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
00038 XPath::Query query(_queries[field]);
00039 XPath::Value* val = query.execute(&_elem);
00040 if (!val->check())
00041 {
00042
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
00052 if (name == entry_elem->getName())
00053 {
00054 continue;
00055 }
00056
00057
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