virtual int ProcessStart() { const buzz::XmlElement* Stanza = NextStanza(); if (Stanza == NULL) return STATE_BLOCKED; if (SendStanza(Stanza) != buzz::XMPP_RETURN_OK) return STATE_ERROR; return STATE_START; }
virtual int ProcessStart() { // see if there are any new stanzas to process const buzz::XmlElement* Stanza = NextStanza(); if (Stanza == NULL) { return STATE_BLOCKED; } ProcessMessageStanza(Stanza); return STATE_START; }
virtual int ProcessStart() { // see if there are any new stanzas to process const buzz::XmlElement* Stanza = NextStanza(); if (Stanza == NULL) { return STATE_BLOCKED; } if (SendStanza(Stanza) != buzz::XMPP_RETURN_OK) { return STATE_ERROR; } return STATE_START; }
virtual int ProcessStart() { // see if there are any new stanzas to process const buzz::XmlElement* Stanza = NextStanza(); if (Stanza == NULL) { return STATE_BLOCKED; } buzz::Jid From(Stanza->Attr(buzz::QN_FROM)); HandlePresence(From, Stanza); return STATE_START; }
int XmppTaskIq::ProcessResponse() { const txmpp::XmlElement* stanza = NextStanza(); if (stanza == NULL) { return STATE_BLOCKED; } std::string from = "Someone"; if (stanza->HasAttr(txmpp::QN_FROM)) from = stanza->Attr(txmpp::QN_FROM); std::cout << "Iq: " << from << std::endl; return STATE_RESPONSE; }
int XmppTaskMessage::ProcessResponse() { const txmpp::XmlElement* stanza = NextStanza(); if (stanza == NULL) { return STATE_BLOCKED; } std::string from = "Someone"; std::string text = "something too quiet to hear."; if (stanza->HasAttr(txmpp::QN_FROM)) from = stanza->Attr(txmpp::QN_FROM); const txmpp::XmlElement *body_stanza = stanza->FirstNamed(txmpp::QN_BODY); if (body_stanza != NULL) { text = body_stanza->BodyText(); } std::cout << "Message: " << from << " says " << text << std::endl; // Send response message if (from != "Someone") { std::stringstream response_text; response_text << "The thing you said was " << text.length() << " characters long."; txmpp::scoped_ptr<txmpp::XmlElement> message( new txmpp::XmlElement(txmpp::QN_MESSAGE)); message->SetAttr(txmpp::QN_TO, from); txmpp::XmlElement *body = new txmpp::XmlElement(txmpp::QN_BODY); body->SetBodyText(response_text.str()); message->AddElement(body); SendStanza(message.get()); } return STATE_RESPONSE; }
int XmppMessageReciveTask::ProcessStart(void) { static buzz::StaticQName QN_DELAY = { "urn:xmpp:delay", "delay" }; // 获取下一个stanza const auto stanza = NextStanza(); if (stanza == nullptr) { return STATE_BLOCKED; } // 获取消息体 const auto body = stanza->FirstNamed(buzz::QN_BODY); if (body == nullptr) { return STATE_BLOCKED; } XmppMessageInfo message; // 消息id message.SetUid(Utf8ToWStr(stanza->Attr(buzz::QN_ID))); // 消息类型 message.SetType(Utf8ToWStr(stanza->Attr(buzz::QN_TYPE))); // 获取发送人 std::wstring from(Utf8ToWStr(stanza->Attr(buzz::QN_FROM))); message.SetFrom(from); message.SetFromResource(from); // 获取接收人 message.SetTo(Utf8ToWStr(stanza->Attr(buzz::QN_TO))); message.SetToResource(Utf8ToWStr(stanza->Attr(buzz::QN_TO))); // 获取消息 message.SetContent(conv.from_bytes(body->BodyText())); // 获取时间 const auto delay = stanza->FirstNamed(QN_DELAY); if (delay != nullptr) { message.SetTime(Utf8ToWStr(delay->Attr(buzz::kQnStamp))); } // 是否离线消息 message.SetIsOfflineMsg(delay != nullptr); // 获取主题 const auto subject = stanza->FirstNamed(buzz::QN_SUBJECT); if (subject != nullptr) { message.SetSubject(Utf8ToWStr(subject->BodyText())); // 主题数据 if (subject->HasAttr(buzz::QN_VALUE)) { message.SetSubjectValue(Utf8ToWStr(subject->Attr(buzz::QN_VALUE))); } } // 获取扩展数据 auto extention = stanza->FirstNamed(QN_EXTENTION); if (extention != nullptr) { std::map<std::wstring, std::wstring> mapValue; auto elChild = extention->FirstElement(); while (elChild != nullptr) { auto name = elChild->Name().LocalPart(); mapValue.emplace(Utf8ToWStr(name), Utf8ToWStr(elChild->BodyText().c_str())); elChild = elChild->NextElement(); } message.SetExtention(mapValue); } MessageReceived(message); return STATE_START; }