media: detect incompatible encryption levels error with Lync 2010
[siplcs.git] / src / miranda / miranda-buddy.c
blob2aed437dc27f2b834677203d1ac3f1c5b9b99f96
1 /**
2 * @file miranda-buddy.c
4 * pidgin-sipe
6 * Copyright (C) 2010-11 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 _NIF();
317 void sipe_backend_buddy_set_alias(struct sipe_core_public *sipe_public,
318 const sipe_backend_buddy who,
319 const gchar *alias)
321 SIPPROTO *pr = sipe_public->backend_private;
322 HANDLE hContact = (HANDLE)who;
324 SIPE_DEBUG_INFO("Set alias of contact <%08x> to <%s>", who, alias);
325 sipe_miranda_setContactStringUtf( pr, hContact, "Nick", alias );
328 void sipe_backend_buddy_set_server_alias(struct sipe_core_public *sipe_public,
329 const sipe_backend_buddy who,
330 const gchar *alias)
332 HANDLE hContact = (HANDLE)who;
333 SIPPROTO *pr = sipe_public->backend_private;
335 SIPE_DEBUG_INFO("Set alias of contact <%08x> to <%s>", who, alias);
336 sipe_miranda_setContactStringUtf( pr, hContact, "Alias", alias );
339 gchar* sipe_backend_buddy_get_string(struct sipe_core_public *sipe_public,
340 sipe_backend_buddy buddy,
341 const sipe_buddy_info_fields key)
343 SIPPROTO *pr = sipe_public->backend_private;
344 const gchar *module = pr->proto.m_szModuleName;
345 const gchar *prop_name = sipe_info_to_miranda_property(key);
346 char *tmp;
347 char *prop_str;
349 if (!prop_name)
350 return NULL;
352 tmp = sipe_miranda_getContactString(pr, buddy, prop_name);
353 prop_str = g_strdup(tmp);
354 mir_free(tmp);
356 return prop_str;
359 void sipe_backend_buddy_set_string(struct sipe_core_public *sipe_public,
360 sipe_backend_buddy buddy,
361 const sipe_buddy_info_fields key,
362 const gchar *val)
364 SIPPROTO *pr = sipe_public->backend_private;
365 const gchar *module = pr->proto.m_szModuleName;
366 const gchar *prop_name = sipe_info_to_miranda_property(key);
368 SIPE_DEBUG_INFO("buddy <%08x> key <%d = %s> val <%s>", buddy, key, prop_name, val);
369 if (!prop_name)
370 return;
372 sipe_miranda_setContactString(pr, buddy, prop_name, val);
375 sipe_backend_buddy sipe_backend_buddy_add(struct sipe_core_public *sipe_public,
376 const gchar *name,
377 const gchar *alias,
378 const gchar *groupname)
380 SIPPROTO *pr = sipe_public->backend_private;
381 HANDLE hContact;
383 SIPE_DEBUG_INFO("Adding miranda contact for buddy <%s> alias <%s> in <%s>", name, alias, groupname);
384 hContact = ( HANDLE )CallService( MS_DB_CONTACT_ADD, 0, 0 );
385 CallService( MS_PROTO_ADDTOCONTACT, ( WPARAM )hContact,( LPARAM )pr->proto.m_szModuleName );
386 sipe_miranda_setContactString( pr, hContact, SIP_UNIQUEID, name ); // name
387 if (alias) sipe_miranda_setContactStringUtf( pr, hContact, "Nick", alias );
388 DBWriteContactSettingString( hContact, "CList", "Group", groupname );
389 sipe_miranda_setContactString( pr, hContact, "Group", groupname );
390 return (sipe_backend_buddy)hContact;
393 void sipe_backend_buddy_remove(struct sipe_core_public *sipe_public,
394 const sipe_backend_buddy who)
396 CallService( MS_DB_CONTACT_DELETE, (WPARAM)who, 0 );
399 void sipe_backend_buddy_request_authorization(struct sipe_core_public *sipe_public,
400 const gchar *who,
401 const gchar *alias,
402 gboolean on_list,
403 sipe_backend_buddy_request_authorization_cb auth_cb,
404 sipe_backend_buddy_request_authorization_cb deny_cb,
405 void *data)
407 SIPPROTO *pr = sipe_public->backend_private;
408 CCSDATA ccs;
409 PROTORECVEVENT pre = {0};
410 HANDLE hContact;
411 BYTE *pblob;
413 hContact = sipe_backend_buddy_find( sipe_public, who, NULL );
414 if (!hContact)
416 SIPE_DEBUG_INFO("Adding miranda contact for incoming talker <%s>", who);
417 hContact = ( HANDLE )CallService( MS_DB_CONTACT_ADD, 0, 0 );
418 CallService( MS_PROTO_ADDTOCONTACT, ( WPARAM )hContact,( LPARAM )pr->proto.m_szModuleName );
419 DBWriteContactSettingByte( hContact, "CList", "NotOnList", 1 );
420 sipe_miranda_setContactString( pr, hContact, SIP_UNIQUEID, who ); // name
423 ccs.szProtoService = PSR_AUTH;
424 ccs.hContact = hContact;
425 ccs.wParam = 0;
426 ccs.lParam = (LPARAM) &pre;
428 pre.flags = PREF_UTF;
429 pre.timestamp = time(NULL);
430 pre.lParam = sizeof(DWORD)+sizeof(HANDLE)+strlen(who)+strlen(alias)+5;
431 pre.szMessage = malloc(pre.lParam);
433 pblob = pre.szMessage;
435 *(DWORD*)pblob = 0; /* UIN */
436 pblob += sizeof(DWORD);
438 *(HANDLE*)pblob = hContact; /* contact */
439 pblob += sizeof(HANDLE);
441 strcpy(pblob, who); /* nick */
442 pblob += strlen(pblob) + 1;
444 strcpy(pblob, alias); /* first name */
445 pblob += strlen(pblob) + 1;
447 strcpy(pblob, ""); /* last name */
448 pblob += strlen(pblob) + 1;
450 strcpy(pblob, ""); /* email */
451 pblob += strlen(pblob) + 1;
453 strcpy(pblob, ""); /* msg */
454 pblob += strlen(pblob) + 1;
456 CallService(MS_PROTO_CHAINRECV, 0, (LPARAM)&ccs);
458 _NIF();
459 auth_cb(data);
462 void sipe_backend_buddy_request_add(struct sipe_core_public *sipe_public,
463 const gchar *who,
464 const gchar *alias)
466 _NIF();
469 gboolean sipe_backend_buddy_is_blocked(struct sipe_core_public *sipe_public,
470 const gchar *who)
472 _NIF();
473 return FALSE;
476 void sipe_backend_buddy_set_blocked_status(struct sipe_core_public *sipe_public,
477 const gchar *who,
478 gboolean blocked)
480 _NIF();
483 void sipe_backend_buddy_set_status(struct sipe_core_public *sipe_public,
484 const gchar *who,
485 guint activity)
487 SIPPROTO *pr = sipe_public->backend_private;
488 const gchar *module = pr->proto.m_szModuleName;
489 GSList *contacts = sipe_backend_buddy_find_all(sipe_public, who, NULL);
491 CONTACTS_FOREACH(contacts)
492 sipe_miranda_setWord(pr, hContact, "Status", SipeStatusToMiranda(activity));
493 CONTACTS_FOREACH_END;
497 gboolean sipe_backend_buddy_group_add(struct sipe_core_public *sipe_public,
498 const gchar *group_name)
500 TCHAR *mir_group_name = mir_a2t(group_name);
501 HANDLE hGroup = (HANDLE)CallService(MS_CLIST_GROUPCREATE, 0, (LPARAM)mir_group_name);
502 mir_free(mir_group_name);
503 return (hGroup?TRUE:FALSE);
506 struct sipe_backend_buddy_info *sipe_backend_buddy_info_start(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public)
508 return((struct sipe_backend_buddy_info *)g_hash_table_new_full(NULL,NULL,NULL,g_free));
511 void sipe_backend_buddy_info_add(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
512 struct sipe_backend_buddy_info *info,
513 sipe_buddy_info_fields description,
514 const gchar *value)
516 g_hash_table_insert((GHashTable*)info, (gpointer)description, g_strdup(value));
519 void sipe_backend_buddy_info_break(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
520 struct sipe_backend_buddy_info *info)
522 /* Nothin to do */
525 static void set_if_defined(SIPPROTO *pr, GHashTable *store, HANDLE hContact, sipe_buddy_info_fields field, char *label)
527 char *value = (char *)g_hash_table_lookup(store, (gpointer)field);
528 if (value)
529 sipe_miranda_setContactStringUtf(pr, hContact, label, value);
532 void sipe_backend_buddy_info_finalize(struct sipe_core_public *sipe_public,
533 struct sipe_backend_buddy_info *info,
534 const gchar *uri)
536 SIPPROTO *pr = sipe_public->backend_private;
537 HANDLE hContact = sipe_miranda_buddy_find(pr, uri, NULL); /* (HANDLE) data; */
538 DBVARIANT dbv;
539 GHashTable *results = (GHashTable*)info;
541 GHashTableIter iter;
542 const char *id, *value;
544 g_hash_table_iter_init( &iter, results);
545 while (g_hash_table_iter_next (&iter, (gpointer *)&id, (gpointer *)&value)) {
546 SIPE_DEBUG_INFO("miranda_sipe_get_info_cb: user info field <%d> = <%s>", id, value ? value : "(none)");
548 set_if_defined(pr, results, hContact, SIPE_BUDDY_INFO_EMAIL, "e-mail");
549 set_if_defined(pr, results, hContact, SIPE_BUDDY_INFO_CITY, "City");
550 set_if_defined(pr, results, hContact, SIPE_BUDDY_INFO_STATE, "State");
551 set_if_defined(pr, results, hContact, SIPE_BUDDY_INFO_COUNTRY, "Country");
552 set_if_defined(pr, results, hContact, SIPE_BUDDY_INFO_COMPANY, "Company");
553 set_if_defined(pr, results, hContact, SIPE_BUDDY_INFO_JOB_TITLE, "CompanyPosition");
554 set_if_defined(pr, results, hContact, SIPE_BUDDY_INFO_WORK_PHONE, "CompanyPhone");
555 set_if_defined(pr, results, hContact, SIPE_BUDDY_INFO_STREET, "CompanyStreet");
556 set_if_defined(pr, results, hContact, SIPE_BUDDY_INFO_ZIPCODE, "CompanyZIP");
557 set_if_defined(pr, results, hContact, SIPE_BUDDY_INFO_DEPARTMENT, "CompanyDepartment");
559 if ( !DBGetContactSettingString( hContact, pr->proto.m_szModuleName, SIP_UNIQUEID, &dbv )) {
560 GString *content = g_string_new(NULL);
561 WORD wstatus;
562 gchar *status;
563 /* GSList *info; */
564 gboolean is_online;
566 sipe_miranda_getWord(pr, hContact, "Status", &wstatus);
567 status = (gchar*)CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, (WPARAM)wstatus, (LPARAM)GSMDF_PREFIXONLINE);
568 is_online = g_str_has_prefix(status, "Online: ") || !g_ascii_strcasecmp(status, "Online");
570 info = sipe_core_buddy_info(sipe_public,
571 dbv.pszVal,
572 g_str_has_prefix(status, "Online: ") ? status+8 : status,
573 is_online);
575 while (info) {
576 struct sipe_buddy_info *sbi = info->data;
577 g_string_append_printf(content, "%s: %s\r\n", sbi->label, sbi->text);
578 g_free(sbi->text);
579 g_free(sbi);
580 info = g_slist_delete_link(info, info);
582 sipe_miranda_setContactStringUtf(pr, hContact, "About", content->str);
584 g_string_free(content, TRUE);
587 sipe_miranda_SendBroadcast(pr, hContact, ACKTYPE_GETINFO, ACKRESULT_SUCCESS, (HANDLE) 1, (LPARAM) 0);
590 struct sipe_backend_buddy_menu *sipe_backend_buddy_menu_start(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public)
592 return(NULL);
595 struct sipe_backend_buddy_menu *sipe_backend_buddy_menu_add(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
596 struct sipe_backend_buddy_menu *menu,
597 const gchar *label,
598 enum sipe_buddy_menu_type type,
599 gpointer parameter)
601 _NIF();
602 return(NULL);
605 struct sipe_backend_buddy_menu *sipe_backend_buddy_menu_separator(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
606 struct sipe_backend_buddy_menu *menu,
607 const gchar *label)
609 _NIF();
610 return(NULL);
613 struct sipe_backend_buddy_menu *sipe_backend_buddy_sub_menu_add(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
614 struct sipe_backend_buddy_menu *menu,
615 const gchar *label,
616 struct sipe_backend_buddy_menu *sub)
618 _NIF();
619 return(NULL);
622 void sipe_backend_buddy_tooltip_add(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
623 struct sipe_backend_buddy_tooltip *tooltip,
624 const gchar *description,
625 const gchar *value)
627 _NIF();
630 int sipe_miranda_buddy_delete(SIPPROTO *pr, WPARAM wParam, LPARAM lParam)
632 DBVARIANT dbv;
633 HANDLE hContact = (HANDLE)wParam;
634 char *name;
635 char *groupname;
637 SIPE_DEBUG_INFO("Deleting contact <%08x>", hContact);
639 if ( DBGetContactSettingString( hContact, pr->proto.m_szModuleName, SIP_UNIQUEID, &dbv ))
640 return 0;
642 name = g_strdup(dbv.pszVal);
643 DBFreeVariant( &dbv );
645 if ( DBGetContactSettingString( hContact, "CList", "Group", &dbv ))
647 g_free(name);
648 return 0;
651 groupname = g_strdup(dbv.pszVal);
652 DBFreeVariant( &dbv );
654 LOCK;
655 sipe_core_buddy_remove(pr->sip, name, groupname);
656 UNLOCK;
658 return 0;
661 unsigned GetAwayMsgThread(SIPPROTO *pr, HANDLE hContact)
663 const gchar *status;
664 gchar *name = sipe_miranda_getContactString(pr, hContact, SIP_UNIQUEID);
665 gchar *tmp = NULL;
667 if (!name)
669 SIPE_DEBUG_INFO("Could not find name for contact <%08x>", hContact);
670 sipe_miranda_SendProtoAck(pr, hContact, 1, ACKRESULT_FAILED, ACKTYPE_AWAYMSG, NULL);
671 return 0;
674 LOCK;
675 status = sipe_core_buddy_status(pr->sip,
676 name,
677 SIPE_ACTIVITY_BUSYIDLE,
678 "dummy test string");
679 UNLOCK;
681 if (status)
682 tmp = sipe_miranda_eliminate_html(status, strlen(status));
684 sipe_miranda_SendProtoAck(pr, hContact, 1, ACKRESULT_SUCCESS, ACKTYPE_AWAYMSG, tmp);
686 mir_free(tmp);
687 mir_free(name);
688 return 0;
691 HANDLE
692 sipe_miranda_GetAwayMsg( SIPPROTO *pr, HANDLE hContact )
694 CloseHandle((HANDLE)mir_forkthreadowner(&GetAwayMsgThread, pr, hContact, NULL ));
695 return (HANDLE)1;
699 sipe_miranda_GetInfo( SIPPROTO *pr, HANDLE hContact, int infoType )
701 DBVARIANT dbv;
703 SIPE_DEBUG_INFO("GetInfo: infotype <%x>", infoType);
704 if (!pr->sip) return 0;
706 if ( !DBGetContactSettingString( hContact, pr->proto.m_szModuleName, SIP_UNIQUEID, &dbv )) {
707 LOCK;
708 sipe_core_buddy_get_info(pr->sip, dbv.pszVal);
709 UNLOCK;
710 DBFreeVariant( &dbv );
713 return 0;
717 Local Variables:
718 mode: c
719 c-file-style: "bsd"
720 indent-tabs-mode: t
721 tab-width: 8
722 End: