# vcard.h

Go to the documentation of this file.

    00001 /*
    00002  * vcard.h
    00003  *
    00004  * Class to represent and parse a vCard as per RFC2426
    00005  *
    00006  * Portable Windows Library
    00007  *
    00008  * Copyright (c) 2010 Vox Lucida Pty Ltd
    00009  *
    00010  * The contents of this file are subject to the Mozilla Public License
    00011  * Version 1.0 (the "License"); you may not use this file except in
    00012  * compliance with the License. You may obtain a copy of the License at
    00013  * http://www.mozilla.org/MPL/
    00014  *
    00015  * Software distributed under the License is distributed on an "AS IS"
    00016  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
    00017  * the License for the specific language governing rights and limitations
    00018  * under the License.
    00019  *
    00020  * The Original Code is Portable Tools Library.
    00021  *
    00022  * The Initial Developer of the Original Code is Vox Lucida Pty Ltd
    00023  *
    00024  * Contributor(s): ______________________________________.
    00025  *
    00026  * $Revision: 26015 $
    00027  * $Author: rjongbloed $
    00028  * $Date: 2011-06-14 02:31:10 -0500 (Tue, 14 Jun 2011) $
    00029  */
    00030
    00031 #ifndef PTLIB_VCARD_H
    00032 #define PTLIB_VCARD_H
    00033
    00034 #ifdef P_USE_PRAGMA
    00035 #pragma interface
    00036 #endif
    00037
    00038
    00039 #include <ptclib/url.h>
    00040
    00041
    00044 class PvCard : public PObject
    00045 {
    00046     PCLASSINFO(PvCard, PObject);
    00047
    00048   public:
    00049     PvCard();
    00050
    00051     bool IsValid() const;
    00052
    00053     virtual void PrintOn(
    00054       ostream & strm
    00055     ) const;
    00056     virtual void ReadFrom(
    00057       istream & strm
    00058     );
    00059     bool Parse(
    00060       const PString & str
    00061     );
    00062
    00070     enum Format {
    00071       e_Standard,
    00072       e_XML_XMPP,
    00073       e_XML_RDF,
    00074       e_XML_RFC
    00075     };
    00076     PString AsString(
    00077       Format fmt = e_Standard
    00078     );
    00079
    00081     class Token : public PCaselessString
    00082     {
    00083       public:
    00084         Token(const char * str = NULL) : PCaselessString(str) { Validate(); }
    00085         Token(const PString & str) : PCaselessString(str) { Validate(); }
    00086         Token & operator=(const char * str) { PCaselessString::operator=(str); Validate(); return *this; }
    00087         Token & operator=(const PString & str) { PCaselessString::operator=(str); Validate(); return *this; }
    00088         virtual void PrintOn(ostream & strm) const;
    00089         virtual void ReadFrom(istream & strm);
    00090       private:
    00091         void Validate();
    00092     };
    00093
    00094     class Separator : public PObject
    00095     {
    00096       public:
    00097         Separator(char c = '\0') : m_separator(c) { }
    00098         virtual void PrintOn(ostream & strm) const;
    00099         virtual void ReadFrom(istream & strm);
    00100         bool operator==(char c) const { return m_separator == c; }
    00101         bool operator!=(char c) const { return m_separator != c; }
    00102         char m_separator;
    00103     };
    00104
    00106     class ParamValue : public PString
    00107     {
    00108       public:
    00109         ParamValue(const char * str = NULL) : PString(str) { }
    00110         ParamValue(const PString & str) : PString(str) { }
    00111         virtual void PrintOn(ostream & strm) const;
    00112         virtual void ReadFrom(istream & strm);
    00113     };
    00115     class ParamValues : public PArray<ParamValue>
    00116     {
    00117       public:
    00118         virtual void PrintOn(ostream & strm) const;
    00119         virtual void ReadFrom(istream & strm);
    00120     };
    00121
    00122     typedef std::map<Token, ParamValues> ParamMap;
    00123
    00124     class TypeValues : public ParamValues
    00125     {
    00126       public:
    00127         TypeValues() { }
    00128         TypeValues(const ParamValues & values) : ParamValues(values) { }
    00129         virtual void PrintOn(ostream & strm) const;
    00130     };
    00131
    00133     class TextValue : public PString
    00134     {
    00135       public:
    00136         TextValue(const char * str = NULL) : PString(str) { }
    00137         TextValue(const PString & str) : PString(str) { }
    00138         virtual void PrintOn(ostream & strm) const;
    00139         virtual void ReadFrom(istream & strm);
    00140     };
    00141
    00143     class TextValues : public PArray<TextValue>
    00144     {
    00145       public:
    00146         virtual void PrintOn(ostream & strm) const;
    00147         virtual void ReadFrom(istream & strm);
    00148     };
    00149
    00150     class URIValue : public PURL
    00151     {
    00152       public:
    00153         URIValue(const char * str = NULL) : PURL(str) { }
    00154         URIValue(const PString & str) : PURL(str) { }
    00155         virtual void PrintOn(ostream & strm) const;
    00156         virtual void ReadFrom(istream & strm);
    00157     };
    00158
    00160     class InlineValue : public URIValue
    00161     {
    00162       public:
    00163         InlineValue(const char * str = NULL) : URIValue(str), m_params(NULL) { }
    00164         InlineValue(const PString & str) : URIValue(str), m_params(NULL) { }
    00165         virtual void PrintOn(ostream & strm) const;
    00166         virtual void ReadFrom(istream & strm);
    00167         InlineValue & ReadFromParam(const ParamMap & params);
    00168       private:
    00169         const ParamMap * m_params;
    00170     };
    00171
    00172     Token       m_group;
    00173     TextValue   m_fullName; // Mandatory
    00174     TextValue   m_version;  // Mandatory
    00175
    00176     TextValue   m_familyName;
    00177     TextValue   m_givenName;
    00178     TextValues  m_additionalNames;
    00179     TextValue   m_honorificPrefixes;
    00180     TextValue   m_honorificSuffixes;
    00181     TextValues  m_nickNames;
    00182     TextValue   m_sortString; // Form of name for sorting, e.g. family name;
    00183
    00184     PTime       m_birthday;
    00185     URIValue    m_url;
    00186     InlineValue m_photo;   // Possibly embedded via data: scheme
    00187     InlineValue m_sound;   // Possibly embedded via data: scheme
    00188     TextValue   m_timeZone;
    00189     double      m_latitude;
    00190     double      m_longitude;
    00191
    00192     TextValue   m_title;
    00193     TextValue   m_role;
    00194     InlineValue m_logo;   // Possibly embedded via data: scheme
    00195     TextValue   m_agent;
    00196     TextValue   m_organisationName;
    00197     TextValue   m_organisationUnit;
    00198
    00199     TextValue   m_mailer;
    00200     TextValues  m_categories;
    00201     TextValue   m_note;
    00202
    00203     TextValue   m_productId;
    00204     TextValue   m_guid;
    00205     TextValue   m_revision;
    00206     TextValue   m_class;
    00207     TextValue   m_publicKey;
    00208
    00209     struct MultiValue : public PObject {
    00210       MultiValue() { }
    00211       MultiValue(const PString & type) { m_types.Append(new ParamValue(type)); }
    00212
    00213       TypeValues m_types;     // e.g. "home", "work", "pref" etc
    00214       void SetTypes(const ParamMap & params);
    00215     };
    00216
    00217     struct Address : public MultiValue {
    00218       Address(bool label = false) : m_label(label) { }
    00219       virtual void PrintOn(ostream & strm) const;
    00220       virtual void ReadFrom(istream & strm);
    00221
    00222       bool        m_label;
    00223       TextValue   m_postOfficeBox;
    00224       TextValue   m_extendedAddress;
    00225       TextValue   m_street;    // Including number "123 Main Street"
    00226       TextValue   m_locality;  // Suburb/city
    00227       TextValue   m_region;    // State/province
    00228       TextValue   m_postCode;
    00229       TextValue   m_country;
    00230     };
    00231     PArray<Address> m_addresses;
    00232     PArray<Address> m_labels;
    00233
    00234     struct Telephone : public MultiValue {
    00235       Telephone() { }
    00236       Telephone(const PString & number, const PString & type = PString::Empty())
    00237         : MultiValue(type)
    00238         , m_number(number)
    00239       { }
    00240       virtual void PrintOn(ostream & strm) const;
    00241
    00242       TextValue m_number;
    00243     };
    00244     PArray<Telephone> m_telephoneNumbers;
    00245
    00246     struct EMail : public MultiValue {
    00247       EMail() { }
    00248       EMail(const PString & address, const PString & type = PString::Empty())
    00249         : MultiValue(type)
    00250         , m_address(address)
    00251       { }
    00252       virtual void PrintOn(ostream & strm) const;
    00253       TextValue   m_address;
    00254     };
    00255     PArray<EMail> m_emailAddresses;
    00256
    00257     struct ExtendedType {
    00258       ParamMap  m_parameters;
    00259       TextValue m_value;
    00260     };
    00261
    00262     typedef std::map<Token, ExtendedType> ExtendedTypeMap;
    00263     ExtendedTypeMap m_extensions;
    00264 };
    00265
    00266
    00267 #endif  // PTLIB_VCARD_H
    00268
    00269
    00270 // End of File ///////////////////////////////////////////////////////////////