void ProcessAvatarInfo(MCONTACT hContact, int type, PROTO_AVATAR_INFORMATIONT *pai, const char *szProto) { QueueRemove(hContact); if (type == GAIR_SUCCESS) { if (pai == NULL) return; // Fix settings in DB db_unset(hContact, "ContactPhoto", "NeedUpdate"); db_unset(hContact, "ContactPhoto", "RFile"); if (!db_get_b(hContact, "ContactPhoto", "Locked", 0)) db_unset(hContact, "ContactPhoto", "Backup"); db_set_ts(hContact, "ContactPhoto", "File", pai->filename); db_set_w(hContact, "ContactPhoto", "Format", pai->format); if (pai->format == PA_FORMAT_PNG || pai->format == PA_FORMAT_JPEG || pai->format == PA_FORMAT_ICON || pai->format == PA_FORMAT_BMP || pai->format == PA_FORMAT_GIF) { // We can load it! MakePathRelative(hContact, pai->filename); ChangeAvatar(hContact, TRUE, TRUE, pai->format); } else // As we can't load it, notify but don't load ChangeAvatar(hContact, FALSE, TRUE, pai->format); } else if (type == GAIR_NOAVATAR) { db_unset(hContact, "ContactPhoto", "NeedUpdate"); if (db_get_b(NULL, AVS_MODULE, "RemoveAvatarWhenContactRemoves", 1)) { // Delete settings db_unset(hContact, "ContactPhoto", "RFile"); if (!db_get_b(hContact, "ContactPhoto", "Locked", 0)) db_unset(hContact, "ContactPhoto", "Backup"); db_unset(hContact, "ContactPhoto", "File"); db_unset(hContact, "ContactPhoto", "Format"); // Fix cache ChangeAvatar(hContact, FALSE, TRUE, 0); } } else if (type == GAIR_FAILED) { int wait = Proto_GetDelayAfterFail(szProto); if (wait > 0) { // Reschedule to request after needed time (and avoid requests before that) mir_cslock lock(cs); QueueRemove(hContact); QueueAdd(hContact, wait); } } }
static INT_PTR avSetAvatar(MCONTACT hContact, TCHAR *tszPath) { TCHAR FileName[MAX_PATH]; TCHAR *szFinalName; BYTE locking_request; if (hContact == NULL || fei == NULL) return 0; int is_locked = db_get_b(hContact, "ContactPhoto", "Locked", 0); if (tszPath == NULL) { OPENFILENAME ofn = { 0 }; TCHAR filter[256]; filter[0] = '\0'; CallService(MS_UTILS_GETBITMAPFILTERSTRINGST, SIZEOF(filter), (LPARAM)filter); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = 0; ofn.lpstrFile = FileName; ofn.lpstrFilter = filter; ofn.nMaxFile = MAX_PATH; ofn.nMaxFileTitle = MAX_PATH; ofn.Flags = OFN_FILEMUSTEXIST | OFN_ENABLETEMPLATE | OFN_EXPLORER | OFN_ENABLESIZING | OFN_ENABLEHOOK; ofn.lpstrInitialDir = _T("."); *FileName = '\0'; ofn.lpstrDefExt = _T(""); ofn.hInstance = g_hInst; ofn.lpTemplateName = MAKEINTRESOURCE(IDD_OPENSUBCLASS); ofn.lpfnHook = OpenFileSubclass; locking_request = is_locked; ofn.lCustData = (LPARAM)&locking_request; if (!GetOpenFileName(&ofn)) return 0; szFinalName = FileName; is_locked = locking_request ? 1 : is_locked; } else szFinalName = tszPath; // filename is now set, check it and perform all needed action if (_taccess(szFinalName, 4) == -1) return 0; // file exists... TCHAR szBackupName[MAX_PATH]; PathToRelativeT(szFinalName, szBackupName, g_szDataPath); db_set_ts(hContact, "ContactPhoto", "Backup", szBackupName); db_set_b(hContact, "ContactPhoto", "Locked", is_locked); db_set_ts(hContact, "ContactPhoto", "File", szFinalName); MakePathRelative(hContact, szFinalName); // Fix cache ChangeAvatar(hContact, true); return 0; }
INT_PTR ProtectAvatar(WPARAM hContact, LPARAM lParam) { BYTE was_locked = db_get_b(hContact, "ContactPhoto", "Locked", 0); if (fei == NULL || was_locked == (BYTE)lParam) // no need for redundant lockings... return 0; if (hContact) { if (!was_locked) MakePathRelative(hContact); db_set_b(hContact, "ContactPhoto", "Locked", lParam ? 1 : 0); if (lParam == 0) MakePathRelative(hContact); ChangeAvatar(hContact, true); } return 0; }
static INT_PTR avSetAvatar(HANDLE hContact, TCHAR *tszPath) { BYTE is_locked = 0; TCHAR FileName[MAX_PATH], szBackupName[MAX_PATH]; TCHAR *szFinalName = NULL; HANDLE hFile = 0; BYTE locking_request; if (hContact == NULL || fei == NULL) return 0; is_locked = db_get_b(hContact, "ContactPhoto", "Locked", 0); if ( tszPath == NULL ) { OPENFILENAME ofn = {0}; TCHAR filter[256]; filter[0] = '\0'; CallService(MS_UTILS_GETBITMAPFILTERSTRINGST, SIZEOF(filter), ( LPARAM )filter); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = 0; ofn.lpstrFile = FileName; ofn.lpstrFilter = filter; ofn.nMaxFile = MAX_PATH; ofn.nMaxFileTitle = MAX_PATH; ofn.Flags = OFN_FILEMUSTEXIST | OFN_ENABLETEMPLATE | OFN_EXPLORER | OFN_ENABLESIZING | OFN_ENABLEHOOK; ofn.lpstrInitialDir = _T("."); *FileName = '\0'; ofn.lpstrDefExt = _T(""); ofn.hInstance = g_hInst; ofn.lpTemplateName = MAKEINTRESOURCE(IDD_OPENSUBCLASS); ofn.lpfnHook = OpenFileSubclass; locking_request = is_locked; ofn.lCustData = (LPARAM)&locking_request; if (GetOpenFileName(&ofn)) { szFinalName = FileName; is_locked = locking_request ? 1 : is_locked; } else return 0; } else szFinalName = tszPath; /* * filename is now set, check it and perform all needed action */ if ((hFile = CreateFile(szFinalName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) return 0; // file exists... CloseHandle(hFile); AVS_pathToRelative(szFinalName, szBackupName); db_set_ts(hContact, "ContactPhoto", "Backup", szBackupName); db_set_b(hContact, "ContactPhoto", "Locked", is_locked); db_set_ts(hContact, "ContactPhoto", "File", szFinalName); MakePathRelative(hContact, szFinalName); // Fix cache ChangeAvatar(hContact, TRUE); return 0; }