00001
00002
00003
00004
00005
00006
00007
00008 #include <string.h>
00009
00010 #include "wvstringlist.h"
00011 #include "wvslp.h"
00012
00013
00014
00015 #ifdef WITH_SLP
00016 #include "slp.h"
00017
00018
00019
00020
00021
00022 static SLPBoolean slpcb(SLPHandle hslp, const char *srvurl,
00023 unsigned short lifetime, SLPError errcode,
00024 void *cookie)
00025 {
00026 printf("Going Into the callback!\n");
00027 printf("srvurl is: %s\n", srvurl);
00028 if (errcode == SLP_OK || errcode == SLP_LAST_CALL)
00029 {
00030 WvStringList &list = *(WvStringList *)cookie;
00031
00032
00033 if (srvurl && strrchr(srvurl, '/'))
00034 {
00035 WvString server(strdup(strrchr(srvurl, '/'))+1);
00036 printf("Found: %s\n", server.cstr());
00037 list.append(server);
00038 }
00039 else
00040 {
00041 if (!srvurl)
00042 printf("End of the list!\n");
00043 else
00044 printf("Malformed URL: %s\n", srvurl);
00045 }
00046 }
00047 else
00048 {
00049 printf("What happened??\n");
00050 }
00051 printf("Coming out of the callback!\n");
00052 return SLP_TRUE;
00053 }
00054
00055 static SLPBoolean slpacb(SLPHandle hslp, const char* pcAttrList,
00056 SLPError errcode, void *cookie)
00057 {
00058 if (errcode == SLP_OK)
00059 {
00060 WvString attrval = *(WvString *)cookie;
00061 if (pcAttrList)
00062 {
00063 attrval = pcAttrList;
00064 printf("Found: %s\n", attrval.cstr());
00065 }
00066 return SLP_TRUE;
00067 }
00068 return SLP_FALSE;
00069 }
00070
00071 bool slp_get_servs(WvStringParm service, WvStringList &servlist)
00072 {
00073 SLPError slperr;
00074 SLPHandle hslp;
00075
00076 servlist.zap();
00077
00078 slperr = SLPOpen("en", SLP_FALSE, &hslp);
00079 if(slperr != SLP_OK)
00080 {
00081 printf("Error opening slp handle\n");
00082 return false;
00083 }
00084
00085 slperr = SLPFindSrvs(hslp, service, NULL, NULL, slpcb, &servlist);
00086 if (slperr != SLP_OK)
00087 {
00088 printf("Something went wrong finding the service.");
00089 printf("You may have an incomplete list!");
00090 }
00091
00092 SLPClose(hslp);
00093 printf("Ok - got %d servers, returning...\n", servlist.count());
00094 return true;
00095 }
00096
00097 bool slp_get_attrs(WvStringParm service, WvStringParm attribute,
00098 WvStringList &servlist)
00099 {
00100 SLPError slperr;
00101 SLPHandle hslp;
00102
00103 servlist.zap();
00104
00105 slperr = SLPOpen("en", SLP_FALSE, &hslp);
00106 if(slperr != SLP_OK)
00107 {
00108 printf("Error opening slp handle\n");
00109 return false;
00110 }
00111
00112 WvStringList possibleservers;
00113 slperr = slp_get_servs(service, possibleservers);
00114
00115 WvStringList::Iter i(possibleservers);
00116 for (i.rewind(); i.next(); )
00117 {
00118 WvString attrval;
00119 slperr = SLPFindAttrs(hslp, WvString("service:%s://%s", service, *i),
00120 NULL, attribute, slpacb, &attrval);
00121 if (slperr == SLP_OK)
00122 {
00123 WvString value = strrchr(attrval.edit(), '=');
00124 servlist.append(new WvString("%s,%s", *i, value), true);
00125 }
00126 else
00127 continue;
00128 }
00129
00130 SLPClose(hslp);
00131 printf("Ok - got %d servers, returning...\n", servlist.count());
00132 return true;
00133 }
00134
00135
00136
00137 static void sillyslpcb(SLPHandle hslp, SLPError errcode, void* cookie)
00138 {
00139
00140 *(SLPError*)cookie = errcode;
00141 }
00142
00143 WvSlp::WvSlp()
00144 : log("WvSlp", WvLog::Info)
00145 {
00146 SLPError slperr = SLPOpen("en", SLP_FALSE, &hslp);
00147 if(slperr != SLP_OK)
00148 {
00149 log(WvLog::Critical, "Error opening SLP handle: %s\n", slperr);
00150 err.seterr("SLP Startup Broken: %s", slperr);
00151 }
00152 }
00153
00154 WvSlp::~WvSlp()
00155 {
00156 SLPError callbackerr;
00157
00158 WvStringList::Iter i(services);
00159
00160 for (i.rewind(); i.next(); )
00161 SLPDereg(hslp, *i, sillyslpcb, &callbackerr);
00162
00163 SLPClose(hslp);
00164 services.zap();
00165 }
00166
00167 void WvSlp::add_service(WvStringParm name, WvStringParm hostname, WvStringParm port)
00168 {
00169 SLPError callbackerr;
00170
00171 WvString *svc = new WvString("service:%s://%s:%s", name, hostname, port);
00172 SLPError slperr = SLPReg(hslp, *svc, SLP_LIFETIME_MAXIMUM, 0, "", SLP_TRUE,
00173 sillyslpcb, &callbackerr);
00174
00175 if(slperr != SLP_OK)
00176 {
00177 log(WvLog::Notice, "Error registering %s: %s\n", *svc, slperr);
00178 err.seterr("SLP Registration Broken: %s", slperr);
00179 }
00180 else
00181 services.add(svc, true);
00182 }
00183
00184 #else
00185 bool slp_get_servs(WvStringParm service, WvStringList &servlist)
00186 {
00187 return true;
00188 }
00189
00190 bool slp_get_attrs(WvStringParm service, WvStringParm attribute,
00191 WvStringList &servlist)
00192 {
00193 return true;
00194 }
00195
00196 WvSlp::WvSlp()
00197 : log("WvSlp", WvLog::Info)
00198 {
00199 log("WvSlp compiled without SLP Library..\n");
00200 log("Not registering\n");
00201 }
00202
00203 WvSlp::~WvSlp()
00204 {
00205 }
00206
00207 void WvSlp::add_service(WvStringParm name, WvStringParm hostname, WvStringParm port)
00208 {
00209
00210 }
00211 #endif