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

ArClientArgUtils.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 
00027 #include "Aria.h"
00028 #include "ArExport.h"
00029 
00030 #include "ArClientArgUtils.h"
00031 
00032 #include <ArConfigArg.h>
00033 
00034 #include "ArNetPacket.h"
00035 
00036 
00037 AREXPORT ArClientArg::ArClientArg(bool isDisplayHintParsed) :
00038   myIsDisplayHintParsed(isDisplayHintParsed),
00039   myBuffer(),
00040   myDisplayBuffer()
00041 {}
00042 
00043 AREXPORT ArClientArg::~ArClientArg()
00044 {}
00045 
00046 AREXPORT bool ArClientArg::isSendableParamType(const ArConfigArg &arg)
00047 {
00048   switch (arg.getType()) {
00049   case ArConfigArg::INT:
00050   case ArConfigArg::DOUBLE:
00051   case ArConfigArg::BOOL:
00052   case ArConfigArg::STRING:
00053   case ArConfigArg::SEPARATOR:
00054     return true;
00055 
00056   default:
00057     return false;
00058   }
00059 }
00060 
00061 
00062 AREXPORT bool ArClientArg::createArg(ArNetPacket *packet, 
00063                                                                       ArConfigArg &argOut)
00064 {
00065         if (packet == NULL) {
00066     ArLog::log(ArLog::Verbose, "ArClientArg::createArg() cannot unpack NULL packet");
00067                 return false;
00068         }
00069 
00070         bool isSuccess = true;
00071 
00072         char name[32000];
00073         char description[32000];
00074   myDisplayBuffer[0] = '\0';
00075 
00076         packet->bufToStr(name, sizeof(name));
00077         packet->bufToStr(description, sizeof(description));
00078 
00079 
00080         char priorityVal = packet->bufToByte();
00081         ArPriority::Priority priority = (ArPriority::Priority) priorityVal;
00082 
00083         char argType = packet->bufToByte();
00084 
00085   switch (argType) {
00086   case 'B':
00087           {
00088                   bool boolVal = false;
00089                   if (packet->bufToByte()) {
00090                           boolVal = true;
00091                   }
00092                   argOut = ArConfigArg(name, boolVal, description);
00093           }
00094     break;
00095 
00096   case 'b': // Lower case indicates display information contained in packet...
00097           {
00098       if (myIsDisplayHintParsed) {
00099 
00100                     bool boolVal = false;
00101                     if (packet->bufToByte()) {
00102                             boolVal = true;
00103                     }
00104                     //packet->bufToStr(myDisplayBuffer, BUFFER_LENGTH);
00105                     argOut = ArConfigArg(name, boolVal, description);
00106       }
00107       else {
00108         isSuccess = false;
00109       }
00110           }
00111     break;
00112 
00113   case 'I':
00114           {
00115                   int intVal = packet->bufToByte4();
00116                   int intMin = packet->bufToByte4();
00117                   int intMax = packet->bufToByte4();
00118 
00119                   argOut = ArConfigArg(name, intVal, description, intMin, intMax);
00120           }
00121     break;
00122 
00123   case 'i':  // Lower case indicates display information contained in packet...
00124           {
00125       if (myIsDisplayHintParsed) {
00126 
00127                     int intVal = packet->bufToByte4();
00128                     int intMin = packet->bufToByte4();
00129                     int intMax = packet->bufToByte4();
00130 
00131                           //packet->bufToStr(myDisplayBuffer, BUFFER_LENGTH);
00132             argOut = ArConfigArg(name, intVal, description, intMin, intMax);
00133       }
00134       else {
00135         isSuccess = false;
00136       }
00137           }
00138     break;
00139 
00140 
00141   case 'D':
00142           {
00143                 double doubleVal = packet->bufToDouble();
00144                 double doubleMin = packet->bufToDouble();
00145                 double doubleMax = packet->bufToDouble();
00146 
00147                 argOut = ArConfigArg(name, doubleVal, description, doubleMin, doubleMax);
00148           }
00149     break;
00150 
00151   case 'd': // Lower case indicates display information contained in packet...
00152           {
00153       if (myIsDisplayHintParsed) {
00154 
00155                     double doubleVal = packet->bufToDouble();
00156                     double doubleMin = packet->bufToDouble();
00157                     double doubleMax = packet->bufToDouble();
00158 
00159                           //packet->bufToStr(myDisplayBuffer, BUFFER_LENGTH);
00160                     argOut = ArConfigArg(name, 
00161                              doubleVal, 
00162                              description, 
00163                              doubleMin, 
00164                              doubleMax);
00165       }
00166       else {
00167         isSuccess = false;
00168       }
00169           }
00170     break;
00171 
00172   case 'S':
00173           {
00174                 packet->bufToStr(myBuffer, BUFFER_LENGTH);
00175                 argOut = ArConfigArg(name, myBuffer, description, 0);
00176           }  
00177     break;
00178 
00179   case 's': // Lower case indicates display information contained in packet...
00180           {
00181       if (myIsDisplayHintParsed) {
00182 
00183                     packet->bufToStr(myBuffer, BUFFER_LENGTH);
00184                                 
00185         //packet->bufToStr(myDisplayBuffer, BUFFER_LENGTH);
00186             argOut = ArConfigArg(name, myBuffer, description, 0);
00187       }
00188       else {
00189         isSuccess = false;
00190       }
00191           }  
00192     break;
00193 
00194   case '.':
00195     {
00196        //if (myIsDisplayHintParsed) {
00197                          //packet->bufToStr(myDisplayBuffer, BUFFER_LENGTH);
00198        //}
00199        argOut = ArConfigArg(ArConfigArg::SEPARATOR);
00200     }
00201     break;
00202 
00203   default:
00204 
00205                 isSuccess = false;
00206     ArLog::log(ArLog::Terse, "ArClientArg::createArg() unsupported param type %c",
00207                argType);
00208         }
00209 
00210   argOut.setConfigPriority(priority);
00211   if (myIsDisplayHintParsed) {
00212 
00213     if (isSuccess) {
00214                   packet->bufToStr(myDisplayBuffer, BUFFER_LENGTH);
00215     }
00216 
00217     if (strlen(myDisplayBuffer) > 0) {
00218       ArLog::log(ArLog::Verbose, "ArClientArg::createArg() arg %s has displayHint = %s",
00219                  argOut.getName(), myDisplayBuffer);
00220     }
00221     argOut.setDisplayHint(myDisplayBuffer);
00222   }
00223 
00224         return isSuccess;
00225 
00226 } // end method createArg
00227 
00228 
00229 AREXPORT bool ArClientArg::createPacket(const ArConfigArg &arg,
00230                                ArNetPacket *packet)
00231 {
00232   if (packet == NULL) {
00233     ArLog::log(ArLog::Verbose, "ArClientArg::createPacket() cannot create NULL packet");
00234     return false;
00235   }
00236 
00237         bool isSuccess = true;
00238 
00239         packet->strToBuf(arg.getName());
00240         packet->strToBuf(arg.getDescription());
00241 
00242         packet->byteToBuf(arg.getConfigPriority());
00243 
00244         char argType = '\0';
00245   
00246   switch (arg.getType()) {
00247   case ArConfigArg::BOOL:
00248 
00249     argType = (myIsDisplayHintParsed ? 'b' : 'B');
00250 
00251     packet->byteToBuf(argType);
00252     packet->byteToBuf(arg.getBool());
00253     break;
00254   
00255   case ArConfigArg::INT:
00256 
00257     argType = (myIsDisplayHintParsed ? 'i' : 'I');
00258     packet->byteToBuf(argType);
00259 
00260                 packet->byte4ToBuf(arg.getInt());
00261                 packet->byte4ToBuf(arg.getMinInt());
00262                 packet->byte4ToBuf(arg.getMaxInt());
00263 
00264     break;
00265 
00266   case ArConfigArg::DOUBLE:
00267 
00268     argType = (myIsDisplayHintParsed ? 'd' : 'D');
00269     packet->byteToBuf(argType);
00270 
00271                 packet->doubleToBuf(arg.getDouble());
00272                 packet->doubleToBuf(arg.getMinDouble());
00273                 packet->doubleToBuf(arg.getMaxDouble());
00274     break;
00275 
00276   case ArConfigArg::STRING:
00277 
00278     argType = (myIsDisplayHintParsed ? 's' : 'S');
00279     packet->byteToBuf(argType);
00280 
00281                 packet->strToBuf(arg.getString());
00282 
00283     break;
00284 
00285   case ArConfigArg::SEPARATOR:
00286 
00287     argType = '.';
00288     packet->byteToBuf(argType);
00289     break;
00290 
00291   default:
00292 
00293                 isSuccess = false;
00294     ArLog::log(ArLog::Terse, "ArClientArg::createPacket() unsupported param type %i", arg.getType());
00295 
00296   } // end switch type
00297 
00298   if (isSuccess && myIsDisplayHintParsed) {
00299     packet->strToBuf(arg.getDisplayHint());
00300   }
00301 
00302         return isSuccess;
00303 
00304 } // end method createPacket
00305 
00306 
00307 
00308 AREXPORT bool ArClientArg::bufToArgValue(ArNetPacket *packet,
00309                                 ArConfigArg &arg)
00310 {
00311   if (packet == NULL) {
00312     return false;
00313   }
00314 
00315   bool isSuccess = true;
00316 
00317   switch (arg.getType()) {
00318   case ArConfigArg::BOOL:
00319     {
00320                 bool boolVal = false;
00321                 if (packet->bufToByte()) {
00322                         boolVal = true;
00323                 }
00324     isSuccess = arg.setBool(boolVal);
00325     }
00326     break;
00327   
00328   case ArConfigArg::INT:
00329     {
00330                 int intVal = packet->bufToByte4();
00331     isSuccess = arg.setInt(intVal);
00332     }
00333     break;
00334 
00335   case ArConfigArg::DOUBLE:
00336     {
00337     double doubleVal = packet->bufToDouble();
00338     isSuccess = arg.setDouble(doubleVal);
00339     }
00340     break;
00341 
00342   case ArConfigArg::STRING:
00343     {
00344                 packet->bufToStr(myBuffer, BUFFER_LENGTH);
00345     isSuccess = arg.setString(myBuffer);
00346     }
00347     break;
00348 
00349 
00350   case ArConfigArg::SEPARATOR:
00351     // There is no value...
00352     break;
00353 
00354   default:
00355 
00356                 isSuccess = false;
00357     ArLog::log(ArLog::Terse, "ArClientArg::createPacket() unsupported param type %i", arg.getType());
00358 
00359   } // end switch type
00360 
00361   return isSuccess;
00362 
00363 } // end method bufToArgValue
00364 
00365 
00366 
00367 AREXPORT bool ArClientArg::argValueToBuf(const ArConfigArg &arg,
00368                                 ArNetPacket *packet)
00369 {
00370   if (packet == NULL) {
00371     return false;
00372   }
00373 
00374   bool isSuccess = true;
00375 
00376   switch (arg.getType()) {
00377   case ArConfigArg::BOOL:
00378 
00379     packet->byteToBuf(arg.getBool());
00380     break;
00381   
00382   case ArConfigArg::INT:
00383 
00384                 packet->byte4ToBuf(arg.getInt());
00385     break;
00386 
00387   case ArConfigArg::DOUBLE:
00388 
00389     packet->doubleToBuf(arg.getDouble());
00390     break;
00391 
00392   case ArConfigArg::STRING:
00393 
00394                 packet->strToBuf(arg.getString());
00395     break;
00396 
00397   case ArConfigArg::SEPARATOR:
00398     // There is no value...
00399     break;
00400 
00401   default:
00402 
00403                 isSuccess = false;
00404     ArLog::log(ArLog::Terse, "ArClientArg::createPacket() unsupported param type %i", arg.getType());
00405 
00406   } // end switch type
00407 
00408   return isSuccess;
00409 
00410 } // end method argValueToBuf
00411 
00412 
00413 AREXPORT bool ArClientArg::argTextToBuf(const ArConfigArg &arg,
00414                                ArNetPacket *packet)
00415 {
00416   if (packet == NULL) {
00417     return false;
00418   }
00419 
00420   bool isSuccess = true;
00421 
00422   switch (arg.getType()) {
00423   case ArConfigArg::INT:
00424     snprintf(myBuffer, BUFFER_LENGTH, "%d", arg.getInt());
00425     break;
00426   case ArConfigArg::DOUBLE:
00427     snprintf(myBuffer, BUFFER_LENGTH, "%g", arg.getDouble());
00428     break;
00429   case ArConfigArg::BOOL:
00430     snprintf(myBuffer, BUFFER_LENGTH, "%s", 
00431              ArUtil::convertBool(arg.getBool()));
00432     break;
00433   case ArConfigArg::STRING:
00434     snprintf(myBuffer, BUFFER_LENGTH, "%s", arg.getString());
00435     break;
00436   case ArConfigArg::SEPARATOR:
00437     break;
00438   default:
00439     isSuccess = false;
00440     break;
00441   } // end switch type
00442 
00443   if (isSuccess) {
00444     packet->strToBuf(myBuffer);
00445   }
00446   return isSuccess;
00447 
00448 } // end method argTextToBuf

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