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

📄 pidf.cxx

📁 这是国外的resip协议栈
💻 CXX
字号:
#if defined(HAVE_CONFIG_H)#include "resip/stack/config.hxx"#endif#include "resip/stack/Pidf.hxx"#include "resip/stack/SipMessage.hxx"#include "resip/stack/Symbols.hxx"#include "resip/stack/XMLCursor.hxx"#include "rutil/Logger.hxx"#include "rutil/Inserter.hxx"#include "rutil/WinLeakCheck.hxx"using namespace resip;using namespace std;#define RESIPROCATE_SUBSYSTEM Subsystem::SIPboolPidf::init(){   static ContentsFactory<Pidf> factory;   (void)factory;   return true;}Pidf::Pidf()   : Contents(getStaticType()){}Pidf::Pidf(const Mime& contentType)   : Contents(getStaticType()){}Pidf::Pidf(HeaderFieldValue* hfv, const Mime& contentsType)   : Contents(hfv, contentsType){} Pidf::Pidf(const Pidf& rhs)   : Contents(rhs),     mEntity(rhs.mEntity),     mNote(rhs.mNote),     mTuples(rhs.mTuples){}Pidf::Pidf(const Uri& entity)   : Contents(getStaticType()),     mEntity(entity){}Pidf::~Pidf(){}void Pidf::setEntity(const Uri& entity){   checkParsed();   mEntity = entity;}const Uri& Pidf::getEntity() const{    checkParsed();   return mEntity; };std::vector<Pidf::Tuple>&Pidf::getTuples(){   checkParsed();   return mTuples;}const std::vector<Pidf::Tuple>&Pidf::getTuples() const{   checkParsed();   return mTuples;}intPidf::getNumTuples() const{   checkParsed();   return mTuples.size();}Pidf&Pidf::operator=(const Pidf& rhs){   if (this != &rhs)   {      Contents::operator=(rhs);      mNote = rhs.mNote;      mEntity = rhs.mEntity;      mTuples = rhs.mTuples;   }   return *this;}Contents* Pidf::clone() const{   return new Pidf(*this);}const Mime& Pidf::getStaticType() {   static Mime type("application","pidf+xml");   return type;}std::ostream& Pidf::encodeParsed(std::ostream& str) const{   //DebugLog(<< "Pidf::encodeParsed " << mText);   //str << mText;   str << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << Symbols::CRLF;   str << "<presence xmlns=\"urn:ietf:params:xml:ns:pidf\"" << Symbols::CRLF;   str << "          entity=\"" << mEntity << "\">"  <<  Symbols::CRLF;   for (vector<Tuple>::const_iterator i = mTuples.begin(); i != mTuples.end(); ++i)   {      Data status( (char*)( (i->status) ? "open" : "closed" ) );      str << "  <tuple id=\"" << i->id << "\" ";      XMLCursor::encode(str, i->attributes);      str << ">" << Symbols::CRLF;      str << "     <status><basic>" << status << "</basic></status>" << Symbols::CRLF;      if ( !i->contact.empty() )      {         str << "     <contact priority=\"" << i->contactPriority << "\">" << i->contact << "</contact>" << Symbols::CRLF;      }      if ( !i->timeStamp.empty() )      {         str << "     <timestamp>" << i->timeStamp << "</timestamp>" << Symbols::CRLF;      }      if ( !i->note.empty() )      {         str << "     <note>" << i->note << "</note>" << Symbols::CRLF;      }      str << "  </tuple>" << Symbols::CRLF;   }   str << "</presence>" << Symbols::CRLF;   return str;}voidPidf::parse(ParseBuffer& pb){   DebugLog(<< "Pidf::parse(" << Data(pb.start(), int(pb.end()-pb.start())) << ") ");	std::string pidf_namespace;   XMLCursor xml(pb);	XMLCursor::AttributeMap attr = xml.getAttributes();	XMLCursor::AttributeMap::const_iterator it =			std::find_if(attr.begin(), attr.end(), XMLCursor::AttributeValueEqual("urn:ietf:params:xml:ns:pidf"));	if ( it != attr.end() ) {		std::string key(it->first.data(), it->first.size());		size_t pos = key.find(':');		if ( pos != string::npos) {			pidf_namespace.assign(key, pos+1, key.size()-pos-1);			pidf_namespace.append(1, ':');		}	}	const std::string presence = pidf_namespace + "presence";	if (xml.getTag() == presence.c_str())   {      XMLCursor::AttributeMap::const_iterator i = xml.getAttributes().find("entity");      if (i != xml.getAttributes().end())      {         mEntity = Uri(i->second);      }      else      {         DebugLog(<< "no entity!");      }      if (xml.firstChild())      {         do         {				const std::string tuple = pidf_namespace + "tuple";				if (xml.getTag() == tuple.c_str())            {               Tuple t;               t.attributes = xml.getAttributes();               XMLCursor::AttributeMap::const_iterator i = xml.getAttributes().find("id");               if (i != xml.getAttributes().end())               {                  t.id = i->second;                  t.attributes.erase("id");               }               // look for status, contacts, notes -- take last of each for now               if (xml.firstChild())               {                  do                  {							const std::string status = pidf_namespace + "status";							const std::string contact = pidf_namespace + "contact";							const std::string note = pidf_namespace + "note";							const std::string timestamp = pidf_namespace + "timestamp";                     if (xml.getTag() == status.c_str())                     {                        // look for basic                        if (xml.firstChild())                        {                           do                           {										std::string basic = pidf_namespace + "basic";                              if (xml.getTag() == basic.c_str())                              {                                 if (xml.firstChild())                                 {                                    t.status = (xml.getValue() == "open");                                    xml.parent();                                 }                              }                           } while (xml.nextSibling());                           xml.parent();                        }                     }							else if (xml.getTag() == contact.c_str())                     {                        XMLCursor::AttributeMap::const_iterator i = xml.getAttributes().find("priority");                        if (i != xml.getAttributes().end())                        {                           t.contactPriority.setValue(i->second);                        }                        if (xml.firstChild())                        {                           t.contact = xml.getValue();                           xml.parent();                        }                     }							else if (xml.getTag() == note.c_str())                     {                        if (xml.firstChild())                        {                           t.note = xml.getValue();                           xml.parent();                        }                     }							else if (xml.getTag() == timestamp.c_str())                     {                        if (xml.firstChild())                        {                           t.timeStamp = xml.getValue();                           xml.parent();                        }                     }                  } while (xml.nextSibling());                  xml.parent();               }                              mTuples.push_back(t);            }         } while (xml.nextSibling());         xml.parent();      }   }   else   {      DebugLog(<< "no presence tag!");   }}void Pidf::setSimpleId(const Data& id){   checkParsed();   if (mTuples.empty())   {      Tuple t;      mTuples.push_back(t);   }   mTuples[0].id = id;}void Pidf::setSimpleStatus( bool online, const Data& note, const Data& contact ){   checkParsed();   if (mTuples.empty())   {      Tuple t;      mTuples.push_back(t);   }   mTuples[0].status = online;   mTuples[0].contact = contact;   mTuples[0].contactPriority = 1000;  // 1.0   mTuples[0].note = note;   mTuples[0].timeStamp = Data::Empty;}bool Pidf::getSimpleStatus(Data* note) const{   checkParsed();   if (!mTuples.empty())   {      if (note)      {         *note = mTuples[0].note;      }         return mTuples[0].status;   }   return false;}void Pidf::merge(const Pidf& other){   vector<Tuple>& tuples = getTuples();   tuples.reserve(tuples.size() + other.getTuples().size());   setEntity(other.mEntity);   for (vector<Tuple>::const_iterator i = other.getTuples().begin();        i != other.getTuples().end(); ++i)   {      bool found = false;      for (vector<Tuple>::iterator j = getTuples().begin();           j != getTuples().end(); ++j)      {         if (i->id == j->id)         {            found = true;            *j = *i;            break;         }      }      if (!found)      {         tuples.push_back(*i);      }   }}std::ostream& resip::operator<<(std::ostream& strm, const Pidf::Tuple& tuple){   strm << "Tuple ["         << " status=" << tuple.status        << " id=" << tuple.id        << " contact=" << tuple.contact        << " attributes=" << Inserter(tuple.attributes);   return strm;}/* ==================================================================== * The Vovida Software License, Version 1.0  *  * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved. *  * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: *  * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. *  * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in *    the documentation and/or other materials provided with the *    distribution. *  * 3. The names "VOCAL", "Vovida Open Communication Application Library", *    and "Vovida Open Communication Application Library (VOCAL)" must *    not be used to endorse or promote products derived from this *    software without prior written permission. For written *    permission, please contact vocal@vovida.org. * * 4. Products derived from this software may not be called "VOCAL", nor *    may "VOCAL" appear in their name, without prior written *    permission of Vovida Networks, Inc. *  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. *  * ==================================================================== *  * This software consists of voluntary contributions made by Vovida * Networks, Inc. and many individuals on behalf of Vovida Networks, * Inc.  For more information on Vovida Networks, Inc., please see * <http://www.vovida.org/>. * */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -