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 "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':
00097 {
00098 if (myIsDisplayHintParsed) {
00099
00100 bool boolVal = false;
00101 if (packet->bufToByte()) {
00102 boolVal = true;
00103 }
00104
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':
00124 {
00125 if (myIsDisplayHintParsed) {
00126
00127 int intVal = packet->bufToByte4();
00128 int intMin = packet->bufToByte4();
00129 int intMax = packet->bufToByte4();
00130
00131
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':
00152 {
00153 if (myIsDisplayHintParsed) {
00154
00155 double doubleVal = packet->bufToDouble();
00156 double doubleMin = packet->bufToDouble();
00157 double doubleMax = packet->bufToDouble();
00158
00159
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':
00180 {
00181 if (myIsDisplayHintParsed) {
00182
00183 packet->bufToStr(myBuffer, BUFFER_LENGTH);
00184
00185
00186 argOut = ArConfigArg(name, myBuffer, description, 0);
00187 }
00188 else {
00189 isSuccess = false;
00190 }
00191 }
00192 break;
00193
00194 case '.':
00195 {
00196
00197
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 }
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 }
00297
00298 if (isSuccess && myIsDisplayHintParsed) {
00299 packet->strToBuf(arg.getDisplayHint());
00300 }
00301
00302 return isSuccess;
00303
00304 }
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
00352 break;
00353
00354 default:
00355
00356 isSuccess = false;
00357 ArLog::log(ArLog::Terse, "ArClientArg::createPacket() unsupported param type %i", arg.getType());
00358
00359 }
00360
00361 return isSuccess;
00362
00363 }
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
00399 break;
00400
00401 default:
00402
00403 isSuccess = false;
00404 ArLog::log(ArLog::Terse, "ArClientArg::createPacket() unsupported param type %i", arg.getType());
00405
00406 }
00407
00408 return isSuccess;
00409
00410 }
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 }
00442
00443 if (isSuccess) {
00444 packet->strToBuf(myBuffer);
00445 }
00446 return isSuccess;
00447
00448 }