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