av%netscape.com 2000-06-13 23:23:13 +00:00
Родитель e9b4ff0cee
Коммит 259aee44a6
4 изменённых файлов: 368 добавлений и 170 удалений

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

@ -89,6 +89,137 @@ static NS_DEFINE_CID(kIOServiceCID, NS_IOSERVICE_CID);
static NS_DEFINE_IID(kIFileUtilitiesIID, NS_IFILEUTILITIES_IID);
static NS_DEFINE_IID(kIOutputStreamIID, NS_IOUTPUTSTREAM_IID);
nsActivePlugin::nsActivePlugin(nsIPluginInstance* aInstance, char * url)
{
mNext = nsnull;
mPeer = nsnull;
mURL = PL_strdup(url);
mInstance = aInstance;
if(aInstance != nsnull)
{
aInstance->GetPeer(&mPeer);
NS_ADDREF(aInstance);
}
mStopped = PR_FALSE;
}
nsActivePlugin::~nsActivePlugin()
{
if(mInstance != nsnull)
{
mInstance->Destroy();
NS_RELEASE(mInstance);
NS_RELEASE(mPeer);
}
PL_strfree(mURL);
}
nsActivePluginList::nsActivePluginList()
{
first = nsnull;
last = nsnull;
count = 0;
}
nsActivePluginList::~nsActivePluginList()
{
if(first == nsnull)
return;
shut();
}
void nsActivePluginList::shut()
{
if(first == nsnull)
return;
for(nsActivePlugin * plugin = first; plugin != nsnull;)
{
nsActivePlugin * next = plugin->mNext;
remove(plugin);
plugin = next;
}
first = nsnull;
last = nsnull;
}
PRInt32 nsActivePluginList::add(nsActivePlugin * plugin)
{
if (first == nsnull)
{
first = plugin;
last = plugin;
first->mNext = nsnull;
}
else
{
last->mNext = plugin;
last = plugin;
}
last->mNext = nsnull;
count++;
return count;
}
PRBool nsActivePluginList::remove(nsActivePlugin * plugin)
{
if(first == nsnull)
return PR_FALSE;
nsActivePlugin * prev = nsnull;
for(nsActivePlugin * p = first; p != nsnull; p = p->mNext)
{
if(p == plugin)
{
if(p == first)
first = p->mNext;
else
prev->mNext = p->mNext;
if((prev != nsnull) && (prev->mNext == nsnull))
last = prev;
delete p;
count--;
return PR_TRUE;
}
prev = p;
}
return PR_FALSE;
}
nsActivePlugin * nsActivePluginList::find(nsIPluginInstance* instance)
{
for(nsActivePlugin * p = first; p != nsnull; p = p->mNext)
{
if(p->mInstance == instance)
return p;
}
return nsnull;
}
nsActivePlugin * nsActivePluginList::findStopped(char * url)
{
for(nsActivePlugin * p = first; p != nsnull; p = p->mNext)
{
if(!PL_strcmp(url, p->mURL) && p->mStopped)
return p;
}
return nsnull;
}
PRUint32 nsActivePluginList::getStoppedCount()
{
PRUint32 stoppedCount = 0;
for(nsActivePlugin * p = first; p != nsnull; p = p->mNext)
{
if(p->mStopped)
stoppedCount++;
}
return stoppedCount;
}
nsPluginTag::nsPluginTag()
{
mNext = nsnull;
@ -104,7 +235,7 @@ nsPluginTag::nsPluginTag()
mLibrary = nsnull;
mEntryPoint = nsnull;
mFlags = NS_PLUGIN_FLAG_ENABLED;
mFileName = nsnull;
mFileName = nsnull;
}
inline char* new_str(char* str)
@ -1090,8 +1221,6 @@ nsPluginHostImpl::nsPluginHostImpl(nsIServiceManager *serviceMgr)
NS_INIT_REFCNT();
mPluginsLoaded = PR_FALSE;
mServiceMgr = serviceMgr;
mNumActivePlugins = 0;
mOldestActivePlugin = 0;
}
nsPluginHostImpl::~nsPluginHostImpl()
@ -1485,17 +1614,7 @@ NS_IMETHODIMP nsPluginHostImpl::Destroy(void)
{
nsPluginTag *plug = mPlugins;
PRUint32 i;
for(i=0; i<mNumActivePlugins; i++)
{
if(mActivePluginList[i].mInstance)
{
mActivePluginList[i].mInstance->Destroy();
NS_RELEASE(mActivePluginList[i].mInstance);
NS_RELEASE(mActivePluginList[i].mPeer);
PL_strfree(mActivePluginList[i].mURL);
}
}
mActivePluginList.shut();
while (nsnull != plug)
{
@ -1709,7 +1828,6 @@ NS_IMETHODIMP nsPluginHostImpl::InstantiateFullPagePlugin(const char *aMimeType,
nsresult nsPluginHostImpl::FindStoppedPluginForURL(nsIURI* aURL,
nsIPluginInstanceOwner *aOwner)
{
PRUint32 i;
char* url;
if(!aURL)
return NS_ERROR_FAILURE;
@ -1720,29 +1838,27 @@ nsresult nsPluginHostImpl::FindStoppedPluginForURL(nsIURI* aURL,
(void)aURL->GetSpec(&url);
for(i=0; i<mNumActivePlugins; i++)
nsActivePlugin * plugin = mActivePluginList.findStopped(url);
if((plugin != nsnull) && (plugin->mStopped))
{
if(!PL_strcmp(url, mActivePluginList[i].mURL) &&
mActivePluginList[i].mStopped)
{
nsIPluginInstance* instance = mActivePluginList[i].mInstance;
nsPluginWindow *window = nsnull;
aOwner->GetWindow(window);
nsIPluginInstance* instance = plugin->mInstance;
nsPluginWindow *window = nsnull;
aOwner->GetWindow(window);
aOwner->SetInstance(instance);
aOwner->SetInstance(instance);
// we have to reset the owner and instance in the plugin instance peer
//instance->GetPeer(&peer);
((nsPluginInstancePeerImpl*)mActivePluginList[i].mPeer)->SetOwner(aOwner);
// we have to reset the owner and instance in the plugin instance peer
//instance->GetPeer(&peer);
((nsPluginInstancePeerImpl*)plugin->mPeer)->SetOwner(aOwner);
instance->Start();
aOwner->CreateWidget();
instance->SetWindow(window);
instance->Start();
aOwner->CreateWidget();
instance->SetWindow(window);
mActivePluginList[i].mStopped = PR_FALSE;
nsCRT::free(url);
return NS_OK;
}
plugin->mStopped = PR_FALSE;
nsCRT::free(url);
return NS_OK;
}
nsCRT::free(url);
return NS_ERROR_FAILURE;
@ -1758,44 +1874,12 @@ void nsPluginHostImpl::AddInstanceToActiveList(nsIPluginInstance* aInstance,
(void)aURL->GetSpec(&url);
if(mNumActivePlugins < MAX_ACTIVE_PLUGINS)
{
mActivePluginList[mNumActivePlugins].mURL = PL_strdup(url);
mActivePluginList[mNumActivePlugins].mInstance = aInstance;
nsActivePlugin * plugin = new nsActivePlugin(aInstance, url);
aInstance->GetPeer(&(mActivePluginList[mNumActivePlugins].mPeer));
mActivePluginList[mNumActivePlugins].mStopped = PR_FALSE;
if(plugin == nsnull)
return;
++mNumActivePlugins;
}
else
{
// Check if the plugin has been stopped
if (mActivePluginList[mOldestActivePlugin].mStopped == PR_FALSE)
{
mActivePluginList[mOldestActivePlugin].mInstance->SetWindow(nsnull);
mActivePluginList[mOldestActivePlugin].mInstance->Stop();
mActivePluginList[mOldestActivePlugin].mStopped = PR_TRUE;
}
// destroy the oldest plugin on the list
mActivePluginList[mOldestActivePlugin].mInstance->Destroy();
NS_RELEASE(mActivePluginList[mOldestActivePlugin].mInstance);
NS_RELEASE(mActivePluginList[mOldestActivePlugin].mPeer);
PL_strfree(mActivePluginList[mOldestActivePlugin].mURL);
// replace it with the new one
mActivePluginList[mOldestActivePlugin].mURL = PL_strdup(url);
mActivePluginList[mOldestActivePlugin].mInstance = aInstance;
aInstance->GetPeer(&(mActivePluginList[mOldestActivePlugin].mPeer));
mActivePluginList[mOldestActivePlugin].mStopped = PR_FALSE;
++mOldestActivePlugin;
if(mOldestActivePlugin == MAX_ACTIVE_PLUGINS)
mOldestActivePlugin = 0;
}
NS_ADDREF(aInstance);
mActivePluginList.add(plugin);
nsCRT::free(url);
}
@ -2555,15 +2639,10 @@ NS_IMETHODIMP nsPluginHostImpl::NewPluginURLStream(const nsString& aURL,
NS_IMETHODIMP
nsPluginHostImpl::StopPluginInstance(nsIPluginInstance* aInstance)
{
PRUint32 i;
for(i=0; i<mNumActivePlugins; i++)
{
if(mActivePluginList[i].mInstance == aInstance)
{
mActivePluginList[i].mStopped = PR_TRUE;
break;
}
}
nsActivePlugin * plugin = mActivePluginList.find(aInstance);
if(plugin != nsnull)
plugin->mStopped = PR_TRUE;
return NS_OK;
}

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

@ -61,15 +61,37 @@ public:
char *mFileName;
};
#define MAX_ACTIVE_PLUGINS 10
typedef struct nsActivePlugin
struct nsActivePlugin
{
nsActivePlugin* mNext;
char* mURL;
nsIPluginInstancePeer* mPeer;
nsIPluginInstance* mInstance;
PRBool mStopped;
} nsActivePlugin;
nsActivePlugin(nsIPluginInstance* aInstance, char * url);
~nsActivePlugin();
};
#define MAX_NUMBER_OF_STOPPED_PLUGINS 16
class nsActivePluginList
{
public:
nsActivePlugin * first;
nsActivePlugin * last;
PRInt32 count;
nsActivePluginList();
~nsActivePluginList();
void shut();
PRBool add(nsActivePlugin * plugin);
PRBool remove(nsActivePlugin * plugin);
nsActivePlugin * find(nsIPluginInstance* instance);
nsActivePlugin * findStopped(char * url);
PRUint32 getStoppedCount();
};
#define NS_PLUGIN_FLAG_ENABLED 0x0001 //is this plugin enabled?
#define NS_PLUGIN_FLAG_OLDSCHOOL 0x0002 //is this a pre-xpcom plugin?
@ -262,9 +284,7 @@ private:
PRBool mPluginsLoaded;
nsIServiceManager *mServiceMgr;
PRUint32 mNumActivePlugins;
PRUint32 mOldestActivePlugin;
nsActivePlugin mActivePluginList[MAX_ACTIVE_PLUGINS];
nsActivePluginList mActivePluginList;
};
#endif

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

@ -89,6 +89,137 @@ static NS_DEFINE_CID(kIOServiceCID, NS_IOSERVICE_CID);
static NS_DEFINE_IID(kIFileUtilitiesIID, NS_IFILEUTILITIES_IID);
static NS_DEFINE_IID(kIOutputStreamIID, NS_IOUTPUTSTREAM_IID);
nsActivePlugin::nsActivePlugin(nsIPluginInstance* aInstance, char * url)
{
mNext = nsnull;
mPeer = nsnull;
mURL = PL_strdup(url);
mInstance = aInstance;
if(aInstance != nsnull)
{
aInstance->GetPeer(&mPeer);
NS_ADDREF(aInstance);
}
mStopped = PR_FALSE;
}
nsActivePlugin::~nsActivePlugin()
{
if(mInstance != nsnull)
{
mInstance->Destroy();
NS_RELEASE(mInstance);
NS_RELEASE(mPeer);
}
PL_strfree(mURL);
}
nsActivePluginList::nsActivePluginList()
{
first = nsnull;
last = nsnull;
count = 0;
}
nsActivePluginList::~nsActivePluginList()
{
if(first == nsnull)
return;
shut();
}
void nsActivePluginList::shut()
{
if(first == nsnull)
return;
for(nsActivePlugin * plugin = first; plugin != nsnull;)
{
nsActivePlugin * next = plugin->mNext;
remove(plugin);
plugin = next;
}
first = nsnull;
last = nsnull;
}
PRInt32 nsActivePluginList::add(nsActivePlugin * plugin)
{
if (first == nsnull)
{
first = plugin;
last = plugin;
first->mNext = nsnull;
}
else
{
last->mNext = plugin;
last = plugin;
}
last->mNext = nsnull;
count++;
return count;
}
PRBool nsActivePluginList::remove(nsActivePlugin * plugin)
{
if(first == nsnull)
return PR_FALSE;
nsActivePlugin * prev = nsnull;
for(nsActivePlugin * p = first; p != nsnull; p = p->mNext)
{
if(p == plugin)
{
if(p == first)
first = p->mNext;
else
prev->mNext = p->mNext;
if((prev != nsnull) && (prev->mNext == nsnull))
last = prev;
delete p;
count--;
return PR_TRUE;
}
prev = p;
}
return PR_FALSE;
}
nsActivePlugin * nsActivePluginList::find(nsIPluginInstance* instance)
{
for(nsActivePlugin * p = first; p != nsnull; p = p->mNext)
{
if(p->mInstance == instance)
return p;
}
return nsnull;
}
nsActivePlugin * nsActivePluginList::findStopped(char * url)
{
for(nsActivePlugin * p = first; p != nsnull; p = p->mNext)
{
if(!PL_strcmp(url, p->mURL) && p->mStopped)
return p;
}
return nsnull;
}
PRUint32 nsActivePluginList::getStoppedCount()
{
PRUint32 stoppedCount = 0;
for(nsActivePlugin * p = first; p != nsnull; p = p->mNext)
{
if(p->mStopped)
stoppedCount++;
}
return stoppedCount;
}
nsPluginTag::nsPluginTag()
{
mNext = nsnull;
@ -104,7 +235,7 @@ nsPluginTag::nsPluginTag()
mLibrary = nsnull;
mEntryPoint = nsnull;
mFlags = NS_PLUGIN_FLAG_ENABLED;
mFileName = nsnull;
mFileName = nsnull;
}
inline char* new_str(char* str)
@ -1090,8 +1221,6 @@ nsPluginHostImpl::nsPluginHostImpl(nsIServiceManager *serviceMgr)
NS_INIT_REFCNT();
mPluginsLoaded = PR_FALSE;
mServiceMgr = serviceMgr;
mNumActivePlugins = 0;
mOldestActivePlugin = 0;
}
nsPluginHostImpl::~nsPluginHostImpl()
@ -1485,17 +1614,7 @@ NS_IMETHODIMP nsPluginHostImpl::Destroy(void)
{
nsPluginTag *plug = mPlugins;
PRUint32 i;
for(i=0; i<mNumActivePlugins; i++)
{
if(mActivePluginList[i].mInstance)
{
mActivePluginList[i].mInstance->Destroy();
NS_RELEASE(mActivePluginList[i].mInstance);
NS_RELEASE(mActivePluginList[i].mPeer);
PL_strfree(mActivePluginList[i].mURL);
}
}
mActivePluginList.shut();
while (nsnull != plug)
{
@ -1709,7 +1828,6 @@ NS_IMETHODIMP nsPluginHostImpl::InstantiateFullPagePlugin(const char *aMimeType,
nsresult nsPluginHostImpl::FindStoppedPluginForURL(nsIURI* aURL,
nsIPluginInstanceOwner *aOwner)
{
PRUint32 i;
char* url;
if(!aURL)
return NS_ERROR_FAILURE;
@ -1720,29 +1838,27 @@ nsresult nsPluginHostImpl::FindStoppedPluginForURL(nsIURI* aURL,
(void)aURL->GetSpec(&url);
for(i=0; i<mNumActivePlugins; i++)
nsActivePlugin * plugin = mActivePluginList.findStopped(url);
if((plugin != nsnull) && (plugin->mStopped))
{
if(!PL_strcmp(url, mActivePluginList[i].mURL) &&
mActivePluginList[i].mStopped)
{
nsIPluginInstance* instance = mActivePluginList[i].mInstance;
nsPluginWindow *window = nsnull;
aOwner->GetWindow(window);
nsIPluginInstance* instance = plugin->mInstance;
nsPluginWindow *window = nsnull;
aOwner->GetWindow(window);
aOwner->SetInstance(instance);
aOwner->SetInstance(instance);
// we have to reset the owner and instance in the plugin instance peer
//instance->GetPeer(&peer);
((nsPluginInstancePeerImpl*)mActivePluginList[i].mPeer)->SetOwner(aOwner);
// we have to reset the owner and instance in the plugin instance peer
//instance->GetPeer(&peer);
((nsPluginInstancePeerImpl*)plugin->mPeer)->SetOwner(aOwner);
instance->Start();
aOwner->CreateWidget();
instance->SetWindow(window);
instance->Start();
aOwner->CreateWidget();
instance->SetWindow(window);
mActivePluginList[i].mStopped = PR_FALSE;
nsCRT::free(url);
return NS_OK;
}
plugin->mStopped = PR_FALSE;
nsCRT::free(url);
return NS_OK;
}
nsCRT::free(url);
return NS_ERROR_FAILURE;
@ -1758,44 +1874,12 @@ void nsPluginHostImpl::AddInstanceToActiveList(nsIPluginInstance* aInstance,
(void)aURL->GetSpec(&url);
if(mNumActivePlugins < MAX_ACTIVE_PLUGINS)
{
mActivePluginList[mNumActivePlugins].mURL = PL_strdup(url);
mActivePluginList[mNumActivePlugins].mInstance = aInstance;
nsActivePlugin * plugin = new nsActivePlugin(aInstance, url);
aInstance->GetPeer(&(mActivePluginList[mNumActivePlugins].mPeer));
mActivePluginList[mNumActivePlugins].mStopped = PR_FALSE;
if(plugin == nsnull)
return;
++mNumActivePlugins;
}
else
{
// Check if the plugin has been stopped
if (mActivePluginList[mOldestActivePlugin].mStopped == PR_FALSE)
{
mActivePluginList[mOldestActivePlugin].mInstance->SetWindow(nsnull);
mActivePluginList[mOldestActivePlugin].mInstance->Stop();
mActivePluginList[mOldestActivePlugin].mStopped = PR_TRUE;
}
// destroy the oldest plugin on the list
mActivePluginList[mOldestActivePlugin].mInstance->Destroy();
NS_RELEASE(mActivePluginList[mOldestActivePlugin].mInstance);
NS_RELEASE(mActivePluginList[mOldestActivePlugin].mPeer);
PL_strfree(mActivePluginList[mOldestActivePlugin].mURL);
// replace it with the new one
mActivePluginList[mOldestActivePlugin].mURL = PL_strdup(url);
mActivePluginList[mOldestActivePlugin].mInstance = aInstance;
aInstance->GetPeer(&(mActivePluginList[mOldestActivePlugin].mPeer));
mActivePluginList[mOldestActivePlugin].mStopped = PR_FALSE;
++mOldestActivePlugin;
if(mOldestActivePlugin == MAX_ACTIVE_PLUGINS)
mOldestActivePlugin = 0;
}
NS_ADDREF(aInstance);
mActivePluginList.add(plugin);
nsCRT::free(url);
}
@ -2555,15 +2639,10 @@ NS_IMETHODIMP nsPluginHostImpl::NewPluginURLStream(const nsString& aURL,
NS_IMETHODIMP
nsPluginHostImpl::StopPluginInstance(nsIPluginInstance* aInstance)
{
PRUint32 i;
for(i=0; i<mNumActivePlugins; i++)
{
if(mActivePluginList[i].mInstance == aInstance)
{
mActivePluginList[i].mStopped = PR_TRUE;
break;
}
}
nsActivePlugin * plugin = mActivePluginList.find(aInstance);
if(plugin != nsnull)
plugin->mStopped = PR_TRUE;
return NS_OK;
}

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

@ -61,15 +61,37 @@ public:
char *mFileName;
};
#define MAX_ACTIVE_PLUGINS 10
typedef struct nsActivePlugin
struct nsActivePlugin
{
nsActivePlugin* mNext;
char* mURL;
nsIPluginInstancePeer* mPeer;
nsIPluginInstance* mInstance;
PRBool mStopped;
} nsActivePlugin;
nsActivePlugin(nsIPluginInstance* aInstance, char * url);
~nsActivePlugin();
};
#define MAX_NUMBER_OF_STOPPED_PLUGINS 16
class nsActivePluginList
{
public:
nsActivePlugin * first;
nsActivePlugin * last;
PRInt32 count;
nsActivePluginList();
~nsActivePluginList();
void shut();
PRBool add(nsActivePlugin * plugin);
PRBool remove(nsActivePlugin * plugin);
nsActivePlugin * find(nsIPluginInstance* instance);
nsActivePlugin * findStopped(char * url);
PRUint32 getStoppedCount();
};
#define NS_PLUGIN_FLAG_ENABLED 0x0001 //is this plugin enabled?
#define NS_PLUGIN_FLAG_OLDSCHOOL 0x0002 //is this a pre-xpcom plugin?
@ -262,9 +284,7 @@ private:
PRBool mPluginsLoaded;
nsIServiceManager *mServiceMgr;
PRUint32 mNumActivePlugins;
PRUint32 mOldestActivePlugin;
nsActivePlugin mActivePluginList[MAX_ACTIVE_PLUGINS];
nsActivePluginList mActivePluginList;
};
#endif