| 7 |
7 |
| 8 static GHashTable *object_stashes = NULL; |
8 static GHashTable *object_stashes = NULL; |
| 9 |
9 |
| 10 void gaim_perl_normalize_script_name(char *name) |
10 void gaim_perl_normalize_script_name(char *name) |
| 11 { |
11 { |
| 12 char *c; |
12 char *c; |
| 13 |
13 |
| 14 c = strrchr(name, '.'); |
14 c = strrchr(name, '.'); |
| 15 |
15 |
| 16 if (c != NULL) |
16 if (c != NULL) |
| 17 *c = '\0'; |
17 *c = '\0'; |
| 18 |
18 |
| 19 for (c = name; *c != '\0'; c++) |
19 for (c = name; *c != '\0'; c++) { |
| 20 { |
20 if (*c != '_' && !g_ascii_isalnum(*c)) |
| 21 if (*c != '_' && !g_ascii_isalnum(*c)) |
21 *c = '_'; |
| 22 *c = '_'; |
22 } |
| 23 } |
23 } |
| 24 } |
|
| 25 |
|
| 26 |
24 |
| 27 static int |
25 static int |
| 28 magic_free_object(pTHX_ SV *sv, MAGIC *mg) |
26 magic_free_object(pTHX_ SV *sv, MAGIC *mg) |
| 29 { |
27 { |
| 30 sv_setiv(sv, 0); |
28 sv_setiv(sv, 0); |
| 208 if (SvTRUE(ERRSV)) { |
204 if (SvTRUE(ERRSV)) { |
| 209 gaim_debug(GAIM_DEBUG_ERROR, "perl", |
205 gaim_debug(GAIM_DEBUG_ERROR, "perl", |
| 210 "Perl function %s exited abnormally: %s\n", |
206 "Perl function %s exited abnormally: %s\n", |
| 211 function, SvPV(ERRSV, na)); |
207 function, SvPV(ERRSV, na)); |
| 212 POPs; |
208 POPs; |
| 213 } |
209 } else if (count != 1) { |
| 214 else if (count != 1) { |
|
| 215 /* |
210 /* |
| 216 * This should NEVER happen. G_SCALAR ensures that we WILL |
211 * This should NEVER happen. G_SCALAR ensures that we WILL |
| 217 * have 1 parameter. |
212 * have 1 parameter. |
| 218 */ |
213 */ |
| 219 gaim_debug(GAIM_DEBUG_ERROR, "perl", |
214 gaim_debug(GAIM_DEBUG_ERROR, "perl", |
| 220 "Perl error from %s: expected 1 return value, " |
215 "Perl error from %s: expected 1 return value, " |
| 221 "but got %d\n", function, count); |
216 "but got %d\n", function, count); |
| 222 } |
217 } else |
| 223 else |
|
| 224 ret_value = POPi; |
218 ret_value = POPi; |
| 225 |
219 |
| 226 /* Check for changed arguments */ |
220 /* Check for changed arguments */ |
| 227 for (i = 0; i < argc; i++) { |
221 for (i = 0; i < argc; i++) { |
| 228 if (args[i] && strcmp(args[i], SvPVX(sv_args[i]))) { |
222 if (args[i] && strcmp(args[i], SvPVX(sv_args[i]))) { |
| 384 void * |
378 void * |
| 385 gaim_perl_data_from_sv(GaimValue *value, SV *sv) |
379 gaim_perl_data_from_sv(GaimValue *value, SV *sv) |
| 386 { |
380 { |
| 387 STRLEN na; |
381 STRLEN na; |
| 388 |
382 |
| 389 switch (gaim_value_get_type(value)) |
383 switch (gaim_value_get_type(value)) { |
| 390 { |
|
| 391 case GAIM_TYPE_BOOLEAN: return (void *)SvIV(sv); |
384 case GAIM_TYPE_BOOLEAN: return (void *)SvIV(sv); |
| 392 case GAIM_TYPE_INT: return (void *)SvIV(sv); |
385 case GAIM_TYPE_INT: return (void *)SvIV(sv); |
| 393 case GAIM_TYPE_UINT: return (void *)SvUV(sv); |
386 case GAIM_TYPE_UINT: return (void *)SvUV(sv); |
| 394 case GAIM_TYPE_LONG: return (void *)SvIV(sv); |
387 case GAIM_TYPE_LONG: return (void *)SvIV(sv); |
| 395 case GAIM_TYPE_ULONG: return (void *)SvUV(sv); |
388 case GAIM_TYPE_ULONG: return (void *)SvUV(sv); |
| 409 static SV * |
402 static SV * |
| 410 gaim_perl_sv_from_subtype(const GaimValue *value, void *arg) |
403 gaim_perl_sv_from_subtype(const GaimValue *value, void *arg) |
| 411 { |
404 { |
| 412 const char *stash = NULL; |
405 const char *stash = NULL; |
| 413 |
406 |
| 414 switch (gaim_value_get_subtype(value)) |
407 switch (gaim_value_get_subtype(value)) { |
| 415 { |
408 case GAIM_SUBTYPE_ACCOUNT: |
| 416 case GAIM_SUBTYPE_ACCOUNT: stash = "Gaim::Account"; break; |
409 stash = "Gaim::Account"; |
| 417 case GAIM_SUBTYPE_BLIST: stash = "Gaim::BuddyList"; break; |
410 break; |
| 418 case GAIM_SUBTYPE_BLIST_BUDDY: stash = "Gaim::BuddyList::Buddy"; break; |
411 case GAIM_SUBTYPE_BLIST: |
| 419 case GAIM_SUBTYPE_BLIST_GROUP: stash = "Gaim::BuddyList::Group"; break; |
412 stash = "Gaim::BuddyList"; |
| 420 case GAIM_SUBTYPE_BLIST_CHAT: stash = "Gaim::BuddyList::Chat"; break; |
413 break; |
| 421 case GAIM_SUBTYPE_CONNECTION: stash = "Gaim::Connection"; break; |
414 case GAIM_SUBTYPE_BLIST_BUDDY: |
| 422 case GAIM_SUBTYPE_CONVERSATION: stash = "Gaim::Conversation"; break; |
415 stash = "Gaim::BuddyList::Buddy"; |
| 423 case GAIM_SUBTYPE_PLUGIN: stash = "Gaim::Plugin"; break; |
416 break; |
| |
417 case GAIM_SUBTYPE_BLIST_GROUP: |
| |
418 stash = "Gaim::BuddyList::Group"; |
| |
419 break; |
| |
420 case GAIM_SUBTYPE_BLIST_CHAT: |
| |
421 stash = "Gaim::BuddyList::Chat"; |
| |
422 break; |
| |
423 case GAIM_SUBTYPE_CONNECTION: |
| |
424 stash = "Gaim::Connection"; |
| |
425 break; |
| |
426 case GAIM_SUBTYPE_CONVERSATION: |
| |
427 stash = "Gaim::Conversation"; |
| |
428 break; |
| |
429 case GAIM_SUBTYPE_PLUGIN: |
| |
430 stash = "Gaim::Plugin"; |
| |
431 break; |
| 424 |
432 |
| 425 default: |
433 default: |
| 426 stash = "Gaim"; /* ? */ |
434 stash = "Gaim"; /* ? */ |
| 427 } |
435 } |
| 428 |
436 |
| 429 return sv_2mortal(gaim_perl_bless_object(arg, stash)); |
437 return sv_2mortal(gaim_perl_bless_object(arg, stash)); |
| 430 } |
438 } |
| 431 |
439 |
| 432 SV * |
440 SV * |
| 433 gaim_perl_sv_from_vargs(const GaimValue *value, va_list *args, |
441 gaim_perl_sv_from_vargs(const GaimValue *value, va_list *args, void ***copy_arg) |
| 434 void ***copy_arg) |
442 { |
| 435 { |
443 if (gaim_value_is_outgoing(value)) { |
| 436 if (gaim_value_is_outgoing(value)) |
444 switch (gaim_value_get_type(value)) { |
| 437 { |
|
| 438 switch (gaim_value_get_type(value)) |
|
| 439 { |
|
| 440 case GAIM_TYPE_SUBTYPE: |
445 case GAIM_TYPE_SUBTYPE: |
| 441 if ((*copy_arg = va_arg(*args, void **)) == NULL) |
446 if ((*copy_arg = va_arg(*args, void **)) == NULL) |
| 442 return &PL_sv_undef; |
447 return &PL_sv_undef; |
| 443 |
448 |
| 444 return gaim_perl_sv_from_subtype(value, *(void **)*copy_arg); |
449 return gaim_perl_sv_from_subtype(value, *(void **)*copy_arg); |
| 509 |
514 |
| 510 default: |
515 default: |
| 511 /* If this happens, things are going to get screwed up... */ |
516 /* If this happens, things are going to get screwed up... */ |
| 512 return NULL; |
517 return NULL; |
| 513 } |
518 } |
| 514 } |
519 } else { |
| 515 else |
520 switch (gaim_value_get_type(value)) { |
| 516 { |
|
| 517 switch (gaim_value_get_type(value)) |
|
| 518 { |
|
| 519 case GAIM_TYPE_SUBTYPE: |
521 case GAIM_TYPE_SUBTYPE: |
| 520 if ((*copy_arg = va_arg(*args, void *)) == NULL) |
522 if ((*copy_arg = va_arg(*args, void *)) == NULL) |
| 521 return &PL_sv_undef; |
523 return &PL_sv_undef; |
| 522 |
524 |
| 523 return gaim_perl_sv_from_subtype(value, *copy_arg); |
525 return gaim_perl_sv_from_subtype(value, *copy_arg); |