Esempio n. 1
0
const QDomNode &SVT_Fcml::fcmlReqWithRefreshSession(const QString &to
                                                    , const QString &model, const QString &func
                                                    , const QMap<QString, QString> &para
                                                    , 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;
}
Esempio n. 2
0
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;
}