]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
skypiax: fixed http://jira.freeswitch.org/browse/MODSKYPIAX-21 on windows, let's...
authorGiovanni Maruzzelli <gmaruzz@gmail.com>
Fri, 27 Feb 2009 11:08:23 +0000 (11:08 +0000)
committerGiovanni Maruzzelli <gmaruzz@gmail.com>
Fri, 27 Feb 2009 11:08:23 +0000 (11:08 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@12320 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/endpoints/mod_skypiax/mod_skypiax.c
src/mod/endpoints/mod_skypiax/skypiax.h
src/mod/endpoints/mod_skypiax/skypiax_protocol.c

index 547116e872e4d1ebe1dfb4deb9f3b0fbf6deb664..d8c1277b41c175b51e2d54fd96e58c2f6b0f2897 100644 (file)
@@ -940,15 +940,32 @@ static switch_status_t load_config(void)
 
         skypiax_audio_init(&globals.SKYPIAX_INTERFACES[interface_id]);
 
+        NOTICA("WAITING max 6 seconds to connect to SKYPE API for interface_id=%d\n", SKYPIAX_P_LOG, interface_id);
         i = 0;
-        while (globals.SKYPIAX_INTERFACES[interface_id].SkypiaxHandles.api_connected == 0 && running && i < 60000) {    // 60sec FIXME
+        while (globals.SKYPIAX_INTERFACES[interface_id].SkypiaxHandles.api_connected == 0 && running && i < 400) {    // 6sec on windows (why ????)  FIXME
+          //DEBUGA_SKYPE("interface_id=%d, times=%d\n", SKYPIAX_P_LOG, interface_id, i);
           switch_sleep(1000);
           i++;
         }
         if (globals.SKYPIAX_INTERFACES[interface_id].SkypiaxHandles.api_connected) {
-          NOTICA("STARTED interface_id=%d\n", SKYPIAX_P_LOG, interface_id);
+          NOTICA("SKYPE API connected for interface_id=%d, waiting max 60 seconds for CURRENTUSERHANDLE==%s\n", SKYPIAX_P_LOG, interface_id, globals.SKYPIAX_INTERFACES[interface_id].skype_user);
         } else {
-          ERRORA("FAILED to start interface_id=%d\n", SKYPIAX_P_LOG, interface_id);
+          ERRORA("SKYPE API FAILED to connect for interface_id=%d\n", SKYPIAX_P_LOG, interface_id);
+          running = 0;
+          return SWITCH_STATUS_FALSE;
+        }
+
+        i = 0;
+        while (globals.SKYPIAX_INTERFACES[interface_id].SkypiaxHandles.currentuserhandle == 0 && running && i < 4000) {    // 60sec on windows (why ????)  FIXME
+          //DEBUGA_SKYPE("interface_id=%d, times=%d\n", SKYPIAX_P_LOG, interface_id, i);
+          switch_sleep(1000);
+          i++;
+        }
+        if (globals.SKYPIAX_INTERFACES[interface_id].SkypiaxHandles.currentuserhandle) {
+          NOTICA("CURRENTUSERHANDLE ok (%s), interface_id=%d STARTED\n", SKYPIAX_P_LOG, globals.SKYPIAX_INTERFACES[interface_id].skype_user, interface_id);
+        } else {
+          ERRORA("FAILED to find CURRENTUSERHANDLE=%s, FAILED to start interface_id=%d\n", SKYPIAX_P_LOG, globals.SKYPIAX_INTERFACES[interface_id].skype_user, interface_id);
+          running = 0;
           return SWITCH_STATUS_FALSE;
         }
 
@@ -995,8 +1012,10 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_skypiax_load)
 
   running = 1;
 
-  if (load_config() != SWITCH_STATUS_SUCCESS)
+  if (load_config() != SWITCH_STATUS_SUCCESS) {
+    running = 0;
     return SWITCH_STATUS_FALSE;
+  }
 
   *module_interface = switch_loadable_module_create_module_interface(pool, modname);
   skypiax_endpoint_interface =
@@ -1039,6 +1058,7 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_skypiax_shutdown)
         DEBUGA_SKYPE
           ("got FALSE here, thread probably was already dead. GetLastError returned: %d\n",
            SKYPIAX_P_LOG, GetLastError());
+            globals.SKYPIAX_INTERFACES[interface_id].skypiax_api_thread=NULL;
       }
 #else
       XEvent e;
@@ -1057,9 +1077,9 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_skypiax_shutdown)
       XSync(tech_pvt->SkypiaxHandles.disp, False);
 #endif
     }
-    while (x) {
+    while (x) {//FIXME 2 seconds?
       x--;
-      switch_yield(20000);
+      switch_yield(20000); 
     }
     if (globals.SKYPIAX_INTERFACES[interface_id].skypiax_signaling_thread) {
       switch_thread_join(&status,
index 5fee026a6a22e580391d3038995a6541b4617b46..1d4607eedbb7f00c1ea1e575fd0ea8937f55c262 100644 (file)
@@ -136,6 +136,7 @@ struct SkypiaxHandles {
   Window skype_win;
   Display *disp;
   Window win;
+  int currentuserhandle;
   int api_connected;
   int fdesc[2];
 };
@@ -148,6 +149,7 @@ struct SkypiaxHandles {
   char win32_acInit_WindowClassName[128];
   UINT win32_uiGlobal_MsgID_SkypeControlAPIAttach;
   UINT win32_uiGlobal_MsgID_SkypeControlAPIDiscover;
+  int currentuserhandle;
   int api_connected;
   switch_file_t *fdesc[2];
 };
index dc9868581a51366bddc49ae3e0c0c4f6c09ecba6..ae478723731f397672e4bba50e12db82bd8eb386 100644 (file)
@@ -100,7 +100,7 @@ int skypiax_signaling_read(private_t * tech_pvt)
         where = strsep(stringp, " ");
         strncpy(id, where, sizeof(id) - 1);
         if (!strcasecmp(id, tech_pvt->skype_user)) {
-          tech_pvt->SkypiaxHandles.api_connected = 1;
+          tech_pvt->SkypiaxHandles.currentuserhandle = 1;
           DEBUGA_SKYPE
             ("Skype MSG: message: %s, currentuserhandle: %s, cuh: %s, skype_user: %s!\n",
              SKYPIAX_P_LOG, message, obj, id, tech_pvt->skype_user);
@@ -909,6 +909,8 @@ LRESULT APIENTRY skypiax_present(HWND hWindow, UINT uiMessage, WPARAM uiParam,
   lReturnCode = 0;
   fIssueDefProc = 0;
   tech_pvt = (private_t *) GetWindowLong(hWindow, GWL_USERDATA);
+  if(!running)
+         return lReturnCode;
   switch (uiMessage) {
   case WM_CREATE:
     tech_pvt = (private_t *) ((LPCREATESTRUCT) ulParam)->lpCreateParams;
@@ -945,8 +947,9 @@ LRESULT APIENTRY skypiax_present(HWND hWindow, UINT uiMessage, WPARAM uiParam,
           tech_pvt->SkypiaxHandles.win32_uiGlobal_MsgID_SkypeControlAPIAttach) {
         switch (ulParam) {
         case SKYPECONTROLAPI_ATTACH_SUCCESS:
-          if (!tech_pvt->SkypiaxHandles.api_connected) {
+          if (!tech_pvt->SkypiaxHandles.currentuserhandle) {
             DEBUGA_SKYPE("\n\n\tConnected to Skype API!\n", SKYPIAX_P_LOG);
+            tech_pvt->SkypiaxHandles.api_connected = 1;
             tech_pvt->SkypiaxHandles.win32_hGlobal_SkypeAPIWindowHandle = (HWND) uiParam;
             tech_pvt->SkypiaxHandles.win32_hGlobal_SkypeAPIWindowHandle =
               tech_pvt->SkypiaxHandles.win32_hGlobal_SkypeAPIWindowHandle;
@@ -957,7 +960,7 @@ LRESULT APIENTRY skypiax_present(HWND hWindow, UINT uiMessage, WPARAM uiParam,
             ("\n\n\tIf I do not (almost) immediately connect to Skype API,\n\tplease give the Skype client authorization to be connected \n\tby Asterisk and to not ask you again.\n\n",
              SKYPIAX_P_LOG);
           skypiax_sleep(5000);
-          if (!tech_pvt->SkypiaxHandles.api_connected) {
+          if (!tech_pvt->SkypiaxHandles.currentuserhandle) {
             SendMessage(HWND_BROADCAST,
                         tech_pvt->SkypiaxHandles.
                         win32_uiGlobal_MsgID_SkypeControlAPIDiscover,
@@ -974,7 +977,7 @@ LRESULT APIENTRY skypiax_present(HWND hWindow, UINT uiMessage, WPARAM uiParam,
         case SKYPECONTROLAPI_ATTACH_API_AVAILABLE:
           DEBUGA_SKYPE("Skype API available\n", SKYPIAX_P_LOG);
           skypiax_sleep(5000);
-          if (!tech_pvt->SkypiaxHandles.api_connected) {
+          if (!tech_pvt->SkypiaxHandles.currentuserhandle) {
             SendMessage(HWND_BROADCAST,
                         tech_pvt->SkypiaxHandles.
                         win32_uiGlobal_MsgID_SkypeControlAPIDiscover,
@@ -1234,12 +1237,14 @@ int skypiax_present(struct SkypiaxHandles *SkypiaxHandles)
   if (status != Success || format_ret != 32 || nitems_ret != 1) {
     SkypiaxHandles->skype_win = (Window) - 1;
     DEBUGA_SKYPE("Skype instance not found\n", SKYPIAX_P_LOG);
+    tech_pvt->SkypiaxHandles.api_connected = 0;
     return 0;
   }
 
   SkypiaxHandles->skype_win = *(const unsigned long *) prop & 0xffffffff;
   DEBUGA_SKYPE("Skype instance found with id #%d\n", SKYPIAX_P_LOG,
                (unsigned int) SkypiaxHandles->skype_win);
+  tech_pvt->SkypiaxHandles.api_connected = 1;
   return 1;
 }