⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmpp.cxx

📁 pwlib源码库
💻 CXX
📖 第 1 页 / 共 2 页
字号:
}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 + -