wvslp.cc

00001 /*
00002  * Worldvisions Weaver Software:
00003  *   Copyright (C) 1997-2004 Net Integration Technologies, Inc.
00004  *
00005  * OpenSLP Service Lister
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 // Note - this only LOOKS Asynchronous - the OpenSLP folks haven't
00019 // finished their Async code yet, so for now, we're stuck with a nice
00020 // blocking call...
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         // srvurl is of the form:
00032         // service:servicename://server:port
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 // Use the below for servers that want to advertise via SLP
00136 
00137 static void sillyslpcb(SLPHandle hslp, SLPError errcode, void* cookie)
00138 { 
00139     /* return the error code in the cookie */ 
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

Generated on Wed Jul 12 17:53:21 2006 for WvStreams by  doxygen 1.4.7