[Freeswitch-svn] [commit] r10270 - freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax

Freeswitch SVN gmaruzz at freeswitch.org
Fri Nov 7 11:41:06 PST 2008


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 */



More information about the Freeswitch-svn mailing list