PTLib
Version 2.10.4
|
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 ///////////////////////////////////////////////////////////////