Main Page | Class Hierarchy | Class List | Directories | File List | Class Members | File Members | Related Pages | Examples

ArServerSimpleOpener.cpp

Go to the documentation of this file.
00001 /*
00002 MobileRobots Advanced Robotics Interface for Applications (ARIA)
00003 Copyright (C) 2004, 2005 ActivMedia Robotics LLC
00004 Copyright (C) 2006, 2007 MobileRobots Inc.
00005 
00006      This program is free software; you can redistribute it and/or modify
00007      it under the terms of the GNU General Public License as published by
00008      the Free Software Foundation; either version 2 of the License, or
00009      (at your option) any later version.
00010 
00011      This program is distributed in the hope that it will be useful,
00012      but WITHOUT ANY WARRANTY; without even the implied warranty of
00013      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014      GNU General Public License for more details.
00015 
00016      You should have received a copy of the GNU General Public License
00017      along with this program; if not, write to the Free Software
00018      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00019 
00020 If you wish to redistribute ARIA under different terms, contact 
00021 MobileRobots for information about a commercial version of ARIA at 
00022 robots@mobilerobots.com or 
00023 MobileRobots Inc, 19 Columbia Drive, Amherst, NH 03031; 800-639-9481
00024 */
00025 
00026 #include "Aria.h"
00027 #include "ArExport.h"
00028 #include "ArServerBase.h"
00029 #include "ArServerSimpleOpener.h"
00030 
00031 
00035 AREXPORT ArServerSimpleOpener::ArServerSimpleOpener(
00036         ArArgumentParser *parser, const char *prefix) :
00037   myParseArgsCB(this, &ArServerSimpleOpener::parseArgs),
00038   myLogOptionsCB(this, &ArServerSimpleOpener::logOptions),
00039   myFileServerKeyCB(this, &ArServerSimpleOpener::fileServerKeyCallback)
00040 {
00041   myParser = parser;
00042   myOwnParser = false;
00043   if (prefix != NULL)
00044     myPrefix = prefix;
00045   else
00046     myPrefix = "";
00047 
00048   myUserFile = NULL;
00049   myServerPort = 7272;
00050   myLogUserInfo = false;
00051   myLogCommandGroups = false;
00052   myServer = NULL;
00053   myOpenOnIP = NULL;
00054 
00055   std::string functorName;
00056   functorName = prefix;
00057   functorName += "ArServerSimpleOpener";
00058   myParseArgsCB.setName(functorName.c_str());
00059   Aria::addParseArgsCB(&myParseArgsCB, 60);
00060   myLogOptionsCB.setName(functorName.c_str());
00061   Aria::addLogOptionsCB(&myLogOptionsCB, 60);
00062 
00063   myFileServerKeyCB.setName("ArServerSimpleOpener::serverKey");
00064   myFileParser.addHandler("serverKey", &myFileServerKeyCB);
00065 }
00066 
00067 AREXPORT ArServerSimpleOpener::~ArServerSimpleOpener(void)
00068 {
00069 
00070 }
00071 
00072 AREXPORT bool ArServerSimpleOpener::parseArgs(void)
00073 {
00074   return parseArgs(myParser);
00075 }
00076 
00077 AREXPORT bool ArServerSimpleOpener::parseArgs(ArArgumentParser *parser)
00078 {
00079   if (myPrefix.size() > 0)
00080     return parseArgsWithPrefix(parser);
00081   else
00082     return parseArgsWithOutPrefix(parser);
00083   
00084 }
00085 
00086 AREXPORT bool ArServerSimpleOpener::parseArgsWithOutPrefix(ArArgumentParser *parser)
00087 {
00088   if (parser->checkArgument("-logUserInfo") || 
00089       parser->checkArgument("-lui"))
00090   {
00091     myLogUserInfo = true;
00092   }
00093 
00094   if (parser->checkArgument("-logCommandGroups") || 
00095       parser->checkArgument("-lcg"))
00096   {
00097     myLogCommandGroups = true;
00098   }
00099 
00100   if (!parser->checkParameterArgumentString("-userInfo",
00101                                             &myUserFile) ||
00102       !parser->checkParameterArgumentString("-ui",
00103                                             &myUserFile) ||
00104       !parser->checkParameterArgumentInteger("-serverPort", 
00105                                              &myServerPort) ||
00106       !parser->checkParameterArgumentInteger("-sp",
00107                                              &myServerPort) ||
00108       !parser->checkParameterArgumentString("-serverIP",
00109                                             &myOpenOnIP) ||
00110       !parser->checkParameterArgumentString("-sip",
00111                                             &myOpenOnIP))
00112     /*||
00113       !parser->checkParameterArgumentString("-setServerKey", 
00114                                              &myServerKey) ||
00115       !parser->checkParameterArgumentString("-ssk",
00116       &myServerKey))*/
00117   {
00118     return false;
00119   }
00120   
00121   bool wasReallySet;
00122   const char *serverInfoFile = NULL;
00123   while (myParser->checkParameterArgumentString(
00124                  "-serverInfoFile", &serverInfoFile, 
00125                  &wasReallySet, true) && 
00126          wasReallySet)
00127   {
00128     if (serverInfoFile != NULL && !parseFile(serverInfoFile))
00129       return false;
00130   }
00131 
00132   return true;
00133 }
00134 
00135 AREXPORT bool ArServerSimpleOpener::parseArgsWithPrefix(
00136         ArArgumentParser *parser)
00137 {
00138   if (parser->checkArgumentVar("-%sLogUserInfo", myPrefix.c_str()))
00139   {
00140     myLogUserInfo = true;
00141   }
00142 
00143   if (parser->checkArgumentVar("-%sLogCommandGroups", myPrefix.c_str()))
00144   {
00145     myLogCommandGroups = true;
00146   }
00147 
00148   if (!parser->checkParameterArgumentStringVar(
00149               NULL, &myUserFile, "-%sUserInfo", myPrefix.c_str()) || 
00150       !parser->checkParameterArgumentStringVar(
00151               NULL, &myOpenOnIP, "-%sServerIP", myPrefix.c_str()) || 
00152       !parser->checkParameterArgumentIntegerVar(
00153               NULL, &myServerPort, "-%sServerPort", myPrefix.c_str()))
00154     /*||
00155       !parser->checkParameterArgumentStringVar(
00156       NULL, &myServerKey, "-%sSetServerKey", myPrefix.c_str()))*/
00157   {
00158     return false;
00159   }
00160 
00161   bool wasReallySet;
00162   const char *serverInfoFile = NULL;
00163   if (myParser->checkParameterArgumentStringVar(
00164               &wasReallySet, &serverInfoFile, "-%sServerInfoFile", 
00165               myPrefix.c_str()) && 
00166       wasReallySet)
00167   {
00168     if (serverInfoFile != NULL && !parseFile(serverInfoFile))
00169       return false;
00170   }
00171   
00172   return true;
00173 }
00174 
00175 AREXPORT void ArServerSimpleOpener::logOptions(void) const
00176 {
00177   if (myPrefix.size() > 0)
00178     logOptionsWithPrefix();
00179   else
00180     logOptionsWithOutPrefix();
00181 }
00182 
00183 AREXPORT void ArServerSimpleOpener::logOptionsWithOutPrefix(void) const
00184 {
00185   ArLog::log(ArLog::Terse, "");
00186   ArLog::log(ArLog::Terse, "Options for ArServerSimpleOpener:");
00187   ArLog::log(ArLog::Terse, "-serverPort <serverPortNumber>");
00188   ArLog::log(ArLog::Terse, "-sp <serverPortNumber>");
00189   ArLog::log(ArLog::Terse, "-serverIP <serverIPToOpenOn>");
00190   ArLog::log(ArLog::Terse, "-sip <serverIPToOpenOn>");
00191   ArLog::log(ArLog::Terse, "-userInfo <userInfoFileName>");
00192   ArLog::log(ArLog::Terse, "-ui <userInfoFileName>");
00193   ArLog::log(ArLog::Terse, "-logUserInfo");
00194   ArLog::log(ArLog::Terse, "-lui");
00195   ArLog::log(ArLog::Terse, "-logCommandGroups");
00196   ArLog::log(ArLog::Terse, "-lcg");
00197   /*
00198     ArLog::log(ArLog::Terse, "-setServerKey <key>");
00199   ArLog::log(ArLog::Terse, "-ssk <key>");
00200   */
00201   ArLog::log(ArLog::Terse, "-serverInfoFile <file>");
00202   ArLog::log(ArLog::Terse, "");
00203 }
00204 
00205 AREXPORT void ArServerSimpleOpener::logOptionsWithPrefix(void) const
00206 {
00207   ArLog::log(ArLog::Terse, "");
00208   ArLog::log(ArLog::Terse, "Options for ArServerSimpleOpener:");
00209   ArLog::log(ArLog::Terse, "-%sServerPort <serverPortNumber>", 
00210              myPrefix.c_str());
00211   ArLog::log(ArLog::Terse, "-%sServerIP <serverIPToOpenOn>", 
00212              myPrefix.c_str());
00213   ArLog::log(ArLog::Terse, "-%sUserInfo <userInfoFileName>",
00214              myPrefix.c_str());
00215   ArLog::log(ArLog::Terse, "-%sLogUserInfo", myPrefix.c_str());
00216   ArLog::log(ArLog::Terse, "-%sLogCommandGroups", myPrefix.c_str());
00217   /*ArLog::log(ArLog::Terse, "-%sSetServerKey <key>",
00218              myPrefix.c_str());
00219   */
00220   ArLog::log(ArLog::Terse, "-%sServerInfoFile <file>",
00221              myPrefix.c_str());
00222   ArLog::log(ArLog::Terse, "");
00223 }
00224 
00234 AREXPORT bool ArServerSimpleOpener::open(ArServerBase *server,
00235                                          const char *baseDirectory,
00236                                          int secondsToTryFor)
00237 {
00238   ArTime startedServer;
00239   bool serverOpened;
00240   startedServer.setToNow();
00241   myBadUserFile = false;
00242   myOpenFailed = false;
00243 
00244   if (secondsToTryFor < 0)
00245     secondsToTryFor = 0;
00246   
00247   server->setServerKey(myServerKey.c_str());
00248   
00249   if (myUserFile != NULL && myUserFile[0] != '\0' &&
00250       !server->loadUserInfo(myUserFile, baseDirectory))
00251   {
00252     ArLog::log(ArLog::Normal, "ArServerSimpleOpener: Bad user file");
00253     myBadUserFile = true;
00254     return false;
00255   }
00256   
00257   while (Aria::getRunning() && 
00258          (serverOpened = server->open(myServerPort, myOpenOnIP)) == false)
00259   {
00260     if (secondsToTryFor == 0)
00261     {
00262       ArLog::log(ArLog::Normal, "Could not open server on port %d", myServerPort);
00263       myOpenFailed = true;
00264       return false;
00265     }
00266     if (startedServer.secSince() > secondsToTryFor)
00267     {
00268       ArLog::log(ArLog::Normal, "Could not open server on port %d even after %d seconds", 
00269      myServerPort, secondsToTryFor);
00270       myOpenFailed = true;
00271       return false;
00272     }
00273     ArLog::log(ArLog::Normal, "Can't open server on port %d yet, waiting", myServerPort);
00274     ArUtil::sleep(1000);
00275   }
00276 
00277   if (serverOpened)
00278     myServer = server;
00279     
00280   return serverOpened;
00281 }
00282 
00283 AREXPORT bool ArServerSimpleOpener::checkAndLog(void) const
00284 {
00285   if (myServer != NULL && myLogCommandGroups)
00286     myServer->logCommandGroups();
00287 
00288   if (myServer != NULL && myLogUserInfo)
00289     myServer->logUserInfo();
00290 
00291 
00292   return true;
00293 }
00294 
00295 bool ArServerSimpleOpener::fileServerKeyCallback(ArArgumentBuilder *arg)
00296 {
00297   if (arg->getArgc() > 1)
00298   {
00299     ArLog::log(ArLog::Normal, "Bad serverKey line: %s %s", 
00300                arg->getExtraString(), arg->getFullString());
00301     return false;
00302   }
00303   if (arg->getArgc() == 0)
00304     myServerKey = "";
00305   else
00306     myServerKey = arg->getArg(0);
00307   return true;
00308 }
00309 
00310 AREXPORT bool ArServerSimpleOpener::parseFile(const char *fileName)
00311 {
00312   ArLog::log(ArLog::Normal, "Loading server key from %s", 
00313              fileName);
00314   if (!myFileParser.parseFile(fileName))
00315   {
00316     ArLog::log(ArLog::Normal, "Failed parsing server key file %s", 
00317              fileName);
00318     return false;
00319   }
00320   return true;
00321 }

Generated on Tue Feb 20 10:51:50 2007 for ArNetworking by  doxygen 1.4.0