Beispiel #1
0
void SessionListener::processPresence(const SessionPtr& session, const xml_document_ptr& doc) {
    string to = doc->child("presence").attribute("to").value();
    if (to.empty()) {
        session->presence(doc->xml());
    } else {
        MCE_DEBUG("presence to muc, " << to);
        IdType type = idType(to);
        if (type == ROOMID || type == ROOMJID) {
            MCE_DEBUG("presence to muc, " << to);
            //MucPresenceAdapter::instance().message(session->jid(), doc->xml());
            MucPresenceMsgHandlerAdapter::instance().message(session->jid(), doc->xml());
        } else if (type == JID) {
            session->presence(doc->xml());
        } else {
            MCE_INFO("DefultAction::execute --> invalid id");
        }

    }

    if (session->state() == SessionStateLogin) {
        LoginProcedureStat::instance().incPresence();
        string type = doc->child("presence").attribute("type").value();
        if (type != "subscribe" && type != "subscribed" && type
                != "unsubscribed") {
            string ver = "";
            string subver = "";
            string ext = "";
            string secver = "";
            string show = "";
            xml_node cNode = doc->child("presence").child("c");
            if (cNode) {
                ver = cNode.attribute("ver").value();
                ext = cNode.attribute("ext").value();
                subver = cNode.attribute("subver").value();
                secver = cNode.attribute("secver").value();
            }
            xml_node showNode = doc->child("presence").child("show");
            if (showNode) {
                show = showNode.first_child().value();
            }
            try {
                PresenceMsgHandlerAdapter::instance().presenceWithSecver(session->jid(),show,ver,subver,ext,secver);
            } catch(Ice::Exception& e) {
                MCE_WARN("PresenceAction::handle --> talklogic presence err :"<<e);
            }
            doc->child("presence").remove_child("status");
            session->state(SessionStateChat);
        }
    }

}