const QDomNode &SVT_Fcml::fcmlReqWithRefreshSession(const QString &to , const QString &model, const QString &func , const QMap<QString, QString> ¶ , int *error) { bool sessionRegeted=false; mNode.clear(); bool sessionOk=mSession.contains(to); mMutex.lock(); bool authOk=mSavedAuth.contains(to); mMutex.unlock(); if(!sessionOk && !authOk) { if(error) { *error=FE_WRONG_USER_OR_PWD; } return mNode; } //step1 get sessionId QString sessionId; if(!sessionOk) { Q_ASSERT(authOk); mMutex.lock(); const QPair<QString,QString> pair=mSavedAuth[to]; mMutex.unlock(); int itemp; sessionId=getSession(to,pair.first,pair.second,&itemp); if(sessionId.isEmpty()) { //有两种可能,1.用户名密码错 2.不在线 if(error) { *error=itemp; } return mNode; } sessionRegeted=true; } else { sessionId=mSession[to]; } //step2 get data QDomElement elem; QDomDocument doc; elem=doc.createElement(QString("%1.%2").arg(model,func)); elem.setAttribute("_sessionId",sessionId); QMap<QString, QString>::const_iterator i = para.constBegin(); while (i != para.constEnd()) { elem.setAttribute(i.key(),i.value()); ++i; } doc.appendChild(elem); // QString req="<%1.%2 _sessionId=\"%3\"/>"; // req=req.arg(model,func,sessionId); QString req=doc.toString(); bool needStartFinish=isSetApi(model,func); if(needStartFinish)sendStart(to,sessionId); elem=fcmlRequest(QString("netrouter@")+to,req).firstChild().toElement(); if(needStartFinish)sendFinish(to,sessionId); if(0==elem.tagName().compare("error")) { int retvalue=elem.attribute("code").toInt(); if(retvalue==FE_SESSION_NOTOK && !sessionRegeted && authOk) { const QPair<QString,QString> pair=mSavedAuth[to]; sessionId=getSession(to,pair.first,pair.second); sessionRegeted=true; if(!sessionId.isEmpty()) { elem=fcmlRequest(QString("netrouter@")+to,req).firstChild().toElement(); } } } if(error) { if(0==elem.tagName().compare("error")) { *error=elem.attribute("code").toInt(); } else { *error=0; } } return mNode; }
bool SVT_Soap::_doFunc(const QString &host, const QString &module, const QString &method, quint32 port, const QMap<QString, QString> *paras, QMap<QString, QString> *retmap){ if((mFlags&IS_CGDG) ||isSetApi(module,method)) { sendStart(host,port); } if(retmap) { retmap->clear(); } const char *cHeadMode="POST /soap/server_sa/ HTTP/1.0\r\n" "SOAPAction: urn:NETGEAR-ROUTER:service:%1:1#%2\r\n" "content-type: text/xml;charset=utf-8\r\n" "HOST: www.routerlogin.com\r\n" "User-Agent: SOAP Toolkit 3.0\r\n" "connection: keep-Alive\r\n" "Cache-Control: no-cache\r\n" "Pragma: no-cache\r\n" "content-length: %3\r\n\r\n"; const char *cBodyMode= "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>" "<SOAP-ENV:Envelope xmlns:SOAPSDK1=\"http://www.w3.org/2001/XMLSchema\" " "xmlns:SOAPSDK2=\"http://www.w3.org/2001/XMLSchema-instance\" " "xmlns:SOAPSDK3=\"http://schemas.xmlsoap.org/soap/encoding/\" " "xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">" "<SOAP-ENV:Header>" "<SessionID>58DEE6006A88A967E89A</SessionID>" "</SOAP-ENV:Header>" "<SOAP-ENV:Body>" "<M1:%2 xmlns:M1=\"urn:NETGEAR-ROUTER:service:%1:1\">" "%3" "</M1:%2>" "</SOAP-ENV:Body>" "</SOAP-ENV:Envelope>"; QString s_para=""; if(paras) { QMap<QString, QString>::const_iterator i = paras->begin(); while (i != paras->end()) { s_para+=QString("<%1>%2</%1>").arg(i.key(),i.value()); ++i; } } QString body=QString(cBodyMode).arg(module,method,s_para); QString head=QString(cHeadMode).arg(module,method).arg(body.length()); if(0==module.compare("ParentalControl",Qt::CaseInsensitive)) { cHeadMode="POST /soap/server_sa/ HTTP/1.0\r\n" "SOAPAction: urn:NETGEAR-ROUTER:service:%1:1#%2\r\n" "content-type: text/xml;charset=utf-8\r\n" "HOST: www.routerlogin.com\r\n" "User-Agent: SOAP Toolkit 3.0\r\n" "connection: keep-Alive\r\n" "Cache-Control: no-cache\r\n" "Pragma: no-cache\r\n" "content-length: %3\r\n\r\n"; cBodyMode="<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" "<SOAP-ENV:Header>\n" "<SessionID xsi:type=\"xsd:string\" xmlns:xsi=\"http://www.w3.org/1999/XMLSchema-instance\">E6A88AE69687E58D9A00</SessionID>\n" "</SOAP-ENV:Header>\n" "<SOAP-ENV:Body>\n" "<%1>\n" "%2" "</%1>\n" "</SOAP-ENV:Body>\n" "</SOAP-ENV:Envelope>\n"; const char *cParaString=" xsi:type=\"xsd:string\" xmlns:xsi=\"http://www.w3.org/1999/XMLSchema-instance\""; s_para=""; if(paras) { QMap<QString, QString>::const_iterator i = paras->begin(); while (i != paras->end()) { s_para+=QString("<%1%3>%2</%1>\n").arg(i.key(),i.value(),cParaString); ++i; } } body=QString(cBodyMode).arg(method,s_para); head=QString(cHeadMode).arg(module,method).arg(body.length()); } SVT_Http http(mExitFlag); QByteArray &retarray=http.rawRequest(host,head+body,port); qDebug()<<retarray; int retv=getRetValue(retarray); bool retOk=(200==retv); if(retOk && retmap) { qDebug()<<"start parse"; QDomDocument doc; QByteArray body=SVT_Http::getBody(retarray); doc.setContent(body,true); // QDomNode root=doc.namedItem() // doc. //QString tagname=method+"Response"; QDomNode rnode = doc.firstChild(); if (!rnode.isElement()) rnode = rnode.nextSibling(); parseNode(rnode,retmap); } if((retOk)&&((mFlags&IS_CGDG) ||isSetApi(module,method))) { sendFinish(host,port); } if(!retOk && retmap) { retmap->insert("error",QString::number(retv)); } return retOk; }