diff options
| author | George Hazan <george.hazan@gmail.com> | 2012-07-04 19:11:17 +0000 | 
|---|---|---|
| committer | George Hazan <george.hazan@gmail.com> | 2012-07-04 19:11:17 +0000 | 
| commit | d7f143dba9e53347a1d7897bcd3989751c7f45f8 (patch) | |
| tree | bb464bed05487cb48d2221dee5840d943fa0b8d1 | |
| parent | 3f918fb53343d815ba8736735d1c0beea2359b15 (diff) | |
wiping objects during dynamic plugin unload
git-svn-id: http://svn.miranda-ng.org/main/trunk@762 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
| -rw-r--r-- | plugins/Import/main.cpp | 1 | ||||
| -rw-r--r-- | src/core/miranda.h | 16 | ||||
| -rw-r--r-- | src/modules/clist/clistmenus.cpp | 11 | ||||
| -rw-r--r-- | src/modules/clist/genmenu.cpp | 45 | ||||
| -rw-r--r-- | src/modules/fonts/services.cpp | 29 | ||||
| -rw-r--r-- | src/modules/icolib/skin2icons.cpp | 21 | ||||
| -rw-r--r-- | src/modules/plugins/newplugins.cpp | 22 | ||||
| -rw-r--r-- | src/modules/skin/hotkeys.cpp | 11 | ||||
| -rw-r--r-- | src/modules/skin/sounds.cpp | 15 | 
9 files changed, 140 insertions, 31 deletions
diff --git a/plugins/Import/main.cpp b/plugins/Import/main.cpp index 65d139e5c5..08403562ee 100644 --- a/plugins/Import/main.cpp +++ b/plugins/Import/main.cpp @@ -130,7 +130,6 @@ static int OnExit(WPARAM wParam, LPARAM lParam)  extern "C" __declspec(dllexport) int Load(void)
  {
 -
  	mir_getLP( &pluginInfo );
  	hImportService = CreateServiceFunction(IMPORT_SERVICE, ImportCommand);
 diff --git a/src/core/miranda.h b/src/core/miranda.h index 8b7d5769db..3446fc0a72 100644 --- a/src/core/miranda.h +++ b/src/core/miranda.h @@ -115,6 +115,14 @@ extern LPFN_WSAADDRESSTOSTRINGA MyWSAAddressToString;  void PushFileEvent(HANDLE hContact, HANDLE hdbe, LPARAM lParam);
 +/**** fontService.cpp ******************************************************************/
 +
 +void KillModuleFonts(int hLangpack);
 +void KillModuleColours(int hLangpack);
 +void KillModuleEffects(int hLangpack);
 +void KillModuleHotkeys(int hLangpack);
 +void KillModuleSounds(int hLangpack);
 +
  /**** miranda.cpp **********************************************************************/
  extern HINSTANCE hInst;
 @@ -143,6 +151,8 @@ HICON  IcoLib_GetIconByHandle(HANDLE hItem, bool big);  HANDLE IcoLib_IsManaged(HICON hIcon);
  int    IcoLib_ReleaseIcon(HICON hIcon, char* szIconName, bool big);
 +void   KillModuleIcons(int hLangpack);
 +
  /**** skinicons.cpp ********************************************************************/
  HICON LoadSkinProtoIcon(const char* szProto, int status, bool big = false);
 @@ -178,6 +188,8 @@ extern const int skinIconStatusFlags[ MAX_STATUS_COUNT ];  int TryProcessDoubleClick(HANDLE hContact);
 +void KillModuleMenus(int hLangpack);
 +
  /**** protocols.cpp *********************************************************************/
  #define OFFSET_PROTOPOS 200
 @@ -224,7 +236,7 @@ public:  	StrConvUT(const char* pSrc) :
  		m_body(mir_a2u(pSrc)) {}
 -    ~StrConvUT() {  mir_free(m_body); }
 +	~StrConvUT() {  mir_free(m_body); }
  	operator const wchar_t* () const { return m_body; }
  };
 @@ -237,7 +249,7 @@ public:  	StrConvAT(const wchar_t* pSrc) :
  		m_body(mir_u2a(pSrc)) {}
 -    ~StrConvAT() {  mir_free(m_body); }
 +	~StrConvAT() {  mir_free(m_body); }
  	operator const char*  () const { return m_body; }
  	operator const wchar_t* () const { return (wchar_t*)m_body; }  // type cast to fake the interface definition
  	operator const LPARAM () const { return (LPARAM)m_body; }
 diff --git a/src/modules/clist/clistmenus.cpp b/src/modules/clist/clistmenus.cpp index dc9c4a69e2..677678d847 100644 --- a/src/modules/clist/clistmenus.cpp +++ b/src/modules/clist/clistmenus.cpp @@ -1193,7 +1193,7 @@ static INT_PTR AddStatusMenuItem(WPARAM wParam, LPARAM lParam)  				mir_free(ptszName);	
  			}
  			if (pRoot == NULL) {
 -				TMO_MenuItem tmi = { 0 };
 +				memset(&tmi, 0, sizeof(tmi));
  				tmi.cbSize = sizeof(tmi);
  				tmi.flags = (mi->flags & CMIF_UNICODE) | CMIF_ROOTHANDLE;
  				tmi.position = 1001;
 @@ -1233,12 +1233,9 @@ static INT_PTR AddStatusMenuItem(WPARAM wParam, LPARAM lParam)  		smep->hMenuItem = menuHandle;
  	char buf[MAX_PATH+64];
 -	
 -	{
 -		char* p = (pRoot) ? mir_t2a(pRoot->mi.ptszName) : NULL;
 -		mir_snprintf(buf, SIZEOF(buf), "%s/%s", (p) ? p : "", mi->pszService ? mi->pszService : "");
 -		mir_free(p);
 -	}
 +	char* p = (pRoot) ? mir_t2a(pRoot->mi.ptszName) : NULL;
 +	mir_snprintf(buf, SIZEOF(buf), "%s/%s", (p) ? p : "", mi->pszService ? mi->pszService : "");
 +	mir_free(p);
  	MO_SetOptionsMenuItem(menuHandle, OPT_MENUITEMSETUNIQNAME, (INT_PTR)buf);
 diff --git a/src/modules/clist/genmenu.cpp b/src/modules/clist/genmenu.cpp index 30f856b7ee..deb5de8227 100644 --- a/src/modules/clist/genmenu.cpp +++ b/src/modules/clist/genmenu.cpp @@ -80,6 +80,8 @@ LPTSTR GetMenuItemText(PMO_IntMenuItem pimi)  	return TranslateTH(pimi->mi.hLangpack, pimi->mi.ptszName);
  }
 +///////////////////////////////////////////////////////////////////////////////
 +
  PMO_IntMenuItem MO_RecursiveWalkMenu(PMO_IntMenuItem parent, pfnWalkFunc func, void* param)
  {
  	if (parent == NULL)
 @@ -102,6 +104,7 @@ PMO_IntMenuItem MO_RecursiveWalkMenu(PMO_IntMenuItem parent, pfnWalkFunc func, v  	return FALSE;
  }
 +///////////////////////////////////////////////////////////////////////////////
  //wparam=0
  //lparam=LPMEASUREITEMSTRUCT
  int MO_MeasureMenuItem(LPMEASUREITEMSTRUCT mis)
 @@ -128,6 +131,7 @@ int MO_MeasureMenuItem(LPMEASUREITEMSTRUCT mis)  	return TRUE;
  }
 +///////////////////////////////////////////////////////////////////////////////
  //wparam=0
  //lparam=LPDRAWITEMSTRUCT
  int MO_DrawMenuItem(LPDRAWITEMSTRUCT dis)
 @@ -453,16 +457,13 @@ int MO_SetOptionsMenuItem(PMO_IntMenuItem aHandle, int setting, INT_PTR value)  int MO_SetOptionsMenuObject(HANDLE handle, int setting, INT_PTR value)
  {
 -	int  pimoidx;
 -	int  res = 0;
 -
  	if ( !bIsGenMenuInited)
  		return -1;
  	mir_cslock lck(csMenuHook);
 -	pimoidx = GetMenuObjbyId((int)handle);
 -	res = pimoidx != -1;
 +	int pimoidx = GetMenuObjbyId((int)handle);
 +	int res = pimoidx != -1;
  	if (res) {
  		TIntMenuObject* pmo = g_menus[pimoidx];
 @@ -553,6 +554,25 @@ INT_PTR MO_RemoveMenuItem(WPARAM wParam, LPARAM)  }
  ///////////////////////////////////////////////////////////////////////////////
 +
 +int KillMenuItems(PMO_IntMenuItem pimi, void* param)
 +{
 +	if (pimi->hLangpack == (int)param)
 +		MO_RemoveMenuItem((WPARAM)pimi, 0);
 +	return FALSE;
 +}
 +
 +void KillModuleMenus(int hLangpack)
 +{
 +	if (bIsGenMenuInited) {
 +		mir_cslock lck(csMenuHook);
 +
 +		for (int i=0; i < g_menus.getCount(); i++)
 +			MO_RecursiveWalkMenu(g_menus[i]->m_items.first, KillMenuItems, (void*)hLangpack);
 +	}
 +}
 +
 +///////////////////////////////////////////////////////////////////////////////
  // we presume that this function is being called inside csMenuHook only
  static int PackMenuItems(PMO_IntMenuItem pimi, void*)
 @@ -600,6 +620,7 @@ PMO_IntMenuItem MO_AddNewMenuItem(HANDLE menuobjecthandle, PMO_MenuItem pmi)  	p->iconId = -1;
  	p->OverrideShow = TRUE;
  	p->originalPosition = pmi->position;
 +	p->hLangpack = pmi->hLangpack;
  	if (pmi->flags & CMIF_UNICODE) 
  		p->mi.ptszName = mir_tstrdup(pmi->ptszName);
 @@ -1039,7 +1060,7 @@ static int MO_RegisterIcon(PMO_IntMenuItem pmi, void*)  		mir_snprintf(iconame, sizeof(iconame), "genmenu_%s_%s", pmi->parent->Name, uname && *uname ? uname : descr);
 -		SKINICONDESC sid={0};
 +		SKINICONDESC sid = { 0 };
  		sid.cbSize = sizeof(sid);
  		sid.cx = 16;
  		sid.cy = 16;
 @@ -1054,14 +1075,12 @@ static int MO_RegisterIcon(PMO_IntMenuItem pmi, void*)  		if (hIcon = (HICON)CallService(MS_SKIN2_GETICON, 0, (LPARAM)iconame)) {
  			ImageList_ReplaceIcon(pmi->parent->m_hMenuIcons, pmi->iconId, hIcon);
  			IconLib_ReleaseIcon(hIcon, 0);
 -	}	}
 -
 -	
 -		if ( !pmi->UniqName)
 -			mir_free(uname);
 -		mir_free(descr);
 -
 +		}
 +	}
 +	if ( !pmi->UniqName)
 +		mir_free(uname);
 +	mir_free(descr);
  	return FALSE;
  }
 diff --git a/src/modules/fonts/services.cpp b/src/modules/fonts/services.cpp index 3774cafe9f..f4804c839a 100644 --- a/src/modules/fonts/services.cpp +++ b/src/modules/fonts/services.cpp @@ -369,6 +369,15 @@ INT_PTR GetFont(WPARAM wParam, LPARAM lParam)  }
  /////////////////////////////////////////////////////////////////////////////////////////
 +
 +void KillModuleFonts(int hLangpack)
 +{
 +	for (int i=font_id_list.getCount()-1; i >= 0; i--)
 +		if ( font_id_list[i].hLangpack == hLangpack)
 +			font_id_list.remove(i);
 +}
 +
 +/////////////////////////////////////////////////////////////////////////////////////////
  // RegisterColour service
  void UpdateColourSettings(ColourIDW* colour_id, COLORREF *colour)
 @@ -434,6 +443,15 @@ INT_PTR GetColour(WPARAM wParam, LPARAM)  	return sttGetColourWorker(&temp);
  }
 +/////////////////////////////////////////////////////////////////////////////////////////
 +
 +void KillModuleColours(int hLangpack)
 +{
 +	for (int i=colour_id_list.getCount()-1; i >= 0; i--)
 +		if (colour_id_list[i].hLangpack == hLangpack)
 +			colour_id_list.remove(i);
 +}
 +
  //////////////////////////////////////////////////////////////////////////
  // Effects
 @@ -451,7 +469,7 @@ void UpdateEffectSettings(EffectIDW* effect_id, FONTEFFECT* effectsettings)  }
  /////////////////////////////////////////////////////////////////////////////////////////
 -// RegisterFont service
 +// RegisterEffect service
  static INT_PTR sttRegisterEffectWorker(EffectIDW* effect_id, int hLangpack)
  {
 @@ -516,3 +534,12 @@ INT_PTR GetEffect(WPARAM wParam, LPARAM lParam)  	if ( !ConvertEffectID((EffectID*)wParam, &temp)) return -1;
  	return sttGetEffectWorker(&temp, (FONTEFFECT*)lParam);
  }
 +
 +/////////////////////////////////////////////////////////////////////////////////////////
 +
 +void KillModuleEffects(int hLangpack)
 +{
 +	for (int i=effect_id_list.getCount()-1; i >= 0; i--)
 +		if (effect_id_list[i].hLangpack == hLangpack)
 +			effect_id_list.remove(i);
 +}
 diff --git a/src/modules/icolib/skin2icons.cpp b/src/modules/icolib/skin2icons.cpp index 6527d7a35e..62ab6b15cf 100644 --- a/src/modules/icolib/skin2icons.cpp +++ b/src/modules/icolib/skin2icons.cpp @@ -101,7 +101,6 @@ void __fastcall SafeDestroyIcon(HICON* icon)  		*icon = NULL;
  }	}
 -
  // Helper functions to manage Icon resources
  IconSourceFile* IconSourceFile_Get(const TCHAR* file, bool isPath)
 @@ -589,6 +588,25 @@ static INT_PTR IcoLib_RemoveIcon(WPARAM, LPARAM lParam)  	return 1; // Failed
  }
 +void KillModuleIcons(int hLangpack)
 +{
 +	if ( !bModuleInitialized)
 +		return;
 +
 +	mir_cslock lck(csIconList);
 +	for (int i=iconList.getCount()-1; i >= 0; i--) {
 +		IconItem *item = iconList[i];
 +		if ( item->hLangpack == hLangpack) {
 +			IcoLib_FreeIcon(item);
 +			iconList.remove(i);
 +			SAFE_FREE((void**)&item);
 +		}
 +	}
 +}
 +
 +/////////////////////////////////////////////////////////////////////////////////////////
 +// IconItem_GetDefaultIcon
 +
  HICON IconItem_GetDefaultIcon(IconItem* item, bool big)
  {
  	HICON hIcon = NULL;
 @@ -873,4 +891,5 @@ void UnloadIcoLibModule(void)  	sectionList.destroy();
  	SafeDestroyIcon(&hIconBlank);
 +	bModuleInitialized = false;
  }
 diff --git a/src/modules/plugins/newplugins.cpp b/src/modules/plugins/newplugins.cpp index 493c40bf10..237d2140b3 100644 --- a/src/modules/plugins/newplugins.cpp +++ b/src/modules/plugins/newplugins.cpp @@ -66,17 +66,14 @@ MuuidReplacement pluginDefault[] =  static BOOL bModuleInitialized = FALSE;
 -TCHAR   mirandabootini[MAX_PATH];
 +TCHAR  mirandabootini[MAX_PATH];
  static DWORD mirandaVersion;
  static int serviceModeIdx = -1;
 -static pluginEntry * pluginListSM;
 -static pluginEntry * pluginListDb;
 -static pluginEntry * pluginListUI;
 -static pluginEntry * pluginList_freeimg;
 -static pluginEntry * pluginList_crshdmp;
  static HANDLE hPluginListHeap = NULL;
  static int askAboutIgnoredPlugins;
 +static pluginEntry *pluginListSM, *pluginListDb, *pluginListUI, *pluginList_freeimg, *pluginList_crshdmp;
 +
  int  InitIni(void);
  void UninitIni(void);
 @@ -286,6 +283,19 @@ void Plugin_Uninit(pluginEntry* p, bool bDynamic)  		KillModuleEventHooks(p->bpi.hInst);
  		KillModuleServices(p->bpi.hInst);
 +		if (bDynamic) {
 +			int hLangpack = Langpack_GetPluginHandle(p->bpi.pluginInfo);
 +			if (hLangpack != 0) {
 +				KillModuleMenus(hLangpack);
 +				KillModuleFonts(hLangpack);
 +				KillModuleColours(hLangpack);
 +				KillModuleEffects(hLangpack);
 +				KillModuleIcons(hLangpack);
 +				KillModuleHotkeys(hLangpack);
 +				KillModuleSounds(hLangpack);
 +			}
 +		}
 +
  		FreeLibrary(p->bpi.hInst);
  		ZeroMemory(&p->bpi, sizeof(p->bpi));
  	}
 diff --git a/src/modules/skin/hotkeys.cpp b/src/modules/skin/hotkeys.cpp index a36dd152d1..bf939d5716 100644 --- a/src/modules/skin/hotkeys.cpp +++ b/src/modules/skin/hotkeys.cpp @@ -300,6 +300,17 @@ void RegisterHotkeys()  			if (vk) RegisterHotKey(g_hwndHotkeyHost, item->idHotkey, mod, vk);
  }	}	}
 +void KillModuleHotkeys(int hLangpack)
 +{
 +	for (int i=hotkeys.getCount()-1; i >= 0; i--) {
 +		THotkeyItem *item = hotkeys[i];
 +		if (item->hLangpack == hLangpack) {
 +			FreeHotkey(item);
 +			hotkeys.remove(i);
 +		}
 +	}
 +}
 +
  void UnregisterHotkeys()
  {
  	for (int i = 0; i < hotkeys.getCount(); i++) {
 diff --git a/src/modules/skin/sounds.cpp b/src/modules/skin/sounds.cpp index 24b4e44476..05422ffef6 100644 --- a/src/modules/skin/sounds.cpp +++ b/src/modules/skin/sounds.cpp @@ -49,6 +49,21 @@ static int CompareSounds(const SoundItem* p1, const SoundItem* p2)  static OBJLIST<SoundItem> arSounds(10, CompareSounds);
 +///////////////////////////////////////////////////////////////////////////////
 +
 +void KillModuleSounds(int hLangpack)
 +{
 +	for (int i=arSounds.getCount()-1; i >= 0; i--) {
 +		SoundItem& p = arSounds[i];
 +		if (p.hLangpack == hLangpack) {
 +			p.clear();
 +			arSounds.remove(i);
 +		}
 +	}
 +}
 +
 +///////////////////////////////////////////////////////////////////////////////
 +
  static BOOL bModuleInitialized = FALSE;
  static HANDLE hPlayEvent = NULL;
  | 
