summaryrefslogtreecommitdiff
path: root/metacontacts/meta_services.c
diff options
context:
space:
mode:
Diffstat (limited to 'metacontacts/meta_services.c')
-rw-r--r--metacontacts/meta_services.c118
1 files changed, 62 insertions, 56 deletions
diff --git a/metacontacts/meta_services.c b/metacontacts/meta_services.c
index bbf9177..90e8c16 100644
--- a/metacontacts/meta_services.c
+++ b/metacontacts/meta_services.c
@@ -27,7 +27,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "metacontacts.h"
-#define NB_SERVICES 62 //!< Number of services registered in Miranda (see Meta_CloseHandles()).
+#define NB_SERVICES 63 //!< Number of services registered in Miranda (see Meta_CloseHandles()).
#define NB_HOOKS 17 //!< Number of hooks set up (see Meta_CloseHandles()).
#define PREF_METANODB 0x2000 //!< Flag to indicate message should not be added to db by filter when sending
@@ -649,26 +649,25 @@ int Meta_HandleACK(WPARAM wParam, LPARAM lParam)
// change avatar if the most online supporting avatars changes, or if we don't have one
most_online = Meta_GetMostOnlineSupporting(hUser, PFLAGNUM_4, PF4_AVATARS);
- //if(AI.hContact == 0 || AI.hContact != most_online) {
- if(ack->hContact == 0 || ack->hContact != most_online) {
+ if(ack->hContact == NULL || ack->hContact != most_online) {
return 0;
}
- //if(!DBGetContactSetting(AI.hContact, "ContactPhoto", "File", &dbv)) {
- if(!DBGetContactSetting(ack->hContact, "ContactPhoto", "File", &dbv)) {
- DBWriteContactSettingString(hUser, "ContactPhoto", "File", dbv.pszVal);
+ if (!DBGetContactSettingStringUtf(ack->hContact, "ContactPhoto", "File", &dbv)) {
+ DBWriteContactSettingStringUtf(hUser, "ContactPhoto", "File", dbv.pszVal);
DBFreeVariant(&dbv);
}
- if(ack->hProcess) {
- PROTO_AVATAR_INFORMATION AI;
- memcpy(&AI, (PROTO_AVATAR_INFORMATION *)ack->hProcess, sizeof(PROTO_AVATAR_INFORMATION));
- if(AI.hContact)
- AI.hContact = hUser;
+ if (ack->hProcess)
+ {
+ PROTO_AVATAR_INFORMATION *aip = (PROTO_AVATAR_INFORMATION*)ack->hProcess;
+ PROTO_AVATAR_INFORMATION *AI = (PROTO_AVATAR_INFORMATION*)alloca(aip->cbSize);
+ memcpy(AI, aip, aip->cbSize);
+ if (AI->hContact) AI->hContact = hUser;
- return ProtoBroadcastAck(META_PROTO,hUser,ack->type,ack->result, (HANDLE)&AI, ack->lParam);
+ return ProtoBroadcastAck(META_PROTO, hUser, ack->type, ack->result, AI, ack->lParam);
} else
- return ProtoBroadcastAck(META_PROTO,hUser,ack->type,ack->result, 0, ack->lParam);
+ return ProtoBroadcastAck(META_PROTO, hUser, ack->type,ack->result, NULL, ack->lParam);
}
}
@@ -882,18 +881,7 @@ int Meta_SettingChanged(WPARAM wParam, LPARAM lParam)
}
// most online contact with avatar support might have changed - update avatar
- most_online = Meta_GetMostOnlineSupporting(hMeta, PFLAGNUM_4, PF4_AVATARS);
- if(most_online) {
- PROTO_AVATAR_INFORMATION AI;
-
- AI.cbSize = sizeof(AI);
- AI.hContact = hMeta;
- AI.format = PA_FORMAT_UNKNOWN;
- strcpy(AI.filename, "X");
-
- if((int)CallProtoService(META_PROTO, PS_GETAVATARINFO, 0, (LPARAM)&AI) == GAIR_SUCCESS)
- DBWriteContactSettingString(hMeta, "ContactPhoto", "File",AI.filename);
- }
+ Meta_UpdateAvatar(hMeta);
} else
if(strcmp(dcws->szSetting, "XStatusId") == 0 || strcmp(dcws->szSetting, "XStatusMsg") == 0 || strcmp(dcws->szSetting, "XStatusName") == 0 || strcmp(dcws->szSetting, "StatusMsg") == 0) {
@@ -1756,12 +1744,12 @@ INT_PTR Meta_GetAwayMsg(WPARAM wParam, LPARAM lParam) {
return 0; // fail
}
-INT_PTR Meta_GetAvatarInfo(WPARAM wParam, LPARAM lParam) {
- PROTO_AVATAR_INFORMATION *AI = (PROTO_AVATAR_INFORMATION *) lParam;
- char *proto = 0;
- DWORD default_contact_number;
+INT_PTR Meta_GetAvatarInfo(WPARAM wParam, LPARAM lParam)
+{
+ PROTO_AVATAR_INFORMATION *AI = (PROTO_AVATAR_INFORMATION *)lParam;
+ DWORD default_contact_number = DBGetContactSettingDword(AI->hContact, META_PROTO, "Default", -1);
- if((default_contact_number = DBGetContactSettingDword(AI->hContact,META_PROTO,"Default",(DWORD)-1)) == (DWORD)-1)
+ if (default_contact_number == -1)
{
// This is a simple contact
// (this should normally not happen, since linked contacts do not appear on the list.)
@@ -1770,8 +1758,43 @@ INT_PTR Meta_GetAvatarInfo(WPARAM wParam, LPARAM lParam) {
else
{
HANDLE hSub, hMeta;
- char szServiceName[100];
- int result;
+ INT_PTR result;
+ char *proto;
+
+ hMeta = AI->hContact;
+ hSub = Meta_GetMostOnlineSupporting(AI->hContact, PFLAGNUM_4, PF4_AVATARS);
+
+ if(!hSub)
+ return GAIR_NOAVATAR;
+
+ proto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hSub, 0);
+ if (!proto) return GAIR_NOAVATAR;
+
+ AI->hContact = hSub;
+
+ result = CallProtoService(proto, PS_GETAVATARINFO, wParam, lParam);
+ AI->hContact = hMeta;
+ if (result != CALLSERVICE_NOTFOUND) return result;
+ }
+ return GAIR_NOAVATAR; // fail
+}
+
+INT_PTR Meta_GetAvatarInfoW(WPARAM wParam, LPARAM lParam)
+{
+ PROTO_AVATAR_INFORMATIONW *AI = (PROTO_AVATAR_INFORMATIONW *)lParam;
+ DWORD default_contact_number = DBGetContactSettingDword(AI->hContact, META_PROTO, "Default", -1);
+
+ if (default_contact_number == -1)
+ {
+ // This is a simple contact
+ // (this should normally not happen, since linked contacts do not appear on the list.)
+ return 0;
+ }
+ else
+ {
+ HANDLE hSub, hMeta;
+ INT_PTR result;
+ char *proto;
hMeta = AI->hContact;
hSub = Meta_GetMostOnlineSupporting(AI->hContact, PFLAGNUM_4, PF4_AVATARS);
@@ -1780,12 +1803,11 @@ INT_PTR Meta_GetAvatarInfo(WPARAM wParam, LPARAM lParam) {
return GAIR_NOAVATAR;
proto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hSub, 0);
- if(!proto) return GAIR_NOAVATAR;
+ if (!proto) return GAIR_NOAVATAR;
AI->hContact = hSub;
- mir_snprintf(szServiceName, sizeof(szServiceName), "%s%s", proto, PS_GETAVATARINFO);
- result = CallService(szServiceName, wParam, lParam);
+ result = CallProtoService(proto, PS_GETAVATARINFOW, wParam, lParam);
AI->hContact = hMeta;
if (result != CALLSERVICE_NOTFOUND) return result;
}
@@ -1806,23 +1828,9 @@ INT_PTR Meta_GetInfo(WPARAM wParam, LPARAM lParam) {
else
{
HANDLE most_online;
- PROTO_AVATAR_INFORMATION AI;
- char szServiceName[100];
-
- most_online = Meta_GetMostOnlineSupporting(ccs->hContact, PFLAGNUM_4, PF4_AVATARS);
-
- if(!most_online)
- return 0;
+ INT_PTR res;
- proto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)most_online, 0);
- if(!proto) return 0;
-
- AI.cbSize = sizeof(AI);
- AI.hContact = ccs->hContact;
- AI.format = PA_FORMAT_UNKNOWN;
- strcpy(AI.filename, "X");
- if((int)CallProtoService(META_PROTO, PS_GETAVATARINFO, 0, (LPARAM)&AI) == GAIR_SUCCESS)
- DBWriteContactSettingString(ccs->hContact, "ContactPhoto", "File",AI.filename);
+ Meta_UpdateAvatar(ccs->hContact);
most_online = Meta_GetMostOnline(ccs->hContact);
Meta_CopyContactNick(ccs->hContact, most_online);
@@ -1835,11 +1843,8 @@ INT_PTR Meta_GetInfo(WPARAM wParam, LPARAM lParam) {
ccs->hContact = most_online;
//Meta_SetNick(proto);
- _snprintf(szServiceName, sizeof(szServiceName), "%s%s", proto, PSS_GETINFO);
- if (ServiceExists(szServiceName)) {
- strncpy(szServiceName, PSS_GETINFO, sizeof(szServiceName));
- return (int)(CallContactService(ccs->hContact, szServiceName, ccs->wParam, ccs->lParam));
- }
+ res = CallContactService(ccs->hContact, PSS_GETINFO, ccs->wParam, ccs->lParam);
+ if (res != CALLSERVICE_NOTFOUND) return res;
}
return 0; // fail
}
@@ -2041,6 +2046,7 @@ void Meta_InitServices()
hServices[60] = CreateServiceFunction("MetaContacts/CListMessageEvent", Meta_ClistMessageEventClicked);
hServices[61] = CreateProtoServiceFunction(META_PROTO, "/SendNudge", Meta_SendNudge);
+ hServices[62] = CreateProtoServiceFunction(META_PROTO,PS_GETAVATARINFOW,Meta_GetAvatarInfoW);
// create our hookable events
hEventDefaultChanged = CreateHookableEvent(ME_MC_DEFAULTTCHANGED);