purple: add support for latest appstreamcli
[siplcs.git] / src / miranda / miranda-buddy.c
blob37ae6f1e6eee9b279c59a19a49cda80ba0c6a262
1 /**
2 * @file miranda-buddy.c
4 * pidgin-sipe
6 * Copyright (C) 2010-2018 SIPE Project <http://sipe.sourceforge.net/>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #include <windows.h>
24 #include <stdio.h>
26 #include <glib.h>
28 #include "miranda-version.h"
29 #include "newpluginapi.h"
30 #include "m_protosvc.h"
31 #include "m_protoint.h"
32 #include "m_protomod.h"
33 #include "m_database.h"
34 #include "m_clist.h"
36 #include "sipe-common.h"
37 #include "sipe-backend.h"
38 #include "sipe-core.h"
39 #include "miranda-private.h"
41 #define ADD_PROP(key,value) g_hash_table_insert(info_to_property_table, (gpointer)key, value)
43 static GHashTable *info_to_property_table = NULL;
45 static void
46 init_property_hash(void)
48 info_to_property_table = g_hash_table_new(NULL, NULL);
50 // ADD_PROP(SIPE_BUDDY_INFO_DISPLAY_NAME, ALIAS_PROP);
51 ADD_PROP(SIPE_BUDDY_INFO_EMAIL , "e-mail");
52 ADD_PROP(SIPE_BUDDY_INFO_WORK_PHONE , "CompanyPhone");
53 // ADD_PROP(SIPE_BUDDY_INFO_WORK_PHONE_DISPLAY, PHONE_DISPLAY_PROP);
54 // ADD_PROP(SIPE_BUDDY_INFO_SITE , SITE_PROP);
55 ADD_PROP(SIPE_BUDDY_INFO_COMPANY , "Company");
56 ADD_PROP(SIPE_BUDDY_INFO_DEPARTMENT , "CompanyDepartment");
57 ADD_PROP(SIPE_BUDDY_INFO_JOB_TITLE , "CompanyPosition");
58 // ADD_PROP(SIPE_BUDDY_INFO_OFFICE , OFFICE_PROP);
59 ADD_PROP(SIPE_BUDDY_INFO_STREET , "CompanyStreet");
60 ADD_PROP(SIPE_BUDDY_INFO_CITY , "CompanyCity");
61 ADD_PROP(SIPE_BUDDY_INFO_STATE , "CompanyState");
62 ADD_PROP(SIPE_BUDDY_INFO_ZIPCODE , "CompanyZIP");
63 ADD_PROP(SIPE_BUDDY_INFO_COUNTRY , "CompanyCountry");
65 /* Summary values:
66 SetValue(hwndDlg,IDC_NICK,hContact,szProto,"Nick",0);
67 SetValue(hwndDlg,IDC_FIRSTNAME,hContact,szProto,"FirstName",0);
68 SetValue(hwndDlg,IDC_LASTNAME,hContact,szProto,"LastName",0);
69 SetValue(hwndDlg,IDC_EMAIL,hContact,szProto,"e-mail",0);
70 SetValue(hwndDlg,IDC_AGE,hContact,szProto,"Age",SVS_ZEROISUNSPEC);
71 SetValue(hwndDlg,IDC_GENDER,hContact,szProto,"Gender",SVS_GENDER);
72 SetValue(hwndDlg,IDC_DOBDAY,hContact,szProto,"BirthDay",0);
73 SetValue(hwndDlg,IDC_DOBMONTH,hContact,szProto,"BirthMonth",SVS_MONTH);
74 SetValue(hwndDlg,IDC_DOBYEAR,hContact,szProto,"BirthYear",0);
76 Location values:
77 SetValue(hwndDlg,IDC_STREET,hContact,szProto,"Street",SVS_ZEROISUNSPEC);
78 SetValue(hwndDlg,IDC_CITY,hContact,szProto,"City",SVS_ZEROISUNSPEC);
79 SetValue(hwndDlg,IDC_STATE,hContact,szProto,"State",SVS_ZEROISUNSPEC);
80 SetValue(hwndDlg,IDC_ZIP,hContact,szProto,"ZIP",SVS_ZEROISUNSPEC);
81 SetValue(hwndDlg,IDC_COUNTRY,hContact,szProto,"Country",SVS_COUNTRY);
82 SetValue(hwndDlg,IDC_LANGUAGE1,hContact,szProto,"Language1",SVS_ZEROISUNSPEC);
83 SetValue(hwndDlg,IDC_LANGUAGE2,hContact,szProto,"Language2",SVS_ZEROISUNSPEC);
84 SetValue(hwndDlg,IDC_LANGUAGE3,hContact,szProto,"Language3",SVS_ZEROISUNSPEC);
85 SetValue(hwndDlg,IDC_TIMEZONE,hContact,szProto,"Timezone",SVS_TIMEZONE);
87 Work values:
88 SetValue(hwndDlg,IDC_COMPANY,hContact,szProto,"Company",SVS_ZEROISUNSPEC);
89 SetValue(hwndDlg,IDC_DEPARTMENT,hContact,szProto,"CompanyDepartment",SVS_ZEROISUNSPEC);
90 SetValue(hwndDlg,IDC_POSITION,hContact,szProto,"CompanyPosition",SVS_ZEROISUNSPEC);
91 SetValue(hwndDlg,IDC_STREET,hContact,szProto,"CompanyStreet",SVS_ZEROISUNSPEC);
92 SetValue(hwndDlg,IDC_CITY,hContact,szProto,"CompanyCity",SVS_ZEROISUNSPEC);
93 SetValue(hwndDlg,IDC_STATE,hContact,szProto,"CompanyState",SVS_ZEROISUNSPEC);
94 SetValue(hwndDlg,IDC_ZIP,hContact,szProto,"CompanyZIP",SVS_ZEROISUNSPEC);
95 SetValue(hwndDlg,IDC_COUNTRY,hContact,szProto,"CompanyCountry",SVS_COUNTRY);
96 SetValue(hwndDlg,IDC_WEBPAGE,hContact,szProto,"CompanyHomepage",SVS_ZEROISUNSPEC);
98 Background:
99 SetValue(hwndDlg,IDC_WEBPAGE,hContact,szProto,"Homepage",SVS_ZEROISUNSPEC);
101 Contact:
102 if(DBGetContactSettingTString(hContact,szProto,"e-mail",&dbv))
103 mir_snprintf(idstr, SIZEOF(idstr), "e-mail%d", i );
104 mir_snprintf(idstr, SIZEOF(idstr), "Mye-mail%d",i);
105 if(!DBGetContactSettingTString(hContact,szProto,"Phone",&dbv)) {
106 if(!DBGetContactSettingTString(hContact,szProto,"Fax",&dbv)) {
107 if(!DBGetContactSettingTString(hContact,szProto,"Cellular",&dbv)) {
108 if(!DBGetContactSettingTString(hContact,szProto,"CompanyPhone",&dbv)) {
109 if(!DBGetContactSettingTString(hContact,szProto,"CompanyFax",&dbv)) {
110 mir_snprintf(idstr, SIZEOF(idstr), "MyPhone%d",i);
115 static const gchar *
116 sipe_info_to_miranda_property(sipe_buddy_info_fields info)
118 if (!info_to_property_table)
119 init_property_hash();
120 return (const char *)g_hash_table_lookup(info_to_property_table, (gconstpointer)info);
123 sipe_backend_buddy sipe_miranda_buddy_find(SIPPROTO *pr,
124 const gchar *name,
125 const gchar *group)
127 HANDLE hContact;
129 hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0);
130 while (hContact) {
131 gchar* szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
132 if (szProto != NULL && !lstrcmpA(szProto, pr->proto.m_szModuleName)) {
133 DBVARIANT dbv;
134 if ( !DBGetContactSettingString( hContact, pr->proto.m_szModuleName, SIP_UNIQUEID, &dbv )) {
135 int tCompareResult = lstrcmpiA( dbv.pszVal, name );
136 DBFreeVariant( &dbv );
137 if ( !tCompareResult ) {
138 if (!group)
140 SIPE_DEBUG_INFO("buddy_name <%s> group <%s> found <%08x>", name, group, hContact);
141 return hContact;
144 if ( !DBGetContactSettingStringUtf(hContact, "CList", "Group", &dbv )) {
145 int tCompareResult = lstrcmpiA( dbv.pszVal, group );
146 DBFreeVariant( &dbv );
147 if ( !tCompareResult )
149 SIPE_DEBUG_INFO("buddy_name <%s> group <%s> found <%08x> in group", name, group, hContact);
150 return hContact;
152 } else {
153 SIPE_DEBUG_INFO("buddy_name <%s> group <%s> ERROR getting contact group", name, group);
154 return NULL;
159 hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0);
162 SIPE_DEBUG_INFO("buddy_name <%s> group <%s> NOT FOUND", name, group);
163 return NULL;
165 sipe_backend_buddy sipe_backend_buddy_find(struct sipe_core_public *sipe_public,
166 const gchar *name,
167 const gchar *group)
169 return sipe_miranda_buddy_find(sipe_public->backend_private, name, group);
172 GSList* sipe_miranda_buddy_find_all(SIPPROTO *pr,
173 const gchar *buddy_name,
174 const gchar *group_name)
176 GSList *res = NULL;
177 HANDLE hContact;
179 hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0);
180 while (hContact) {
181 gchar* szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
182 if (szProto != NULL && !lstrcmpA(szProto, pr->proto.m_szModuleName)) {
183 if (DBGetContactSettingByte(hContact, pr->proto.m_szModuleName, "ChatRoom", 0) == 0) {
184 DBVARIANT dbv;
185 if (!buddy_name)
186 res = g_slist_append(res, hContact);
187 else if ( !DBGetContactSettingString( hContact, pr->proto.m_szModuleName, SIP_UNIQUEID, &dbv )) {
188 int tCompareResult = lstrcmpiA( dbv.pszVal, buddy_name );
189 DBFreeVariant( &dbv );
190 if ( !tCompareResult ) {
191 if (!group_name)
192 res = g_slist_append(res, hContact);
194 else if ( !DBGetContactSettingStringUtf(hContact, "CList", "Group", &dbv )) {
195 int tCompareResult = lstrcmpiA( dbv.pszVal, group_name );
196 DBFreeVariant( &dbv );
197 if ( !tCompareResult )
198 res = g_slist_append(res, hContact);
201 } else {
202 SIPE_DEBUG_INFO_NOFORMAT("Could not get SIP id from contact");
206 hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0);
209 SIPE_DEBUG_INFO("name <%s> group <%s> found <%d> buddies", buddy_name, group_name, g_slist_length(res));
210 return res;
213 GSList* sipe_backend_buddy_find_all(struct sipe_core_public *sipe_public,
214 const gchar *buddy_name,
215 const gchar *group_name)
217 return sipe_miranda_buddy_find_all(sipe_public->backend_private, buddy_name, group_name);
220 gchar* sipe_backend_buddy_get_name(struct sipe_core_public *sipe_public,
221 const sipe_backend_buddy who)
223 DBVARIANT dbv;
224 HANDLE hContact = (HANDLE)who;
225 gchar *alias;
226 SIPPROTO *pr = sipe_public->backend_private;
227 const gchar *module = pr->proto.m_szModuleName;
229 if ( !DBGetContactSettingString( hContact, module, SIP_UNIQUEID, &dbv )) {
230 alias = g_strdup(dbv.pszVal);
231 DBFreeVariant( &dbv );
232 return alias;
235 return NULL;
238 gchar* sipe_backend_buddy_get_alias(struct sipe_core_public *sipe_public,
239 const sipe_backend_buddy who)
241 DBVARIANT dbv;
242 HANDLE hContact = (HANDLE)who;
243 gchar *alias;
244 SIPPROTO *pr = sipe_public->backend_private;
245 const gchar *module = pr->proto.m_szModuleName;
247 if ( DBGetContactSettingString( hContact, module, "Nick", &dbv )
248 && DBGetContactSettingString( hContact, module, "Alias", &dbv )
249 && DBGetContactSettingString( hContact, module, SIP_UNIQUEID, &dbv ))
250 return NULL;
252 alias = g_strdup(dbv.pszVal);
253 DBFreeVariant( &dbv );
254 return alias;
257 gchar* sipe_backend_buddy_get_server_alias(struct sipe_core_public *sipe_public,
258 const sipe_backend_buddy who)
260 DBVARIANT dbv;
261 HANDLE hContact = (HANDLE)who;
262 char *alias;
263 SIPPROTO *pr = sipe_public->backend_private;
264 const gchar *module = pr->proto.m_szModuleName;
266 if ( !DBGetContactSettingString( hContact, module, "Alias", &dbv )) {
267 alias = g_strdup(dbv.pszVal);
268 DBFreeVariant( &dbv );
269 return alias;
272 return NULL;
275 gchar* sipe_backend_buddy_get_local_alias(struct sipe_core_public *sipe_public,
276 const sipe_backend_buddy who)
278 DBVARIANT dbv;
279 HANDLE hContact = (HANDLE)who;
280 char *alias;
281 SIPPROTO *pr = sipe_public->backend_private;
282 const gchar *module = pr->proto.m_szModuleName;
284 if ( DBGetContactSettingString( hContact, module, "Nick", &dbv )
285 && DBGetContactSettingString( hContact, module, SIP_UNIQUEID, &dbv ))
286 return NULL;
288 alias = g_strdup(dbv.pszVal);
289 DBFreeVariant( &dbv );
290 return alias;
293 gchar* sipe_backend_buddy_get_group_name(struct sipe_core_public *sipe_public,
294 const sipe_backend_buddy who)
296 DBVARIANT dbv;
297 HANDLE hContact = (HANDLE)who;
298 gchar *alias;
299 SIPPROTO *pr = sipe_public->backend_private;
300 const gchar *module = pr->proto.m_szModuleName;
302 if ( !DBGetContactSettingString( hContact, "CList", "Group", &dbv )) {
303 alias = g_strdup(dbv.pszVal);
304 DBFreeVariant( &dbv );
305 return alias;
308 return NULL;
311 guint sipe_backend_buddy_get_status(struct sipe_core_public *sipe_public,
312 const gchar *uri)
314 SIPPROTO *pr = sipe_public->backend_private;
315 sipe_backend_buddy buddy = sipe_backend_buddy_find(sipe_public, uri, NULL);
316 WORD rv = SIPE_ACTIVITY_UNSET;
318 sipe_miranda_getWord(pr, buddy, "Status", &rv);
319 return MirandaStatusToSipe(rv);
322 void sipe_backend_buddy_set_alias(struct sipe_core_public *sipe_public,
323 const sipe_backend_buddy who,
324 const gchar *alias)
326 SIPPROTO *pr = sipe_public->backend_private;
327 HANDLE hContact = (HANDLE)who;
329 SIPE_DEBUG_INFO("Set alias of contact <%08x> to <%s>", who, alias);
330 sipe_miranda_setContactStringUtf( pr, hContact, "Nick", alias );
333 void sipe_backend_buddy_set_server_alias(struct sipe_core_public *sipe_public,
334 const sipe_backend_buddy who,
335 const gchar *alias)
337 HANDLE hContact = (HANDLE)who;
338 SIPPROTO *pr = sipe_public->backend_private;
340 SIPE_DEBUG_INFO("Set alias of contact <%08x> to <%s>", who, alias);
341 sipe_miranda_setContactStringUtf( pr, hContact, "Alias", alias );
344 gchar* sipe_backend_buddy_get_string(struct sipe_core_public *sipe_public,
345 sipe_backend_buddy buddy,
346 const sipe_buddy_info_fields key)
348 SIPPROTO *pr = sipe_public->backend_private;
349 const gchar *module = pr->proto.m_szModuleName;
350 const gchar *prop_name = sipe_info_to_miranda_property(key);
351 char *tmp;
352 char *prop_str;
354 if (!prop_name)
355 return NULL;
357 tmp = sipe_miranda_getContactString(pr, buddy, prop_name);
358 prop_str = g_strdup(tmp);
359 mir_free(tmp);
361 return prop_str;
364 void sipe_backend_buddy_set_string(struct sipe_core_public *sipe_public,
365 sipe_backend_buddy buddy,
366 const sipe_buddy_info_fields key,
367 const gchar *val)
369 SIPPROTO *pr = sipe_public->backend_private;
370 const gchar *module = pr->proto.m_szModuleName;
371 const gchar *prop_name = sipe_info_to_miranda_property(key);
373 SIPE_DEBUG_INFO("buddy <%08x> key <%d = %s> val <%s>", buddy, key, prop_name, val);
374 if (!prop_name)
375 return;
377 sipe_miranda_setContactString(pr, buddy, prop_name, val);
380 void sipe_backend_buddy_refresh_properties(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
381 SIPE_UNUSED_PARAMETER const gchar *uri,
382 SIPE_UNUSED_PARAMETER last_active)
384 /* nothing to do here: already taken care of by Miranda */
387 void sipe_backend_buddy_list_processing_start(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public)
391 void sipe_backend_buddy_list_processing_finish(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public)
395 sipe_backend_buddy sipe_backend_buddy_add(struct sipe_core_public *sipe_public,
396 const gchar *name,
397 const gchar *alias,
398 const gchar *groupname)
400 SIPPROTO *pr = sipe_public->backend_private;
401 HANDLE hContact;
403 SIPE_DEBUG_INFO("Adding miranda contact for buddy <%s> alias <%s> in <%s>", name, alias, groupname);
404 hContact = ( HANDLE )CallService( MS_DB_CONTACT_ADD, 0, 0 );
405 CallService( MS_PROTO_ADDTOCONTACT, ( WPARAM )hContact,( LPARAM )pr->proto.m_szModuleName );
406 sipe_miranda_setContactString( pr, hContact, SIP_UNIQUEID, name ); // name
407 if (alias) sipe_miranda_setContactStringUtf( pr, hContact, "Nick", alias );
408 DBWriteContactSettingString( hContact, "CList", "Group", groupname );
409 sipe_miranda_setContactString( pr, hContact, "Group", groupname );
410 return (sipe_backend_buddy)hContact;
413 void sipe_backend_buddy_remove(struct sipe_core_public *sipe_public,
414 const sipe_backend_buddy who)
416 CallService( MS_DB_CONTACT_DELETE, (WPARAM)who, 0 );
419 void sipe_backend_buddy_request_authorization(struct sipe_core_public *sipe_public,
420 const gchar *who,
421 const gchar *alias,
422 gboolean on_list,
423 sipe_backend_buddy_request_authorization_cb auth_cb,
424 sipe_backend_buddy_request_authorization_cb deny_cb,
425 void *data)
427 SIPPROTO *pr = sipe_public->backend_private;
428 CCSDATA ccs;
429 PROTORECVEVENT pre = {0};
430 HANDLE hContact;
431 BYTE *pblob;
433 hContact = sipe_backend_buddy_find( sipe_public, who, NULL );
434 if (!hContact)
436 SIPE_DEBUG_INFO("Adding miranda contact for incoming talker <%s>", who);
437 hContact = ( HANDLE )CallService( MS_DB_CONTACT_ADD, 0, 0 );
438 CallService( MS_PROTO_ADDTOCONTACT, ( WPARAM )hContact,( LPARAM )pr->proto.m_szModuleName );
439 DBWriteContactSettingByte( hContact, "CList", "NotOnList", 1 );
440 sipe_miranda_setContactString( pr, hContact, SIP_UNIQUEID, who ); // name
443 ccs.szProtoService = PSR_AUTH;
444 ccs.hContact = hContact;
445 ccs.wParam = 0;
446 ccs.lParam = (LPARAM) &pre;
448 pre.flags = PREF_UTF;
449 pre.timestamp = time(NULL);
450 pre.lParam = sizeof(DWORD)+sizeof(HANDLE)+strlen(who)+strlen(alias)+5;
451 pre.szMessage = malloc(pre.lParam);
453 pblob = pre.szMessage;
455 *(DWORD*)pblob = 0; /* UIN */
456 pblob += sizeof(DWORD);
458 *(HANDLE*)pblob = hContact; /* contact */
459 pblob += sizeof(HANDLE);
461 strcpy(pblob, who); /* nick */
462 pblob += strlen(pblob) + 1;
464 strcpy(pblob, alias); /* first name */
465 pblob += strlen(pblob) + 1;
467 strcpy(pblob, ""); /* last name */
468 pblob += strlen(pblob) + 1;
470 strcpy(pblob, ""); /* email */
471 pblob += strlen(pblob) + 1;
473 strcpy(pblob, ""); /* msg */
474 pblob += strlen(pblob) + 1;
476 CallService(MS_PROTO_CHAINRECV, 0, (LPARAM)&ccs);
478 _NIF();
479 auth_cb(data);
482 void sipe_backend_buddy_request_add(struct sipe_core_public *sipe_public,
483 const gchar *who,
484 const gchar *alias)
486 _NIF();
489 gboolean sipe_backend_buddy_is_blocked(struct sipe_core_public *sipe_public,
490 const gchar *who)
492 _NIF();
493 return FALSE;
496 void sipe_backend_buddy_set_blocked_status(struct sipe_core_public *sipe_public,
497 const gchar *who,
498 gboolean blocked)
500 _NIF();
503 void sipe_backend_buddy_set_status(struct sipe_core_public *sipe_public,
504 const gchar *who,
505 guint activity)
507 SIPPROTO *pr = sipe_public->backend_private;
508 GSList *contacts = sipe_backend_buddy_find_all(sipe_public, who, NULL);
510 CONTACTS_FOREACH(contacts)
511 sipe_miranda_setWord(pr, hContact, "Status", SipeStatusToMiranda(activity));
512 CONTACTS_FOREACH_END;
516 gboolean sipe_backend_buddy_group_add(struct sipe_core_public *sipe_public,
517 const gchar *group_name)
519 TCHAR *mir_group_name = mir_a2t(group_name);
520 HANDLE hGroup = (HANDLE)CallService(MS_CLIST_GROUPCREATE, 0, (LPARAM)mir_group_name);
521 mir_free(mir_group_name);
522 return (hGroup?TRUE:FALSE);
525 gboolean sipe_backend_buddy_group_rename(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
526 SIPE_UNUSED_PARAMETER const gchar *old_name,
527 SIPE_UNUSED_PARAMETER const gchar *new_name)
529 /* @TODO */
530 return(FALSE);
533 void sipe_backend_buddy_group_remove(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
534 SIPE_UNUSED_PARAMETER const gchar *group_name)
536 /* @TODO */
539 struct sipe_backend_buddy_info *sipe_backend_buddy_info_start(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public)
541 return((struct sipe_backend_buddy_info *)g_hash_table_new_full(NULL,NULL,NULL,g_free));
544 void sipe_backend_buddy_info_add(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
545 struct sipe_backend_buddy_info *info,
546 sipe_buddy_info_fields description,
547 const gchar *value)
549 g_hash_table_insert((GHashTable*)info, (gpointer)description, g_strdup(value));
552 void sipe_backend_buddy_info_break(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
553 struct sipe_backend_buddy_info *info)
555 /* Nothin to do */
558 static void set_if_defined(SIPPROTO *pr, GHashTable *store, HANDLE hContact, sipe_buddy_info_fields field, char *label)
560 char *value = (char *)g_hash_table_lookup(store, (gpointer)field);
561 if (value)
562 sipe_miranda_setContactStringUtf(pr, hContact, label, value);
565 void sipe_backend_buddy_info_finalize(struct sipe_core_public *sipe_public,
566 struct sipe_backend_buddy_info *info,
567 const gchar *uri)
569 SIPPROTO *pr = sipe_public->backend_private;
570 HANDLE hContact = sipe_miranda_buddy_find(pr, uri, NULL); /* (HANDLE) data; */
571 DBVARIANT dbv;
572 GHashTable *results = (GHashTable*)info;
574 GHashTableIter iter;
575 const char *id, *value;
577 g_hash_table_iter_init( &iter, results);
578 while (g_hash_table_iter_next (&iter, (gpointer *)&id, (gpointer *)&value)) {
579 SIPE_DEBUG_INFO("miranda_sipe_get_info_cb: user info field <%d> = <%s>", id, value ? value : "(none)");
581 set_if_defined(pr, results, hContact, SIPE_BUDDY_INFO_EMAIL, "e-mail");
582 set_if_defined(pr, results, hContact, SIPE_BUDDY_INFO_CITY, "City");
583 set_if_defined(pr, results, hContact, SIPE_BUDDY_INFO_STATE, "State");
584 set_if_defined(pr, results, hContact, SIPE_BUDDY_INFO_COUNTRY, "Country");
585 set_if_defined(pr, results, hContact, SIPE_BUDDY_INFO_COMPANY, "Company");
586 set_if_defined(pr, results, hContact, SIPE_BUDDY_INFO_JOB_TITLE, "CompanyPosition");
587 set_if_defined(pr, results, hContact, SIPE_BUDDY_INFO_WORK_PHONE, "CompanyPhone");
588 set_if_defined(pr, results, hContact, SIPE_BUDDY_INFO_STREET, "CompanyStreet");
589 set_if_defined(pr, results, hContact, SIPE_BUDDY_INFO_ZIPCODE, "CompanyZIP");
590 set_if_defined(pr, results, hContact, SIPE_BUDDY_INFO_DEPARTMENT, "CompanyDepartment");
592 if ( !DBGetContactSettingString( hContact, pr->proto.m_szModuleName, SIP_UNIQUEID, &dbv )) {
593 GString *content = g_string_new(NULL);
594 WORD wstatus;
595 gchar *status;
596 /* GSList *info; */
597 gboolean is_online;
599 sipe_miranda_getWord(pr, hContact, "Status", &wstatus);
600 status = (gchar*)CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, (WPARAM)wstatus, (LPARAM)GSMDF_PREFIXONLINE);
601 is_online = g_str_has_prefix(status, "Online: ") || !g_ascii_strcasecmp(status, "Online");
603 info = sipe_core_buddy_info(sipe_public,
604 dbv.pszVal,
605 g_str_has_prefix(status, "Online: ") ? status+8 : status,
606 is_online);
608 while (info) {
609 struct sipe_buddy_info *sbi = info->data;
610 g_string_append_printf(content, "%s: %s\r\n", sbi->label, sbi->text);
611 g_free(sbi->text);
612 g_free(sbi);
613 info = g_slist_delete_link(info, info);
615 sipe_miranda_setContactStringUtf(pr, hContact, "About", content->str);
617 g_string_free(content, TRUE);
620 sipe_miranda_SendBroadcast(pr, hContact, ACKTYPE_GETINFO, ACKRESULT_SUCCESS, (HANDLE) 1, (LPARAM) 0);
623 struct sipe_backend_buddy_menu *sipe_backend_buddy_menu_start(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public)
625 return(NULL);
628 struct sipe_backend_buddy_menu *sipe_backend_buddy_menu_add(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
629 struct sipe_backend_buddy_menu *menu,
630 const gchar *label,
631 enum sipe_buddy_menu_type type,
632 gpointer parameter)
634 _NIF();
635 return(NULL);
638 struct sipe_backend_buddy_menu *sipe_backend_buddy_menu_separator(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
639 struct sipe_backend_buddy_menu *menu,
640 const gchar *label)
642 _NIF();
643 return(NULL);
646 struct sipe_backend_buddy_menu *sipe_backend_buddy_sub_menu_add(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
647 struct sipe_backend_buddy_menu *menu,
648 const gchar *label,
649 struct sipe_backend_buddy_menu *sub)
651 _NIF();
652 return(NULL);
655 void sipe_backend_buddy_tooltip_add(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
656 struct sipe_backend_buddy_tooltip *tooltip,
657 const gchar *description,
658 const gchar *value)
660 _NIF();
663 int sipe_miranda_buddy_delete(SIPPROTO *pr, WPARAM wParam, LPARAM lParam)
665 DBVARIANT dbv;
666 HANDLE hContact = (HANDLE)wParam;
667 char *name;
668 char *groupname;
670 SIPE_DEBUG_INFO("Deleting contact <%08x>", hContact);
672 if ( DBGetContactSettingString( hContact, pr->proto.m_szModuleName, SIP_UNIQUEID, &dbv ))
673 return 0;
675 name = g_strdup(dbv.pszVal);
676 DBFreeVariant( &dbv );
678 if ( DBGetContactSettingString( hContact, "CList", "Group", &dbv ))
680 g_free(name);
681 return 0;
684 groupname = g_strdup(dbv.pszVal);
685 DBFreeVariant( &dbv );
687 LOCK;
688 sipe_core_buddy_remove(pr->sip, name, groupname);
689 UNLOCK;
691 return 0;
694 unsigned GetAwayMsgThread(SIPPROTO *pr, HANDLE hContact)
696 const gchar *status;
697 gchar *name = sipe_miranda_getContactString(pr, hContact, SIP_UNIQUEID);
698 gchar *tmp = NULL;
700 if (!name)
702 SIPE_DEBUG_INFO("Could not find name for contact <%08x>", hContact);
703 sipe_miranda_SendProtoAck(pr, hContact, 1, ACKRESULT_FAILED, ACKTYPE_AWAYMSG, NULL);
704 return 0;
707 LOCK;
708 status = sipe_core_buddy_status(pr->sip,
709 name,
710 SIPE_ACTIVITY_BUSYIDLE,
711 "dummy test string");
712 UNLOCK;
714 if (status)
715 tmp = sipe_miranda_eliminate_html(status, strlen(status));
717 sipe_miranda_SendProtoAck(pr, hContact, 1, ACKRESULT_SUCCESS, ACKTYPE_AWAYMSG, tmp);
719 mir_free(tmp);
720 mir_free(name);
721 return 0;
724 HANDLE
725 sipe_miranda_GetAwayMsg( SIPPROTO *pr, HANDLE hContact )
727 CloseHandle((HANDLE)mir_forkthreadowner(&GetAwayMsgThread, pr, hContact, NULL ));
728 return (HANDLE)1;
732 sipe_miranda_GetInfo( SIPPROTO *pr, HANDLE hContact, int infoType )
734 DBVARIANT dbv;
736 SIPE_DEBUG_INFO("GetInfo: infotype <%x>", infoType);
737 if (!pr->sip) return 0;
739 if ( !DBGetContactSettingString( hContact, pr->proto.m_szModuleName, SIP_UNIQUEID, &dbv )) {
740 LOCK;
741 sipe_core_buddy_get_info(pr->sip, dbv.pszVal);
742 UNLOCK;
743 DBFreeVariant( &dbv );
746 return 0;
749 gboolean sipe_backend_uses_photo(void)
751 return FALSE;
754 void sipe_backend_buddy_set_photo(struct sipe_core_public *sipe_public,
755 const gchar *who,
756 gpointer photo_data,
757 gsize data_len,
758 const gchar *photo_hash)
760 g_free(photo_data);
763 const gchar *sipe_backend_buddy_get_photo_hash(struct sipe_core_public *sipe_public,
764 const gchar *who)
766 const gchar *result = NULL;
767 return result;
771 Local Variables:
772 mode: c
773 c-file-style: "bsd"
774 indent-tabs-mode: t
775 tab-width: 8
776 End: