AREXPORT void ArClientHandlerConfig::handleGetConfigDefaults( ArNetPacket *packet) { ArLog::log(ArLog::Normal, "%sreceived default config %s", myLogPrefix.c_str(), ((myHaveRequestedDefaultCopy) ? "(copy)" : "(reset)")); char param[1024]; char argument[1024]; char errorBuffer[1024]; myDataMutex.lock(); ArConfig *config = NULL; // If the config (or a section) is being reset to its default values, // then we don't want to remove any parameters that are not set -- i.e. // any parameters that are not contained in the default config. bool isClearUnsetValues = false; if (myHaveRequestedDefaults) { config = &myConfig; } else if (myHaveRequestedDefaultCopy) { // If we have requested a copy of the default configuration, then we // will want to remove any parameters that haven't been explicitly set. // (This is because of the next line, which copies the current config // to the default config.) isClearUnsetValues = true; // The default config is transmitted in an "abbreviated" form -- just // the section/param names and values. Copy the current config to the // default before processing the packet so that the parameter types, etc. // can be preserved. if (myDefaultConfig == NULL) { myDefaultConfig = new ArConfig(myConfig); myDefaultConfig->setConfigName("Default", myRobotName.c_str()); myDefaultConfig->setQuiet(myIsQuiet); } else { *myDefaultConfig = myConfig; } config = myDefaultConfig; } // if we didn't ask for any of these, then just return since the // data is for someone else else { myDataMutex.unlock(); return; } if (config == NULL) { ArLog::log(ArLog::Normal, "%serror determining config to populate with default values", myLogPrefix.c_str()); myDataMutex.unlock(); return; } ArArgumentBuilder *builder = NULL; ArLog::log(ArLog::Normal, "%sGot defaults", myLogPrefix.c_str()); errorBuffer[0] = '\0'; //myDataMutex.lock(); if (isClearUnsetValues) { config->clearAllValueSet(); } while (packet->getDataReadLength() < packet->getDataLength()) { packet->bufToStr(param, sizeof(param)); packet->bufToStr(argument, sizeof(argument)); builder = new ArArgumentBuilder; builder->setQuiet(myIsQuiet); builder->setExtraString(param); builder->add(argument); if ((strcasecmp(param, "Section") == 0 && !config->parseSection(builder, errorBuffer, sizeof(errorBuffer))) || (strcasecmp(param, "Section") != 0 && !config->parseArgument(builder, errorBuffer, sizeof(errorBuffer)))) { ArLog::log(ArLog::Terse, "%shandleGetConfigDefaults: Hideous problem getting defaults, couldn't parse '%s %s'", myLogPrefix.c_str(), param, argument); } else { IFDEBUG(if (strlen(param) > 0) { ArLog::log(ArLog::Normal, "%shandleGetConfigDefaults: added default '%s %s'", myLogPrefix.c_str(), param, argument); } ); } delete builder; builder = NULL; }
bool ArServerHandlerConfig::internalSetConfig(ArServerClient *client, ArNetPacket *packet) { char param[1024]; char argument[1024]; char errorBuffer[1024]; char firstError[1024]; ArNetPacket retPacket; ArConfig *config; bool ret = true; if (client != NULL) config = myConfig; else config = myDefault; if (client != NULL) lockConfig(); ArArgumentBuilder *builder = NULL; if (client != NULL) ArLog::log(ArLog::Normal, "Got new config from client %s", client->getIPString()); else ArLog::log(ArLog::Verbose, "New default config"); errorBuffer[0] = '\0'; firstError[0] = '\0'; while (packet->getDataReadLength() < packet->getDataLength()) { packet->bufToStr(param, sizeof(param)); packet->bufToStr(argument, sizeof(argument)); builder = new ArArgumentBuilder; builder->setExtraString(param); builder->add(argument); ArLog::log(ArLog::Verbose, "Config: %s %s", param, argument); // if the param name here is "Section" we need to parse sections, // otherwise we parse the argument if ((strcasecmp(param, "Section") == 0 && !config->parseSection(builder, errorBuffer, sizeof(errorBuffer))) || (strcasecmp(param, "Section") != 0 && !config->parseArgument(builder, errorBuffer, sizeof(errorBuffer)))) { if (firstError[0] == '\0') strcpy(firstError, errorBuffer); } delete builder; builder = NULL; } if (firstError[0] == '\0') { if (config->callProcessFileCallBacks(true, errorBuffer, sizeof(errorBuffer))) { if (client != NULL) ArLog::log(ArLog::Normal, "New config from client %s was fine.", client->getIPString()); else ArLog::log(ArLog::Verbose, "New default config was fine."); retPacket.strToBuf(""); writeConfig(); } else // error processing config callbacks { ret = false; if (firstError[0] == '\0') strcpy(firstError, errorBuffer); // if its still empty it means we didn't have anything good in the errorBuffer if (firstError[0] == '\0') strcpy(firstError, "Error processing"); if (client != NULL) ArLog::log(ArLog::Normal, "New config from client %s had errors processing ('%s').", client->getIPString(), firstError); else ArLog::log(ArLog::Normal, "New default config had errors processing ('%s').", firstError); retPacket.strToBuf(firstError); } } else { ret = false; if (client != NULL) ArLog::log(ArLog::Normal, "New config from client %s had at least this problem: %s", client->getIPString(), firstError); else ArLog::log(ArLog::Normal, "New default config had at least this problem: %s", firstError); retPacket.strToBuf(firstError); } //printf("Sending "); //retPacket.log(); if (client != NULL) client->sendPacketTcp(&retPacket); if (client != NULL) unlockConfig(); if (client != NULL) configUpdated(client); return ret; }