Update of /cvsroot/playerstage/code/player/libplayersd
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv17843

Modified Files:
        playersd.h playersd_mdns.c 
Log Message:
added browse

Index: playersd_mdns.c
===================================================================
RCS file: /cvsroot/playerstage/code/player/libplayersd/playersd_mdns.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** playersd_mdns.c     26 Sep 2007 01:39:22 -0000      1.7
--- playersd_mdns.c     26 Sep 2007 17:36:58 -0000      1.8
***************
*** 50,59 ****
  
  #include <stdlib.h>
  #include <string.h>
  #include <assert.h>
  #include <stdio.h>
  #include <errno.h>
  
- //#include <sys/poll.h>
  
  #include <dns_sd.h>
--- 50,60 ----
  
  #include <stdlib.h>
+ #include <math.h>
  #include <string.h>
  #include <assert.h>
  #include <stdio.h>
  #include <errno.h>
+ #include <sys/time.h>
  
  
  #include <dns_sd.h>
***************
*** 62,65 ****
--- 63,68 ----
  #include <libplayercore/interface_util.h>
  
+ #include <replace/replace.h> // for poll(2)
+ 
  #include "playersd.h"
  
***************
*** 97,100 ****
--- 100,105 ----
    // Length of list
    size_t mdnsDevs_len;
+   // User's browse callback
+   player_sd_browse_callback_fn_t callb;
  } player_sd_mdns_t;
  
***************
*** 107,110 ****
--- 112,124 ----
                         void *context);  
  
+ static void browseCB(DNSServiceRef sdRef, 
+                      DNSServiceFlags flags, 
+                      uint32_t interfaceIndex, 
+                      DNSServiceErrorType errorCode, 
+                      const char *serviceName, 
+                      const char *regtype, 
+                      const char *replyDomain, 
+                      void *context);
+ 
  
  player_sd_t* 
***************
*** 121,124 ****
--- 135,139 ----
    mdns->mdnsDevs = NULL;
    mdns->mdnsDevs_len = 0;
+   mdns->callb = NULL;
    sd->sdRef = mdns;
  
***************
*** 283,286 ****
--- 298,391 ----
  }
  
+ int 
+ player_sd_browse(player_sd_t* sd,
+                  double timeout, 
+                  int keepalive,
+                  player_sd_browse_callback_fn_t cb)
+ {
+   DNSServiceErrorType sdErr;
+   player_sd_mdns_t* mdns = (player_sd_mdns_t*)(sd->sdRef);
+   struct pollfd ufds[1];
+   int numready;
+   struct timeval curr;
+   double currtime, starttime;
+   int polltime;
+   
+   // Close any previously open session
+   if(mdns->browseRef_valid)
+   {
+     DNSServiceRefDeallocate(mdns->browseRef);
+     mdns->browseRef_valid = 0;
+   }
+ 
+   // Initiate the browse session
+   if((sdErr = DNSServiceBrowse(&(mdns->browseRef),
+                                0,
+                                0,
+                                PLAYER_SD_SERVICENAME,
+                                NULL,
+                                browseCB,
+                                (void*)mdns)) != kDNSServiceErr_NoError)
+   {
+     PLAYER_ERROR1("DNSServiceBrowse returned error: %d", sdErr);
+     return(-1);
+   }
+ 
+   mdns->browseRef_valid = 1;
+   mdns->callb = cb;
+ 
+   // Should we wait here for responses?
+   if(timeout > 0.0)
+   {
+     // Record the current time
+     gettimeofday(&curr,NULL);
+     starttime = currtime = curr.tv_sec + curr.tv_usec / 1e6;
+ 
+     while((currtime - starttime) < timeout)
+     {
+       // Set up to poll on the DNSSD socket
+       polltime = (int)rint((timeout - (currtime - starttime)) * 1e3);
+       ufds[0].fd = DNSServiceRefSockFD(mdns->browseRef);
+       ufds[0].events = POLLIN;
+       if((numready = poll(ufds,1,polltime)) < 0)
+       {
+         if(errno == EAGAIN)
+           continue;
+         else
+         {
+           PLAYER_ERROR1("poll returned error: %s\n", strerror(errno));
+           DNSServiceRefDeallocate(mdns->browseRef);
+           mdns->browseRef_valid = 0;
+           return(-1);
+         }
+       }
+       else if(numready > 0)
+       {
+         // Input is ready; collect it.   Our callback (browseCB) will be
+         // invoked.
+         if((sdErr = DNSServiceProcessResult(mdns->browseRef)) != 
+            kDNSServiceErr_NoError)
+         {
+           PLAYER_ERROR1("DNSServiceProcessResult returned error: %d", sdErr);
+           DNSServiceRefDeallocate(mdns->browseRef);
+           mdns->browseRef_valid = 0;
+           return(-1);
+         }
+       }
+ 
+       gettimeofday(&curr,NULL);
+       currtime = curr.tv_sec + curr.tv_usec / 1e6;
+     }
+   }
+ 
+   // Should we leave the session open?
+   if(!keepalive)
+   {
+     DNSServiceRefDeallocate(mdns->browseRef);
+     mdns->browseRef_valid = 0;
+   }
+   return(0);
+ }
+ 
  void 
  registerCB(DNSServiceRef sdRef, 
***************
*** 294,295 ****
--- 399,412 ----
    // Don't need to do anything here
  }
+ 
+ void 
+ browseCB(DNSServiceRef sdRef, 
+          DNSServiceFlags flags, 
+          uint32_t interfaceIndex, 
+          DNSServiceErrorType errorCode, 
+          const char *serviceName, 
+          const char *regtype, 
+          const char *replyDomain, 
+          void *context)
+ {
+ }

Index: playersd.h
===================================================================
RCS file: /cvsroot/playerstage/code/player/libplayersd/playersd.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** playersd.h  26 Sep 2007 01:39:22 -0000      1.6
--- playersd.h  26 Sep 2007 17:36:58 -0000      1.7
***************
*** 112,116 ****
                                                 player_devaddr_t addr);
  
! /// Browse for player devices.  Browses for timeout ms, accruing the results
  /// into the sd object.  If keepalive is non-zero, then the browsing session
  /// is left open and can be updated by future calls to player_sd_update().
--- 112,116 ----
                                                 player_devaddr_t addr);
  
! /// Browse for player devices.  Browses for timeout s, accruing the results
  /// into the sd object.  If keepalive is non-zero, then the browsing session
  /// is left open and can be updated by future calls to player_sd_update().
***************
*** 121,134 ****
  /// success, non-zero on error.
  int player_sd_browse(player_sd_t* sd,
!                      int timeout, 
                       int keepalive,
                       player_sd_browse_callback_fn_t cb);
  
! /// Check for new device updates, waiting for timeout ms.  Contents of sd
  /// are updated, and if a callback was passed to player_sd_browse, then this
  /// function is also called for each discovered device.  Only makes sense to
  /// call this function after a call to player_sd_browse.  Returns 0 on
  /// success, non-zero on error.
! int player_sd_update(player_sd_t* sd, int timeout);
  
  /// Stop browsing.  Returns 0 on success, non-zero on error.
--- 121,134 ----
  /// success, non-zero on error.
  int player_sd_browse(player_sd_t* sd,
!                      double timeout, 
                       int keepalive,
                       player_sd_browse_callback_fn_t cb);
  
! /// Check for new device updates, waiting for timeout s.  Contents of sd
  /// are updated, and if a callback was passed to player_sd_browse, then this
  /// function is also called for each discovered device.  Only makes sense to
  /// call this function after a call to player_sd_browse.  Returns 0 on
  /// success, non-zero on error.
! int player_sd_update(player_sd_t* sd, double timeout);
  
  /// Stop browsing.  Returns 0 on success, non-zero on error.


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit

Reply via email to