void fromConfig(const char *txt,Searchable& env, bool wipe=true) { StringInputStream sis; sis.add(txt); sis.add("\n"); if (wipe) { clear(); } String tag = ""; Bottle accum; bool done = false; do { bool isTag = false; bool including = false; String buf; bool good = true; buf = sis.readLine('\n',&good); while (good && !BottleImpl::isComplete(buf.c_str())) { buf += sis.readLine('\n',&good); } if (!good) { done = true; } if (!done) { including = false; if (buf.find("//")!=String::npos) { bool quoted = false; int comment = 0; for (unsigned int i=0; i<buf.length(); i++) { char ch = buf[i]; if (ch=='\"') { quoted = !quoted; } if (!quoted) { if (ch=='/') { comment++; if (comment==2) { //buf = buf.substr(0,buf.strstr("//")); buf = buf.substr(0,i); break; } } else { comment = 0; } } else { comment = 0; } } } // expand any environment references buf = expand(buf.c_str(),env,owner).c_str(); if (buf.length()>0 && buf[0]=='[') { size_t stop = buf.find("]"); if (stop!=String::npos) { buf = buf.substr(1,stop-1); size_t space = buf.find(" "); if (space!=String::npos) { Bottle bot(buf.c_str()); if (bot.size()>1) { if (bot.get(0).toString() == "include") { including = true; if (bot.size()>2) { if (tag!="") { if (accum.size()>=1) { putBottleCompat(tag.c_str(), accum); } tag = ""; } ConstString subName, fname; if (bot.size()==3) { // [include section "filename"] subName = bot.get(1).toString(); fname = bot.get(2).toString(); } else if (bot.size()==4) { // [include type section "filename"] ConstString key; key = bot.get(1).toString(); subName = bot.get(2).toString(); fname = bot.get(3).toString(); Bottle *target = getBottle(key.c_str()); if (target==NULL) { Bottle init; init.addString(key.c_str()); init.addString(subName.c_str()); putBottleCompat(key.c_str(), init); } else { target->addString(subName.c_str()); } } else { YARP_ERROR(Logger::get(), String("bad include")); return; } Property p; if (getBottle(subName)!=NULL) { p.fromString(getBottle(subName)->tail().toString()); //printf(">>> prior p %s\n", // p.toString().c_str()); } p.fromConfigFile(fname.c_str(), env, false); accum.fromString(p.toString()); tag = subName.c_str(); //printf(">>> tag %s accum %s\n", // tag.c_str(), // accum.toString().c_str()); if (tag!="") { if (accum.size()>=1) { Bottle b; b.addString(tag.c_str()); //Bottle& subList = b.addList(); //subList.copy(accum); b.append(accum); putBottleCompat(tag.c_str(), b); } tag = ""; } } else { tag = ""; ConstString fname = bot.get(1).toString(); //printf("Including %s\n", fname.c_str()); fromConfigFile(fname.c_str(), env, false); } } } if (bot.size()==2 && !including) { buf = bot.get(1).toString().c_str(); String key = bot.get(0).toString().c_str(); Bottle *target = getBottle(key.c_str()); if (target==NULL) { Bottle init; init.addString(key.c_str()); init.addString(buf.c_str()); putBottleCompat(key.c_str(),init); } else { target->addString(buf.c_str()); } } } if (!including) { isTag = true; } } } } if (!isTag && !including) { Bottle bot; bot.fromString(buf.c_str()); if (bot.size()>=1) { if (tag=="") { putBottleCompat(bot.get(0).toString().c_str(),bot); } else { if (bot.get(1).asString()=="=") { Bottle& b = accum.addList(); for (int i=0; i<bot.size(); i++) { if (i!=1) { b.add(bot.get(i)); } } } else { accum.addList().copy(bot); } } } } if (isTag||done) { if (tag!="") { if (accum.size()>=1) { putBottleCompat(tag.c_str(),accum); } tag = ""; } tag = buf; accum.clear(); accum.addString(tag.c_str()); if (tag!="") { if (getBottle(tag.c_str())!=NULL) { // merge data accum.append(getBottle(tag.c_str())->tail()); //printf("MERGE %s, got %s\n", tag.c_str(), // accum.toString().c_str()); } } } } while (!done); }
bool XmlRpcCarrier::write(ConnectionState& proto, SizedWriter& writer) { StringOutputStream sos; StringInputStream sis; writer.write(sos); sis.reset(sos.toString()); ConstString header; if (sender) { header = sis.readLine(); } ConstString body = sis.readLine(); Value v; if (header.length()>0 && header[0]=='q') { body = "yarp.quit"; // XMLRPC does not need a quit message, this should get stripped return false; } Bottle *bot = v.asList(); bot->fromString(body.c_str()); ConstString methodName; if (sender) { methodName = bot->get(0).toString(); *bot = bot->tail(); } XmlRpcValue args; if (bot->size()==1) { toXmlRpcValue(bot->get(0),args); } else { toXmlRpcValue(v,args); } std::string req; if (sender) { const Contact& addr = host.isValid()?host:proto.getStreams().getRemoteAddress(); XmlRpcClient c(addr.getHost().c_str(),(addr.getPort()>0)?addr.getPort():80); c.generateRequest(methodName.c_str(),args); req = c.getRequest(); } else { XmlRpcServerConnection c(0,NULL); c.generateResponse(args.toXml()); req = c.getResponse(); } int start = 0; if (sender) { if (req.length()<8) { fprintf(stderr, "XmlRpcCarrier fail, %s:%d\n", __FILE__, __LINE__); return false; } for (int i=0; i<(int)req.length(); i++) { if (req[i] == '\n') { start++; break; } start++; } if (!firstRound) { Bytes b((char*)http.c_str(),http.length()); proto.os().write(b); } firstRound = false; } Bytes b((char*)req.c_str()+start,req.length()-start); proto.os().write(b); return proto.os().isOk(); }