[commit] r10270 - freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax
Author: gmaruzz Date: Thu Nov 6 10:14:17 2008 New Revision: 10270 Modified: freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax/mod_skypiax.c Log: skypiax: added a little X11 init Modified: freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax/mod_skypiax.c ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax/mod_skypiax.c (original) +++ freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax/mod_skypiax.c Thu Nov 6 10:14:17 2008 @@ -2205,6 +2205,9 @@ #define MOD_SKYPIAX #ifdef MOD_SKYPIAX +#include <X11/Xlib.h> +#include <X11/Xlibint.h> +#include <X11/Xatom.h> #include <switch.h> #define SKYPIAX_MAX_INTERFACES 64 @@ -2672,6 +2675,157 @@ /*.receive_message */ channel_receive_message, /*.receive_event */ channel_receive_event }; +#define SKYPE_THREAD +#ifdef SKYPE_THREAD +void *do_skype_thread(void *data) +{ + +// struct skypiax_pvt *p; + // struct AsteriskHandles *AsteriskHandlesAst; + //FIXME char buf[SKYPE_X11_BUF_SIZE]; + Display *disp = NULL; + //FIXME Window root = -1; + //FIXME Window win = -1; + + /* + p = data; + + if (option_debug > 10) { + DEBUGA_PBX("ENTERING FUNC\n", SKYPIAX_P_LOG); + } + if (pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL)) { + ERRORA("Unable to set cancel type to deferred\n", SKYPIAX_P_LOG); + if (option_debug > 10) { + DEBUGA_PBX("EXITING FUNC\n", SKYPIAX_P_LOG); + } + return NULL; + } + + AsteriskHandlesAst = &p->AsteriskHandlesAst; +*/ + disp = XOpenDisplay(getenv("DISPLAY")); + if (!disp) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot open X Display, exiting skype thread\n"); + return NULL; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "X Display opened\n"); + } + + int xfd; + xfd = XConnectionNumber(disp); + fcntl(xfd, F_SETFD, FD_CLOEXEC); + +#ifdef NOTDEF + pthread_cleanup_push(skypiax_skype_clean_disp, &xfd); + DEBUGA_SKYPE("PUSH disp %d\n", SKYPIAX_P_LOG, xfd); + + if (skypiax_skype_present(disp)) { + root = DefaultRootWindow(disp); + win = + XCreateSimpleWindow(disp, root, 0, 0, 1, 1, 0, + BlackPixel(disp, DefaultScreen(disp)), BlackPixel(disp, + DefaultScreen + (disp))); + + DEBUGA_SKYPE("skype_win=%d win=%d\n", SKYPIAX_P_LOG, (unsigned int) skype_win, + (unsigned int) win); + + AsteriskHandlesAst->skype_win = skype_win; + AsteriskHandlesAst->disp = disp; + AsteriskHandlesAst->win = win; + + snprintf(buf, SKYPE_X11_BUF_SIZE, "NAME skypiax"); + + if (!skypiax_skype_send_message(AsteriskHandlesAst, buf)) { + ERRORA + ("Sending message failed - probably Skype crashed. Please run/restart Skype manually and launch Skypiax again\n", + SKYPIAX_P_LOG); + p->skype = 0; + p->skype_thread = AST_PTHREADT_NULL; + if (option_debug > 10) { + DEBUGA_PBX("EXITING FUNC\n", SKYPIAX_P_LOG); + } + return NULL; + } + + snprintf(buf, SKYPE_X11_BUF_SIZE, "PROTOCOL 6"); + if (!skypiax_skype_send_message(AsteriskHandlesAst, buf)) { + ERRORA + ("Sending message failed - probably Skype crashed. Please run/restart Skype manually and launch Skypiax again\n", + SKYPIAX_P_LOG); + p->skype = 0; + p->skype_thread = AST_PTHREADT_NULL; + if (option_debug > 10) { + DEBUGA_PBX("EXITING FUNC\n", SKYPIAX_P_LOG); + } + return NULL; + } + + /* perform an events loop */ + XEvent an_event; + char buf[21]; /* can't be longer */ + char buffer[17000]; + char *b; + int i; + + b = buffer; + + while (1) { + pthread_testcancel(); + XNextEvent(disp, &an_event); + switch (an_event.type) { + case ClientMessage: + + if (an_event.xclient.format != 8) + break; + + for (i = 0; i < 20 && an_event.xclient.data.b[i] != '\0'; ++i) + buf[i] = an_event.xclient.data.b[i]; + + buf[i] = '\0'; + + //NOTICA("ClientMessage buf:|||%s||| buffer:|||%s||| serial=%ld|||\r\n",SKYPIAX_P_LOG,buf, buffer,an_event.xclient.serial); + //NOTICA ("SKYPE read: |||%s|||%d\n", SKYPIAX_P_LOG, buf, strlen(buf)); + //NOTICA ("SKYPE buffer: |||%s|||%d\n", SKYPIAX_P_LOG, buffer, strlen(buffer)); + + strcat(buffer, buf); + + if (i < 20) { /* last fragment */ + write(AsteriskHandlesAst->fdesc[1], b, strlen(b) + 1); + //write(AsteriskHandlesAst->fdesc[1], "\0", 1); + DEBUGA_SKYPE("SKYPE pipewrite: |||%s|||len=%d serial=%ld\n", SKYPIAX_P_LOG, b, + strlen(b) + 1, an_event.xclient.serial); + //usleep(1000); + memset(buffer, '\0', 17000); + } + + break; + default: + break; + } + } + } else { + ERRORA + ("Skype is not running, maybe crashed. Please run/restart Skype and relaunch Skypiax\n", + SKYPIAX_P_LOG); + p->skype = 0; + p->skype_thread = AST_PTHREADT_NULL; + return NULL; + } + p->skype = 0; + p->skype_thread = AST_PTHREADT_NULL; + pthread_cleanup_pop(1); + if (option_debug > 10) { + DEBUGA_PBX("EXITING FUNC\n", SKYPIAX_P_LOG); + } +#endif /* NOTDEF */ + return NULL; + +} + + +#endif /* SKYPE_THREAD */ + static switch_status_t load_config(void) { @@ -2805,7 +2959,6 @@ if(span_id && span_id < SKYPIAX_MAX_INTERFACES ) { struct skypiax_config newconf; - //skypax_config_t newconf; memset(&newconf, '\0', sizeof(newconf)); SKYPIAX_CONFIGS[span_id]=newconf; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "CONFIGURING span_id=%d\n", span_id); @@ -2840,15 +2993,24 @@ switch_xml_free(xml); + do_skype_thread(NULL); + return SWITCH_STATUS_SUCCESS; } - SWITCH_MODULE_LOAD_FUNCTION(mod_skypiax_load) { module_pool = pool; +#ifndef _WINDOWS_ //FIXME + if (!XInitThreads()) + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Not initialized XInitThreads!\n"); + else + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Initialized XInitThreads!\n"); +#endif /* _WINDOWS_ */ + + load_config(); *module_interface = switch_loadable_module_create_module_interface(pool, modname); @@ -2860,60 +3022,6 @@ /*****************************************/ #ifdef CICOPET { - int i; - struct ast_config *cfg; - struct skypiax_pvt *tmp; - struct skypiax_pvt *p = NULL; - -#ifndef __CYGWIN__ - if (!XInitThreads()) - ast_log(LOG_ERROR, "Not initialized XInitThreads!\n"); -#endif /* __CYGWIN__ */ - - /* load skypiax.conf config file */ - cfg = ast_config_load(skypiax_config); - if (cfg != NULL) { - char *ctg = NULL; - int is_first_category = 1; - while ((ctg = ast_category_browse(cfg, ctg)) != NULL) { - /* create one interface for each category in skypiax.conf config file, first one set the defaults */ - tmp = skypiax_mkif(cfg, ctg, is_first_category); - if (tmp) { - DEBUGA_PBX - ("Created channel Skypiax: skypiax.conf category '[%s]', channel name '%s'" - "\n", SKYPIAX_P_LOG, ctg, tmp->name); - /* add interface to skypiax_iflist */ - tmp->next = skypiax_iflist; - skypiax_iflist = tmp; - /* next one will not be the first ;) */ - if (is_first_category == 1) { - is_first_category = 0; - skypiax_console_active = tmp->name; - } - } else { - ERRORA("Unable to create channel Skypiax from skypiax.conf category '[%s]'\n", - SKYPIAX_P_LOG, ctg); - /* if error, unload config from memory and return */ - ast_config_destroy(cfg); - ast_channel_unregister(&skypiax_tech); - if (option_debug > 10) { - DEBUGA_PBX("EXITING FUNC\n", SKYPIAX_P_LOG); - } - return -1; - } - /* do it for each category described in config */ - } - - /* we finished, unload config from memory */ - ast_config_destroy(cfg); - } else { - ERRORA("Unable to load skypiax_config skypiax.conf\n", SKYPIAX_P_LOG); - ast_channel_unregister(&skypiax_tech); - if (option_debug > 10) { - DEBUGA_PBX("EXITING FUNC\n", SKYPIAX_P_LOG); - } - return -1; - } #ifndef ASTERISK_VERSION_1_6 ast_cli_register_multiple(myclis, sizeof(myclis) / sizeof(struct ast_cli_entry)); #endif /* ASTERISK_VERSION_1_6 */
participants (1)
-
Freeswitch SVN