00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "ArExport.h"
00028 #include "ariaOSDef.h"
00029 #include "ArConfigArg.h"
00030 #include "ArLog.h"
00031 #include "ArArgumentBuilder.h"
00032
00033 ArConfigArg::ArConfigArg()
00034 {
00035 clear();
00036 }
00037
00038 ArConfigArg::ArConfigArg(const char * name, int *pointer,
00039 const char * description, int minInt, int maxInt)
00040 {
00041 clear();
00042 myType = INT;
00043 myIntType = INT_INT;
00044 myName = name;
00045 myDescription = description;
00046 myMinInt = minInt;
00047 myMaxInt = maxInt;
00048 myIntPointer = pointer;
00049 }
00050
00051 ArConfigArg::ArConfigArg(const char * name, short *pointer,
00052 const char * description, int minInt, int maxInt)
00053 {
00054 clear();
00055 myType = INT;
00056 myIntType = INT_SHORT;
00057 myName = name;
00058 myDescription = description;
00059 myMinInt = minInt;
00060 myMaxInt = maxInt;
00061 myIntShortPointer = pointer;
00062 }
00063
00064 ArConfigArg::ArConfigArg(const char * name, unsigned short *pointer,
00065 const char * description, int minInt, int maxInt)
00066 {
00067 clear();
00068 myType = INT;
00069 myIntType = INT_UNSIGNED_SHORT;
00070 myName = name;
00071 myDescription = description;
00072 myMinInt = minInt;
00073 myMaxInt = maxInt;
00074 myIntUnsignedShortPointer = pointer;
00075 }
00076
00077 ArConfigArg::ArConfigArg(const char * name, unsigned char *pointer,
00078 const char * description, int minInt, int maxInt)
00079 {
00080 clear();
00081 myType = INT;
00082 myIntType = INT_UNSIGNED_CHAR;
00083 myName = name;
00084 myDescription = description;
00085 myMinInt = minInt;
00086 myMaxInt = maxInt;
00087 myIntUnsignedCharPointer = pointer;
00088 }
00089
00090 ArConfigArg::ArConfigArg(const char * name, double *pointer,
00091 const char * description, double minDouble,
00092 double maxDouble)
00093 {
00094 clear();
00095 myType = DOUBLE;
00096 myName = name;
00097 myDescription = description;
00098 myMinDouble = minDouble;
00099 myMaxDouble = maxDouble;
00100 myDoublePointer = pointer;
00101 }
00102
00103 ArConfigArg::ArConfigArg(const char * name, bool *pointer,
00104 const char * description)
00105 {
00106 clear();
00107 myType = BOOL;
00108 myName = name;
00109 myDescription = description;
00110 myBoolPointer = pointer;
00111 }
00112
00113
00114 ArConfigArg::ArConfigArg(const char * name, int val,
00115 const char * description, int minInt, int maxInt)
00116 {
00117 clear();
00118 myType = INT;
00119 myIntType = INT_INT;
00120 myName = name;
00121 myDescription = description;
00122 myMinInt = minInt;
00123 myMaxInt = maxInt;
00124 myIntPointer = new int;
00125 *myIntPointer = val;
00126 myOwnPointedTo = true;
00127 }
00128
00129 ArConfigArg::ArConfigArg(const char * name, double val,
00130 const char * description, double minDouble,
00131 double maxDouble)
00132 {
00133 clear();
00134 myType = DOUBLE;
00135 myName = name;
00136 myDescription = description;
00137 myMinDouble = minDouble;
00138 myMaxDouble = maxDouble;
00139 myDoublePointer = new double;
00140 *myDoublePointer = val;
00141 myOwnPointedTo = true;
00142 }
00143
00144 ArConfigArg::ArConfigArg(const char * name, bool val,
00145 const char * description)
00146 {
00147 clear();
00148 myType = BOOL;
00149 myName = name;
00150 myDescription = description;
00151 myBoolPointer = new bool;
00152 *myBoolPointer = val;
00153 myOwnPointedTo = true;
00154 }
00155
00162 ArConfigArg::ArConfigArg(const char * name, char *str,
00163 const char * description, size_t maxStrLen)
00164 {
00165 clear();
00166 myType = STRING;
00167 myName = name;
00168 myDescription = description;
00169 if (maxStrLen == 0)
00170 {
00171 myUsingOwnedString = true;
00172 myString = str;
00173 }
00174 else
00175 {
00176 myStringPointer = str;
00177 myMaxStrLen = maxStrLen;
00178 }
00179 }
00180
00193 ArConfigArg::ArConfigArg(const char *name,
00194 ArRetFunctor1<bool, ArArgumentBuilder *> *setFunctor,
00195 ArRetFunctor<const std::list<ArArgumentBuilder *> *> *getFunctor,
00196 const char *description)
00197 {
00198 clear();
00199 myType = FUNCTOR;
00200 myName = name;
00201 myDescription = description;
00202 mySetFunctor = setFunctor;
00203 myGetFunctor = getFunctor;
00204 }
00205
00206 ArConfigArg::ArConfigArg(const char * description)
00207 {
00208 clear();
00209 myType = DESCRIPTION_HOLDER;
00210 myDescription = description;
00211 }
00212
00213 ArConfigArg::ArConfigArg(const ArConfigArg & arg)
00214 {
00215 copy(arg);
00216 }
00217
00218 ArConfigArg &ArConfigArg::operator=(const ArConfigArg & arg)
00219 {
00220 if (this != &arg)
00221 {
00222 copy(arg);
00223 }
00224 return *this;
00225 }
00226
00227 void ArConfigArg::copy(const ArConfigArg &arg)
00228 {
00229 clear();
00230 myType = arg.myType;
00231 myIntType = arg.myIntType;
00232 myName = arg.myName;
00233 myDescription = arg.myDescription;
00234 myOwnPointedTo = arg.myOwnPointedTo;
00235 if (arg.myOwnPointedTo && arg.myIntPointer != NULL)
00236 {
00237 myIntPointer = new int;
00238 *myIntPointer = *arg.myIntPointer;
00239 }
00240 else
00241 {
00242 myIntPointer = arg.myIntPointer;
00243 }
00244 if (arg.myOwnPointedTo && arg.myIntShortPointer != NULL)
00245 {
00246 myIntShortPointer = new short;
00247 *myIntShortPointer = *arg.myIntShortPointer;
00248 }
00249 else
00250 {
00251 myIntShortPointer = arg.myIntShortPointer;
00252 }
00253 if (arg.myOwnPointedTo && arg.myIntUnsignedShortPointer != NULL)
00254 {
00255 myIntUnsignedShortPointer = new unsigned short;
00256 *myIntUnsignedShortPointer = *arg.myIntUnsignedShortPointer;
00257 }
00258 else
00259 {
00260 myIntUnsignedShortPointer = arg.myIntUnsignedShortPointer;
00261 }
00262 if (arg.myOwnPointedTo && arg.myIntUnsignedCharPointer != NULL)
00263 {
00264 myIntUnsignedCharPointer = new unsigned char;
00265 *myIntUnsignedCharPointer = *arg.myIntUnsignedCharPointer;
00266 }
00267 else
00268 {
00269 myIntUnsignedCharPointer = arg.myIntUnsignedCharPointer;
00270 }
00271 if (arg.myOwnPointedTo && arg.myDoublePointer != NULL)
00272 {
00273 myDoublePointer = new double;
00274 *myDoublePointer = *arg.myDoublePointer;
00275 }
00276 else
00277 {
00278 myDoublePointer = arg.myDoublePointer;
00279 }
00280 if (arg.myOwnPointedTo && arg.myBoolPointer != NULL)
00281 {
00282 myBoolPointer = new bool;
00283 *myBoolPointer = *arg.myBoolPointer;
00284 }
00285 else
00286 {
00287 myBoolPointer = arg.myBoolPointer;
00288 }
00289 myStringPointer = arg.myStringPointer;
00290 myMinInt = arg.myMinInt;
00291 myMaxInt = arg.myMaxInt;
00292 myMinDouble = arg.myMinDouble;
00293 myMaxDouble = arg.myMaxDouble;
00294 myMaxStrLen = arg.myMaxStrLen;
00295 mySetFunctor = arg.mySetFunctor;
00296 myGetFunctor = arg.myGetFunctor;
00297 myUsingOwnedString = arg.myUsingOwnedString;
00298 myString = arg.myString;
00299 myConfigPriority = arg.myConfigPriority;
00300 myIgnoreBounds = arg.myIgnoreBounds;
00301 }
00302
00303 ArConfigArg::~ArConfigArg()
00304 {
00305 clear();
00306 }
00307
00308 void ArConfigArg::clear(void)
00309 {
00310 myType = INVALID;
00311 myIntType = INT_NOT;
00312 myName = "";
00313 myDescription = "";
00314 myOwnPointedTo = false;
00315 if (myOwnPointedTo && myIntPointer != NULL)
00316 delete myIntPointer;
00317 myIntPointer = NULL;
00318 if (myOwnPointedTo && myIntShortPointer != NULL)
00319 delete myIntShortPointer;
00320 myIntShortPointer = NULL;
00321 if (myOwnPointedTo && myIntUnsignedShortPointer != NULL)
00322 delete myIntUnsignedShortPointer;
00323 myIntUnsignedShortPointer = NULL;
00324 if (myOwnPointedTo && myIntUnsignedCharPointer != NULL)
00325 delete myIntUnsignedCharPointer;
00326 myIntUnsignedCharPointer = NULL;
00327 if (myOwnPointedTo && myDoublePointer != NULL)
00328 delete myDoublePointer;
00329 myDoublePointer = NULL;
00330 if (myOwnPointedTo && myBoolPointer != NULL)
00331 delete myBoolPointer;
00332 myBoolPointer = NULL;
00333 myStringPointer = NULL;
00334 myUsingOwnedString = false;
00335 myString = "";
00336 myMinInt = INT_MIN;
00337 myMaxInt = INT_MAX;
00338 myMinDouble = -HUGE_VAL;
00339 myMaxDouble = HUGE_VAL;
00340 myMaxStrLen = 0;
00341 mySetFunctor = NULL;
00342 myGetFunctor = NULL;
00343 myConfigPriority = ArPriority::NORMAL;
00344 myIgnoreBounds = false;
00345 }
00346
00353 ArConfigArg::Type ArConfigArg::getType(void) const
00354 {
00355 return myType;
00356 }
00357
00358 int ArConfigArg::getMinInt(void) const
00359 {
00360 return myMinInt;
00361 }
00362
00363 int ArConfigArg::getMaxInt(void) const
00364 {
00365 return myMaxInt;
00366 }
00367
00368 double ArConfigArg::getMinDouble(void) const
00369 {
00370 return myMinDouble;
00371 }
00372
00373 double ArConfigArg::getMaxDouble(void) const
00374 {
00375 return myMaxDouble;
00376 }
00377
00378 const char *ArConfigArg::getName(void) const
00379 {
00380 return myName.c_str();
00381 }
00382
00383 const char *ArConfigArg::getDescription(void) const
00384 {
00385 return myDescription.c_str();
00386 }
00387
00388 int ArConfigArg::getInt(void) const
00389 {
00390
00391 if (myIntPointer != NULL)
00392 return *myIntPointer;
00393 else if (myIntShortPointer != NULL)
00394 return *myIntShortPointer;
00395 else if (myIntUnsignedShortPointer != NULL)
00396 return *myIntUnsignedShortPointer;
00397 else if (myIntUnsignedCharPointer != NULL)
00398 return *myIntUnsignedCharPointer;
00399 else
00400 return 0;
00401 }
00402
00403 double ArConfigArg::getDouble(void) const
00404 {
00405 if (myDoublePointer != NULL)
00406 return *myDoublePointer;
00407 else
00408 return 0;
00409 }
00410
00411 bool ArConfigArg::getBool(void) const
00412 {
00413 if (myBoolPointer != NULL)
00414 return *myBoolPointer;
00415 else
00416 return false;
00417 }
00418
00419 const char *ArConfigArg::getString(void) const
00420 {
00421 if (myUsingOwnedString)
00422 return myString.c_str();
00423 else if (myStringPointer != NULL)
00424 return myStringPointer;
00425 else
00426 return NULL;
00427 }
00428
00429 const std::list<ArArgumentBuilder *> *ArConfigArg::getArgsWithFunctor(void) const
00430 {
00431 if (myGetFunctor == NULL)
00432 return NULL;
00433 else
00434 return myGetFunctor->invokeR();
00435 }
00436
00437 bool ArConfigArg::setInt(int val, char *errorBuffer,
00438 size_t errorBufferLen, bool doNotSet)
00439 {
00440
00441 if (!myIgnoreBounds && val < myMinInt)
00442 {
00443 ArLog::log(ArLog::Normal, "ArConfigArg of %s: setInt value %d below range [%d, %d]", getName(), val, myMinInt, myMaxInt);
00444 if (errorBuffer != NULL)
00445 snprintf(errorBuffer, errorBufferLen, "%s value of %d is below minimum of %d.", getName(), val, myMinInt);
00446 return false;
00447 }
00448 if (!myIgnoreBounds && val > myMaxInt)
00449 {
00450 ArLog::log(ArLog::Normal, "ArConfigArg of %s: setInt value %d above range [%d, %d]", getName(), val, myMinInt, myMaxInt);
00451 if (errorBuffer != NULL)
00452 snprintf(errorBuffer, errorBufferLen, "%s value of %d is above maximum of %d.", getName(), val, myMaxInt);
00453 return false;
00454 }
00455 if ((myIntType == INT_INT && myIntPointer == NULL) ||
00456 (myIntType == INT_SHORT && myIntShortPointer == NULL) ||
00457 (myIntType == INT_UNSIGNED_SHORT &&
00458 myIntUnsignedShortPointer == NULL) ||
00459 (myIntType == INT_UNSIGNED_CHAR && myIntUnsignedCharPointer == NULL))
00460 {
00461 ArLog::log(ArLog::Normal, "ArConfigArg of %s: setInt called with NULL int pointer.", getName());
00462 if (errorBuffer != NULL)
00463 snprintf(errorBuffer, errorBufferLen, "%s pointer is NULL.", getName());
00464 return false;
00465 }
00466
00467 if (!doNotSet)
00468 {
00469 if (myIntType == INT_INT)
00470 *myIntPointer = val;
00471 else if (myIntType == INT_SHORT)
00472 *myIntShortPointer = val;
00473 else if (myIntType == INT_UNSIGNED_SHORT)
00474 *myIntUnsignedShortPointer = val;
00475 else if (myIntType == INT_UNSIGNED_CHAR)
00476 *myIntUnsignedCharPointer = val;
00477 else
00478 {
00479 ArLog::log(ArLog::Normal, "ArConfigArg of %s: int is bad type.", getName());
00480 if (errorBuffer != NULL)
00481 snprintf(errorBuffer, errorBufferLen, "%s int is bad type (%d).", getName(), myIntType);
00482 return false;
00483 }
00484 }
00485 return true;
00486 }
00487
00488 bool ArConfigArg::setDouble(double val, char *errorBuffer,
00489 size_t errorBufferLen, bool doNotSet)
00490 {
00491 if (!myIgnoreBounds && val < myMinDouble)
00492 {
00493 ArLog::log(ArLog::Normal, "ArConfigArg of %s: setDouble value %g below range [%g, %g]", getName(), val, myMinDouble, myMaxDouble);
00494 if (errorBuffer != NULL)
00495 snprintf(errorBuffer, errorBufferLen, "%s value of %g is below minimum of %g.", getName(), val, myMinDouble);
00496 return false;
00497 }
00498 if (!myIgnoreBounds && val > myMaxDouble)
00499 {
00500 ArLog::log(ArLog::Normal, "ArConfigArg of %s: setDouble value %g above range [%g, %g]", getName(), val, myMinDouble, myMaxDouble);
00501 if (errorBuffer != NULL)
00502 snprintf(errorBuffer, errorBufferLen, "%s value of %g is above maximum of %g.", getName(), val, myMaxDouble);
00503 return false;
00504 }
00505 if (myDoublePointer == NULL)
00506 {
00507 ArLog::log(ArLog::Normal, "ArConfigArg of %s: setDouble called with NULL pointer.", getName());
00508 if (errorBuffer != NULL)
00509 snprintf(errorBuffer, errorBufferLen, "%s pointer is NULL.", getName());
00510 return false;
00511 }
00512
00513 if (!doNotSet)
00514 *myDoublePointer = val;
00515 return true;
00516 }
00517
00518
00519 bool ArConfigArg::setBool(bool val, char *errorBuffer,
00520 size_t errorBufferLen, bool doNotSet)
00521 {
00522 if (myBoolPointer == NULL)
00523 {
00524 ArLog::log(ArLog::Normal, "ArConfigArg of %s: setBool called with NULL pointer.", getName());
00525 if (errorBuffer != NULL)
00526 snprintf(errorBuffer, errorBufferLen, "%s pointer is NULL.", getName());
00527 return false;
00528 }
00529 if (!doNotSet)
00530 *myBoolPointer = val;
00531 return true;
00532 }
00533
00534 bool ArConfigArg::setString(const char *str, char *errorBuffer,
00535 size_t errorBufferLen, bool doNotSet)
00536 {
00537 size_t len;
00538 if (myUsingOwnedString)
00539 {
00540 myString = str;
00541 return true;
00542 }
00543 if (myStringPointer == NULL)
00544 {
00545 ArLog::log(ArLog::Normal, "ArConfigArg of %s: setString called with NULL pointer.", getName());
00546 if (errorBuffer != NULL)
00547 snprintf(errorBuffer, errorBufferLen, "%s pointer is NULL.", getName());
00548 return false;
00549 }
00550
00551
00552 if ((len = strlen(str)) >= myMaxStrLen)
00553 {
00554 ArLog::log(ArLog::Normal, "ArConfigArg of %s: setString called with argument %d long, when max length is %d.", getName(), len, myMaxStrLen);
00555 if (errorBuffer != NULL)
00556 snprintf(errorBuffer, errorBufferLen, "%s string is %d long when max length is %d.", getName(), len, myMaxStrLen);
00557 return false;
00558 }
00559 if (!doNotSet)
00560 strcpy(myStringPointer, str);
00561 return true;
00562 }
00563
00564 bool ArConfigArg::setArgWithFunctor(ArArgumentBuilder *argument,
00565 char *errorBuffer,
00566 size_t errorBufferLen,
00567 bool doNotSet)
00568 {
00569 bool ret = true;
00570 if (mySetFunctor == NULL)
00571 {
00572 ArLog::log(ArLog::Normal, "ArConfigArg of %s: setArgWithFunctor called with NULL pointer.", getName());
00573 if (errorBuffer != NULL)
00574 snprintf(errorBuffer, errorBufferLen, "%s pointer is NULL.", getName());
00575 return false;
00576 }
00577 if (!doNotSet)
00578 ret = mySetFunctor->invokeR(argument);
00579 return ret;
00580 }
00581
00582
00583 void ArConfigArg::log(bool verbose) const
00584 {
00585 std::list<ArArgumentBuilder *>::const_iterator it;
00586 const std::list<ArArgumentBuilder *> *argList;
00587 std::string intType;
00588
00589 switch (getType())
00590 {
00591 case ArConfigArg::INVALID:
00592 ArLog::log(ArLog::Terse,
00593 "\tType: %10s. This argument was not created properly.",
00594 "invalid");
00595 case ArConfigArg::INT:
00596 if (myIntType == INT_NOT)
00597 intType = "Not";
00598 else if (myIntType == INT_INT)
00599 intType = "Int";
00600 else if (myIntType == INT_SHORT)
00601 intType = "Short";
00602 else if (myIntType == INT_UNSIGNED_SHORT)
00603 intType = "Unsigned Short";
00604 else if (myIntType == INT_UNSIGNED_CHAR)
00605 intType = "Unsigned Short";
00606 else
00607 intType = "Unknown";
00608 ArLog::log(ArLog::Terse, "\tType: %10s name: %12s value: %d intType: %s",
00609 "int", getName(), getInt(), intType.c_str());
00610 if (strlen(getDescription()) != 0)
00611 ArLog::log(ArLog::Terse, "\t\tDescription: %s",
00612 getDescription());
00613 if (verbose)
00614 ArLog::log(ArLog::Terse, "\t\tMin: %10d Max: %10d",
00615 myMinInt, myMaxInt);
00616 break;
00617 case ArConfigArg::DOUBLE:
00618 ArLog::log(ArLog::Terse, "\tType: %10s name: %12s value: %f", "double",
00619 getName(), getDouble());
00620 if (strlen(getDescription()) != 0)
00621 ArLog::log(ArLog::Terse, "\t\tDescription: %s",
00622 getDescription());
00623 if (verbose)
00624 ArLog::log(ArLog::Terse, "\t\tMin: %10g Max: %10g",
00625 myMinDouble, myMaxDouble);
00626 break;
00627 case ArConfigArg::STRING:
00628 ArLog::log(ArLog::Terse, "\tType: %10s name: %12s value: %s", "string",
00629 getName(), getString());
00630 if (strlen(getDescription()) != 0)
00631 ArLog::log(ArLog::Terse, "\t\tDescription: %s",
00632 getDescription());
00633 if (verbose)
00634 ArLog::log(ArLog::Terse, "\t\tLength: %d", myMaxStrLen);
00635 break;
00636 case ArConfigArg::BOOL:
00637 ArLog::log(ArLog::Terse, "\tType: %10s name: %12s value: %d", "bool",
00638 getName(), getBool());
00639 if (strlen(getDescription()) != 0)
00640 ArLog::log(ArLog::Terse, "\t\tDescription: %s",
00641 getDescription());
00642 break;
00643 case ArConfigArg::FUNCTOR:
00644 ArLog::log(ArLog::Terse, "\tType: %10s name: %12s",
00645 "functor", getName());
00646 if (strlen(getDescription()) != 0)
00647 ArLog::log(ArLog::Terse, "\t\tDescription: %s",
00648 getDescription());
00649 ArLog::log(ArLog::Terse, "\t\tValues:");
00650 argList = myGetFunctor->invokeR();
00651 for (it = argList->begin(); it != argList->end(); it++)
00652 ArLog::log(ArLog::Terse, "\t\t\t%s", (*it)->getFullString());
00653 break;
00654 case ArConfigArg::DESCRIPTION_HOLDER:
00655 ArLog::log(ArLog::Terse, "\tType: %20s Description: %s",
00656 "description_holder", getDescription());
00657
00658 default:
00659 ArLog::log(ArLog::Terse,
00660 "\tType: %10s. This type doesn't have a case in ArConfigArg::print.",
00661 "unknown");
00662 break;
00663 }
00664
00665 ArLog::log(ArLog::Terse, "\t\tPriority: %s",
00666 ArPriority::getPriorityName(myConfigPriority));
00667 }
00668
00672 ArPriority::Priority ArConfigArg::getConfigPriority(void) const
00673 {
00674 return myConfigPriority;
00675 }
00676
00681 void ArConfigArg::setConfigPriority(ArPriority::Priority priority)
00682 {
00683 myConfigPriority = priority;
00684 }
00685
00690 void ArConfigArg::setIgnoreBounds(bool ignoreBounds)
00691 {
00692 myIgnoreBounds = ignoreBounds;
00693 }