This commit is contained in:
law%netscape.com 1999-05-13 05:38:38 +00:00
Родитель dec10427b3
Коммит 0fc6a66d09
7 изменённых файлов: 103 добавлений и 332 удалений

Просмотреть файл

@ -45,8 +45,7 @@
// ctor
nsFindComponent::nsFindComponent()
: mAppShell(),
mLastSearchString(),
: mLastSearchString(),
mLastIgnoreCase( PR_FALSE ),
mLastSearchBackwards( PR_FALSE ),
mLastWrapSearch( PR_FALSE )
@ -61,53 +60,6 @@ nsFindComponent::~nsFindComponent()
{
}
// nsISupports Implementation
NS_IMPL_ADDREF( nsFindComponent );
NS_IMPL_RELEASE( nsFindComponent );
NS_IMETHODIMP
nsFindComponent::QueryInterface( REFNSIID anIID, void **anInstancePtr )
{
nsresult rv = NS_OK;
// Check for place to return result.
if ( !anInstancePtr ) {
rv = NS_ERROR_NULL_POINTER;
} else {
// Initialize result.
*anInstancePtr = 0;
// Check for IIDs we support and cast this appropriately.
if ( anIID.Equals( nsIFindComponent::GetIID() ) ) {
*anInstancePtr = (void*) this;
NS_ADDREF_THIS();
} else if ( anIID.Equals( nsIAppShellComponent::GetIID() ) ) {
*anInstancePtr = (void*) ( (nsIAppShellComponent*)this );
NS_ADDREF_THIS();
} else if ( anIID.Equals( nsISupports::GetIID() ) ) {
*anInstancePtr = (void*) ( (nsISupports*)this );
NS_ADDREF_THIS();
} else {
// Not an interface we support.
rv = NS_NOINTERFACE;
}
}
return rv;
}
NS_IMETHODIMP
nsFindComponent::Initialize( nsIAppShellService *appShell,
nsICmdLineService *args )
{
nsresult rv = NS_OK;
// Remember the app shell service in case we need it.
mAppShell = nsDontQueryInterface<nsIAppShellService>( appShell );
return rv;
}
NS_IMETHODIMP
nsFindComponent::CreateContext( nsIWebShell *aWebShell,
nsISupports **aResult )
@ -630,215 +582,4 @@ nsFindComponent::ResetContext( nsISupports *aContext,
// nsFindComponent::Context implementation...
NS_IMPL_ISUPPORTS( nsFindComponent::Context, nsISupports::GetIID() )
static PRInt32 g_InstanceCount = 0;
static PRInt32 g_LockCount = 0;
// Factory stuff
struct nsFindComponentFactory : public nsIFactory {
// ctor/dtor
nsFindComponentFactory() {
NS_INIT_REFCNT();
}
virtual ~nsFindComponentFactory() {
}
// This class implements the nsISupports interface functions.
NS_DECL_ISUPPORTS
// nsIFactory methods
NS_IMETHOD CreateInstance( nsISupports *aOuter,
const nsIID &aIID,
void **aResult );
NS_IMETHOD LockFactory( PRBool aLock );
};
// nsISupports interface implementation.
NS_IMPL_ADDREF(nsFindComponentFactory)
NS_IMPL_RELEASE(nsFindComponentFactory)
NS_IMETHODIMP
nsFindComponentFactory::QueryInterface( const nsIID &anIID, void **aResult ) {
nsresult rv = NS_OK;
if ( aResult ) {
*aResult = 0;
if ( 0 ) {
} else if ( anIID.Equals( nsIFactory::GetIID() ) ) {
*aResult = (void*) (nsIFactory*)this;
NS_ADDREF_THIS();
} else if ( anIID.Equals( nsISupports::GetIID() ) ) {
*aResult = (void*) (nsISupports*)this;
NS_ADDREF_THIS();
} else {
rv = NS_ERROR_NO_INTERFACE;
}
} else {
rv = NS_ERROR_NULL_POINTER;
}
return rv;
}
NS_IMETHODIMP
nsFindComponentFactory::CreateInstance( nsISupports *anOuter,
const nsIID &anIID,
void* *aResult ) {
nsresult rv = NS_OK;
if ( aResult ) {
// Allocate new find component object.
nsFindComponent *component = new nsFindComponent();
if ( component ) {
// Allocated OK, do query interface to get proper
// pointer and increment refcount.
rv = component->QueryInterface( anIID, aResult );
if ( NS_FAILED( rv ) ) {
// refcount still at zero, delete it here.
delete component;
}
} else {
rv = NS_ERROR_OUT_OF_MEMORY;
}
} else {
rv = NS_ERROR_NULL_POINTER;
}
return rv;
}
NS_IMETHODIMP
nsFindComponentFactory::LockFactory(PRBool aLock) {
if (aLock)
PR_AtomicIncrement(&g_LockCount);
else
PR_AtomicDecrement(&g_LockCount);
return NS_OK;
}
#ifdef XP_MAC
#pragma mark -
#endif
extern "C" NS_EXPORT nsresult
NSRegisterSelf( nsISupports* aServiceMgr, const char* path ) {
nsresult rv = NS_OK;
nsCOMPtr<nsIServiceManager> serviceMgr( do_QueryInterface( aServiceMgr, &rv ) );
if ( NS_SUCCEEDED( rv ) ) {
// Get the component manager service.
nsCID cid = NS_COMPONENTMANAGER_CID;
nsIComponentManager *componentMgr = 0;
rv = serviceMgr->GetService( cid,
nsIComponentManager::GetIID(),
(nsISupports**)&componentMgr );
if ( NS_SUCCEEDED( rv ) ) {
// Register our component.
rv = componentMgr->RegisterComponent( nsFindComponent::GetCID(),
NS_IFINDCOMPONENT_CLASSNAME,
NS_IFINDCOMPONENT_PROGID,
path,
PR_TRUE,
PR_TRUE );
#ifdef NS_DEBUG
if ( NS_SUCCEEDED( rv ) ) {
printf( "nsFindComponent's NSRegisterSelf successful\n" );
} else {
printf( "nsFindComponent's NSRegisterSelf failed, RegisterComponent rv=0x%X\n", (int)rv );
}
#endif
// Release the component manager service.
serviceMgr->ReleaseService( cid, componentMgr );
} else {
#ifdef NS_DEBUG
printf( "nsFindComponent's NSRegisterSelf failed, GetService rv=0x%X\n", (int)rv );
#endif
}
} else {
#ifdef NS_DEBUG
printf( "nsFindComponent's NSRegisterSelf failed, QueryInterface rv=0x%X\n", (int)rv );
#endif
}
return rv;
}
extern "C" NS_EXPORT nsresult
NSUnregisterSelf( nsISupports* aServiceMgr, const char* path ) {
nsresult rv = NS_OK;
nsCOMPtr<nsIServiceManager> serviceMgr( do_QueryInterface( aServiceMgr, &rv ) );
if ( NS_SUCCEEDED( rv ) ) {
// Get the component manager service.
nsCID cid = NS_COMPONENTMANAGER_CID;
nsIComponentManager *componentMgr = 0;
rv = serviceMgr->GetService( cid,
nsIComponentManager::GetIID(),
(nsISupports**)&componentMgr );
if ( NS_SUCCEEDED( rv ) ) {
// Register our component.
rv = componentMgr->UnregisterComponent( nsFindComponent::GetCID(), path );
#ifdef NS_DEBUG
if ( NS_SUCCEEDED( rv ) ) {
printf( "nsFindComponent's NSUnregisterSelf successful\n" );
} else {
printf( "nsFindComponent's NSUnregisterSelf failed, UnregisterComponent rv=0x%X\n", (int)rv );
}
#endif
// Release the component manager service.
serviceMgr->ReleaseService( cid, componentMgr );
} else {
#ifdef NS_DEBUG
printf( "nsFindComponent's NSRegisterSelf failed, GetService rv=0x%X\n", (int)rv );
#endif
}
} else {
#ifdef NS_DEBUG
printf( "nsFindComponent's NSRegisterSelf failed, QueryInterface rv=0x%X\n", (int)rv );
#endif
}
return rv;
}
extern "C" NS_EXPORT nsresult
NSGetFactory( nsISupports *aServMgr,
const nsCID &aClass,
const char *aClassName,
const char *aProgID,
nsIFactory* *aFactory ) {
nsresult rv = NS_OK;
if ( aFactory ) {
nsFindComponentFactory *factory = new nsFindComponentFactory();
if ( factory ) {
rv = factory->QueryInterface( nsIFactory::GetIID(), (void**)aFactory );
if ( NS_FAILED( rv ) ) {
#ifdef NS_DEBUG
printf( "nsFindComponent's NSGetFactory failed, QueryInterface rv=0x%X\n", (int)rv );
#endif
// Delete this bogus factory.
delete factory;
}
} else {
rv = NS_ERROR_OUT_OF_MEMORY;
}
} else {
rv = NS_ERROR_NULL_POINTER;
}
return rv;
}
extern "C" NS_EXPORT PRBool
NSCanUnload( nsISupports* aServiceMgr ) {
PRBool result = g_InstanceCount == 0 && g_LockCount == 0;
return result;
}
NS_IMPL_IAPPSHELLCOMPONENT( nsFindComponent, nsIFindComponent, NS_IFINDCOMPONENT_PROGID )

Просмотреть файл

@ -15,7 +15,7 @@
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
#include "nsIAppShellComponentImpl.h"
class nsITextServicesDocument;
@ -23,7 +23,7 @@ class nsITextServicesDocument;
#define NS_FINDCOMPONENT_CID \
{ 0x4aa267a0, 0xf81d, 0x11d2, { 0x80, 0x67, 0x0, 0x60, 0x8, 0x11, 0xa9, 0xc3} }
class nsFindComponent : public nsIFindComponent
class nsFindComponent : public nsIFindComponent, public nsAppShellComponentImpl
{
public:
NS_DEFINE_STATIC_CID_ACCESSOR( NS_FINDCOMPONENT_CID );
@ -74,9 +74,9 @@ public:
}; // nsFindComponent::Context
protected:
nsCOMPtr<nsIAppShellService> mAppShell;
nsString mLastSearchString;
PRBool mLastIgnoreCase;
PRBool mLastSearchBackwards;
PRBool mLastWrapSearch;
nsInstanceCounter mInstanceCounter;
}; // nsFindComponent

Просмотреть файл

@ -26,8 +26,9 @@ class nsICmdLineService;
// a6cf90ed-15b3-11d2-932e-00805f8add32
#define NS_IAPPSHELLCOMPONENT_IID \
{ 0xa6cf90ed, 0x15b3, 0x11d2, {0x93, 0x2e, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32} };
#define NS_IAPPSHELLCOMPONENT_PROGID "component://netscape/appshell/component"
#define NS_IAPPSHELLCOMPONENT_PROGID "component://netscape/appshell/component"
#define NS_IAPPSHELLCOMPONENT_CLASSNAME "Mozilla AppShell Component"
#define NS_IAPPSHELLCOMPONENT_KEY "software/netscape/appshell/components"
/*--------------------------- nsIAppShellComponent -----------------------------
| This interface describes the fundamental communications between the |
@ -79,6 +80,12 @@ struct nsIAppShellComponent : public nsISupports {
NS_IMETHOD Initialize( nsIAppShellService *appShell,
nsICmdLineService *args ) = 0;
/*------------------------------- Shutdown ---------------------------------
| Called at application shutdown (if the component had registered as a |
| service). |
--------------------------------------------------------------------------*/
NS_IMETHOD Shutdown() = 0;
/*------------------------- HandleAppShellEvent ----------------------------
| This function is called (by the app shell, when its |
| BroadcastAppShellEvent member function is called) to broadcast |
@ -100,7 +107,8 @@ struct nsIAppShellComponent : public nsISupports {
}; // nsIAppShellComponent
#define NS_DECL_IAPPSHELLCOMPONENT \
NS_IMETHOD Initialize( nsIAppShellService *appShell, \
nsICmdLineService *args );
NS_IMETHOD Initialize( nsIAppShellService*, \
nsICmdLineService* ); \
NS_IMETHOD Shutdown();
#endif

Просмотреть файл

@ -26,11 +26,10 @@
#include "nsICmdLineService.h"
#include "nsISupports.h"
#include "nsIFactory.h"
#include "nsIRegistry.h"
#include "pratom.h"
#include "nsCOMPtr.h"
#ifdef NS_DEBUG
#include "prprf.h"
#endif
/*------------------------------------------------------------------------------
| This file contains macros to assist in the implementation of application |
@ -86,9 +85,49 @@ private:
PRInt32 nsInstanceCounter::mInstanceCount = 0; \
PRInt32 nsInstanceCounter::mLockCount = 0;
// Declare component-global class.
class nsAppShellComponentImpl {
public:
// Override this and return PR_FALSE if your component
// should not be registered with the Service Manager
// when Initialize-d.
virtual PRBool Is_Service() { return PR_TRUE; }
static nsIServiceManager *mServiceMgr;
static nsIAppShellService *mAppShell;
static nsICmdLineService *mCmdLine;
}; // nsAppShellComponent
#define NS_DEFINE_COMPONENT_GLOBALS() \
nsIServiceManager *nsAppShellComponentImpl::mServiceMgr = 0; \
nsIAppShellService *nsAppShellComponentImpl::mAppShell = 0; \
nsICmdLineService *nsAppShellComponentImpl::mCmdLine = 0;
#define NS_IMPL_IAPPSHELLCOMPONENT( className, interfaceName, progId ) \
/* Define instance counter implementation stuff. */\
NS_DEFINE_MODULE_INSTANCE_COUNTER() \
/* Define component globals. */\
NS_DEFINE_COMPONENT_GLOBALS() \
/* Component's implementation of Initialize. */\
NS_IMETHODIMP \
className::Initialize( nsIAppShellService *anAppShell, \
nsICmdLineService *aCmdLineService ) { \
nsresult rv = NS_OK; \
mAppShell = anAppShell; \
mCmdLine = aCmdLineService; \
if ( mServiceMgr && Is_Service() ) { \
rv = mServiceMgr->RegisterService( progId, this ); \
} \
return rv; \
} \
/* Component's implementation of Shutdown. */\
NS_IMETHODIMP \
className::Shutdown() { \
nsresult rv = NS_OK; \
if ( mServiceMgr && Is_Service() ) { \
rv = mServiceMgr->ReleaseService( progId, this ); \
} \
return rv; \
} \
/* nsISupports Implementation for the class */\
NS_IMPL_ADDREF( className ); \
NS_IMPL_RELEASE( className ); \
@ -195,14 +234,16 @@ className##Factory::LockFactory(PRBool aLock) { \
extern "C" NS_EXPORT nsresult \
NSRegisterSelf( nsISupports* aServiceMgr, const char* path ) { \
nsresult rv = NS_OK; \
nsCOMPtr<nsIServiceManager> serviceMgr( do_QueryInterface( aServiceMgr, &rv ) ); \
/* Remember service manager. */\
rv = aServiceMgr->QueryInterface( nsIServiceManager::GetIID(), \
(void**)&className::mServiceMgr ); \
if ( NS_SUCCEEDED( rv ) ) { \
/* Get the component manager service. */\
nsCID cid = NS_COMPONENTMANAGER_CID; \
nsIComponentManager *componentMgr = 0; \
rv = serviceMgr->GetService( cid, \
nsIComponentManager::GetIID(), \
(nsISupports**)&componentMgr ); \
rv = className::mServiceMgr->GetService( cid, \
nsIComponentManager::GetIID(), \
(nsISupports**)&componentMgr ); \
if ( NS_SUCCEEDED( rv ) ) { \
/* Register our component. */\
rv = componentMgr->RegisterComponent( className::GetCID(), \
@ -212,12 +253,40 @@ NSRegisterSelf( nsISupports* aServiceMgr, const char* path ) { \
PR_TRUE, \
PR_TRUE ); \
if ( NS_SUCCEEDED( rv ) ) { \
DEBUG_PRINTF( PR_STDOUT, #className " registeration successful\n" ); \
DEBUG_PRINTF( PR_STDOUT, #className " registration successful\n" ); \
/* Add to appshell component list. */\
nsIRegistry *registry; \
rv = className::mServiceMgr->GetService( NS_REGISTRY_PROGID, \
nsIRegistry::GetIID(), \
(nsISupports**)&registry ); \
if ( NS_SUCCEEDED( rv ) ) { \
registry->Open(); \
char buffer[256]; \
char *cid = className::GetCID().ToString(); \
PR_snprintf( buffer, \
sizeof buffer, \
"%s/%s", \
NS_IAPPSHELLCOMPONENT_KEY, \
cid ? cid : "unknown" ); \
delete [] cid; \
nsIRegistry::Key key; \
rv = registry->AddSubtree( nsIRegistry::Common, \
buffer, \
&key ); \
if ( NS_SUCCEEDED( rv ) ) { \
DEBUG_PRINTF( PR_STDOUT, #className " added to appshell component list\n" ); \
} else { \
DEBUG_PRINTF( PR_STDOUT, #className " not added to appshell component list, rv=0x%X\n", (int)rv ); \
} \
className::mServiceMgr->ReleaseService( NS_REGISTRY_PROGID, registry ); \
} else { \
DEBUG_PRINTF( PR_STDOUT, #className " not added to appshell component list, rv=0x%X\n", (int)rv ); \
} \
} else { \
DEBUG_PRINTF( PR_STDOUT, #className " registration failed, RegisterComponent rv=0x%X\n", (int)rv ); \
} \
/* Release the component manager service. */\
serviceMgr->ReleaseService( cid, componentMgr ); \
className::mServiceMgr->ReleaseService( cid, componentMgr ); \
} else { \
DEBUG_PRINTF( PR_STDOUT, #className " registration failed, GetService rv=0x%X\n", (int)rv ); \
} \
@ -239,7 +308,7 @@ NSUnregisterSelf( nsISupports* aServiceMgr, const char* path ) { \
nsIComponentManager::GetIID(), \
(nsISupports**)&componentMgr ); \
if ( NS_SUCCEEDED( rv ) ) { \
/* Register our component. */\
/* Unregister our component. */\
rv = componentMgr->UnregisterComponent( className::GetCID(), path ); \
if ( NS_SUCCEEDED( rv ) ) { \
DEBUG_PRINTF( PR_STDOUT, #className " unregistration successful\n" ); \

Просмотреть файл

@ -49,7 +49,8 @@
{ 0xcfc599f0, 0x4ca, 0x11d3, { 0x80, 0x68, 0x0, 0x60, 0x8, 0x11, 0xa9, 0xc3 } }
// Implementation of the sample app shell component interface.
class nsSampleAppShellComponent : public nsISampleAppShellComponent {
class nsSampleAppShellComponent : public nsISampleAppShellComponent,
public nsAppShellComponentImpl {
public:
NS_DEFINE_STATIC_CID_ACCESSOR( NS_SAMPLEAPPSHELLCOMPONENT_CID );
@ -71,7 +72,6 @@ public:
private:
// Data members and implemention functions go here.
nsCOMPtr<nsIAppShellService> mAppShell;
// Objects of this class are counted to manage library unloading...
nsInstanceCounter instanceCounter;
@ -85,14 +85,6 @@ nsSampleAppShellComponent::DoDialogTests() {
return rv;
}
NS_IMETHODIMP
nsSampleAppShellComponent::Initialize( nsIAppShellService *anAppShell,
nsICmdLineService *aCmdLineService ) {
nsresult rv = NS_OK;
mAppShell = dont_QueryInterface( anAppShell );
return rv;
}
// Generate base nsIAppShellComponent implementation.
NS_IMPL_IAPPSHELLCOMPONENT( nsSampleAppShellComponent,
nsISampleAppShellComponent,

Просмотреть файл

@ -39,7 +39,8 @@
#define NS_UNKNOWNCONTENTTYPEHANDLER_CID \
{ 0x42770b50, 0x3e9, 0x11d3, { 0x80, 0x68, 0x0, 0x60, 0x8, 0x11, 0xa9, 0xc3 } }
class nsUnknownContentTypeHandler : public nsIUnknownContentTypeHandler {
class nsUnknownContentTypeHandler : public nsIUnknownContentTypeHandler,
public nsAppShellComponentImpl {
public:
NS_DEFINE_STATIC_CID_ACCESSOR( NS_UNKNOWNCONTENTTYPEHANDLER_CID );
@ -60,23 +61,9 @@ public:
NS_DECL_IUNKNOWNCONTENTTYPEHANDLER
private:
nsCOMPtr<nsIAppShellService> mAppShell;
nsInstanceCounter mInstanceCounter;
}; // nsUnknownContentTypeHandler
// Initialize (from nsIAppShellComponent) implementation.
NS_IMETHODIMP
nsUnknownContentTypeHandler::Initialize( nsIAppShellService *appShell,
nsICmdLineService *args )
{
nsresult rv = NS_OK;
// Remember the app shell service in case we need it.
mAppShell = nsDontQueryInterface<nsIAppShellService>( appShell );
return rv;
}
struct nsUnknownContentDialog : public nsIXULWindowCallbacks,
nsIDocumentObserver {
// Declare implementation of ISupports stuff.
@ -355,27 +342,11 @@ nsUnknownContentDialog::OnSave() {
// Get "stream xfer component".
nsIStreamTransfer *xfer;
rv = nsServiceManager::GetService( NS_ISTREAMTRANSFER_PROGID,
nsIStreamTransfer::GetIID(),
(nsISupports**)&xfer );
rv = nsAppShellComponentImpl::mServiceMgr->GetService( NS_ISTREAMTRANSFER_PROGID,
nsIStreamTransfer::GetIID(),
(nsISupports**)&xfer );
if ( NS_SUCCEEDED( rv ) ) {
#if 1
// Temporary code pending proper component initialization in apprunner main.
static PRBool initialized = PR_FALSE;
if ( !initialized ) {
// Get app shell service.
nsIAppShellService *appShell;
rv = nsServiceManager::GetService( kAppShellServiceCID,
nsIAppShellService::GetIID(),
(nsISupports**)&appShell );
if ( NS_SUCCEEDED( rv ) ) {
rv = xfer->Initialize( appShell, 0 );
nsServiceManager::ReleaseService( kAppShellServiceCID, appShell );
initialized = PR_TRUE;
}
}
#endif
// Have the component stream the url to a user-selected file.
rv = xfer->SelectFileAndTransferLocation( mUrl );
@ -386,6 +357,7 @@ nsUnknownContentDialog::OnSave() {
DEBUG_PRINTF( PR_STDOUT, "%s %d: Error saving file, rv=0x%X\n",
__FILE__, (int)__LINE__, (int)rv );
}
nsAppShellComponentImpl::mServiceMgr->ReleaseService( NS_ISTREAMTRANSFER_PROGID, xfer );
} else {
DEBUG_PRINTF( PR_STDOUT, "Unable to get stream transfer, GetService rv=0x%X\n", (int)rv );
}

Просмотреть файл

@ -30,7 +30,7 @@ static NS_DEFINE_IID( kCFileWidgetCID, NS_FILEWIDGET_CID );
static NS_DEFINE_IID( kIFileWidgetIID, NS_IFILEWIDGET_IID );
// Implementation of the stream transfer component interface.
class nsStreamTransfer : public nsIStreamTransfer {
class nsStreamTransfer : public nsIStreamTransfer, public nsAppShellComponentImpl {
public:
NS_DEFINE_STATIC_CID_ACCESSOR( NS_STREAMTRANSFER_CID );
@ -54,21 +54,10 @@ private:
// Put up file picker dialog.
NS_IMETHOD SelectFile( nsFileSpec &result );
// Hold reference to app shell service (for OpenWindow calls).
nsCOMPtr<nsIAppShellService> mAppShell;
// Objects of this class are counted to manage library unloading...
nsInstanceCounter instanceCounter;
}; // nsStreamTransfer
NS_IMETHODIMP
nsStreamTransfer::Initialize( nsIAppShellService *anAppShell,
nsICmdLineService *aCmdLineService ) {
nsresult rv = NS_OK;
mAppShell = dont_QueryInterface( anAppShell );
return rv;
}
NS_IMETHODIMP
nsStreamTransfer::SelectFileAndTransferLocation( nsIURL *aURL ) {
// Prompt the user for the destination file.