//* For RTConnTcp
void RTConnectionTcp::OnLogin(const char* pUserid, const char* pPass)
{
    {
        //check & auth
        
        //std::string uid;
        //m_rtHiredis.CmdGet(pPass, uid);
        //if (uid.length()>0 && uid.compare(pUserid) == 0) {
        //login ok send response
        //} else {
        //login failed
        //}
    }
    std::string sid;
    {
        //store userid & pass
        RTConnectionManager::ConnectionInfo* pci = new RTConnectionManager::ConnectionInfo();
        if (pci) {
            RTConnectionManager::Instance()->GenericSessionId(sid);
            m_connectorId = RTConnectionManager::Instance()->ConnectorId();
            pci->connId = sid;
            pci->connAddr = RTConnectionManager::Instance()->ConnectorIp();
            pci->connPort = RTConnectionManager::Instance()->ConnectorPort();
            pci->userId = pUserid;
            pci->pConn = this;
            pci->connType = CONNECTIONTYPE::_ctcp;
            pci->flag = 1;
            std::string uid(pUserid);
            LI("OnLogin Uid:%s\n", uid.c_str());
            RTConnectionManager::Instance()->AddUser(CONNECTIONTYPE::_ctcp, uid, pci);
            m_userId = pUserid;
        } else {
            LE("new ConnectionInfo error!!!\n");
            std::string resp;
            GenericResponse(SIGNALTYPE::reqlogin, MSGTYPE::meeting, 0, RTCommCode::_errconninfo, GetRTCommStatus(RTCommCode::_errconninfo), resp);
            SendResponse(0, resp.c_str());
            return;

        }
    }
    
    {
        // send response
        std::string resp;
        GenericResponse(SIGNALTYPE::reqlogin, MSGTYPE::meeting, 0, RTCommCode::_ok, GetRTCommStatus(RTCommCode::_ok), resp);
        SendResponse(0, resp.c_str());
        return;
    }
}
void RTConnectionTcp::OnSndMsg(MSGTYPE mType, long long mseq, const char* pUserid, const char* pData, int dLen)
{
    if (!pData) {
        LE("%s invalid params\n", __FUNCTION__);
        std::string resp;
        GenericResponse(SIGNALTYPE::reqsndmsg, mType, mseq, RTCommCode::_invparams, GetRTCommStatus(RTCommCode::_invparams), resp);
        SendResponse(0, resp.c_str());
        return;
    }
    
    //no matter mType is meet or callcenter or p2p or others
    //the following code should be same
    //find an TrasnferSession By mtype
    //transfer msg by TransferSession
    
    TRANSFERMSG t_trmsg;
    TRANSMSG t_msg;
    t_msg._flag = 0;
    t_msg._touser = "";
    t_msg._connector = RTConnectionManager::Instance()->ConnectorId();
    t_msg._content = pData;
    
    t_trmsg._action = TRANSFERACTION::req;
    t_trmsg._fmodule = TRANSFERMODULE::mconnector;
    t_trmsg._type = TRANSFERTYPE::trans;
    t_trmsg._trans_seq = GenericTransSeq();
    t_trmsg._trans_seq_ack = 0;
    t_trmsg._valid = 1;
    t_trmsg._content = t_msg.ToJson();
    
    const std::string s = t_trmsg.ToJson();
    RTConnectionManager::ModuleInfo* pmi = RTConnectionManager::Instance()->findModuleInfo(pUserid, (TRANSFERMODULE)mType);
    if (pmi && pmi->pModule) {
        pmi->pModule->SendTransferData(s.c_str(), (int)s.length());
    } else {
        LE("pmi->pModule is NULL\n");
        std::string resp;
        GenericResponse(SIGNALTYPE::reqsndmsg, mType, mseq, RTCommCode::_errmoduinfo, GetRTCommStatus(RTCommCode::_errmoduinfo), resp);
        SendResponse(0, resp.c_str());
        return;
    }
    {
        std::string resp;
        GenericResponse(SIGNALTYPE::reqsndmsg, mType, mseq, RTCommCode::_ok, GetRTCommStatus(RTCommCode::_ok), resp);
        SendResponse(0, resp.c_str());
        return;
    }
}
void RTConnectionTcp::OnGetMsg(MSGTYPE mType, long long mseq, const char* pUserid)
{
    std::string resp;
    GenericResponse(SIGNALTYPE::reqgetmsg, mType, mseq, RTCommCode::_ok, GetRTCommStatus(RTCommCode::_ok), resp);
    SendResponse(0, resp.c_str());
    return;
}
void RTConnectionTcp::OnLogout(const char* pUserid)
{
    std::string uid(pUserid);
    RTConnectionManager::Instance()->DelUser(CONNECTIONTYPE::_ctcp, uid);
    m_userId = "";
    std::string resp;
    GenericResponse(SIGNALTYPE::reqlogout, MSGTYPE::meeting, 1, RTCommCode::_ok, GetRTCommStatus(RTCommCode::_ok), resp);
    SendResponse(0, resp.c_str());
    return;
}
void LRTGroupSession::OnLogin(pms::EServerCmd cmd, pms::EModuleType module, const std::string& msg)
{
    LI("%s was called\n", __FUNCTION__);
    pms::Login login;
    if (!login.ParseFromString(msg)) {
        LE("login.ParseFromString error\n");
    }

    m_userid = login.usr_from();
    m_token = login.usr_token();
    LI("Onlogin user:%s login\n", m_userid.c_str());
    std::string sid;
    {
        //store userid & pass
        LRTConnManager::ConnectionInfo* pci = new LRTConnManager::ConnectionInfo();
        if (pci) {
            GenericSessionId(sid);
            pci->_connId = sid;
            pci->_userId = m_userid;
            pci->_token = m_token;
            pci->_pConn = this;
            pci->_connType = pms::EConnType::TTCP;
            pci->_flag = 1;
            LRTConnManager::Instance().AddUser(pms::EConnType::TTCP, m_userid, pci);
            //LRTConnManager::Instance().ConnectionConnNotify(m_userId, m_token);

            // send response
            std::string resp;
            GenericResponse(pms::EServerCmd::CLOGIN, module, 0, resp);
            SendResponse(0, resp.c_str());
            m_login = true;
            return;
        } else {
            LE("new ConnectionInfo error userid:%s\n", m_userid.c_str());
            std::string resp;
            GenericResponse(pms::EServerCmd::CLOGIN, module, 101, resp);
            SendResponse(0, resp.c_str());
            m_login = false;
            return;
        }
    }
}
void RTConnectionTcp::OnKeepAlive(const char *pUserid)
{
    LI("RTConnectionTcp::OnKeepAlive pUserid:%s\n", pUserid);
    RTTcp::UpdateTimer();
    {
        std::string resp;
        GenericResponse(SIGNALTYPE::reqkeepalive, MSGTYPE::meeting, 2, RTCommCode::_ok, GetRTCommStatus(RTCommCode::_ok), resp);
        SendResponse(0, resp.c_str());
        return;
    }
}
void LRTGroupSession::OnLogout(pms::EServerCmd cmd, pms::EModuleType module, const std::string& msg)
{
    LI("%s was called\n", __FUNCTION__);
    pms::Logout logout;
    if (!logout.ParseFromString(msg)) {
        LE("login.ParseFromString error\n");
    }
    assert(logout.usr_from().compare(m_userid)==0);
    LI("OnLogout user:%s logout\n", m_userid.c_str());
    assert(logout.usr_from().compare(m_userid)==0);
    std::string token;
    LRTConnManager::Instance().DelUser(pms::EConnType::TTCP, m_userid, token);
    //LRTConnManager::Instance().ConnectionLostNotify(m_userid, m_token);

    m_userid = "";
    m_token = "";
    std::string resp;
    GenericResponse(pms::EServerCmd::CLOGOUT, module, 0, resp);
    SendResponse(0, resp.c_str());
    m_login = false;
    return;
}