summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/AVS/src/main.cpp31
-rw-r--r--plugins/AVS/src/options.cpp100
-rw-r--r--plugins/AVS/src/stdafx.h13
-rw-r--r--plugins/AVS/src/utils.cpp1
-rw-r--r--plugins/AVS/src/version.h6
5 files changed, 82 insertions, 69 deletions
diff --git a/plugins/AVS/src/main.cpp b/plugins/AVS/src/main.cpp
index fd982164a1..2f3577df98 100644
--- a/plugins/AVS/src/main.cpp
+++ b/plugins/AVS/src/main.cpp
@@ -32,7 +32,7 @@ bool g_shutDown = false;
int hLangpack;
-wchar_t g_szDataPath[MAX_PATH]; // user datae path (read at startup only)
+wchar_t g_szDataPath[MAX_PATH]; // user datae path (read at startup only)
BOOL g_AvatarHistoryAvail = FALSE;
HWND hwndSetMyAvatar = nullptr;
@@ -45,10 +45,9 @@ void InitServices();
static int ComparePicture(const protoPicCacheEntry *p1, const protoPicCacheEntry *p2)
{
- if ((mir_strcmp(p1->szProtoname, "Global avatar") == 0) || strstr(p1->szProtoname, "Global avatar"))
- return -1;
- if ((mir_strcmp(p2->szProtoname, "Global avatar") == 0) || strstr(p2->szProtoname, "Global avatar"))
- return 1;
+ if (p1->cacheType != p2->cacheType)
+ return p1->cacheType - p2->cacheType;
+
return mir_strcmp(p1->szProtoname, p2->szProtoname);
}
@@ -122,12 +121,11 @@ static int MetaChanged(WPARAM hMeta, LPARAM hSubContact)
static void LoadDefaultInfo()
{
- protoPicCacheEntry *pce = new protoPicCacheEntry;
+ protoPicCacheEntry *pce = new protoPicCacheEntry(PCE_TYPE_GLOBAL);
if (CreateAvatarInCache(0, pce, AVS_DEFAULT) != 1)
db_unset(0, PPICT_MODULE, AVS_DEFAULT);
pce->szProtoname = mir_strdup(AVS_DEFAULT);
- pce->tszAccName = mir_wstrdup(TranslateT("Global avatar"));
g_ProtoPictures.insert(pce);
}
@@ -139,31 +137,28 @@ static void LoadProtoInfo(PROTOCOLDESCRIPTOR *proto)
char protoName[MAX_PATH];
mir_snprintf(protoName, "Global avatar for %s accounts", proto->szName);
- wchar_t protoNameTmp[MAX_PATH];
- mir_snwprintf(protoNameTmp, TranslateT("Global avatar for %s accounts"), _A2T(proto->szName));
- protoPicCacheEntry *pce = new protoPicCacheEntry;
+ protoPicCacheEntry *pce = new protoPicCacheEntry(PCE_TYPE_PROTO);
if (CreateAvatarInCache(0, pce, protoName) != 1)
db_unset(0, PPICT_MODULE, protoName);
+ pce->pd = proto;
pce->szProtoname = mir_strdup(protoName);
- pce->tszAccName = mir_wstrdup(protoNameTmp);
g_ProtoPictures.insert(pce);
}
static void LoadAccountInfo(PROTOACCOUNT *acc)
{
- protoPicCacheEntry *pce = new protoPicCacheEntry;
+ protoPicCacheEntry *pce = new protoPicCacheEntry(PCE_TYPE_ACCOUNT);
if (CreateAvatarInCache(0, pce, acc->szModuleName) != 1)
db_unset(0, PPICT_MODULE, acc->szModuleName);
+ pce->pa = acc;
pce->szProtoname = mir_strdup(acc->szModuleName);
- pce->tszAccName = mir_wstrdup(acc->tszAccountName);
g_ProtoPictures.insert(pce);
- pce = new protoPicCacheEntry;
+ pce = new protoPicCacheEntry(PCE_TYPE_ACCOUNT);
CreateAvatarInCache(INVALID_CONTACT_ID, pce, acc->szModuleName);
pce->szProtoname = mir_strdup(acc->szModuleName);
- pce->tszAccName = mir_wstrdup(acc->tszAccountName);
g_MyAvatars.insert(pce);
}
@@ -178,8 +173,8 @@ static int OnAccChanged(WPARAM wParam, LPARAM lParam)
case PRAC_REMOVED:
int idx;
- protoPicCacheEntry tmp;
- tmp.szProtoname = mir_strdup(pa->szModuleName);
+ protoPicCacheEntry tmp(PCE_TYPE_ACCOUNT);
+ tmp.szProtoname = pa->szModuleName;
if ((idx = g_ProtoPictures.getIndex(&tmp)) != -1)
g_ProtoPictures.remove(idx);
if ((idx = g_MyAvatars.getIndex(&tmp)) != -1)
@@ -344,7 +339,7 @@ static int ModulesLoaded(WPARAM, LPARAM)
LoadAccountInfo(accs[i]);
// Load global avatar
- protoPicCacheEntry *pce = new protoPicCacheEntry;
+ protoPicCacheEntry *pce = new protoPicCacheEntry(PCE_TYPE_GLOBAL);
CreateAvatarInCache(INVALID_CONTACT_ID, pce, "");
pce->szProtoname = mir_strdup("");
g_MyAvatars.insert(pce);
diff --git a/plugins/AVS/src/options.cpp b/plugins/AVS/src/options.cpp
index c6de060ac0..da93793d14 100644
--- a/plugins/AVS/src/options.cpp
+++ b/plugins/AVS/src/options.cpp
@@ -44,14 +44,15 @@ struct WindowData
HANDLE hHook;
};
-static void RemoveProtoPic(const char *szProto)
+static void RemoveProtoPic(protoPicCacheEntry *pce)
{
- if (szProto == nullptr)
+ if (pce == nullptr)
return;
- db_unset(NULL, PPICT_MODULE, szProto);
+ db_unset(NULL, PPICT_MODULE, pce->szProtoname);
- if (!mir_strcmp(AVS_DEFAULT, szProto)) {
+ // common for all accounts
+ if (pce->cacheType == PCE_TYPE_GLOBAL) {
for (auto &p : g_ProtoPictures) {
if (p->szProtoname == nullptr)
continue;
@@ -63,19 +64,17 @@ static void RemoveProtoPic(const char *szProto)
return;
}
- if (strstr(szProto, "Global avatar for")) {
- CMStringA szProtoname;
- szProtoname = szProto;
- szProtoname.Delete(0, mir_strlen("Global avatar for "));
- szProtoname.Delete(mir_strlen(szProtoname) - mir_strlen(" accounts"), mir_strlen(" accounts"));
+ // common for all accounts of this proto
+ if (pce->cacheType == PCE_TYPE_PROTO) {
for (auto &p : g_ProtoPictures) {
if (p->szProtoname == nullptr)
continue;
+
PROTOACCOUNT *pdescr = Proto_GetAccount(p->szProtoname);
- if (pdescr == nullptr && mir_strcmp(p->szProtoname, szProto))
+ if (pdescr == nullptr && mir_strcmp(p->szProtoname, pce->szProtoname))
continue;
- if (!mir_strcmp(p->szProtoname, szProto) || !mir_strcmp(pdescr->szProtoName, szProtoname)) {
+ if (!mir_strcmp(p->szProtoname, pce->szProtoname) || !mir_strcmp(pdescr->szProtoName, pce->pd->szName)) {
p->clear();
CreateAvatarInCache(0, p, p->szProtoname);
NotifyEventHooks(hEventChanged, 0, (LPARAM)p);
@@ -85,14 +84,14 @@ static void RemoveProtoPic(const char *szProto)
}
for (auto &p : g_ProtoPictures) {
- if (!mir_strcmp(p->szProtoname, szProto)) {
+ if (!mir_strcmp(p->szProtoname, pce->szProtoname)) {
p->clear();
NotifyEventHooks(hEventChanged, 0, (LPARAM)p);
}
}
}
-static void SetProtoPic(char *szProto)
+static void SetProtoPic(protoPicCacheEntry *pce)
{
wchar_t FileName[MAX_PATH], filter[256];
Bitmap_GetFilter(filter, _countof(filter));
@@ -116,49 +115,48 @@ static void SetProtoPic(char *szProto)
wchar_t szNewPath[MAX_PATH];
PathToRelativeW(FileName, szNewPath, g_szDataPath);
- db_set_ws(NULL, PPICT_MODULE, szProto, szNewPath);
+ db_set_ws(NULL, PPICT_MODULE, pce->szProtoname, szNewPath);
- if (!mir_strcmp(AVS_DEFAULT, szProto)) {
+ switch(pce->cacheType) {
+ case PCE_TYPE_GLOBAL:
for (auto &p : g_ProtoPictures) {
if (mir_strlen(p->szProtoname) == 0)
continue;
if (p->hbmPic == nullptr || !mir_strcmp(p->szProtoname, AVS_DEFAULT)) {
- CreateAvatarInCache(0, p, szProto);
+ CreateAvatarInCache(0, p, pce->szProtoname);
NotifyEventHooks(hEventChanged, 0, (LPARAM)p);
}
}
- }
- else if (strstr(szProto, "Global avatar for")) {
- CMStringA szProtoname;
- szProtoname = szProto;
- szProtoname.Delete(0, mir_strlen("Global avatar for "));
- szProtoname.Delete(mir_strlen(szProtoname) - mir_strlen(" accounts"), mir_strlen(" accounts"));
+ break;
+
+ case PCE_TYPE_PROTO:
for (auto &p : g_ProtoPictures) {
PROTOACCOUNT* pdescr = Proto_GetAccount(p->szProtoname);
- if (pdescr == nullptr && mir_strcmp(p->szProtoname, szProto))
+ if (pdescr == nullptr && mir_strcmp(p->szProtoname, pce->szProtoname))
continue;
- if (!mir_strcmp(p->szProtoname, szProto) || !mir_strcmp(pdescr->szProtoName, szProtoname)) {
+ if (!mir_strcmp(p->szProtoname, pce->szProtoname) || !mir_strcmp(pdescr->szProtoName, pce->pd->szName)) {
if (mir_strlen(p->szProtoname) != 0) {
if (p->hbmPic == nullptr) {
- CreateAvatarInCache(0, p, szProto);
+ CreateAvatarInCache(0, p, pce->szProtoname);
NotifyEventHooks(hEventChanged, 0, (LPARAM)p);
}
}
}
}
- }
- else {
+ break;
+
+ default:
for (auto &p : g_ProtoPictures) {
if (mir_strlen(p->szProtoname) == 0)
break;
- if (!mir_strcmp(p->szProtoname, szProto) && mir_strlen(p->szProtoname) == mir_strlen(szProto)) {
+ if (!mir_strcmp(p->szProtoname, pce->szProtoname) && mir_strlen(p->szProtoname) == mir_strlen(pce->szProtoname)) {
if (p->hbmPic != nullptr)
DeleteObject(p->hbmPic);
memset(p, 0, sizeof(AVATARCACHEENTRY));
- CreateAvatarInCache(0, p, szProto);
+ CreateAvatarInCache(0, p, pce->szProtoname);
NotifyEventHooks(hEventChanged, 0, (LPARAM)p);
break;
}
@@ -166,7 +164,7 @@ static void SetProtoPic(char *szProto)
}
}
-static char* g_selectedProto;
+static protoPicCacheEntry *g_selectedProto;
static INT_PTR CALLBACK DlgProcOptionsAvatars(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
@@ -265,7 +263,7 @@ static INT_PTR CALLBACK DlgProcOptionsOwn(HWND hwndDlg, UINT msg, WPARAM, LPARAM
return FALSE;
}
-static char* GetProtoFromList(HWND hwndDlg, int iItem)
+static protoPicCacheEntry* GetProtoFromList(HWND hwndDlg, int iItem)
{
LVITEM item;
item.mask = LVIF_PARAM;
@@ -273,8 +271,7 @@ static char* GetProtoFromList(HWND hwndDlg, int iItem)
if (!ListView_GetItem(GetDlgItem(hwndDlg, IDC_PROTOCOLS), &item))
return nullptr;
- protoPicCacheEntry *pce = (protoPicCacheEntry *)item.lParam;
- return (pce == nullptr) ? nullptr : pce->szProtoname;
+ return (protoPicCacheEntry*)item.lParam;
}
static INT_PTR CALLBACK DlgProcOptionsProtos(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
@@ -295,12 +292,25 @@ static INT_PTR CALLBACK DlgProcOptionsProtos(HWND hwndDlg, UINT msg, WPARAM wPar
lvc.fmt = LVCFMT_IMAGE | LVCFMT_LEFT;
ListView_InsertColumn(hwndList, 0, &lvc);
+ CMStringW tmp;
+
LVITEM item = { 0 };
item.mask = LVIF_TEXT | LVIF_PARAM;
item.iItem = 1000;
for (auto &p : g_ProtoPictures) {
+ switch (p->cacheType) {
+ case PCE_TYPE_ACCOUNT:
+ item.pszText = p->pa->tszAccountName;
+ break;
+ case PCE_TYPE_PROTO:
+ tmp.Format(TranslateT("Global avatar for %s accounts"), _A2T(p->pd->szName).get());
+ item.pszText = tmp.GetBuffer();
+ break;
+ default:
+ item.pszText = TranslateT("Global avatar");
+ break;
+ }
item.lParam = (LPARAM)p;
- item.pszText = p->tszAccName;
int newItem = ListView_InsertItem(hwndList, &item);
if (newItem >= 0)
ListView_SetCheckState(hwndList, newItem,
@@ -319,12 +329,12 @@ static INT_PTR CALLBACK DlgProcOptionsProtos(HWND hwndDlg, UINT msg, WPARAM wPar
case IDC_SETPROTOPIC:
case IDC_REMOVEPROTOPIC:
int iItem = ListView_GetSelectionMark(hwndList);
- char *szProto = GetProtoFromList(hwndDlg, iItem);
- if (szProto) {
+ auto *pce = GetProtoFromList(hwndDlg, iItem);
+ if (pce) {
if (LOWORD(wParam) == IDC_SETPROTOPIC)
- SetProtoPic(szProto);
+ SetProtoPic(pce);
else
- RemoveProtoPic(szProto);
+ RemoveProtoPic(pce);
NMHDR nm = { hwndList, IDC_PROTOCOLS, NM_CLICK };
SendMessage(hwndDlg, WM_NOTIFY, 0, (LPARAM)&nm);
@@ -340,7 +350,7 @@ static INT_PTR CALLBACK DlgProcOptionsProtos(HWND hwndDlg, UINT msg, WPARAM wPar
avdrq.cbSize = sizeof(avdrq);
avdrq.hTargetDC = dis->hDC;
avdrq.dwFlags |= AVDRQ_PROTOPICT;
- avdrq.szProto = g_selectedProto;
+ avdrq.szProto = (g_selectedProto) ? g_selectedProto->szProtoname : 0;
GetClientRect(GetDlgItem(hwndDlg, IDC_PROTOPIC), &avdrq.rcDraw);
CallService(MS_AV_DRAWAVATAR, 0, (LPARAM)&avdrq);
}
@@ -378,7 +388,7 @@ static INT_PTR CALLBACK DlgProcOptionsProtos(HWND hwndDlg, UINT msg, WPARAM wPar
g_selectedProto = GetProtoFromList(hwndDlg, iItem);
if (g_selectedProto) {
DBVARIANT dbv;
- if (!db_get_ws(NULL, PPICT_MODULE, g_selectedProto, &dbv)) {
+ if (!db_get_ws(NULL, PPICT_MODULE, g_selectedProto->szProtoname, &dbv)) {
if (!PathIsAbsoluteW(VARSW(dbv.ptszVal))) {
wchar_t szFinalPath[MAX_PATH];
mir_snwprintf(szFinalPath, L"%%miranda_path%%\\%s", dbv.ptszVal);
@@ -400,19 +410,19 @@ static INT_PTR CALLBACK DlgProcOptionsProtos(HWND hwndDlg, UINT msg, WPARAM wPar
case 0:
if (((LPNMHDR)lParam)->code == PSN_APPLY) {
for (int i = 0; i < ListView_GetItemCount(hwndList); i++) {
- char *szProto = GetProtoFromList(hwndDlg, i);
+ auto *pce = GetProtoFromList(hwndDlg, i);
- BOOL oldVal = db_get_b(NULL, AVS_MODULE, szProto, 1);
+ BOOL oldVal = db_get_b(NULL, AVS_MODULE, pce->szProtoname, 1);
BOOL newVal = ListView_GetCheckState(hwndList, i);
if (oldVal && !newVal)
- for (auto &hContact : Contacts(szProto))
+ for (auto &hContact : Contacts(pce->szProtoname))
DeleteAvatarFromCache(hContact, TRUE);
if (newVal)
- db_set_b(NULL, AVS_MODULE, szProto, 1);
+ db_set_b(NULL, AVS_MODULE, pce->szProtoname, 1);
else
- db_set_b(NULL, AVS_MODULE, szProto, 0);
+ db_set_b(NULL, AVS_MODULE, pce->szProtoname, 0);
}
}
}
diff --git a/plugins/AVS/src/stdafx.h b/plugins/AVS/src/stdafx.h
index 14bdbf935e..596b29fecd 100644
--- a/plugins/AVS/src/stdafx.h
+++ b/plugins/AVS/src/stdafx.h
@@ -27,6 +27,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include <windows.h>
#include <commctrl.h>
#include <time.h>
+#include <malloc.h>
#include <win2k.h>
#include <newpluginapi.h>
@@ -79,15 +80,23 @@ struct CacheNode : public AVATARCACHEENTRY, public MZeroedObject
};
// The same fields as AVATARCACHEENTRY + proto name
+#define PCE_TYPE_GLOBAL 0
+#define PCE_TYPE_PROTO 1
+#define PCE_TYPE_ACCOUNT 2
+
struct protoPicCacheEntry : public AVATARCACHEENTRY, public MZeroedObject
{
- protoPicCacheEntry() { memset(this, 0, sizeof(*this)); };
+ protoPicCacheEntry(int _type) : cacheType(_type) {}
~protoPicCacheEntry();
void clear();
char* szProtoname;
- wchar_t* tszAccName;
+ int cacheType = 0;
+ union {
+ PROTOCOLDESCRIPTOR *pd;
+ PROTOACCOUNT *pa;
+ };
};
extern OBJLIST<protoPicCacheEntry> g_ProtoPictures, g_MyAvatars;
diff --git a/plugins/AVS/src/utils.cpp b/plugins/AVS/src/utils.cpp
index c3b6dcd83a..0fcfc88c4c 100644
--- a/plugins/AVS/src/utils.cpp
+++ b/plugins/AVS/src/utils.cpp
@@ -272,7 +272,6 @@ protoPicCacheEntry::~protoPicCacheEntry()
if (hbmPic != nullptr)
DeleteObject(hbmPic);
mir_free(szProtoname);
- mir_free(tszAccName);
}
void protoPicCacheEntry::clear()
diff --git a/plugins/AVS/src/version.h b/plugins/AVS/src/version.h
index 62074d982d..53b44c9394 100644
--- a/plugins/AVS/src/version.h
+++ b/plugins/AVS/src/version.h
@@ -1,7 +1,7 @@
#define __MAJOR_VERSION 0
-#define __MINOR_VERSION 95
-#define __RELEASE_NUM 3
-#define __BUILD_NUM 4
+#define __MINOR_VERSION 98
+#define __RELEASE_NUM 1
+#define __BUILD_NUM 1
#include <stdver.h>