📄 xmpp.cxx
字号:
}void XMPP::Message::SetLanguage(const PString& lang){ PAssertNULL(rootElement)->SetAttribute(XMPP::Language, lang);}void XMPP::Message::SetSubject(const PString& subj, const PString& lang){ PXMLElement * elem = GetSubjectElement(lang); if (elem == NULL) { elem = PAssertNULL(rootElement)->AddChild(new PXMLElement(rootElement, XMPP::Message::Subject)); if (!lang.IsEmpty()) elem->SetAttribute(XMPP::Language, lang); } elem->AddChild(new PXMLData(elem, subj));}void XMPP::Message::SetBody(const PString& body, const PString& lang){ PXMLElement * elem = GetBodyElement(lang); if (elem == NULL) { elem = PAssertNULL(rootElement)->AddChild(new PXMLElement(rootElement, XMPP::Message::Body)); if (!lang.IsEmpty()) elem->SetAttribute(XMPP::Language, lang); } elem->AddChild(new PXMLData(elem, body));}void XMPP::Message::SetThread(const PString& thrd){ PXMLElement * elem = PAssertNULL(rootElement)->GetElement(XMPP::Message::Thread); if (elem == NULL) elem = PAssertNULL(rootElement)->AddChild(new PXMLElement(rootElement, XMPP::Message::Thread)); elem->AddChild(new PXMLData(elem, thrd));}///////////////////////////////////////////////////////const PString XMPP::Presence::Type("type");const PString XMPP::Presence::Show("show");const PString XMPP::Presence::Status("status");const PString XMPP::Presence::Priority("priority");XMPP::Presence::Presence(){ SetRootElement(new PXMLElement(0, XMPP::PresenceStanza)); SetID(XMPP::Stanza::GenerateID());}XMPP::Presence::Presence(PXML& pdu){ if (XMPP::Presence::IsValid(&pdu)) { PWaitAndSignal m(pdu.GetMutex()); PXMLElement * elem = pdu.GetRootElement(); if (elem != NULL) SetRootElement((PXMLElement *)elem->Clone(0)); }}XMPP::Presence::Presence(PXML * pdu){ if (XMPP::Presence::IsValid(pdu)) { PWaitAndSignal m(PAssertNULL(pdu)->GetMutex()); PXMLElement * elem = pdu->GetRootElement(); if (elem != NULL) SetRootElement((PXMLElement *)elem->Clone(0)); }}BOOL XMPP::Presence::IsValid() const{ return XMPP::Presence::IsValid(this);}BOOL XMPP::Presence::IsValid(const PXML * pdu){ PXMLElement * elem = PAssertNULL(pdu)->GetRootElement(); return elem != NULL && elem->GetName() == XMPP::PresenceStanza;}XMPP::Presence::PresenceType XMPP::Presence::GetType(PString * typeName) const{ PString t = PAssertNULL(rootElement)->GetAttribute(XMPP::Presence::Type); if (t.IsEmpty()) { if (typeName != NULL) *typeName = "available"; return XMPP::Presence::Available; } else { if (typeName != NULL) *typeName = t; if (t *= "unavailable") return XMPP::Presence::Unavailable; else if (t *= "subscribe") return XMPP::Presence::Subscribe; else if (t *= "subscribed") return XMPP::Presence::Subscribed; else if (t *= "unsubscribe") return XMPP::Presence::Unsubscribe; else if (t *= "unsubscribed") return XMPP::Presence::Unsubscribed; else if (t *= "probe") return XMPP::Presence::Probe; else if (t *= "error") return XMPP::Presence::Error; else return XMPP::Presence::Unknown; }}XMPP::Presence::ShowType XMPP::Presence::GetShow(PString * showName) const{ PXMLElement * elem = PAssertNULL(rootElement)->GetElement(XMPP::Presence::Show); if (elem == NULL) { if (showName != NULL) *showName = "online"; return XMPP::Presence::Online; } PString s = elem->GetData(); if (s.IsEmpty()) { if (showName != NULL) *showName = "online"; return XMPP::Presence::Online; } else { if (showName != NULL) *showName = s; if (s *= "away") return XMPP::Presence::Away; else if (s *= "chat") return XMPP::Presence::Chat; else if (s *= "dnd") return XMPP::Presence::DND; else if (s *= "xa") return XMPP::Presence::XA; else return XMPP::Presence::Other; }}BYTE XMPP::Presence::GetPriority() const{ PXMLElement * elem = PAssertNULL(rootElement)->GetElement(XMPP::Presence::Priority); return elem == NULL ? (BYTE)0 : (BYTE)elem->GetData().AsInteger();}PXMLElement * XMPP::Presence::GetStatusElement(const PString& lang){ if (PAssertNULL(rootElement) == NULL) return NULL; PXMLElement * dfltStatus = NULL; PINDEX i = 0; PXMLElement * status; PString l; while ((status = rootElement->GetElement(XMPP::Presence::Status, i++)) != NULL) { l = status->GetAttribute(XMPP::Language); if (l == lang) return status; else if (l.IsEmpty() && dfltStatus == NULL) dfltStatus = status; } return dfltStatus;}PString XMPP::Presence::GetStatus(const PString& lang){ PXMLElement * elem = GetStatusElement(lang); return elem != NULL ? elem->GetData() : PString::Empty();}void XMPP::Presence::SetType(PresenceType type){ switch (type) { case XMPP::Presence::Available: PAssertNULL(rootElement)->SetAttribute(XMPP::Presence::Type, PString::Empty()); break; case XMPP::Presence::Unavailable: SetType("unavailable"); break; case XMPP::Presence::Subscribe: SetType("subscribe"); break; case XMPP::Presence::Subscribed: SetType("subscribed"); break; case XMPP::Presence::Unsubscribe: SetType("unsubscribe"); break; case XMPP::Presence::Unsubscribed: SetType("unsubscribed"); break; case XMPP::Presence::Probe: SetType("probe"); break; case XMPP::Presence::Error: SetType("error"); break; default : break; }}void XMPP::Presence::SetType(const PString& type){ PAssertNULL(rootElement)->SetAttribute(XMPP::Presence::Type, type);}void XMPP::Presence::SetShow(ShowType show){ switch (show) { case XMPP::Presence::Online: { PXMLElement * elem = PAssertNULL(rootElement)->GetElement(XMPP::Presence::Show); if (elem) rootElement->RemoveElement(rootElement->FindObject(elem)); } break; case XMPP::Presence::Away: SetType("away"); break; case XMPP::Presence::Chat: SetType("chat"); break; case XMPP::Presence::DND: SetType("dnd"); break; case XMPP::Presence::XA: SetType("xa"); break; default : break; }}void XMPP::Presence::SetShow(const PString& show){ PXMLElement * elem = PAssertNULL(rootElement)->GetElement(XMPP::Presence::Show); if (elem == NULL) elem = PAssertNULL(rootElement)->AddChild(new PXMLElement(rootElement, XMPP::Presence::Show)); elem->AddChild(new PXMLData(elem, show));}void XMPP::Presence::SetPriority(BYTE priority){ PXMLElement * elem = PAssertNULL(rootElement)->GetElement(XMPP::Presence::Priority); if (elem == NULL) elem = PAssertNULL(rootElement)->AddChild(new PXMLElement(rootElement, XMPP::Presence::Priority)); elem->AddChild(new PXMLData(elem, PString((PINDEX)priority)));}void XMPP::Presence::SetStatus(const PString& status, const PString& lang){ PXMLElement * elem = GetStatusElement(lang); if (elem == NULL) { elem = PAssertNULL(rootElement)->AddChild(new PXMLElement(rootElement, XMPP::Presence::Status)); if (!lang.IsEmpty()) elem->SetAttribute(XMPP::Language, lang); } elem->AddChild(new PXMLData(elem, status));}///////////////////////////////////////////////////////const PString XMPP::IQ::Type("type");XMPP::IQ::IQ(XMPP::IQ::IQType type, PXMLElement * body) : m_Processed(FALSE), m_OriginalIQ(NULL){ SetRootElement(new PXMLElement(NULL, XMPP::IQStanza)); SetType(type); SetID(XMPP::Stanza::GenerateID()); SetBody(body); rootElement->SetAttribute(XMPP::Namespace, "jabber:client");}XMPP::IQ::IQ(PXML& pdu) : m_Processed(FALSE), m_OriginalIQ(NULL){ if (XMPP::IQ::IsValid(&pdu)) { PWaitAndSignal m(pdu.GetMutex()); PXMLElement * elem = pdu.GetRootElement(); if (elem != NULL) SetRootElement((PXMLElement *)elem->Clone(0)); }}XMPP::IQ::IQ(PXML * pdu) : m_Processed(FALSE), m_OriginalIQ(NULL){ if (XMPP::IQ::IsValid(pdu)) { PWaitAndSignal m(PAssertNULL(pdu)->GetMutex()); PXMLElement * elem = pdu->GetRootElement(); if (elem != NULL) SetRootElement((PXMLElement *)elem->Clone(0)); }}XMPP::IQ::~IQ(){ delete m_OriginalIQ;}BOOL XMPP::IQ::IsValid() const{ return XMPP::IQ::IsValid(this);}BOOL XMPP::IQ::IsValid(const PXML * pdu){ PXMLElement * elem = PAssertNULL(pdu)->GetRootElement(); if (elem == NULL || elem->GetName() != XMPP::IQStanza) return FALSE; PString s = elem->GetAttribute(XMPP::IQ::Type); if (s.IsEmpty() || (s != "get" && s != "set" && s != "result" && s != "error")) return FALSE; /* Appartently when a server sends a set to us there's no id... s = elem->GetAttribute(XMPP::IQ::ID); return !s.IsEmpty(); */ return TRUE;}XMPP::IQ::IQType XMPP::IQ::GetType(PString * typeName) const{ PString t = PAssertNULL(rootElement)->GetAttribute(XMPP::IQ::Type); if (typeName != NULL) *typeName = t; if (t *= "get") return XMPP::IQ::Get; else if (t *= "set") return XMPP::IQ::Set; else if (t *= "result") return XMPP::IQ::Result; else if (t *= "error") return XMPP::IQ::Error; else return XMPP::IQ::Unknown;}PXMLElement * XMPP::IQ::GetBody(){ PXMLObject * elem = PAssertNULL(rootElement)->GetElement(0); return PIsDescendant(elem, PXMLElement) ? (PXMLElement *)elem : NULL;}void XMPP::IQ::SetType(XMPP::IQ::IQType type){ switch (type) { case XMPP::IQ::Get: SetType("get"); break; case XMPP::IQ::Set: SetType("set"); break; case XMPP::IQ::Result: SetType("result"); break; case XMPP::IQ::Error: SetType("error"); break; default : break; }}void XMPP::IQ::SetType(const PString& type){ PAssertNULL(rootElement)->SetAttribute(XMPP::IQ::Type, type);}void XMPP::IQ::SetBody(PXMLElement * body){ if (PAssertNULL(rootElement) == NULL) return; while(rootElement->HasSubObjects()) rootElement->RemoveElement(0); if (body != NULL) { body->SetParent(rootElement); rootElement->AddChild(body); }}void XMPP::IQ::SetOriginalMessage(IQ * iq){ delete m_OriginalIQ; m_OriginalIQ = iq;}XMPP::IQ * XMPP::IQ::BuildResult() const{ IQType iq_type = GetType(); if (iq_type != XMPP::IQ::Get && iq_type != XMPP::IQ::Set) return NULL; IQ * result = new IQ(XMPP::IQ::Result); result->SetID(GetID()); result->SetTo(GetFrom()); return result;}XMPP::IQ * XMPP::IQ::BuildError(const PString& type, const PString& code) const{ IQType iq_type = GetType(); if (iq_type != XMPP::IQ::Get && iq_type != XMPP::IQ::Set) return NULL; IQ * error = new IQ(XMPP::IQ::Error); error->SetID(GetID()); error->SetTo(GetFrom()); PXMLElement * body = error->GetRootElement()->AddChild(new PXMLElement(error->GetRootElement(), "error")); body->SetAttribute("type", type); PXMLElement * codeElem = body->AddChild(new PXMLElement(body, code)); codeElem->SetAttribute(XMPP::Namespace, "urn:ietf:params:xml:ns:xmpp-stanzas"); const PXMLElement * originalBody = (PXMLElement *)rootElement->GetElement(0); if (originalBody != NULL) error->GetRootElement()->AddChild((PXMLElement *)originalBody->Clone(error->GetRootElement())); return error;}///////////////////////////////////////////////////////XMPP::Disco::Item::Item(PXMLElement * item) : m_JID(item != 0 ? item->GetAttribute("jid") : PString::Empty()), m_Node(item != 0 ? item->GetAttribute("node") : PString::Empty()){}XMPP::Disco::Item::Item(const PString& jid, const PString& node) : m_JID(jid), m_Node(node){}PXMLElement * XMPP::Disco::Item::AsXML(PXMLElement * parent) const{ if (parent == 0) return 0; PXMLElement * item = parent->AddChild(new PXMLElement(parent, "item")); item->SetAttribute("jid", m_JID); if (!m_Node.IsEmpty()) item->SetAttribute("node", m_Node); return item;}XMPP::Disco::ItemList::ItemList(PXMLElement * list){ if (list == 0) return; PINDEX i = 0; PXMLElement * item; while ((item = list->GetElement("item", i++)) != 0) Append(new Item(item));}PXMLElement * XMPP::Disco::ItemList::AsXML(PXMLElement * parent) const{ if (parent == 0) return 0; PXMLElement * items = parent->AddChild(new PXMLElement(parent, "query")); items->SetAttribute(XMPP::Namespace, "http://jabber.org/protocol/disco#items"); for (PINDEX i = 0, max = GetSize() ; i < max ; i++) (*this)[i].AsXML(items); return items;}XMPP::Disco::Identity::Identity(PXMLElement * identity) : m_Category(identity != 0 ? identity->GetAttribute("category") : PString::Empty()), m_Type(identity != 0 ? identity->GetAttribute("type") : PString::Empty()), m_Name(identity != 0 ? identity->GetAttribute("name") : PString::Empty()){}XMPP::Disco::Identity::Identity(const PString& category, const PString& type, const PString& name) : m_Category(category), m_Type(type), m_Name(name){}PXMLElement * XMPP::Disco::Identity::AsXML(PXMLElement * parent) const{ if (parent == 0) return 0; PXMLElement * identity = parent->AddChild(new PXMLElement(parent, "identity")); if (!m_Category.IsEmpty()) identity->SetAttribute("category", m_Category); if (!m_Type.IsEmpty()) identity->SetAttribute("type", m_Type); if (!m_Name.IsEmpty()) identity->SetAttribute("name", m_Name); return identity;}XMPP::Disco::IdentityList::IdentityList(PXMLElement * list){ if (list == 0) return; PINDEX i = 0; PXMLElement * identity; while ((identity = list->GetElement("identity", i++)) != 0) Append(new Identity(identity));}PXMLElement * XMPP::Disco::IdentityList::AsXML(PXMLElement * parent) const{ if (parent == 0) return 0; // Identity lists normally come as part of a full info, which we // assume here it's the parent for (PINDEX i = 0, max = GetSize() ; i < max ; i++) (*this)[i].AsXML(parent); return parent;}XMPP::Disco::Info::Info(PXMLElement * info){ if (info == 0) return; m_Identities = IdentityList(info); PINDEX i = 0; PXMLElement * feature; PString var; while ((feature = info->GetElement("feature", i++)) != 0) { var = feature->GetAttribute("var"); if (!var.IsEmpty()) m_Features.Include(var); }}PXMLElement * XMPP::Disco::Info::AsXML(PXMLElement * parent) const{ if (parent == 0) return 0; PXMLElement * info = parent->AddChild(new PXMLElement(parent, "query")); info->SetAttribute(XMPP::Namespace, "http://jabber.org/protocol/disco#info"); m_Identities.AsXML(info); for (PINDEX i = 0, max = m_Features.GetSize() ; i < max ; i++) { PXMLElement * feature = info->AddChild(new PXMLElement(info, "feature")); feature->SetAttribute("var", m_Features.GetKeyAt(i)); } return info;}#endif // P_EXPAT// End of File ///////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -