Merge branch 'mob' of git+ssh://repo.or.cz/srv/git/siplcs into mob
[siplcs.git] / src / miranda / miranda-buddy.c
blobb7b94723845475df06c18a341aac005bcd4347a0
1 /**
2 * @file miranda-buddy.c
4 * pidgin-sipe
6 * Copyright (C) 2010-12 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_list_processing_start(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public)
384 void sipe_backend_buddy_list_processing_finish(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public)
388 sipe_backend_buddy sipe_backend_buddy_add(struct sipe_core_public *sipe_public,
389 const gchar *name,
390 const gchar *alias,
391 const gchar *groupname)
393 SIPPROTO *pr = sipe_public->backend_private;
394 HANDLE hContact;
396 SIPE_DEBUG_INFO("Adding miranda contact for buddy <%s> alias <%s> in <%s>", name, alias, groupname);
397 hContact = ( HANDLE )CallService( MS_DB_CONTACT_ADD, 0, 0 );
398 CallService( MS_PROTO_ADDTOCONTACT, ( WPARAM )hContact,( LPARAM )pr->proto.m_szModuleName );
399 sipe_miranda_setContactString( pr, hContact, SIP_UNIQUEID, name ); // name
400 if (alias) sipe_miranda_setContactStringUtf( pr, hContact, "Nick", alias );
401 DBWriteContactSettingString( hContact, "CList", "Group", groupname );
402 sipe_miranda_setContactString( pr, hContact, "Group", groupname );
403 return (sipe_backend_buddy)hContact;
406 void sipe_backend_buddy_remove(struct sipe_core_public *sipe_public,
407 const sipe_backend_buddy who)
409 CallService( MS_DB_CONTACT_DELETE, (WPARAM)who, 0 );
412 void sipe_backend_buddy_request_authorization(struct sipe_core_public *sipe_public,
413 const gchar *who,
414 const gchar *alias,
415 gboolean on_list,
416 sipe_backend_buddy_request_authorization_cb auth_cb,
417 sipe_backend_buddy_request_authorization_cb deny_cb,
418 void *data)
420 SIPPROTO *pr = sipe_public->backend_private;
421 CCSDATA ccs;
422 PROTORECVEVENT pre = {0};
423 HANDLE hContact;
424 BYTE *pblob;
426 hContact = sipe_backend_buddy_find( sipe_public, who, NULL );
427 if (!hContact)
429 SIPE_DEBUG_INFO("Adding miranda contact for incoming talker <%s>", who);
430 hContact = ( HANDLE )CallService( MS_DB_CONTACT_ADD, 0, 0 );
431 CallService( MS_PROTO_ADDTOCONTACT, ( WPARAM )hContact,( LPARAM )pr->proto.m_szModuleName );
432 DBWriteContactSettingByte( hContact, "CList", "NotOnList", 1 );
433 sipe_miranda_setContactString( pr, hContact, SIP_UNIQUEID, who ); // name
436 ccs.szProtoService = PSR_AUTH;
437 ccs.hContact = hContact;
438 ccs.wParam = 0;
439 ccs.lParam = (LPARAM) &pre;
441 pre.flags = PREF_UTF;
442 pre.timestamp = time(NULL);
443 pre.lParam = sizeof(DWORD)+sizeof(HANDLE)+strlen(who)+strlen(alias)+5;
444 pre.szMessage = malloc(pre.lParam);
446 pblob = pre.szMessage;
448 *(DWORD*)pblob = 0; /* UIN */
449 pblob += sizeof(DWORD);
451 *(HANDLE*)pblob = hContact; /* contact */
452 pblob += sizeof(HANDLE);
454 strcpy(pblob, who); /* nick */
455 pblob += strlen(pblob) + 1;
457 strcpy(pblob, alias); /* first name */
458 pblob += strlen(pblob) + 1;
460 strcpy(pblob, ""); /* last name */
461 pblob += strlen(pblob) + 1;
463 strcpy(pblob, ""); /* email */
464 pblob += strlen(pblob) + 1;
466 strcpy(pblob, ""); /* msg */
467 pblob += strlen(pblob) + 1;
469 CallService(MS_PROTO_CHAINRECV, 0, (LPARAM)&ccs);
471 _NIF();
472 auth_cb(data);
475 void sipe_backend_buddy_request_add(struct sipe_core_public *sipe_public,
476 const gchar *who,
477 const gchar *alias)
479 _NIF();
482 gboolean sipe_backend_buddy_is_blocked(struct sipe_core_public *sipe_public,
483 const gchar *who)
485 _NIF();
486 return FALSE;
489 void sipe_backend_buddy_set_blocked_status(struct sipe_core_public *sipe_public,
490 const gchar *who,
491 gboolean blocked)
493 _NIF();
496 void sipe_backend_buddy_set_status(struct sipe_core_public *sipe_public,
497 const gchar *who,
498 guint activity)
500 SIPPROTO *pr = sipe_public->backend_private;
501 GSList *contacts = sipe_backend_buddy_find_all(sipe_public, who, NULL);
503 CONTACTS_FOREACH(contacts)
504 sipe_miranda_setWord(pr, hContact, "Status", SipeStatusToMiranda(activity));
505 CONTACTS_FOREACH_END;
509 gboolean sipe_backend_buddy_group_add(struct sipe_core_public *sipe_public,
510 const gchar *group_name)
512 TCHAR *mir_group_name = mir_a2t(group_name);
513 HANDLE hGroup = (HANDLE)CallService(MS_CLIST_GROUPCREATE, 0, (LPARAM)mir_group_name);
514 mir_free(mir_group_name);
515 return (hGroup?TRUE:FALSE);
518 gboolean sipe_backend_buddy_group_rename(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
519 SIPE_UNUSED_PARAMETER const gchar *old_name,
520 SIPE_UNUSED_PARAMETER const gchar *new_name)
522 /* @TODO */
523 return(FALSE);
526 void sipe_backend_buddy_group_remove(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
527 SIPE_UNUSED_PARAMETER const gchar *group_name)
529 /* @TODO */
532 struct sipe_backend_buddy_info *sipe_backend_buddy_info_start(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public)
534 return((struct sipe_backend_buddy_info *)g_hash_table_new_full(NULL,NULL,NULL,g_free));
537 void sipe_backend_buddy_info_add(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
538 struct sipe_backend_buddy_info *info,
539 sipe_buddy_info_fields description,
540 const gchar *value)
542 g_hash_table_insert((GHashTable*)info, (gpointer)description, g_strdup(value));
545 void sipe_backend_buddy_info_break(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
546 struct sipe_backend_buddy_info *info)
548 /* Nothin to do */
551 static void set_if_defined(SIPPROTO *pr, GHashTable *store, HANDLE hContact, sipe_buddy_info_fields field, char *label)
553 char *value = (char *)g_hash_table_lookup(store, (gpointer)field);
554 if (value)
555 sipe_miranda_setContactStringUtf(pr, hContact, label, value);
558 void sipe_backend_buddy_info_finalize(struct sipe_core_public *sipe_public,
559 struct sipe_backend_buddy_info *info,
560 const gchar *uri)
562 SIPPROTO *pr = sipe_public->backend_private;
563 HANDLE hContact = sipe_miranda_buddy_find(pr, uri, NULL); /* (HANDLE) data; */
564 DBVARIANT dbv;
565 GHashTable *results = (GHashTable*)info;
567 GHashTableIter iter;
568 const char *id, *value;
570 g_hash_table_iter_init( &iter, results);
571 while (g_hash_table_iter_next (&iter, (gpointer *)&id, (gpointer *)&value)) {
572 SIPE_DEBUG_INFO("miranda_sipe_get_info_cb: user info field <%d> = <%s>", id, value ? value : "(none)");
574 set_if_defined(pr, results, hContact, SIPE_BUDDY_INFO_EMAIL, "e-mail");
575 set_if_defined(pr, results, hContact, SIPE_BUDDY_INFO_CITY, "City");
576 set_if_defined(pr, results, hContact, SIPE_BUDDY_INFO_STATE, "State");
577 set_if_defined(pr, results, hContact, SIPE_BUDDY_INFO_COUNTRY, "Country");
578 set_if_defined(pr, results, hContact, SIPE_BUDDY_INFO_COMPANY, "Company");
579 set_if_defined(pr, results, hContact, SIPE_BUDDY_INFO_JOB_TITLE, "CompanyPosition");
580 set_if_defined(pr, results, hContact, SIPE_BUDDY_INFO_WORK_PHONE, "CompanyPhone");
581 set_if_defined(pr, results, hContact, SIPE_BUDDY_INFO_STREET, "CompanyStreet");
582 set_if_defined(pr, results, hContact, SIPE_BUDDY_INFO_ZIPCODE, "CompanyZIP");
583 set_if_defined(pr, results, hContact, SIPE_BUDDY_INFO_DEPARTMENT, "CompanyDepartment");
585 if ( !DBGetContactSettingString( hContact, pr->proto.m_szModuleName, SIP_UNIQUEID, &dbv )) {
586 GString *content = g_string_new(NULL);
587 WORD wstatus;
588 gchar *status;
589 /* GSList *info; */
590 gboolean is_online;
592 sipe_miranda_getWord(pr, hContact, "Status", &wstatus);
593 status = (gchar*)CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, (WPARAM)wstatus, (LPARAM)GSMDF_PREFIXONLINE);
594 is_online = g_str_has_prefix(status, "Online: ") || !g_ascii_strcasecmp(status, "Online");
596 info = sipe_core_buddy_info(sipe_public,
597 dbv.pszVal,
598 g_str_has_prefix(status, "Online: ") ? status+8 : status,
599 is_online);
601 while (info) {
602 struct sipe_buddy_info *sbi = info->data;
603 g_string_append_printf(content, "%s: %s\r\n", sbi->label, sbi->text);
604 g_free(sbi->text);
605 g_free(sbi);
606 info = g_slist_delete_link(info, info);
608 sipe_miranda_setContactStringUtf(pr, hContact, "About", content->str);
610 g_string_free(content, TRUE);
613 sipe_miranda_SendBroadcast(pr, hContact, ACKTYPE_GETINFO, ACKRESULT_SUCCESS, (HANDLE) 1, (LPARAM) 0);
616 struct sipe_backend_buddy_menu *sipe_backend_buddy_menu_start(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public)
618 return(NULL);
621 struct sipe_backend_buddy_menu *sipe_backend_buddy_menu_add(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
622 struct sipe_backend_buddy_menu *menu,
623 const gchar *label,
624 enum sipe_buddy_menu_type type,
625 gpointer parameter)
627 _NIF();
628 return(NULL);
631 struct sipe_backend_buddy_menu *sipe_backend_buddy_menu_separator(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
632 struct sipe_backend_buddy_menu *menu,
633 const gchar *label)
635 _NIF();
636 return(NULL);
639 struct sipe_backend_buddy_menu *sipe_backend_buddy_sub_menu_add(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
640 struct sipe_backend_buddy_menu *menu,
641 const gchar *label,
642 struct sipe_backend_buddy_menu *sub)
644 _NIF();
645 return(NULL);
648 void sipe_backend_buddy_tooltip_add(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
649 struct sipe_backend_buddy_tooltip *tooltip,
650 const gchar *description,
651 const gchar *value)
653 _NIF();
656 int sipe_miranda_buddy_delete(SIPPROTO *pr, WPARAM wParam, LPARAM lParam)
658 DBVARIANT dbv;
659 HANDLE hContact = (HANDLE)wParam;
660 char *name;
661 char *groupname;
663 SIPE_DEBUG_INFO("Deleting contact <%08x>", hContact);
665 if ( DBGetContactSettingString( hContact, pr->proto.m_szModuleName, SIP_UNIQUEID, &dbv ))
666 return 0;
668 name = g_strdup(dbv.pszVal);
669 DBFreeVariant( &dbv );
671 if ( DBGetContactSettingString( hContact, "CList", "Group", &dbv ))
673 g_free(name);
674 return 0;
677 groupname = g_strdup(dbv.pszVal);
678 DBFreeVariant( &dbv );
680 LOCK;
681 sipe_core_buddy_remove(pr->sip, name, groupname);
682 UNLOCK;
684 return 0;
687 unsigned GetAwayMsgThread(SIPPROTO *pr, HANDLE hContact)
689 const gchar *status;
690 gchar *name = sipe_miranda_getContactString(pr, hContact, SIP_UNIQUEID);
691 gchar *tmp = NULL;
693 if (!name)
695 SIPE_DEBUG_INFO("Could not find name for contact <%08x>", hContact);
696 sipe_miranda_SendProtoAck(pr, hContact, 1, ACKRESULT_FAILED, ACKTYPE_AWAYMSG, NULL);
697 return 0;
700 LOCK;
701 status = sipe_core_buddy_status(pr->sip,
702 name,
703 SIPE_ACTIVITY_BUSYIDLE,
704 "dummy test string");
705 UNLOCK;
707 if (status)
708 tmp = sipe_miranda_eliminate_html(status, strlen(status));
710 sipe_miranda_SendProtoAck(pr, hContact, 1, ACKRESULT_SUCCESS, ACKTYPE_AWAYMSG, tmp);
712 mir_free(tmp);
713 mir_free(name);
714 return 0;
717 HANDLE
718 sipe_miranda_GetAwayMsg( SIPPROTO *pr, HANDLE hContact )
720 CloseHandle((HANDLE)mir_forkthreadowner(&GetAwayMsgThread, pr, hContact, NULL ));
721 return (HANDLE)1;
725 sipe_miranda_GetInfo( SIPPROTO *pr, HANDLE hContact, int infoType )
727 DBVARIANT dbv;
729 SIPE_DEBUG_INFO("GetInfo: infotype <%x>", infoType);
730 if (!pr->sip) return 0;
732 if ( !DBGetContactSettingString( hContact, pr->proto.m_szModuleName, SIP_UNIQUEID, &dbv )) {
733 LOCK;
734 sipe_core_buddy_get_info(pr->sip, dbv.pszVal);
735 UNLOCK;
736 DBFreeVariant( &dbv );
739 return 0;
743 Local Variables:
744 mode: c
745 c-file-style: "bsd"
746 indent-tabs-mode: t
747 tab-width: 8
748 End: