Main Page   Namespace List   Class Hierarchy   Compound List   File List   Compound Members  

jabberoox-vcard.cpp

00001 #include "vCard.h"
00002 #include "XPath.h"
00003 
00004 #include <algorithm>
00005 
00006 using namespace judo;
00007 using namespace jabberoo;
00008 
00009 vCard::vCard(const judo::Element& elem): _elem(elem)
00010 {
00011     _queries[Firstname] = "/vCard/N/GIVEN";
00012     _queries[Middlename] = "/vCard/N/MIDDLE";
00013     _queries[Lastname] = "/vCard/N/FAMILY";
00014     _queries[Fullname] = "/vCard/FN";
00015     _queries[Nickname] = "/vCard/NICKNAME";
00016     _queries[EMail] = "/vCard/EMAIL";
00017     _queries[Birthday] = "/vCard/BDAY";
00018     _queries[Telephone] = "/vCard/TEL";
00019     _queries[URL] = "/vCard/URL";
00020     _queries[Description] = "/vCard/DESC";
00021 }
00022 
00023 vCard::~vCard()
00024 {
00025     for (EntryIter it = _entries.begin(); it != _entries.end(); it++)
00026     {
00027         delete it->second;
00028     }
00029 }
00030 
00031 vCard::Entry& vCard::operator[](vCard::Field field)
00032 {
00033     EntryIter it = _entries.find(field);
00034     if (it == _entries.end())
00035     {
00036         judo::Element* entry_elem = NULL;
00037         // See if there is an old value in the vCard to proxy
00038         XPath::Query query(_queries[field]);
00039         XPath::Value* val = query.execute(&_elem);
00040         if (!val->check())
00041         {
00042             // We need to build it into our node
00043             const XPath::Query::OpList& ops = query.getOps();
00044             entry_elem = &_elem;
00045             for (XPath::Query::OpList::const_iterator it = ops.begin(); 
00046                  it != ops.end(); ++it)
00047             {
00048                 if ((*it)->isType(XPath::Op::OP_NODE))
00049                 {
00050                     std::string name = (*it)->getValue();
00051                     // This really just gets past the first entry
00052                     if (name == entry_elem->getName())
00053                     {
00054                         continue;
00055                     }
00056 
00057                     // See if we have that child
00058                     judo::Element* tmp = entry_elem->findElement(name);
00059                     if (tmp)
00060                     {
00061                         entry_elem = tmp;
00062                     }
00063                     else
00064                     {
00065                         entry_elem = entry_elem->addElement((*it)->getValue());
00066                     }
00067                 }
00068             }
00069         }
00070         else
00071         {
00072             entry_elem = val->getElem();
00073         }
00074 
00075         Entry* entry = new Entry(*entry_elem);
00076         _entries[field] = entry;
00077         return *entry;
00078     }
00079     else
00080     {
00081         return *_entries[field];
00082     }
00083 }
00084 
00085 std::string vCard::toString(void)
00086 {
00087     for(EntryIter it = _entries.begin(); it != _entries.end(); ++it)
00088     {
00089         it->second->update();
00090     }
00091 
00092     return _elem.toString();
00093 }
00094 

Generated on Thu Jul 24 13:31:51 2003 for jabberoo by doxygen1.3-rc3