From 84bb8836befd3d31b22562bb02f4ecf22e92c4a9 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Sat, 10 Aug 2013 20:23:50 +0000 Subject: avatars related code cleaning & reordering git-svn-id: http://svn.miranda-ng.org/main/trunk@5638 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/AVS/src/commonheaders.h | 12 ++ plugins/AVS/src/main.cpp | 362 +++++++++++++--------------------------- plugins/AVS/src/options.cpp | 86 ++++++++-- 3 files changed, 198 insertions(+), 262 deletions(-) (limited to 'plugins/AVS/src') diff --git a/plugins/AVS/src/commonheaders.h b/plugins/AVS/src/commonheaders.h index e35a5270e5..0541a7e53a 100644 --- a/plugins/AVS/src/commonheaders.h +++ b/plugins/AVS/src/commonheaders.h @@ -64,6 +64,17 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +struct CacheNode +{ + CacheNode *pNextNode; + avatarCacheEntry ace; + + BOOL loaded; + int mustLoad; + DWORD dwFlags; + int pa_format; +}; + // The same fields as avatarCacheEntry + proto name struct protoPicCacheEntry : public avatarCacheEntry, public MZeroedObject { @@ -81,6 +92,7 @@ extern OBJLIST g_ProtoPictures, g_MyAvatars; extern FI_INTERFACE *fei; int SetAvatarAttribute(HANDLE hContact, DWORD attrib, int mode); +void DeleteAvatarFromCache(HANDLE, BOOL); #define GAIR_FAILED 1000 diff --git a/plugins/AVS/src/main.cpp b/plugins/AVS/src/main.cpp index 2856a7f85c..bd54f660e6 100644 --- a/plugins/AVS/src/main.cpp +++ b/plugins/AVS/src/main.cpp @@ -67,9 +67,12 @@ char* g_szMetaName = NULL; // Stores the id of the dialog int ChangeAvatar(HANDLE hContact, BOOL fLoad, BOOL fNotifyHist = FALSE, int pa_format = 0); + +int OnDetailsInit(WPARAM wParam, LPARAM lParam); +int OptInit(WPARAM wParam, LPARAM lParam); + static int ShutdownProc(WPARAM wParam, LPARAM lParam); static int OkToExitProc(WPARAM wParam, LPARAM lParam); -static int OnDetailsInit(WPARAM wParam, LPARAM lParam); static int GetFileHash(TCHAR* filename); static DWORD GetFileSize(TCHAR *szFilename); @@ -101,12 +104,7 @@ PLUGININFOEX pluginInfoEx = { {0xe00f1643, 0x263c, 0x4599, {0xb8, 0x4b, 0x5, 0x3e, 0x5c, 0x51, 0x1d, 0x29}} }; -extern INT_PTR CALLBACK DlgProcOptionsAvatars(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); -extern INT_PTR CALLBACK DlgProcOptionsProtos(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); -extern INT_PTR CALLBACK DlgProcOptionsOwn(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); extern INT_PTR CALLBACK DlgProcAvatarOptions(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); -extern INT_PTR CALLBACK DlgProcAvatarUserInfo(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); -extern INT_PTR CALLBACK DlgProcAvatarProtoInfo(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); static int SetProtoMyAvatar(char *protocol, HBITMAP hBmp, TCHAR *originalFilename, int format, BOOL square, BOOL grow); @@ -217,6 +215,9 @@ size_t AVS_pathToAbsolute(const TCHAR *pSrc, TCHAR *pOut) static void NotifyMetaAware(HANDLE hContact, struct CacheNode *node = NULL, AVATARCACHEENTRY *ace = (AVATARCACHEENTRY *)-1) { + if (g_shutDown) + return; + if (ace == (AVATARCACHEENTRY *)-1) ace = &node->ace; @@ -224,11 +225,11 @@ static void NotifyMetaAware(HANDLE hContact, struct CacheNode *node = NULL, AVAT if (g_MetaAvail && (node->dwFlags & MC_ISSUBCONTACT) && db_get_b(NULL, g_szMetaName, "Enabled", 0)) { HANDLE hMasterContact = (HANDLE)db_get_dw(hContact, g_szMetaName, "Handle", 0); - if (hMasterContact && (HANDLE)CallService(MS_MC_GETMOSTONLINECONTACT, (WPARAM)hMasterContact, 0) == hContact && !db_get_b(hMasterContact, "ContactPhoto", "Locked", 0)) NotifyEventHooks(hEventChanged, (WPARAM)hMasterContact, (LPARAM)ace); } + if (node->dwFlags & AVH_MUSTNOTIFY) { // Fire the event for avatar history node->dwFlags &= ~AVH_MUSTNOTIFY; @@ -245,9 +246,9 @@ static void NotifyMetaAware(HANDLE hContact, struct CacheNode *node = NULL, AVAT if (szProto != NULL) { DBVARIANT dbv = {0}; if ( !db_get_s(hContact, szProto, "AvatarHash", &dbv)) { - if (dbv.type == DBVT_TCHAR) { - _tcsncpy(cacn.hash, dbv.ptszVal, SIZEOF(cacn.hash)); - } else if (dbv.type == DBVT_BLOB) { + if (dbv.type == DBVT_TCHAR) + _tcsncpy_s(cacn.hash, SIZEOF(cacn.hash), dbv.ptszVal, _TRUNCATE); + else if (dbv.type == DBVT_BLOB) { // Lets use base64 encode char *tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; int i; @@ -284,8 +285,7 @@ static void NotifyMetaAware(HANDLE hContact, struct CacheNode *node = NULL, AVAT NotifyEventHooks(hEventContactAvatarChanged, (WPARAM)cacn.hContact, (LPARAM)&cacn); } - else - NotifyEventHooks(hEventContactAvatarChanged, (WPARAM)hContact, NULL); + else NotifyEventHooks(hEventContactAvatarChanged, (WPARAM)hContact, NULL); } } @@ -305,11 +305,7 @@ static struct CacheNode *AllocCacheBlock() ZeroMemory((void *)allocedBlock, sizeof(struct CacheNode) * CACHE_BLOCKSIZE); for(int i = 0; i < CACHE_BLOCKSIZE - 1; i++) - { - //InitializeCriticalSection(&allocedBlock[i].cs); allocedBlock[i].pNextNode = &allocedBlock[i + 1]; // pre-link the alloced block - } - //InitializeCriticalSection(&allocedBlock[CACHE_BLOCKSIZE - 1].cs); if (g_Cache == NULL) // first time only... g_Cache = allocedBlock; @@ -327,18 +323,18 @@ static struct CacheNode *AllocCacheBlock() int SetAvatarAttribute(HANDLE hContact, DWORD attrib, int mode) { - struct CacheNode *cacheNode = g_Cache; + struct CacheNode *ρρ = g_Cache; - while(cacheNode) { - if (cacheNode->ace.hContact == hContact) { - DWORD dwFlags = cacheNode->ace.dwFlags; + while(ρρ) { + if (ρρ->ace.hContact == hContact) { + DWORD dwFlags = ρρ->ace.dwFlags; - cacheNode->ace.dwFlags = mode ? cacheNode->ace.dwFlags | attrib : cacheNode->ace.dwFlags & ~attrib; - if (cacheNode->ace.dwFlags != dwFlags) - NotifyMetaAware(hContact, cacheNode); + ρρ->ace.dwFlags = mode ? (ρρ->ace.dwFlags | attrib) : (ρρ->ace.dwFlags & ~attrib); + if (ρρ->ace.dwFlags != dwFlags) + NotifyMetaAware(hContact, ρρ); break; } - cacheNode = cacheNode->pNextNode; + ρρ = ρρ->pNextNode; } return 0; } @@ -421,9 +417,8 @@ int CreateAvatarInCache(HANDLE hContact, avatarCacheEntry *ace, char *szProto) if (szProto == NULL) { char *proto = GetContactProto(hContact); - if (proto == NULL || !db_get_b(NULL, AVS_MODULE, proto, 1)) { + if (proto == NULL || !db_get_b(NULL, AVS_MODULE, proto, 1)) return -1; - } if (db_get_b(hContact, "ContactPhoto", "Locked", 0) && !db_get_ts(hContact, "ContactPhoto", "Backup", &dbv)) { @@ -438,9 +433,7 @@ int CreateAvatarInCache(HANDLE hContact, avatarCacheEntry *ace, char *szProto) AVS_pathToAbsolute(dbv.ptszVal, tszFilename); db_free(&dbv); } - else { - return -2; - } + else return -2; } else { if (hContact == 0) { // create a protocol picture in the proto picture cache @@ -479,11 +472,11 @@ int CreateAvatarInCache(HANDLE hContact, avatarCacheEntry *ace, char *szProto) AVS_pathToAbsolute(dbv.ptszVal, tszFilename); db_free(&dbv); } - else if (ProtoServiceExists(szProto, PS_GETMYAVATART)) { + else if ( ProtoServiceExists(szProto, PS_GETMYAVATART)) { if (CallProtoService(szProto, PS_GETMYAVATART, (WPARAM)tszFilename, (LPARAM)MAX_PATH)) tszFilename[0] = '\0'; } - else if (ProtoServiceExists(szProto, PS_GETMYAVATAR)) { + else if ( ProtoServiceExists(szProto, PS_GETMYAVATAR)) { char szFileName[ MAX_PATH ]; if (CallProtoService(szProto, PS_GETMYAVATAR, (WPARAM)szFileName, (LPARAM)MAX_PATH)) tszFilename[0] = '\0'; @@ -498,13 +491,10 @@ int CreateAvatarInCache(HANDLE hContact, avatarCacheEntry *ace, char *szProto) } } - if ( lstrlen(tszFilename) < 4 ) + if ( lstrlen(tszFilename) < 4) return -1; - TCHAR* tmpPath = Utils_ReplaceVarsT(tszFilename); - mir_sntprintf(tszFilename, SIZEOF(tszFilename), _T("%s"), tmpPath); - mir_free(tmpPath); - + _tcsncpy_s(tszFilename, SIZEOF(tszFilename), VARST(tszFilename), _TRUNCATE); if ((hFile = CreateFile(tszFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) return -2; @@ -534,13 +524,10 @@ int CreateAvatarInCache(HANDLE hContact, avatarCacheEntry *ace, char *szProto) BOOL noTransparency = db_get_b(0, AVS_MODULE, "RemoveAllTransparency", 0); // Calc image hash - if (hContact != 0 && hContact != (HANDLE)-1) - { + if (hContact != 0 && hContact != (HANDLE)-1) { // Have to reset settings? -> do it if image changed DWORD imgHash = GetImgHash(ace->hbmPic); - - if (imgHash != db_get_dw(hContact, "ContactPhoto", "ImageHash", 0)) - { + if (imgHash != db_get_dw(hContact, "ContactPhoto", "ImageHash", 0)) { ResetTranspSettings(hContact); db_set_dw(hContact, "ContactPhoto", "ImageHash", imgHash); } @@ -550,22 +537,19 @@ int CreateAvatarInCache(HANDLE hContact, avatarCacheEntry *ace, char *szProto) && db_get_b(hContact, "ContactPhoto", "MakeTransparentBkg", db_get_b(0, AVS_MODULE, "MakeTransparentBkg", 0))) { - if (MakeTransparentBkg(hContact, &ace->hbmPic)) - { + if (MakeTransparentBkg(hContact, &ace->hbmPic)) { ace->dwFlags |= AVS_CUSTOMTRANSPBKG | AVS_HASTRANSPARENCY; GetObject(ace->hbmPic, sizeof(bminfo), &bminfo); isTransparentImage = TRUE; } } } - else if (hContact == (HANDLE)-1) // My avatars - { + else if (hContact == (HANDLE)-1) { // My avatars if (!noTransparency && !isTransparentImage && db_get_b(0, AVS_MODULE, "MakeTransparentBkg", 0) && db_get_b(0, AVS_MODULE, "MakeMyAvatarsTransparent", 0)) { - if (MakeTransparentBkg(0, &ace->hbmPic)) - { + if (MakeTransparentBkg(0, &ace->hbmPic)) { ace->dwFlags |= AVS_CUSTOMTRANSPBKG | AVS_HASTRANSPARENCY; GetObject(ace->hbmPic, sizeof(bminfo), &bminfo); isTransparentImage = TRUE; @@ -574,27 +558,21 @@ int CreateAvatarInCache(HANDLE hContact, avatarCacheEntry *ace, char *szProto) } if (db_get_b(0, AVS_MODULE, "MakeGrayscale", 0)) - { ace->hbmPic = MakeGrayscale(hContact, ace->hbmPic); - } - if (noTransparency) - { + if (noTransparency) { fei->FI_CorrectBitmap32Alpha(ace->hbmPic, TRUE); isTransparentImage = FALSE; } - if (bminfo.bmBitsPixel == 32 && isTransparentImage) - { + if (bminfo.bmBitsPixel == 32 && isTransparentImage) { if (fei->FI_Premultiply(ace->hbmPic)) - { ace->dwFlags |= AVS_HASTRANSPARENCY; - } + ace->dwFlags |= AVS_PREMULTIPLIED; } - if (szProto) - { + if (szProto) { protoPicCacheEntry *pAce = (protoPicCacheEntry *)ace; if (hContact == 0) pAce->dwFlags |= AVS_PROTOPIC; @@ -611,7 +589,8 @@ int CreateAvatarInCache(HANDLE hContact, avatarCacheEntry *ace, char *szProto) * link a new cache block with the already existing chain of blocks */ -static struct CacheNode *AddToList(struct CacheNode *node) { +static struct CacheNode *AddToList(struct CacheNode *node) +{ struct CacheNode *pCurrent = g_Cache; while(pCurrent->pNextNode != 0) @@ -623,7 +602,8 @@ static struct CacheNode *AddToList(struct CacheNode *node) { struct CacheNode *FindAvatarInCache(HANDLE hContact, BOOL add, BOOL findAny = FALSE) { - struct CacheNode *cacheNode = g_Cache, *foundNode = NULL; + if (g_shutDown) + return NULL; char *szProto = GetContactProto(hContact); if (szProto == NULL || !db_get_b(NULL, AVS_MODULE, szProto, 1)) @@ -631,25 +611,26 @@ struct CacheNode *FindAvatarInCache(HANDLE hContact, BOOL add, BOOL findAny = FA mir_cslock lck(cachecs); - while(cacheNode) { - if (cacheNode->ace.hContact == hContact) { - cacheNode->ace.t_lastAccess = time(NULL); - foundNode = cacheNode->loaded || findAny ? cacheNode : NULL; + struct CacheNode *ρρ = g_Cache, *foundNode = NULL; + while(ρρ) { + if (ρρ->ace.hContact == hContact) { + ρρ->ace.t_lastAccess = time(NULL); + foundNode = ρρ->loaded || findAny ? ρρ : NULL; return foundNode; } // found an empty and usable node - if (foundNode == NULL && cacheNode->ace.hContact == 0) - foundNode = cacheNode; + if (foundNode == NULL && ρρ->ace.hContact == 0) + foundNode = ρρ; - cacheNode = cacheNode->pNextNode; + ρρ = ρρ->pNextNode; } // not found if (!add) return NULL; - if (foundNode == NULL) { // no free entry found, create a new and append it to the list + if (foundNode == NULL) { // no free entry found, create a new and append it to the list mir_cslock all(alloccs); // protect memory block allocation struct CacheNode *newNode = AllocCacheBlock(); AddToList(newNode); @@ -660,8 +641,8 @@ struct CacheNode *FindAvatarInCache(HANDLE hContact, BOOL add, BOOL findAny = FA if (g_MetaAvail) foundNode->dwFlags |= (db_get_b(hContact, g_szMetaName, "IsSubcontact", 0) ? MC_ISSUBCONTACT : 0); foundNode->loaded = FALSE; - foundNode->mustLoad = 1; // pic loader will watch this and load images - SetEvent(hLoaderEvent); // wake him up + foundNode->mustLoad = 1; // pic loader will watch this and load images + SetEvent(hLoaderEvent); // wake him up return NULL; } @@ -697,7 +678,8 @@ static int GetFileHash(TCHAR* filename) remainder = (remainder << 1); } } - } while(dwRead == 1024); + } + while(dwRead == 1024); CloseHandle(hFile); @@ -708,32 +690,24 @@ static int ProtocolAck(WPARAM wParam, LPARAM lParam) { ACKDATA *ack = (ACKDATA *) lParam; - if (ack != NULL && ack->type == ACKTYPE_AVATAR && ack->hContact != 0 - // Ignore metacontacts - && (!g_MetaAvail || strcmp(ack->szModule, g_szMetaName))) - { - if (ack->result == ACKRESULT_SUCCESS) - { + if (ack != NULL && ack->type == ACKTYPE_AVATAR && ack->hContact != 0 && (!g_MetaAvail || strcmp(ack->szModule, g_szMetaName))) { + if (ack->result == ACKRESULT_SUCCESS) { if (ack->hProcess == NULL) ProcessAvatarInfo(ack->hContact, GAIR_NOAVATAR, NULL, ack->szModule); else ProcessAvatarInfo(ack->hContact, GAIR_SUCCESS, (PROTO_AVATAR_INFORMATIONT *) ack->hProcess, ack->szModule); } - else if (ack->result == ACKRESULT_FAILED) - { + else if (ack->result == ACKRESULT_FAILED) { ProcessAvatarInfo(ack->hContact, GAIR_FAILED, (PROTO_AVATAR_INFORMATIONT *) ack->hProcess, ack->szModule); } - else if (ack->result == ACKRESULT_STATUS) - { + else if (ack->result == ACKRESULT_STATUS) { char *szProto = GetContactProto(ack->hContact); - if (szProto == NULL || Proto_NeedDelaysForAvatars(szProto)) - { + if (szProto == NULL || Proto_NeedDelaysForAvatars(szProto)) { // Queue db_set_b(ack->hContact, "ContactPhoto", "NeedUpdate", 1); QueueAdd(ack->hContact); } - else - { + else { // Fetch it now FetchAvatarFor(ack->hContact, szProto); } @@ -1123,7 +1097,7 @@ static int InternalRemoveMyAvatar(char *protocol) int ret = 0; if (protocol != NULL) { - if (ProtoServiceExists(protocol, PS_SETMYAVATAR)) + if ( ProtoServiceExists(protocol, PS_SETMYAVATAR)) ret = SaveAvatar(protocol, NULL); else ret = -3; @@ -1783,23 +1757,15 @@ static void PicLoader(LPVOID param) int result = CreateAvatarInCache(node->ace.hContact, &ace_temp, NULL); - if (result == -2) - { + if (result == -2) { char *szProto = GetContactProto(node->ace.hContact); if (szProto == NULL || Proto_NeedDelaysForAvatars(szProto)) - { QueueAdd(node->ace.hContact); - } - else - { - if (FetchAvatarFor(node->ace.hContact, szProto) == GAIR_SUCCESS) - // Try yo create again - result = CreateAvatarInCache(node->ace.hContact, &ace_temp, NULL); - } + else if (FetchAvatarFor(node->ace.hContact, szProto) == GAIR_SUCCESS) // Try yo create again + result = CreateAvatarInCache(node->ace.hContact, &ace_temp, NULL); } - if ((result == 1 && ace_temp.hbmPic != 0)) // Loaded - { + if (result == 1 && ace_temp.hbmPic != 0) { // Loaded HBITMAP oldPic = node->ace.hbmPic; EnterCriticalSection(&cachecs); @@ -1810,8 +1776,7 @@ static void PicLoader(LPVOID param) DeleteObject(oldPic); NotifyMetaAware(node->ace.hContact, node); } - else if (result == 0 || result == -3) // Has no avatar - { + else if (result == 0 || result == -3) { // Has no avatar HBITMAP oldPic = node->ace.hbmPic; EnterCriticalSection(&cachecs); @@ -1834,11 +1799,11 @@ static void PicLoader(LPVOID param) if (node->ace.hbmPic) DeleteObject(node->ace.hbmPic); ZeroMemory(&node->ace, sizeof(AVATARCACHEENTRY)); - if (node->dwFlags & AVS_DELETENODEFOREVER) { + if (node->dwFlags & AVS_DELETENODEFOREVER) node->dwFlags &= ~AVS_DELETENODEFOREVER; - } else { + else node->ace.hContact = hContact; - } + LeaveCriticalSection(&cachecs); NotifyMetaAware(hContact, node, (AVATARCACHEENTRY *)GetProtoDefaultAvatar(hContact)); } @@ -1870,8 +1835,7 @@ static int MetaChanged(WPARAM wParam, LPARAM lParam) ace = (AVATARCACHEENTRY *)GetProtoDefaultAvatar(hSubContact); QueueAdd(hSubContact); } - else - ace = &node->ace; + else ace = &node->ace; NotifyEventHooks(hEventChanged, (WPARAM)hContact, (LPARAM)ace); return 0; @@ -1879,7 +1843,7 @@ static int MetaChanged(WPARAM wParam, LPARAM lParam) static void LoadDefaultInfo() { - protoPicCacheEntry* pce = new protoPicCacheEntry; + protoPicCacheEntry *pce = new protoPicCacheEntry; if (CreateAvatarInCache(0, pce, AVS_DEFAULT) != 1) db_unset(0, PPICT_MODULE, AVS_DEFAULT); @@ -1890,48 +1854,47 @@ static void LoadDefaultInfo() static void LoadProtoInfo(PROTOCOLDESCRIPTOR* proto) { - if ( proto->type == PROTOTYPE_PROTOCOL && proto->cbSize == sizeof( *proto )) - { - char protoName[MAX_PATH]; - mir_snprintf(protoName, SIZEOF(protoName), "Global avatar for %s accounts", proto->szName); - TCHAR protoNameTmp[MAX_PATH]; - TCHAR *tszName = mir_a2t(proto->szName); - mir_sntprintf(protoNameTmp, SIZEOF(protoNameTmp), TranslateT("Global avatar for %s accounts"), tszName); - protoPicCacheEntry* pce = new protoPicCacheEntry; - if (CreateAvatarInCache(0, pce, protoName) != 1) - db_unset(0, PPICT_MODULE, protoName); + if (proto->type != PROTOTYPE_PROTOCOL || proto->cbSize != sizeof(*proto)) + return; - pce->szProtoname = mir_strdup(protoName); - pce->tszAccName = mir_tstrdup(protoNameTmp); - g_ProtoPictures.insert(pce); - mir_free(tszName); - } + char protoName[MAX_PATH]; + mir_snprintf(protoName, SIZEOF(protoName), "Global avatar for %s accounts", proto->szName); + + TCHAR protoNameTmp[MAX_PATH]; + mir_sntprintf(protoNameTmp, SIZEOF(protoNameTmp), TranslateT("Global avatar for %s accounts"), _A2T(proto->szName)); + protoPicCacheEntry *pce = new protoPicCacheEntry; + if (CreateAvatarInCache(0, pce, protoName) != 1) + db_unset(0, PPICT_MODULE, protoName); + + pce->szProtoname = mir_strdup(protoName); + pce->tszAccName = mir_tstrdup(protoNameTmp); + g_ProtoPictures.insert(pce); } static void LoadAccountInfo( PROTOACCOUNT* acc ) { - protoPicCacheEntry* pce = new protoPicCacheEntry; - if ( CreateAvatarInCache(0, pce, acc->szModuleName ) != 1 ) + protoPicCacheEntry *pce = new protoPicCacheEntry; + if ( CreateAvatarInCache(0, pce, acc->szModuleName) != 1) db_unset(0, PPICT_MODULE, acc->szModuleName); - pce->szProtoname = mir_strdup( acc->szModuleName ); - pce->tszAccName = mir_tstrdup( acc->tszAccountName ); - g_ProtoPictures.insert( pce ); + pce->szProtoname = mir_strdup( acc->szModuleName); + pce->tszAccName = mir_tstrdup( acc->tszAccountName); + g_ProtoPictures.insert(pce); pce = new protoPicCacheEntry; - CreateAvatarInCache((HANDLE)-1, pce, acc->szModuleName ); - pce->szProtoname = mir_strdup( acc->szModuleName ); - pce->tszAccName = mir_tstrdup( acc->tszAccountName ); - g_MyAvatars.insert( pce ); + CreateAvatarInCache((HANDLE)-1, pce, acc->szModuleName); + pce->szProtoname = mir_strdup(acc->szModuleName); + pce->tszAccName = mir_tstrdup(acc->tszAccountName); + g_MyAvatars.insert(pce); } static int OnAccChanged(WPARAM wParam, LPARAM lParam) { - PROTOACCOUNT* pa = ( PROTOACCOUNT* )lParam; + PROTOACCOUNT *pa = (PROTOACCOUNT*)lParam; switch( wParam ) { case PRAC_ADDED: - LoadAccountInfo( pa ); + LoadAccountInfo(pa); break; case PRAC_REMOVED: @@ -1939,9 +1902,9 @@ static int OnAccChanged(WPARAM wParam, LPARAM lParam) int idx; protoPicCacheEntry tmp; tmp.szProtoname = mir_strdup(pa->szModuleName); - if (( idx = g_ProtoPictures.getIndex( &tmp )) != -1 ) + if ((idx = g_ProtoPictures.getIndex( &tmp )) != -1) g_ProtoPictures.remove( idx ); - if (( idx = g_MyAvatars.getIndex( &tmp )) != -1 ) + if ((idx = g_MyAvatars.getIndex( &tmp )) != -1) g_MyAvatars.remove( idx ); } break; @@ -1990,7 +1953,7 @@ static int ModulesLoaded(WPARAM wParam, LPARAM lParam) } // Load global avatar - protoPicCacheEntry* pce = new protoPicCacheEntry; + protoPicCacheEntry *pce = new protoPicCacheEntry; CreateAvatarInCache((HANDLE)-1, pce, ""); pce->szProtoname = mir_strdup(""); g_MyAvatars.insert( pce ); @@ -2078,32 +2041,6 @@ static int ContactSettingChanged(WPARAM wParam, LPARAM lParam) static int ContactDeleted(WPARAM wParam, LPARAM lParam) { DeleteAvatarFromCache((HANDLE)wParam, TRUE); - - return 0; -} - -static int OptInit(WPARAM wParam, LPARAM lParam) -{ - OPTIONSDIALOGPAGE odp = { sizeof(odp) }; - odp.hInstance = g_hInst; - odp.flags = ODPF_BOLDGROUPS; - odp.pszGroup = LPGEN("Contacts"); - odp.pszTitle = LPGEN("Avatars"); - - odp.pszTab = LPGEN("Protocols"); - odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPTIONS_PICTS); - odp.pfnDlgProc = DlgProcOptionsProtos; - Options_AddPage(wParam, &odp); - - odp.pszTab = LPGEN("Contact Avatars"); - odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPTIONS_AVATARS); - odp.pfnDlgProc = DlgProcOptionsAvatars; - Options_AddPage(wParam, &odp); - - odp.pszTab = LPGEN("Own Avatars"); - odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPTIONS_OWN); - odp.pfnDlgProc = DlgProcOptionsOwn; - Options_AddPage(wParam, &odp); return 0; } @@ -2113,10 +2050,6 @@ static int ShutdownProc(WPARAM wParam, LPARAM lParam) SetEvent(hLoaderEvent); SetEvent(hShutdownEvent); CloseHandle(hShutdownEvent); hShutdownEvent = NULL; - - DestroyHookableEvent(hEventChanged); hEventChanged = 0; - DestroyHookableEvent(hEventContactAvatarChanged); hEventContactAvatarChanged = 0; - DestroyHookableEvent(hMyAvatarChanged); hMyAvatarChanged = 0; return 0; } @@ -2273,41 +2206,6 @@ INT_PTR DrawAvatarPicture(WPARAM wParam, LPARAM lParam) return 0; } -static int OnDetailsInit(WPARAM wParam, LPARAM lParam) -{ - HANDLE hContact = (HANDLE) lParam; - if (hContact == NULL) - { - // User dialog - OPTIONSDIALOGPAGE odp = {0}; - odp.cbSize = sizeof(odp); - odp.hIcon = g_hIcon; - odp.hInstance = g_hInst; - odp.pfnDlgProc = DlgProcAvatarProtoInfo; - odp.pszTemplate = MAKEINTRESOURCEA(IDD_PROTO_AVATARS); - odp.pszTitle = LPGEN("Avatar"); - UserInfo_AddPage(wParam, &odp); - } - else - { - char *szProto = GetContactProto(hContact); - if (szProto == NULL || db_get_b(NULL, AVS_MODULE, szProto, 1)) - { - // Contact dialog - OPTIONSDIALOGPAGE odp = {0}; - odp.cbSize = sizeof(odp); - odp.hIcon = g_hIcon; - odp.hInstance = g_hInst; - odp.pfnDlgProc = DlgProcAvatarUserInfo; - odp.position = -2000000000; - odp.pszTemplate = MAKEINTRESOURCEA(IDD_USER_AVATAR); - odp.pszTitle = LPGEN("Avatar"); - UserInfo_AddPage(wParam, &odp); - } - } - return 0; -} - static int LoadAvatarModule() { InitializeCriticalSection(&cachecs); @@ -2401,6 +2299,10 @@ extern "C" int __declspec(dllexport) Unload(void) g_ProtoPictures.destroy(); g_MyAvatars.destroy(); + DestroyHookableEvent(hEventChanged); + DestroyHookableEvent(hEventContactAvatarChanged); + DestroyHookableEvent(hMyAvatarChanged); + CloseHandle(hLoaderEvent); DeleteCriticalSection(&alloccs); DeleteCriticalSection(&cachecs); @@ -2411,10 +2313,10 @@ extern "C" int __declspec(dllexport) Unload(void) protoPicCacheEntry::~protoPicCacheEntry() { - if ( hbmPic != 0 ) - DeleteObject( hbmPic ); - mir_free( szProtoname ); - mir_free( tszAccName ); + if (hbmPic != 0) + DeleteObject(hbmPic); + mir_free(szProtoname); + mir_free(tszAccName); } void protoPicCacheEntry::clear() @@ -2425,32 +2327,9 @@ void protoPicCacheEntry::clear() memset(this, 0, sizeof(avatarCacheEntry)); } -/* -wParam=(int *)max width of avatar - will be set (-1 for no max) -lParam=(int *)max height of avatar - will be set (-1 for no max) -return=0 for sucess -*/ -#define PS_GETMYAVATARMAXSIZE "/GetMyAvatarMaxSize" - -/* -wParam=0 -lParam=0 -return=One of PIP_SQUARE, PIP_FREEPROPORTIONS -*/ -#define PIP_FREEPROPORTIONS 0 -#define PIP_SQUARE 1 -#define PS_GETMYAVATARIMAGEPROPORTION "/GetMyAvatarImageProportion" - -/* -wParam = 0 -lParam = PA_FORMAT_* // avatar format -return = 1 (supported) or 0 (not supported) -*/ -#define PS_ISAVATARFORMATSUPPORTED "/IsAvatarFormatSupported" - BOOL Proto_IsAvatarsEnabled(const char *proto) { - if (ProtoServiceExists(proto, PS_GETAVATARCAPS)) + if ( ProtoServiceExists(proto, PS_GETAVATARCAPS)) return CallProtoService(proto, PS_GETAVATARCAPS, AF_ENABLED, 0); return TRUE; @@ -2458,12 +2337,9 @@ BOOL Proto_IsAvatarsEnabled(const char *proto) BOOL Proto_IsAvatarFormatSupported(const char *proto, int format) { - if (ProtoServiceExists(proto, PS_GETAVATARCAPS)) + if ( ProtoServiceExists(proto, PS_GETAVATARCAPS)) return CallProtoService(proto, PS_GETAVATARCAPS, AF_FORMATSUPPORTED, format); - if (ProtoServiceExists(proto, PS_ISAVATARFORMATSUPPORTED)) - return CallProtoService(proto, PS_ISAVATARFORMATSUPPORTED, 0, format); - if (format >= PA_FORMAT_SWF) return FALSE; @@ -2472,30 +2348,21 @@ BOOL Proto_IsAvatarFormatSupported(const char *proto, int format) int Proto_AvatarImageProportion(const char *proto) { - if (ProtoServiceExists(proto, PS_GETAVATARCAPS)) + if ( ProtoServiceExists(proto, PS_GETAVATARCAPS)) return CallProtoService(proto, PS_GETAVATARCAPS, AF_PROPORTION, 0); - if (ProtoServiceExists(proto, PS_GETMYAVATARIMAGEPROPORTION)) - return CallProtoService(proto, PS_GETMYAVATARIMAGEPROPORTION, 0, 0); - return 0; } void Proto_GetAvatarMaxSize(const char *proto, int *width, int *height) { - if (ProtoServiceExists(proto, PS_GETAVATARCAPS)) - { + if ( ProtoServiceExists(proto, PS_GETAVATARCAPS)) { POINT maxSize; CallProtoService(proto, PS_GETAVATARCAPS, AF_MAXSIZE, (LPARAM) &maxSize); *width = maxSize.y; *height = maxSize.x; } - else if (ProtoServiceExists(proto, PS_GETMYAVATARMAXSIZE)) - { - CallProtoService(proto, PS_GETMYAVATARMAXSIZE, (WPARAM) width, (LPARAM) height); - } - else - { + else { *width = 300; *height = 300; } @@ -2513,8 +2380,7 @@ void Proto_GetAvatarMaxSize(const char *proto, int *width, int *height) BOOL Proto_NeedDelaysForAvatars(const char *proto) { - if (ProtoServiceExists(proto, PS_GETAVATARCAPS)) - { + if ( ProtoServiceExists(proto, PS_GETAVATARCAPS)) { int ret = CallProtoService(proto, PS_GETAVATARCAPS, AF_DONTNEEDDELAYS, 0); if (ret > 0) return FALSE; @@ -2527,7 +2393,7 @@ BOOL Proto_NeedDelaysForAvatars(const char *proto) int Proto_GetAvatarMaxFileSize(const char *proto) { - if (ProtoServiceExists(proto, PS_GETAVATARCAPS)) + if ( ProtoServiceExists(proto, PS_GETAVATARCAPS)) return CallProtoService(proto, PS_GETAVATARCAPS, AF_MAXFILESIZE, 0); return 0; @@ -2535,7 +2401,7 @@ int Proto_GetAvatarMaxFileSize(const char *proto) int Proto_GetDelayAfterFail(const char *proto) { - if (ProtoServiceExists(proto, PS_GETAVATARCAPS)) + if ( ProtoServiceExists(proto, PS_GETAVATARCAPS)) return CallProtoService(proto, PS_GETAVATARCAPS, AF_DELAYAFTERFAIL, 0); return 0; @@ -2543,7 +2409,7 @@ int Proto_GetDelayAfterFail(const char *proto) BOOL Proto_IsFetchingAlwaysAllowed(const char *proto) { - if (ProtoServiceExists(proto, PS_GETAVATARCAPS)) + if ( ProtoServiceExists(proto, PS_GETAVATARCAPS)) return CallProtoService(proto, PS_GETAVATARCAPS, AF_FETCHALWAYS, 0); return FALSE; diff --git a/plugins/AVS/src/options.cpp b/plugins/AVS/src/options.cpp index 3120f43d60..8e7556629d 100644 --- a/plugins/AVS/src/options.cpp +++ b/plugins/AVS/src/options.cpp @@ -37,9 +37,7 @@ extern HICON g_hIcon; extern int CreateAvatarInCache(HANDLE hContact, struct avatarCacheEntry *ace, char *szProto); extern INT_PTR ProtectAvatar(WPARAM wParam, LPARAM lParam); -extern int SetAvatarAttribute(HANDLE hContact, DWORD attrib, int mode); extern int ChangeAvatar(HANDLE hContact, BOOL fLoad, BOOL fNotifyHist = FALSE, int pa_format = 0); -extern void DeleteAvatarFromCache(HANDLE, BOOL); extern HBITMAP LoadPNG(struct avatarCacheEntry *ace, char *szFilename); extern HANDLE GetContactThatHaveTheAvatar(HANDLE hContact, int locked = -1); @@ -188,7 +186,7 @@ static void SetProtoPic(char *szProto) static char* g_selectedProto; -INT_PTR CALLBACK DlgProcOptionsAvatars(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +static INT_PTR CALLBACK DlgProcOptionsAvatars(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: @@ -253,7 +251,9 @@ INT_PTR CALLBACK DlgProcOptionsAvatars(HWND hwndDlg, UINT msg, WPARAM wParam, LP return FALSE; } -INT_PTR CALLBACK DlgProcOptionsOwn(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +///////////////////////////////////////////////////////////////////////////////////////// + +static INT_PTR CALLBACK DlgProcOptionsOwn(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: @@ -289,11 +289,11 @@ static char* GetProtoFromList(HWND hwndDlg, int iItem) if ( !ListView_GetItem( GetDlgItem(hwndDlg, IDC_PROTOCOLS), &item )) return NULL; - protoPicCacheEntry* pce = ( protoPicCacheEntry* )item.lParam; + protoPicCacheEntry *pce = ( protoPicCacheEntry* )item.lParam; return ( pce == NULL ) ? NULL : pce->szProtoname; } -INT_PTR CALLBACK DlgProcOptionsProtos(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +static INT_PTR CALLBACK DlgProcOptionsProtos(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { HWND hwndList = GetDlgItem(hwndDlg, IDC_PROTOCOLS); HWND hwndChoosePic = GetDlgItem(hwndDlg, IDC_SETPROTOPIC); @@ -419,9 +419,9 @@ INT_PTR CALLBACK DlgProcOptionsProtos(HWND hwndDlg, UINT msg, WPARAM wParam, LPA } } break; + case 0: - switch (((LPNMHDR) lParam)->code) { - case PSN_APPLY: + if (((LPNMHDR) lParam)->code == PSN_APPLY) { for (int i = 0; i < ListView_GetItemCount(hwndList); i++) { char *szProto = GetProtoFromList(hwndDlg, i); @@ -444,7 +444,9 @@ INT_PTR CALLBACK DlgProcOptionsProtos(HWND hwndDlg, UINT msg, WPARAM wParam, LPA return FALSE; } -void LoadTransparentData(HWND hwndDlg, HANDLE hContact) +///////////////////////////////////////////////////////////////////////////////////////// + +static void LoadTransparentData(HWND hwndDlg, HANDLE hContact) { CheckDlgButton(hwndDlg, IDC_MAKETRANSPBKG, db_get_b(hContact, "ContactPhoto", "MakeTransparentBkg", db_get_b(0, AVS_MODULE, "MakeTransparentBkg", 0))); SendDlgItemMessage(hwndDlg, IDC_BKG_NUM_POINTS_SPIN, UDM_SETPOS, 0, (LPARAM)db_get_w(hContact, "ContactPhoto", "TranspBkgNumPoints", db_get_w(0, AVS_MODULE, "TranspBkgNumPoints", 5))); @@ -459,7 +461,7 @@ void LoadTransparentData(HWND hwndDlg, HANDLE hContact) EnableWindow(GetDlgItem(hwndDlg, IDC_BKG_COLOR_DIFFERENCE), transp_enabled); } -void SaveTransparentData(HWND hwndDlg, HANDLE hContact) +static void SaveTransparentData(HWND hwndDlg, HANDLE hContact) { BOOL transp = IsDlgButtonChecked(hwndDlg, IDC_MAKETRANSPBKG); if (db_get_b(0, AVS_MODULE, "MakeTransparentBkg", 0) == transp) @@ -480,7 +482,7 @@ void SaveTransparentData(HWND hwndDlg, HANDLE hContact) db_set_w(hContact, "ContactPhoto", "TranspBkgColorDiff", tmp); } -void SaveTransparentData(HWND hwndDlg, HANDLE hContact, BOOL locked) +static void SaveTransparentData(HWND hwndDlg, HANDLE hContact, BOOL locked) { SaveTransparentData(hwndDlg, hContact); @@ -734,7 +736,34 @@ INT_PTR CALLBACK DlgProcAvatarOptions(HWND hwndDlg, UINT msg, WPARAM wParam, LPA return FALSE; } -INT_PTR CALLBACK DlgProcAvatarUserInfo(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +int OptInit(WPARAM wParam, LPARAM lParam) +{ + OPTIONSDIALOGPAGE odp = { sizeof(odp) }; + odp.hInstance = g_hInst; + odp.flags = ODPF_BOLDGROUPS; + odp.pszGroup = LPGEN("Contacts"); + odp.pszTitle = LPGEN("Avatars"); + + odp.pszTab = LPGEN("Protocols"); + odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPTIONS_PICTS); + odp.pfnDlgProc = DlgProcOptionsProtos; + Options_AddPage(wParam, &odp); + + odp.pszTab = LPGEN("Contact Avatars"); + odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPTIONS_AVATARS); + odp.pfnDlgProc = DlgProcOptionsAvatars; + Options_AddPage(wParam, &odp); + + odp.pszTab = LPGEN("Own Avatars"); + odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPTIONS_OWN); + odp.pfnDlgProc = DlgProcOptionsOwn; + Options_AddPage(wParam, &odp); + return 0; +} + +///////////////////////////////////////////////////////////////////////////////////////// + +static INT_PTR CALLBACK DlgProcAvatarUserInfo(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { HANDLE hContact; struct WindowData *dat = (struct WindowData *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); @@ -889,7 +918,9 @@ INT_PTR CALLBACK DlgProcAvatarUserInfo(HWND hwndDlg, UINT msg, WPARAM wParam, LP return FALSE; } -static char * GetSelectedProtocol(HWND hwndDlg) +///////////////////////////////////////////////////////////////////////////////////////// + +static char* GetSelectedProtocol(HWND hwndDlg) { HWND hwndList = GetDlgItem(hwndDlg, IDC_PROTOCOLS); @@ -1005,7 +1036,7 @@ static void EnableDisableProtocols(HWND hwndDlg, BOOL init) } } -INT_PTR CALLBACK DlgProcAvatarProtoInfo(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +static INT_PTR CALLBACK DlgProcAvatarProtoInfo(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_INITDIALOG: @@ -1131,3 +1162,30 @@ INT_PTR CALLBACK DlgProcAvatarProtoInfo(HWND hwndDlg, UINT msg, WPARAM wParam, L } return FALSE; } + +int OnDetailsInit(WPARAM wParam, LPARAM lParam) +{ + OPTIONSDIALOGPAGE odp = { sizeof(odp) }; + odp.hIcon = g_hIcon; + odp.hInstance = g_hInst; + odp.pszTitle = LPGEN("Avatar"); + + HANDLE hContact = (HANDLE)lParam; + if (hContact == NULL) { + // User dialog + odp.pfnDlgProc = DlgProcAvatarProtoInfo; + odp.pszTemplate = MAKEINTRESOURCEA(IDD_PROTO_AVATARS); + UserInfo_AddPage(wParam, &odp); + } + else { + char *szProto = GetContactProto(hContact); + if (szProto == NULL || db_get_b(NULL, AVS_MODULE, szProto, 1)) { + // Contact dialog + odp.pfnDlgProc = DlgProcAvatarUserInfo; + odp.position = -2000000000; + odp.pszTemplate = MAKEINTRESOURCEA(IDD_USER_AVATAR); + UserInfo_AddPage(wParam, &odp); + } + } + return 0; +} -- cgit v1.2.3