Changeset 5ebff60 for protocols/msn/msn_util.c
- Timestamp:
- 2015-02-20T22:50:54Z (9 years ago)
- Branches:
- master
- Children:
- 0b9daac, 3d45471, 7733b8c
- Parents:
- af359b4
- git-author:
- Indent <please@…> (19-02-15 05:47:20)
- git-committer:
- dequis <dx@…> (20-02-15 22:50:54)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
protocols/msn/msn_util.c
raf359b4 r5ebff60 1 1 /********************************************************************\ 2 2 * BitlBee -- An IRC to other IM-networks gateway * 3 3 * * … … 30 30 #include <ctype.h> 31 31 32 static char *adlrml_entry( const char *handle_, msn_buddy_flags_t list)33 { 34 char *domain, handle[strlen(handle_) +1];35 36 strcpy( handle, handle_);37 if ( ( domain = strchr( handle, '@' ) ) )32 static char *adlrml_entry(const char *handle_, msn_buddy_flags_t list) 33 { 34 char *domain, handle[strlen(handle_) + 1]; 35 36 strcpy(handle, handle_); 37 if ((domain = strchr(handle, '@'))) { 38 38 *(domain++) = '\0'; 39 else39 } else { 40 40 return NULL; 41 42 return g_markup_printf_escaped( "<ml><d n=\"%s\"><c n=\"%s\" l=\"%d\" t=\"1\"/></d></ml>", 43 domain, handle, list ); 44 } 45 46 int msn_buddy_list_add( struct im_connection *ic, msn_buddy_flags_t list, const char *who, const char *realname, const char *group ) 41 } 42 43 return g_markup_printf_escaped("<ml><d n=\"%s\"><c n=\"%s\" l=\"%d\" t=\"1\"/></d></ml>", 44 domain, handle, list); 45 } 46 47 int msn_buddy_list_add(struct im_connection *ic, msn_buddy_flags_t list, const char *who, const char *realname, 48 const char *group) 47 49 { 48 50 struct msn_data *md = ic->proto_data; … … 51 53 struct msn_buddy_data *bd; 52 54 char *adl; 53 55 54 56 *groupid = '\0'; 55 57 #if 0 56 if( group ) 57 { 58 if (group) { 58 59 int i; 59 for( i = 0; i < md->groupcount; i ++ ) 60 if( g_strcasecmp( md->grouplist[i], group ) == 0 ) 61 { 62 g_snprintf( groupid, sizeof( groupid ), " %d", i ); 60 for (i = 0; i < md->groupcount; i++) { 61 if (g_strcasecmp(md->grouplist[i], group) == 0) { 62 g_snprintf(groupid, sizeof(groupid), " %d", i); 63 63 break; 64 64 } 65 66 if( *groupid == '\0' ) 67 {65 } 66 67 if (*groupid == '\0') { 68 68 /* Have to create this group, it doesn't exist yet. */ 69 69 struct msn_groupadd *ga; 70 70 GSList *l; 71 72 for( l = md->grpq; l; l = l->next ) 73 { 71 72 for (l = md->grpq; l; l = l->next) { 74 73 ga = l->data; 75 if ( g_strcasecmp( ga->group, group ) == 0 )74 if (g_strcasecmp(ga->group, group) == 0) { 76 75 break; 77 } 78 79 ga = g_new0( struct msn_groupadd, 1 ); 80 ga->who = g_strdup( who ); 81 ga->group = g_strdup( group ); 82 md->grpq = g_slist_prepend( md->grpq, ga ); 83 84 if( l == NULL ) 85 { 86 char groupname[strlen(group)+1]; 87 strcpy( groupname, group ); 88 http_encode( groupname ); 89 g_snprintf( buf, sizeof( buf ), "ADG %d %s %d\r\n", ++md->trId, groupname, 0 ); 90 return msn_write( ic, buf, strlen( buf ) ); 91 } 92 else 93 { 76 } 77 } 78 79 ga = g_new0(struct msn_groupadd, 1); 80 ga->who = g_strdup(who); 81 ga->group = g_strdup(group); 82 md->grpq = g_slist_prepend(md->grpq, ga); 83 84 if (l == NULL) { 85 char groupname[strlen(group) + 1]; 86 strcpy(groupname, group); 87 http_encode(groupname); 88 g_snprintf(buf, sizeof(buf), "ADG %d %s %d\r\n", ++md->trId, groupname, 0); 89 return msn_write(ic, buf, strlen(buf)); 90 } else { 94 91 /* This can happen if the user's doing lots of adds to a 95 92 new group at once; we're still waiting for the server … … 100 97 } 101 98 #endif 102 103 if ( !( ( bu = bee_user_by_handle( ic->bee, ic, who )) ||104 ( bu = bee_user_new( ic->bee, ic, who, 0 ) )) ||105 !( bd = bu->data ) || bd->flags & list )99 100 if (!((bu = bee_user_by_handle(ic->bee, ic, who)) || 101 (bu = bee_user_new(ic->bee, ic, who, 0))) || 102 !(bd = bu->data) || bd->flags & list) { 106 103 return 1; 107 104 } 105 108 106 bd->flags |= list; 109 110 if ( list == MSN_BUDDY_FL )111 msn_soap_ab_contact_add( ic, bu);112 else113 msn_soap_memlist_edit( ic, who, TRUE, list);114 115 if( ( adl = adlrml_entry( who, list ) ) ) 116 {117 int st = msn_ns_write( 118 ++md->trId, strlen( adl ), adl);119 g_free( adl);120 107 108 if (list == MSN_BUDDY_FL) { 109 msn_soap_ab_contact_add(ic, bu); 110 } else { 111 msn_soap_memlist_edit(ic, who, TRUE, list); 112 } 113 114 if ((adl = adlrml_entry(who, list))) { 115 int st = msn_ns_write(ic, -1, "ADL %d %zd\r\n%s", 116 ++md->trId, strlen(adl), adl); 117 g_free(adl); 118 121 119 return st; 122 120 } 123 121 124 122 return 1; 125 123 } 126 124 127 int msn_buddy_list_remove( struct im_connection *ic, msn_buddy_flags_t list, const char *who, const char *group)125 int msn_buddy_list_remove(struct im_connection *ic, msn_buddy_flags_t list, const char *who, const char *group) 128 126 { 129 127 struct msn_data *md = ic->proto_data; … … 132 130 struct msn_buddy_data *bd; 133 131 char *adl; 134 132 135 133 *groupid = '\0'; 136 134 #if 0 137 if( group ) 138 { 135 if (group) { 139 136 int i; 140 for( i = 0; i < md->groupcount; i ++ ) 141 if( g_strcasecmp( md->grouplist[i], group ) == 0 ) 142 { 143 g_snprintf( groupid, sizeof( groupid ), " %d", i ); 137 for (i = 0; i < md->groupcount; i++) { 138 if (g_strcasecmp(md->grouplist[i], group) == 0) { 139 g_snprintf(groupid, sizeof(groupid), " %d", i); 144 140 break; 145 141 } 142 } 146 143 } 147 144 #endif 148 149 if ( !( bu = bee_user_by_handle( ic->bee, ic, who )) ||150 !( bd = bu->data ) || !( bd->flags & list ) )145 146 if (!(bu = bee_user_by_handle(ic->bee, ic, who)) || 147 !(bd = bu->data) || !(bd->flags & list)) { 151 148 return 1; 152 149 } 150 153 151 bd->flags &= ~list; 154 155 if ( list == MSN_BUDDY_FL )156 msn_soap_ab_contact_del( ic, bu);157 else158 msn_soap_memlist_edit( ic, who, FALSE, list);159 160 if( ( adl = adlrml_entry( who, list ) ) ) 161 {162 int st = msn_ns_write( 163 ++md->trId, strlen( adl ), adl);164 g_free( adl);165 152 153 if (list == MSN_BUDDY_FL) { 154 msn_soap_ab_contact_del(ic, bu); 155 } else { 156 msn_soap_memlist_edit(ic, who, FALSE, list); 157 } 158 159 if ((adl = adlrml_entry(who, list))) { 160 int st = msn_ns_write(ic, -1, "RML %d %zd\r\n%s", 161 ++md->trId, strlen(adl), adl); 162 g_free(adl); 163 166 164 return st; 167 165 } 168 166 169 167 return 1; 170 168 } 171 169 172 struct msn_buddy_ask_data 173 { 170 struct msn_buddy_ask_data { 174 171 struct im_connection *ic; 175 172 char *handle; … … 177 174 }; 178 175 179 static void msn_buddy_ask_yes( void *data)176 static void msn_buddy_ask_yes(void *data) 180 177 { 181 178 struct msn_buddy_ask_data *bla = data; 182 183 msn_buddy_list_add( bla->ic, MSN_BUDDY_AL, bla->handle, bla->realname, NULL);184 185 imcb_ask_add( bla->ic, bla->handle, NULL);186 187 g_free( bla->handle);188 g_free( bla->realname);189 g_free( bla);190 } 191 192 static void msn_buddy_ask_no( void *data)179 180 msn_buddy_list_add(bla->ic, MSN_BUDDY_AL, bla->handle, bla->realname, NULL); 181 182 imcb_ask_add(bla->ic, bla->handle, NULL); 183 184 g_free(bla->handle); 185 g_free(bla->realname); 186 g_free(bla); 187 } 188 189 static void msn_buddy_ask_no(void *data) 193 190 { 194 191 struct msn_buddy_ask_data *bla = data; 195 196 msn_buddy_list_add( bla->ic, MSN_BUDDY_BL, bla->handle, bla->realname, NULL);197 198 g_free( bla->handle);199 g_free( bla->realname);200 g_free( bla);201 } 202 203 void msn_buddy_ask( bee_user_t *bu)192 193 msn_buddy_list_add(bla->ic, MSN_BUDDY_BL, bla->handle, bla->realname, NULL); 194 195 g_free(bla->handle); 196 g_free(bla->realname); 197 g_free(bla); 198 } 199 200 void msn_buddy_ask(bee_user_t *bu) 204 201 { 205 202 struct msn_buddy_ask_data *bla; 206 203 struct msn_buddy_data *bd = bu->data; 207 204 char buf[1024]; 208 209 if ( !( bd->flags & MSN_BUDDY_PL ) )205 206 if (!(bd->flags & MSN_BUDDY_PL)) { 210 207 return; 211 212 bla = g_new0( struct msn_buddy_ask_data, 1 ); 208 } 209 210 bla = g_new0(struct msn_buddy_ask_data, 1); 213 211 bla->ic = bu->ic; 214 bla->handle = g_strdup( bu->handle);215 bla->realname = g_strdup( bu->fullname);216 217 g_snprintf( buf, sizeof( buf),218 219 bu->handle, bu->fullname);220 imcb_ask( bu->ic, buf, bla, msn_buddy_ask_yes, msn_buddy_ask_no);212 bla->handle = g_strdup(bu->handle); 213 bla->realname = g_strdup(bu->fullname); 214 215 g_snprintf(buf, sizeof(buf), 216 "The user %s (%s) wants to add you to his/her buddy list.", 217 bu->handle, bu->fullname); 218 imcb_ask(bu->ic, buf, bla, msn_buddy_ask_yes, msn_buddy_ask_no); 221 219 } 222 220 223 221 /* *NOT* thread-safe, but that's not a problem for now... */ 224 char **msn_linesplit( char *line)222 char **msn_linesplit(char *line) 225 223 { 226 224 static char **ret = NULL; 227 225 static int size = 3; 228 226 int i, n = 0; 229 230 if( ret == NULL ) 231 ret = g_new0( char*, size ); 232 233 for( i = 0; line[i] && line[i] == ' '; i ++ ); 234 if( line[i] ) 235 { 227 228 if (ret == NULL) { 229 ret = g_new0(char*, size); 230 } 231 232 for (i = 0; line[i] && line[i] == ' '; i++) { 233 ; 234 } 235 if (line[i]) { 236 236 ret[n++] = line + i; 237 for( i ++; line[i]; i ++ ) 238 { 239 if( line[i] == ' ' ) 237 for (i++; line[i]; i++) { 238 if (line[i] == ' ') { 240 239 line[i] = 0; 241 else if( line[i] != ' ' && !line[i-1] )240 } else if (line[i] != ' ' && !line[i - 1]) { 242 241 ret[n++] = line + i; 243 244 if( n >= size ) 245 ret = g_renew( char*, ret, size += 2 ); 242 } 243 244 if (n >= size) { 245 ret = g_renew(char*, ret, size += 2); 246 } 246 247 } 247 248 } 248 249 ret[n] = NULL; 249 250 return( ret);250 251 return(ret); 251 252 } 252 253 … … 259 260 1: OK */ 260 261 261 int msn_handler( struct msn_handler_data *h)262 int msn_handler(struct msn_handler_data *h) 262 263 { 263 264 int st; 264 265 h->rxq = g_renew( char, h->rxq, h->rxlen + 1024);266 st = read( h->fd, h->rxq + h->rxlen, 1024);265 266 h->rxq = g_renew(char, h->rxq, h->rxlen + 1024); 267 st = read(h->fd, h->rxq + h->rxlen, 1024); 267 268 h->rxlen += st; 268 269 if( st <= 0 ) 270 return( -1 ); 271 272 if( getenv( "BITLBEE_DEBUG" ) ) 273 { 274 write( 2, "->C:", 4 ); 275 write( 2, h->rxq + h->rxlen - st, st ); 276 } 277 278 while( st ) 279 { 269 270 if (st <= 0) { 271 return(-1); 272 } 273 274 if (getenv("BITLBEE_DEBUG")) { 275 write(2, "->C:", 4); 276 write(2, h->rxq + h->rxlen - st, st); 277 } 278 279 while (st) { 280 280 int i; 281 282 if( h->msglen == 0 ) 283 { 284 for( i = 0; i < h->rxlen; i ++ ) 285 { 286 if( h->rxq[i] == '\r' || h->rxq[i] == '\n' ) 287 { 281 282 if (h->msglen == 0) { 283 for (i = 0; i < h->rxlen; i++) { 284 if (h->rxq[i] == '\r' || h->rxq[i] == '\n') { 288 285 char *cmd_text, **cmd; 289 286 int count; 290 291 cmd_text = g_strndup( h->rxq, i ); 292 cmd = msn_linesplit( cmd_text ); 293 for( count = 0; cmd[count]; count ++ ); 294 st = h->exec_command( h, cmd, count ); 295 g_free( cmd_text ); 296 287 288 cmd_text = g_strndup(h->rxq, i); 289 cmd = msn_linesplit(cmd_text); 290 for (count = 0; cmd[count]; count++) { 291 ; 292 } 293 st = h->exec_command(h, cmd, count); 294 g_free(cmd_text); 295 297 296 /* If the connection broke, don't continue. We don't even exist anymore. */ 298 if( !st ) 299 return( 0 ); 300 301 if( h->msglen ) 302 h->cmd_text = g_strndup( h->rxq, i ); 303 297 if (!st) { 298 return(0); 299 } 300 301 if (h->msglen) { 302 h->cmd_text = g_strndup(h->rxq, i); 303 } 304 304 305 /* Skip to the next non-emptyline */ 305 while( i < h->rxlen && ( h->rxq[i] == '\r' || h->rxq[i] == '\n' ) ) i ++; 306 306 while (i < h->rxlen && (h->rxq[i] == '\r' || h->rxq[i] == '\n')) { 307 i++; 308 } 309 307 310 break; 308 311 } 309 312 } 310 313 311 314 /* If we reached the end of the buffer, there's still an incomplete command there. 312 315 Return and wait for more data. */ 313 if ( i == h->rxlen && h->rxq[i-1] != '\r' && h->rxq[i-1] != '\n' )316 if (i == h->rxlen && h->rxq[i - 1] != '\r' && h->rxq[i - 1] != '\n') { 314 317 break; 315 } 316 else 317 { 318 } 319 } else { 318 320 char *msg, **cmd; 319 321 int count; 320 322 321 323 /* Do we have the complete message already? */ 322 if ( h->msglen > h->rxlen )324 if (h->msglen > h->rxlen) { 323 325 break; 324 325 msg = g_strndup( h->rxq, h->msglen ); 326 cmd = msn_linesplit( h->cmd_text ); 327 for( count = 0; cmd[count]; count ++ ); 328 329 st = h->exec_message( h, msg, h->msglen, cmd, count ); 330 g_free( msg ); 331 g_free( h->cmd_text ); 326 } 327 328 msg = g_strndup(h->rxq, h->msglen); 329 cmd = msn_linesplit(h->cmd_text); 330 for (count = 0; cmd[count]; count++) { 331 ; 332 } 333 334 st = h->exec_message(h, msg, h->msglen, cmd, count); 335 g_free(msg); 336 g_free(h->cmd_text); 332 337 h->cmd_text = NULL; 333 334 if( !st ) 335 return( 0 ); 336 338 339 if (!st) { 340 return(0); 341 } 342 337 343 i = h->msglen; 338 344 h->msglen = 0; 339 345 } 340 346 341 347 /* More data after this block? */ 342 if( i < h->rxlen ) 343 { 348 if (i < h->rxlen) { 344 349 char *tmp; 345 346 tmp = g_memdup( h->rxq + i, h->rxlen - i);347 g_free( h->rxq);350 351 tmp = g_memdup(h->rxq + i, h->rxlen - i); 352 g_free(h->rxq); 348 353 h->rxq = tmp; 349 354 h->rxlen -= i; 350 355 i = 0; 351 } 352 else 353 /* If not, reset the rx queue and get lost. */ 354 { 355 g_free( h->rxq ); 356 h->rxq = g_new0( char, 1 ); 356 } else { 357 /* If not, reset the rx queue and get lost. */ 358 g_free(h->rxq); 359 h->rxq = g_new0(char, 1); 357 360 h->rxlen = 0; 358 return( 1);359 } 360 } 361 362 return( 1);363 } 364 365 void msn_msgq_purge( struct im_connection *ic, GSList **list)361 return(1); 362 } 363 } 364 365 return(1); 366 } 367 368 void msn_msgq_purge(struct im_connection *ic, GSList **list) 366 369 { 367 370 struct msn_message *m; … … 369 372 GSList *l; 370 373 int n = 0; 371 374 372 375 l = *list; 373 if ( l == NULL )376 if (l == NULL) { 374 377 return; 375 378 } 379 376 380 m = l->data; 377 ret = g_string_sized_new( 1024 ); 378 g_string_printf( ret, "Warning: Cleaning up MSN (switchboard) connection with unsent " 379 "messages to %s:", m->who ? m->who : "unknown recipient" ); 380 381 while( l ) 382 { 381 ret = g_string_sized_new(1024); 382 g_string_printf(ret, "Warning: Cleaning up MSN (switchboard) connection with unsent " 383 "messages to %s:", m->who ? m->who : "unknown recipient"); 384 385 while (l) { 383 386 m = l->data; 384 385 if( strncmp( m->text, "\r\r\r", 3 ) != 0 ) 386 { 387 g_string_append_printf( ret, "\n%s", m->text ); 388 n ++; 389 } 390 391 g_free( m->who ); 392 g_free( m->text ); 393 g_free( m ); 394 387 388 if (strncmp(m->text, "\r\r\r", 3) != 0) { 389 g_string_append_printf(ret, "\n%s", m->text); 390 n++; 391 } 392 393 g_free(m->who); 394 g_free(m->text); 395 g_free(m); 396 395 397 l = l->next; 396 398 } 397 g_slist_free( *list);399 g_slist_free(*list); 398 400 *list = NULL; 399 400 if( n > 0 ) 401 imcb_log( ic, "%s", ret->str ); 402 g_string_free( ret, TRUE ); 401 402 if (n > 0) { 403 imcb_log(ic, "%s", ret->str); 404 } 405 g_string_free(ret, TRUE); 403 406 } 404 407 405 408 /* Copied and heavily modified from http://tmsnc.sourceforge.net/chl.c */ 406 char *msn_p11_challenge( char *challenge)409 char *msn_p11_challenge(char *challenge) 407 410 { 408 411 char *output, buf[256]; … … 415 418 /* Create the MD5 hash */ 416 419 md5_init(&md5c); 417 md5_append(&md5c, (unsigned char *) challenge, strlen(challenge));418 md5_append(&md5c, (unsigned char *) MSNP11_PROD_KEY, strlen(MSNP11_PROD_KEY));420 md5_append(&md5c, (unsigned char *) challenge, strlen(challenge)); 421 md5_append(&md5c, (unsigned char *) MSNP11_PROD_KEY, strlen(MSNP11_PROD_KEY)); 419 422 md5_finish(&md5c, md5Hash); 420 423 421 424 /* Split it into four integers */ 422 md5Parts = (unsigned int *)md5Hash; 423 for (i = 0; i < 4; i ++) 424 { 425 md5Parts = (unsigned int *) md5Hash; 426 for (i = 0; i < 4; i++) { 425 427 md5Parts[i] = GUINT32_TO_LE(md5Parts[i]); 426 428 427 429 /* & each integer with 0x7FFFFFFF */ 428 430 /* and save one unmodified array for later */ … … 430 432 md5Parts[i] &= 0x7FFFFFFF; 431 433 } 432 434 433 435 /* make a new string and pad with '0' */ 434 n = g_snprintf(buf, sizeof(buf) -5, "%s%s00000000", challenge, MSNP11_PROD_ID);436 n = g_snprintf(buf, sizeof(buf) - 5, "%s%s00000000", challenge, MSNP11_PROD_ID); 435 437 /* truncate at an 8-byte boundary */ 436 buf[n &=~7] = '\0';437 438 buf[n &= ~7] = '\0'; 439 438 440 /* split into integers */ 439 chlStringParts = (unsigned int *) buf;440 441 chlStringParts = (unsigned int *) buf; 442 441 443 /* this is magic */ 442 for (i = 0; i < (n / 4) - 1; i += 2) 443 { 444 for (i = 0; i < (n / 4) - 1; i += 2) { 444 445 long long temp; 445 446 446 447 chlStringParts[i] = GUINT32_TO_LE(chlStringParts[i]); 447 chlStringParts[i+1] = GUINT32_TO_LE(chlStringParts[i+1]); 448 449 temp = (md5Parts[0] * (((0x0E79A9C1 * (long long)chlStringParts[i]) % 0x7FFFFFFF)+nHigh) + md5Parts[1])%0x7FFFFFFF; 450 nHigh = (md5Parts[2] * (((long long)chlStringParts[i+1]+temp) % 0x7FFFFFFF) + md5Parts[3]) % 0x7FFFFFFF; 448 chlStringParts[i + 1] = GUINT32_TO_LE(chlStringParts[i + 1]); 449 450 temp = 451 (md5Parts[0] * 452 (((0x0E79A9C1 * 453 (long long) chlStringParts[i]) % 0x7FFFFFFF) + nHigh) + md5Parts[1]) % 0x7FFFFFFF; 454 nHigh = 455 (md5Parts[2] * 456 (((long long) chlStringParts[i + 1] + temp) % 0x7FFFFFFF) + md5Parts[3]) % 0x7FFFFFFF; 451 457 nLow = nLow + nHigh + temp; 452 458 } 453 nHigh = (nHigh +md5Parts[1]) % 0x7FFFFFFF;454 nLow = (nLow +md5Parts[3]) % 0x7FFFFFFF;455 459 nHigh = (nHigh + md5Parts[1]) % 0x7FFFFFFF; 460 nLow = (nLow + md5Parts[3]) % 0x7FFFFFFF; 461 456 462 newHashParts[0] ^= nHigh; 457 463 newHashParts[1] ^= nLow; 458 464 newHashParts[2] ^= nHigh; 459 465 newHashParts[3] ^= nLow; 460 466 461 467 /* swap more bytes if big endian */ 462 for (i = 0; i < 4; i ++) 463 newHashParts[i] = GUINT32_TO_LE(newHashParts[i]); 464 468 for (i = 0; i < 4; i++) { 469 newHashParts[i] = GUINT32_TO_LE(newHashParts[i]); 470 } 471 465 472 /* make a string of the parts */ 466 newHash = (unsigned char *) newHashParts;467 473 newHash = (unsigned char *) newHashParts; 474 468 475 /* convert to hexadecimal */ 469 476 output = g_new(char, 33); 470 for (i = 0; i < 16; i ++)477 for (i = 0; i < 16; i++) { 471 478 sprintf(output + i * 2, "%02x", newHash[i]); 472 479 } 480 473 481 return output; 474 482 } 475 483 476 gint msn_domaintree_cmp( gconstpointer a_, gconstpointer b_)484 gint msn_domaintree_cmp(gconstpointer a_, gconstpointer b_) 477 485 { 478 486 const char *a = a_, *b = b_; 479 487 gint ret; 480 481 if( !( a = strchr( a, '@' ) ) || !( b = strchr( b, '@' ) ) || 482 ( ret = strcmp( a, b ) ) == 0 ) 483 ret = strcmp( a_, b_ ); 484 488 489 if (!(a = strchr(a, '@')) || !(b = strchr(b, '@')) || 490 (ret = strcmp(a, b)) == 0) { 491 ret = strcmp(a_, b_); 492 } 493 485 494 return ret; 486 495 } 487 496 488 struct msn_group *msn_group_by_name( struct im_connection *ic, const char *name)497 struct msn_group *msn_group_by_name(struct im_connection *ic, const char *name) 489 498 { 490 499 struct msn_data *md = ic->proto_data; 491 500 GSList *l; 492 493 for( l = md->groups; l; l = l->next ) 494 { 501 502 for (l = md->groups; l; l = l->next) { 495 503 struct msn_group *mg = l->data; 496 497 if ( g_strcasecmp( mg->name, name ) == 0 )504 505 if (g_strcasecmp(mg->name, name) == 0) { 498 506 return mg; 499 } 500 507 } 508 } 509 501 510 return NULL; 502 511 } 503 512 504 struct msn_group *msn_group_by_id( struct im_connection *ic, const char *id)513 struct msn_group *msn_group_by_id(struct im_connection *ic, const char *id) 505 514 { 506 515 struct msn_data *md = ic->proto_data; 507 516 GSList *l; 508 509 for( l = md->groups; l; l = l->next ) 510 { 517 518 for (l = md->groups; l; l = l->next) { 511 519 struct msn_group *mg = l->data; 512 513 if ( g_strcasecmp( mg->id, id ) == 0 )520 521 if (g_strcasecmp(mg->id, id) == 0) { 514 522 return mg; 515 } 516 523 } 524 } 525 517 526 return NULL; 518 527 } 519 528 520 int msn_ns_set_display_name( struct im_connection *ic, const char *value)529 int msn_ns_set_display_name(struct im_connection *ic, const char *value) 521 530 { 522 531 struct msn_data *md = ic->proto_data; 523 char fn[strlen(value) *3+1];524 525 strcpy( fn, value);526 http_encode( fn);527 532 char fn[strlen(value) * 3 + 1]; 533 534 strcpy(fn, value); 535 http_encode(fn); 536 528 537 /* Note: We don't actually know if the server accepted the new name, 529 538 and won't give proper feedback yet if it doesn't. */ 530 return msn_ns_write( ic, -1, "PRP %d MFN %s\r\n", ++md->trId, fn);531 } 532 533 const char *msn_normalize_handle( const char *handle)534 { 535 if ( strncmp( handle, "1:", 2 ) == 0 )539 return msn_ns_write(ic, -1, "PRP %d MFN %s\r\n", ++md->trId, fn); 540 } 541 542 const char *msn_normalize_handle(const char *handle) 543 { 544 if (strncmp(handle, "1:", 2) == 0) { 536 545 return handle + 2; 537 else546 } else { 538 547 return handle; 539 } 548 } 549 }
Note: See TracChangeset
for help on using the changeset viewer.