source: roaraudio/libroar/slp.c @ 2008:ab4a0fa45b38

Last change on this file since 2008:ab4a0fa45b38 was 2008:ab4a0fa45b38, checked in by phi, 15 years ago

cleanup: ROAR_WARN() -> ROAR_DBG()

File size: 4.9 KB
Line 
1//slp.c:
2
3/*
4 *      Copyright (C) Philipp 'ph3-der-loewe' Schafft - 2009
5 *
6 *  This file is part of libroar a part of RoarAudio,
7 *  a cross-platform sound system for both, home and professional use.
8 *  See README for details.
9 *
10 *  This file is free software; you can redistribute it and/or modify
11 *  it under the terms of the GNU General Public License version 3
12 *  as published by the Free Software Foundation.
13 *
14 *  libroar is distributed in the hope that it will be useful,
15 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 *  GNU General Public License for more details.
18 *
19 *  You should have received a copy of the GNU General Public License
20 *  along with this software; see the file COPYING.  If not, write to
21 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
22 *
23 *  NOTE for everyone want's to change something and send patches:
24 *  read README and HACKING! There a addition information on
25 *  the license of this document you need to read before you send
26 *  any patches.
27 *
28 *  NOTE for uses of non-GPL (LGPL,...) software using libesd, libartsc
29 *  or libpulse*:
30 *  The libs libroaresd, libroararts and libroarpulse link this lib
31 *  and are therefore GPL. Because of this it may be illigal to use
32 *  them with any software that uses libesd, libartsc or libpulse*.
33 */
34
35#include "libroar.h"
36
37SLPBoolean roar_slp_url_callback(SLPHandle        hslp,
38                                 const char     * srvurl,
39                                 unsigned short   lifetime,
40                                 SLPError         errcode,
41                                 void           * cookie) {
42 struct roar_slp_cookie * self = cookie;
43
44 ROAR_DBG("roar_slp_url_callback(*) = ?");
45
46 if (errcode == SLP_OK || errcode == SLP_LAST_CALL) {
47  self->callbackerr = SLP_OK;
48
49  if ( srvurl == NULL ) /* hu? */
50   return SLP_TRUE;
51
52  if ( self->matchcount == ROAR_SLP_MAX_MATCHES )
53   return SLP_FALSE;
54
55  strncpy(self->match[self->matchcount].url, srvurl, ROAR_SLP_MAX_URL_LEN);
56
57  self->match[self->matchcount].url[ROAR_SLP_MAX_URL_LEN-1] = 0;
58
59  self->matchcount++;
60 } else {
61  self->callbackerr = errcode;
62 }
63
64
65 /* return SLP_TRUE because we want to be called again */
66 /* if more services were found                        */
67
68 return SLP_TRUE;
69}
70
71int roar_slp_search          (struct roar_slp_cookie * cookie, char * type) {
72#ifdef ROAR_HAVE_LIBSLP
73 SLPError err;
74 SLPHandle hslp;
75
76 ROAR_DBG("roar_slp_search(cookie=%p, type='%s') = ?", cookie, type);
77
78 if ( cookie->search != NULL ) /* currently only non-search filter mode supported */
79  return -1;
80
81 err = SLPOpen("en", SLP_FALSE, &hslp);
82 if (err != SLP_OK) {
83  return -1;
84 }
85
86 ROAR_DBG("roar_slp_search(*) = ?");
87
88 err = SLPFindSrvs(hslp,
89                   type,
90                   0,                    /* use configured scopes */
91                   0,                    /* no attr filter        */
92                   roar_slp_url_callback,
93                   cookie);
94
95 ROAR_DBG("roar_slp_search(*) = ?");
96
97  /* err may contain an error code that occurred as the slp library    */
98  /* _prepared_ to make the call.                                     */
99  if (err != SLP_OK) {
100   return -1;
101  }
102
103 /* callbackerr may contain an error code (that was assigned through */
104 /* the callback cookie) that occurred as slp packets were sent on    */
105 /* the wire */
106 if (cookie->callbackerr != SLP_OK) {
107  return -1;
108 }
109
110 ROAR_DBG("roar_slp_search(*) = ?");
111
112 /* Now that we're done using slp, close the slp handle */
113 //SLPClose(hslp);
114
115 ROAR_DBG("roar_slp_search(*) = ?");
116
117 return 0;
118#else
119 return -1;
120#endif
121}
122
123int roar_slp_cookie_init     (struct roar_slp_cookie * cookie, struct roar_slp_search * search) {
124 if ( cookie == NULL )
125  return -1;
126
127 memset(cookie, 0, sizeof(struct roar_slp_cookie));
128
129 cookie->search = search;
130
131 return 0;
132}
133
134
135char * roar_slp_find_roard   (void) {
136 static char addr[80];
137
138 if ( roar_slp_find_roard_r(addr, 80) == -1 )
139  return NULL;
140
141 return addr;
142}
143
144int    roar_slp_find_roard_r (char * addr, size_t len) {
145 struct roar_slp_cookie cookie;
146 int offset = 0;
147
148 ROAR_DBG("roar_slp_find_roard_r(addr=%p, len=%i) = ?", addr, len);
149
150 if ( addr == NULL || len == 0 )
151  return -1;
152
153 *addr = 0; // just in case...
154
155 ROAR_DBG("roar_slp_find_roard_r(*) = ?");
156
157 if ( roar_slp_cookie_init(&cookie, NULL) == -1 )
158  return -1;
159
160 ROAR_DBG("roar_slp_find_roard_r(*) = ?");
161
162 if ( roar_slp_search(&cookie, "service:mixer.fellig:roar") == -1 )
163  return -1;
164
165 ROAR_DBG("roar_slp_find_roard_r(*) = ?");
166
167 if ( cookie.matchcount == 0 )
168  return -1;
169
170 ROAR_DBG("roar_slp_find_roard_r(*) = ?");
171
172 if ( !strncmp(cookie.match[0].url, "service:mixer.fellig:roar://", 28) )
173  offset = 28;
174
175 ROAR_DBG("roar_slp_find_roard_r(*): url='%s'", cookie.match[0].url);
176
177 strncpy(addr, &(cookie.match[0].url[offset]), len);
178 addr[len-1] = 0; // also just in case.
179
180 ROAR_DBG("roar_slp_find_roard_r(*): addr='%s'", addr);
181
182 return 0;
183}
184
185//ll
Note: See TracBrowser for help on using the repository browser.