| 129 } |
129 } |
| 130 |
130 |
| 131 static SV *execute_perl(char *function, char *args) |
131 static SV *execute_perl(char *function, char *args) |
| 132 { |
132 { |
| 133 static char *perl_cmd = NULL; |
133 static char *perl_cmd = NULL; |
| |
134 SV *i; |
| 134 |
135 |
| 135 if (perl_cmd) |
136 if (perl_cmd) |
| 136 g_free(perl_cmd); |
137 g_free(perl_cmd); |
| 137 perl_cmd = g_malloc(strlen(function) + (strlen(args) * 2) + 2 + 10); |
138 perl_cmd = g_malloc(strlen(function) + strlen(args) + 4); |
| 138 sprintf(perl_cmd, "&%s('%s')", function, escape_quotes(args)); |
139 sprintf(perl_cmd, "&%s(%s)", function, args); |
| 139 #ifndef HAVE_PERL_EVAL_PV |
140 #ifndef HAVE_PERL_EVAL_PV |
| 140 return (perl_eval_pv(perl_cmd, TRUE)); |
141 i = (perl_eval_pv(perl_cmd, TRUE)); |
| 141 #else |
142 #else |
| 142 return (Perl_eval_pv(perl_cmd, TRUE)); |
143 i = (Perl_eval_pv(perl_cmd, TRUE)); |
| 143 #endif |
144 #endif |
| |
145 return i; |
| 144 } |
146 } |
| 145 |
147 |
| 146 int perl_load_file(char *script_name) |
148 int perl_load_file(char *script_name) |
| 147 { |
149 { |
| |
150 char *name = g_strdup_printf("'%s'", escape_quotes(script_name)); |
| 148 SV *return_val; |
151 SV *return_val; |
| 149 if (my_perl == NULL) |
152 if (my_perl == NULL) |
| 150 perl_init(); |
153 perl_init(); |
| 151 return_val = execute_perl("load_file", script_name); |
154 return_val = execute_perl("load_file", name); |
| |
155 g_free(name); |
| 152 return SvNV (return_val); |
156 return SvNV (return_val); |
| 153 } |
157 } |
| 154 |
158 |
| 155 static int is_pl_file(char *filename) |
159 static int is_pl_file(char *filename) |
| 156 { |
160 { |
| 641 if (b) |
645 if (b) |
| 642 serv_chat_send(gc, id, what); |
646 serv_chat_send(gc, id, what); |
| 643 XSRETURN(0); |
647 XSRETURN(0); |
| 644 } |
648 } |
| 645 |
649 |
| 646 int perl_event(char *event, char *args) |
650 int perl_event(enum gaim_event event, void *arg1, void *arg2, void *arg3, void *arg4) |
| 647 { |
651 { |
| |
652 char *buf = NULL; |
| 648 GList *handler; |
653 GList *handler; |
| 649 struct _perl_event_handlers *data; |
654 struct _perl_event_handlers *data; |
| 650 SV *handler_return; |
655 SV *handler_return; |
| 651 |
656 |
| |
657 switch (event) { |
| |
658 case event_signon: |
| |
659 case event_signoff: |
| |
660 buf = g_strdup_printf("'%lu'", (unsigned long)arg1); |
| |
661 break; |
| |
662 case event_away: |
| |
663 buf = g_strdup_printf("'%lu','%s'", (unsigned long)arg1, |
| |
664 ((struct gaim_connection *)arg1)->away ? |
| |
665 escape_quotes(((struct gaim_connection *)arg1)->away) : ""); |
| |
666 break; |
| |
667 case event_im_recv: |
| |
668 { |
| |
669 char *tmp = *(char **)arg2 ? g_strdup(escape_quotes(*(char **)arg2)) : g_malloc0(1); |
| |
670 buf = g_strdup_printf("'%lu','%s','%s'", (unsigned long)arg1, tmp, |
| |
671 *(char **)arg3 ? escape_quotes(*(char **)arg3) : ""); |
| |
672 g_free(tmp); |
| |
673 } |
| |
674 break; |
| |
675 case event_im_send: |
| |
676 { |
| |
677 char *tmp = arg2 ? g_strdup(escape_quotes(arg2)) : g_malloc0(1); |
| |
678 buf = g_strdup_printf("'%lu','%s','%s'", (unsigned long)arg1, tmp, |
| |
679 *(char **)arg3 ? escape_quotes(*(char **)arg3) : ""); |
| |
680 g_free(tmp); |
| |
681 } |
| |
682 break; |
| |
683 case event_buddy_signon: |
| |
684 case event_buddy_signoff: |
| |
685 case event_set_info: |
| |
686 case event_buddy_away: |
| |
687 case event_buddy_back: |
| |
688 case event_buddy_idle: |
| |
689 case event_buddy_unidle: |
| |
690 buf = g_strdup_printf("'%lu','%s'", (unsigned long)arg1, escape_quotes(arg2)); |
| |
691 break; |
| |
692 case event_chat_invited: |
| |
693 { |
| |
694 char *tmp2, *tmp3, *tmp4; |
| |
695 tmp2 = g_strdup(escape_quotes(arg2)); |
| |
696 tmp3 = g_strdup(escape_quotes(arg3)); |
| |
697 tmp4 = arg4 ? g_strdup(escape_quotes(arg4)) : g_malloc0(1); |
| |
698 buf = g_strdup_printf("'%lu','%s','%s','%s'", (unsigned long)arg1, tmp2, tmp3, tmp4); |
| |
699 g_free(tmp2); |
| |
700 g_free(tmp3); |
| |
701 g_free(tmp4); |
| |
702 } |
| |
703 break; |
| |
704 case event_chat_join: |
| |
705 case event_chat_buddy_join: |
| |
706 case event_chat_buddy_leave: |
| |
707 buf = g_strdup_printf("'%lu','%d','%s'", (unsigned long)arg1, (int)arg2, |
| |
708 escape_quotes(arg3)); |
| |
709 break; |
| |
710 case event_chat_leave: |
| |
711 buf = g_strdup_printf("'%lu','%d'", (unsigned long)arg1, (int)arg2); |
| |
712 break; |
| |
713 case event_chat_recv: |
| |
714 { |
| |
715 char *t3, *t4; |
| |
716 t3 = g_strdup(escape_quotes(arg3)); |
| |
717 t4 = arg4 ? g_strdup(escape_quotes(arg4)) : g_malloc0(1); |
| |
718 buf = g_strdup_printf("'%lu','%d','%s','%s'", (unsigned long)arg1, (int)arg2, t3, t4); |
| |
719 g_free(t3); |
| |
720 g_free(t4); |
| |
721 } |
| |
722 break; |
| |
723 case event_chat_send_invite: |
| |
724 { |
| |
725 char *t3, *t4; |
| |
726 t3 = g_strdup(escape_quotes(arg3)); |
| |
727 t4 = *(char **)arg4 ? g_strdup(escape_quotes(*(char **)arg4)) : g_malloc0(1); |
| |
728 buf = g_strdup_printf("'%lu','%d','%s','%s'", (unsigned long)arg1, (int)arg2, t3, t4); |
| |
729 g_free(t3); |
| |
730 g_free(t4); |
| |
731 } |
| |
732 break; |
| |
733 case event_chat_send: |
| |
734 buf = g_strdup_printf("'%lu','%d','%s'", (unsigned long)arg1, (int)arg2, |
| |
735 *(char **)arg3 ? escape_quotes(*(char **)arg3) : ""); |
| |
736 break; |
| |
737 case event_warned: |
| |
738 buf = g_strdup_printf("'%lu','%s','%d'", (unsigned long)arg1, |
| |
739 arg2 ? escape_quotes(arg2) : "", (int)arg3); |
| |
740 break; |
| |
741 case event_quit: |
| |
742 buf = g_malloc0(1); |
| |
743 break; |
| |
744 case event_new_conversation: |
| |
745 buf = g_strdup_printf("'%s'", escape_quotes(arg1)); |
| |
746 break; |
| |
747 case event_im_displayed_sent: |
| |
748 { |
| |
749 char *tmp2, *tmp3; |
| |
750 tmp2 = g_strdup(escape_quotes(arg2)); |
| |
751 tmp3 = *(char **)arg3 ? g_strdup(escape_quotes(*(char **)arg3)) : g_malloc0(1); |
| |
752 buf = g_strdup_printf("'%lu','%s','%s'", (unsigned long)arg1, tmp2, tmp3); |
| |
753 g_free(tmp2); |
| |
754 g_free(tmp3); |
| |
755 } |
| |
756 break; |
| |
757 case event_im_displayed_rcvd: |
| |
758 { |
| |
759 char *tmp2, *tmp3; |
| |
760 tmp2 = g_strdup(escape_quotes(arg2)); |
| |
761 tmp3 = arg3 ? g_strdup(escape_quotes(arg3)) : g_malloc0(1); |
| |
762 buf = g_strdup_printf("%lu \"%s\" %s", (unsigned long)arg1, tmp2, tmp3); |
| |
763 g_free(tmp2); |
| |
764 g_free(tmp3); |
| |
765 } |
| |
766 break; |
| |
767 default: |
| |
768 return 0; |
| |
769 } |
| |
770 |
| 652 for (handler = perl_event_handlers; handler != NULL; handler = handler->next) { |
771 for (handler = perl_event_handlers; handler != NULL; handler = handler->next) { |
| 653 data = handler->data; |
772 data = handler->data; |
| 654 if (!strcmp(event, data->event_type)) { |
773 if (!strcmp(event_name(event), data->event_type)) { |
| 655 handler_return = execute_perl(data->handler_name, args); |
774 handler_return = execute_perl(data->handler_name, buf); |
| 656 if (SvIV(handler_return)) |
775 if (SvIV(handler_return)) { |
| |
776 if (buf) |
| |
777 g_free(buf); |
| 657 return SvIV(handler_return); |
778 return SvIV(handler_return); |
| 658 } |
779 } |
| 659 } |
780 } |
| |
781 } |
| |
782 |
| |
783 if (buf) |
| |
784 g_free(buf); |
| 660 |
785 |
| 661 return 0; |
786 return 0; |
| 662 } |
787 } |
| 663 |
788 |
| 664 XS (XS_GAIM_add_event_handler) |
789 XS (XS_GAIM_add_event_handler) |