1 // vcard34conv-v3conv.cpp - vCard34Conv Object vCard3 conversion subroutines.
3 // (c) 2012-2015 Xestia Software Development.
5 // This file is part of Xestia Address Book.
7 // Xestia Address Book is free software: you can redistribute it and/or modify
8 // it under the terms of the GNU General Public License as published by the
9 // Free Software Foundation, version 3 of the license.
11 // Xestia Address Book is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License along
17 // with Xestia Address Book. If not, see <http://www.gnu.org/licenses/>
19 #include "vcard34conv.h"
21 #include "../version.h"
22 #include "../common/textprocessing.h"
25 #include <wx/tokenzr.h>
26 #include <wx/datetime.h>
29 bool vCard34Conv::ConvertToV3(wxString Filename, wxString *wxSData){
34 // Load the contact into the contact editor.
37 wxString wxSContactString;
43 // Check if we are using wxWidgets version 2.8 or less and
44 // execute the required command accordingly.
46 #if wxABI_VERSION < 20900
47 ContactFile.Open(Filename.c_str(), wxT("r"));
49 ContactFile.Open(Filename, wxT("r"));
52 if (ContactFile.IsOpened() == FALSE){
58 ContactFile.ReadAll(&wxSContactString, wxConvAuto());
62 std::map<int, wxString> ContactFileLines;
63 std::map<int, wxString>::iterator striter;
65 wxStringTokenizer wSTContactFileLines(wxSContactString, wxT("\r\n"));
67 int ContactLineSeek = 0;
69 while (wSTContactFileLines.HasMoreTokens() == TRUE){
71 ContactLine = wSTContactFileLines.GetNextToken();
72 ContactFileLines.insert(std::make_pair(ContactLineSeek, ContactLine));
79 bool QuoteMode = FALSE;
80 bool PropertyFind = TRUE;
81 bool HasExtraNicknames = FALSE;
82 bool IgnoreGender = FALSE;
83 bool ExtraLineSeek = TRUE;
84 bool BirthdayProcessed = FALSE;
85 bool AnniversaryProcessed = FALSE;
86 bool FNProcessed = FALSE;
87 bool GenderProcessed = FALSE;
88 bool NameProcessed = FALSE;
89 bool KindProcessed = FALSE;
91 bool NicknameFirst = FALSE;
92 bool TitleFirst = FALSE;
93 bool OrganisationFirst = FALSE;
94 bool NoteFirst = FALSE;
95 bool PhotoFirst = FALSE;
96 bool LogoFirst = FALSE;
97 int intExtraNickname = 0;
99 wxString wxSPropertySeg1;
100 wxString wxSPropertySeg2;
101 wxString wxSPropertyNextLine;
102 size_t ContactLineLen = 0;
103 int QuoteBreakPoint = 0;
106 int NicknameCount = 0;
115 int RelatedCount = 0;
120 int CategoryCount = 0;
125 int CalReqAdrCount = 0;
126 int FreeBusyCount = 0;
134 // Setup the version string.
136 strVer.Append(wxT("-//Xestia//Address Book Version "));
137 strVer.Append(wxT(XSDAB_VERSION));
138 strVer.Append(wxT("//KW"));
140 ContactDatav3.AddRaw(wxT("BEGIN"), wxT("VCARD"));
141 ContactDatav3.AddRaw(wxT("VERSION"), wxT("3.0"));
142 ContactDatav3.AddRaw(wxT("PRODID"), strVer);
144 for (std::map<int,wxString>::iterator iter = ContactFileLines.begin();
145 iter != ContactFileLines.end(); ++iter){
147 // Find the colon which splits the start bit from the data part.
149 ContactLine = iter->second;
151 while (ExtraLineSeek == TRUE){
153 // Check if there is extra data on the next line
154 // (indicated by space or tab at the start) and add data.
158 if (iter == ContactFileLines.end()){
165 wxSPropertyNextLine = iter->second;
168 if (wxSPropertyNextLine.Mid(0, 1) == wxT(" ") || wxSPropertyNextLine.Mid(0, 1) == wxT("\t")){
170 wxSPropertyNextLine.Remove(0, 1);
171 ContactLine.Append(wxSPropertyNextLine);
176 ExtraLineSeek = FALSE;
182 ContactLineLen = ContactLine.Len();
184 // Make sure we are not in quotation mode.
185 // Make sure colon does not have \ or \\ before it.
189 for (int i = 0; i <= ContactLineLen; i++){
191 if ((ContactLine.Mid(i, 1) == wxT(";") || ContactLine.Mid(i, 1) == wxT(":")) && PropertyFind == TRUE){
193 PropertyFind = FALSE;
195 } else if (PropertyFind == TRUE){
197 wxSProperty.Append(ContactLine.Mid(i, 1));
201 if (ContactLine.Mid(i, 1) == wxT("\"")){
203 if (QuoteMode == TRUE){
215 if (ContactLine.Mid(i, 1) == wxT(":") && ContactLine.Mid((i - 1), 1) != wxT("\\") && QuoteMode == FALSE){
224 // Split that line at the point into two variables (ignore the colon).
226 wxSPropertySeg1 = ContactLine.Mid(0, QuoteBreakPoint);
227 wxSPropertySeg2 = ContactLine.Mid((QuoteBreakPoint + 1));
229 // Add the data into the contact editor depending on what it is.
231 if (wxSProperty == wxT("FN")){
233 std::map<int, int> SplitPoints;
234 std::map<int, int> SplitLength;
235 std::map<int, int>::iterator SLiter;
236 wxString PropertyData;
237 wxString PropertyName;
238 wxString PropertyValue;
239 wxString PropertyTokens;
240 int intPrevValue = 4;
244 if (FNFirst == FALSE){
246 ContactDatav3.AddRaw(wxT("FN"), wxSPropertySeg2);
248 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
252 ContactDatav3.AddRaw(wxT("X-VCARD4-FN;X-FIRST=TRUE;") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))), wxSPropertySeg2);
259 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
261 ContactDatav3.AddRaw(wxT("X-VCARD4-FN"), wxSPropertySeg2);
265 ContactDatav3.AddRaw(wxT("X-VCARD4-FN;") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))),
272 } else if (wxSProperty == wxT("N") && NameProcessed == FALSE){
274 std::map<int, int> SplitPoints;
275 std::map<int, int> SplitLength;
276 std::map<int, int>::iterator SLiter;
277 wxString PropertyData;
278 wxString PropertyName;
279 wxString PropertyValue;
280 wxString PropertyTokens;
281 int intPrevValue = 3;
285 ContactDatav3.AddRaw(wxT("N"), wxSPropertySeg2);
287 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
293 ContactDatav3.AddRaw(wxT("X-VCARD4-N;") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))), wxT(""));
297 NameProcessed = TRUE;
299 } else if (wxSProperty == wxT("KIND") && KindProcessed == FALSE){
303 std::map<int, int> SplitPoints;
304 std::map<int, int> SplitLength;
305 std::map<int, int>::iterator SLiter;
306 wxString PropertyData;
307 wxString PropertyName;
308 wxString PropertyValue;
309 wxString PropertyTokens;
310 int intPrevValue = 5;
314 ContactDatav3.AddRaw(wxT("X-ADDRESSBOOKSERVER-KIND"), wxSPropertySeg2);
316 KindProcessed = TRUE;
318 } else if (wxSProperty == wxT("MEMBER")){
322 std::map<int, int> SplitPoints;
323 std::map<int, int> SplitLength;
324 std::map<int, int>::iterator SLiter;
325 wxString PropertyData;
326 wxString PropertyName;
327 wxString PropertyValue;
328 wxString PropertyTokens;
329 int intPrevValue = 7;
333 ContactDatav3.AddRaw(wxT("X-ADDRESSBOOKSERVER-MEMBER"), wxSPropertySeg2);
335 } else if (wxSProperty == wxT("NICKNAME")){
337 std::map<int, int> SplitPoints;
338 std::map<int, int> SplitLength;
339 std::map<int, int>::iterator SLiter;
340 wxString PropertyData;
341 wxString PropertyName;
342 wxString PropertyValue;
343 wxString PropertyTokens;
344 int intPrevValue = 10;
348 if (NicknameFirst == FALSE){
350 ContactDatav3.AddRaw(wxT("NICKNAME"), wxSPropertySeg2);
352 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
356 ContactDatav3.AddRaw(wxT("X-VCARD4-NICKNAME;X-FIRST=TRUE;")
357 + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))), wxT(""));
360 NicknameFirst = TRUE;
365 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
367 ContactDatav3.AddRaw(wxT("X-VCARD4-NICKNAME"), wxSPropertySeg2);
371 ContactDatav3.AddRaw(wxT("X-VCARD4-NICKNAME;") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))) + wxT(":"),
379 } else if (wxSProperty == wxT("GENDER") && GenderProcessed == FALSE){
381 // Do PID/ALTID/LANG things.
383 std::map<int, int> SplitPoints;
384 std::map<int, int> SplitLength;
385 std::map<int, int>::iterator SLiter;
386 wxString PropertyData;
387 wxString PropertyName;
388 wxString PropertyValue;
389 wxString PropertyTokens;
390 int intPrevValue = 8;
395 if (wxSPropertySeg2.Mid(1, 1) == wxT(";")){
397 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
399 ContactDatav3.AddRaw(wxT("X-VCARD4-GENDER;X-GENDERTEXT=\"") + wxSPropertySeg2.Mid(2) + wxT("\""), wxSPropertySeg2.Mid(0, 1));
403 ContactDatav3.AddRaw(wxT("X-VCARD4-GENDER;X-GENDERTEXT=\"") + wxSPropertySeg2.Mid(2) + wxT("\";")
404 + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))),
405 wxSPropertySeg2.Mid(0, 1));
411 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
413 ContactDatav3.AddRaw(wxT("X-VCARD4-GENDER"), wxSPropertySeg2);
417 ContactDatav3.AddRaw(wxT("X-VCARD4-GENDER;") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))), wxSPropertySeg2);
423 GenderProcessed = TRUE;
425 } else if (wxSProperty == wxT("BDAY") && BirthdayProcessed == FALSE){
427 // Process date. Preserve the remainder in the string.
429 std::map<int, int> SplitPoints;
430 std::map<int, int> SplitLength;
431 std::map<int, int>::iterator SLiter;
432 wxString PropertyData;
433 wxString PropertyName;
434 wxString PropertyValue;
435 wxString PropertyTokens;
437 int intPrevValue = 6;
443 // Look for type before continuing.
445 if (wxSPropertySeg2.Mid(0, 2) == wxT("--")){
447 strResults.Append(wxT("1604-"));
450 strResults.Append(wxSPropertySeg2.Mid(2, 2) + wxT("-"));
451 strResults.Append(wxSPropertySeg2.Mid(4, 2));
455 strResults.Append(wxSPropertySeg2.Mid(0, 4) + wxT("-"));
456 strResults.Append(wxSPropertySeg2.Mid(4, 2) + wxT("-"));
457 strResults.Append(wxSPropertySeg2.Mid(6, 2));
465 ContactDatav3.AddRaw(wxT("BDAY;X-APPLE-OMIT-YEAR=1604"), strResults);
467 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
469 ContactDatav3.AddRaw(wxT("X-VCARD4-BDAY"), wxSPropertySeg2);
473 ContactDatav3.AddRaw(wxT("X-VCARD4-BDAY;") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))), wxSPropertySeg2);
479 ContactDatav3.AddRaw(wxT("BDAY"), strResults);
481 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
483 ContactDatav3.AddRaw(wxT("X-VCARD4-BDAY"), wxSPropertySeg2);
487 ContactDatav3.AddRaw(wxT("X-VCARD4-BDAY;") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))), wxSPropertySeg2);
493 BirthdayProcessed = TRUE;
495 } else if (wxSProperty == wxT("ANNIVERSARY") && AnniversaryProcessed == FALSE){
497 // Process date. Preserve the remainder in the string.
499 std::map<int, int> SplitPoints;
500 std::map<int, int> SplitLength;
501 std::map<int, int>::iterator SLiter;
502 wxString PropertyData;
503 wxString PropertyName;
504 wxString PropertyValue;
505 wxString PropertyTokens;
506 int intPrevValue = 13;
513 // Look for type before continuing.
515 if (wxSPropertySeg2.Mid(0, 2) == wxT("--")){
517 strResults.Append(wxT("1604-"));
520 strResults.Append(wxSPropertySeg2.Mid(2, 2) + wxT("-"));
521 strResults.Append(wxSPropertySeg2.Mid(4, 2));
525 strResults.Append(wxSPropertySeg2.Mid(0, 4) + wxT("-"));
526 strResults.Append(wxSPropertySeg2.Mid(4, 2) + wxT("-"));
527 strResults.Append(wxSPropertySeg2.Mid(6, 2));
533 ContactDatav3.AddRaw(wxT("ANNIVERSARY;X-APPLE-OMIT-YEAR=1604"), strResults);
535 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
537 ContactDatav3.AddRaw(wxT("X-VCARD4-ANNIVERSARY"), wxSPropertySeg2);
541 ContactDatav3.AddRaw(wxT("X-VCARD4-ANNIVERSARY;") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))), wxSPropertySeg2);
547 ContactDatav3.AddRaw(wxT("ANNIVERSARY"), strResults);
549 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
551 ContactDatav3.AddRaw(wxT("X-VCARD4-ANNIVERSARY"), wxSPropertySeg2);
555 ContactDatav3.AddRaw(wxT("X-VCARD4-ANNIVERSARY;") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))), wxSPropertySeg2);
561 AnniversaryProcessed = TRUE;
563 } else if (wxSProperty == wxT("TZ")){
565 std::map<int, int> SplitPoints;
566 std::map<int, int> SplitLength;
567 std::map<int, int>::iterator SLiter;
568 wxString PropertyData;
569 wxString PropertyName;
570 wxString PropertyValue;
571 wxString PropertyTokens;
572 int intPrevValue = 4;
576 // Look for type before continuing.
578 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
580 ContactDatav3.AddRaw(wxT("X-VCARD4-TZ"), wxSPropertySeg2);
584 ContactDatav3.AddRaw(wxT("X-VCARD4-TZ;") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))), wxSPropertySeg2);
588 } else if (wxSProperty == wxT("ADR")){
590 std::map<int, int> SplitPoints;
591 std::map<int, int> SplitLength;
592 std::map<int, int>::iterator SLiter;
593 wxString PropertyData;
594 wxString PropertyName;
595 wxString PropertyValue;
596 wxString PropertyTokens;
597 wxString AddressLabel;
598 wxString AddressLang;
599 wxString AddressAltID;
601 wxString AddressTokens;
603 wxString AddressTimezone;
604 wxString AddressType;
605 wxString AddressMediatype;
606 wxString AddressPOBox;
607 wxString AddressExtended;
608 wxString AddressStreet;
609 wxString AddressLocality;
610 wxString AddressCity;
611 wxString AddressRegion;
612 wxString AddressPostalCode;
613 wxString AddressCountry;
614 int intPrevValue = 5;
618 // TODO: Check in value for X-ABLabel and use it if it is there.
620 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
622 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".ADR"), wxSPropertySeg2);
623 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".X-ABLabel"), _("Address"));
624 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".X-VCARD4-ADR"), wxSPropertySeg2);
628 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".ADR"), wxSPropertySeg2);
629 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".X-ABLabel"), _("Address"));
630 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".X-VCARD4-ADR;") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))), wxSPropertySeg2);
636 } else if (wxSProperty == wxT("EMAIL")){
638 // TODO: Continue from here! See ADR for good example (Replace initer with intPrevValue).
639 // Remove inserted comma for Extra Tokens in frmContactEditor.cpp
641 std::map<int, int> SplitPoints;
642 std::map<int, int> SplitLength;
643 std::map<int, int>::iterator SLiter;
644 std::map<int, int>::iterator SPoint;
645 wxString PropertyData;
646 wxString PropertyName;
647 wxString PropertyValue;
648 wxString PropertyTokens;
649 wxString AddressLabel;
650 wxString AddressLang;
651 wxString AddressAltID;
653 wxString AddressTokens;
655 wxString AddressTimezone;
656 wxString AddressType;
657 wxString AddressMediatype;
658 wxString AddressPOBox;
659 wxString AddressExtended;
660 wxString AddressStreet;
661 wxString AddressLocality;
662 wxString AddressCity;
663 wxString AddressRegion;
664 wxString AddressPostalCode;
665 wxString AddressCountry;
666 int intPrevValue = 7;
670 // TODO: Check in value for X-ABLabel and use it if it is there.
672 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
674 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".EMAIL"), wxSPropertySeg2);
675 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".X-ABLabel"), _("E-mail Address"));
676 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".X-VCARD4-EMAIL"), wxSPropertySeg2);
680 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".EMAIL"), wxSPropertySeg2);
681 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".X-ABLabel"), _("E-mail Address"));
682 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".X-VCARD4-EMAIL;") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))), wxSPropertySeg2);
688 } else if (wxSProperty == wxT("IMPP")){
690 std::map<int, int> SplitPoints;
691 std::map<int, int> SplitLength;
692 std::map<int, int>::iterator SLiter;
693 std::map<int, int>::iterator SPoint;
694 wxString PropertyData;
695 wxString PropertyName;
696 wxString PropertyValue;
697 wxString PropertyTokens;
699 wxString IMPPAddress;
700 int intPrevValue = 6;
702 SplitValues(&wxSPropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
706 // TODO: Check in value for X-ABLabel and use it if it is there.
708 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
710 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".IMPP"), wxSPropertySeg2);
711 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".X-ABLabel"), _("Instant Message"));
712 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".X-VCARD4-IMPP"), wxSPropertySeg2);
716 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".IMPP"), wxSPropertySeg2);
717 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".X-ABLabel"), _("Instant Message"));
718 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".X-VCARD4-IMPP;") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))), wxSPropertySeg2);
724 } else if (wxSProperty == wxT("TEL")){
726 // Check TEL and make sure it is functioning properly.
728 std::map<int, int> SplitPoints;
729 std::map<int, int> SplitLength;
730 std::map<int, int> TypeSplitPoints;
731 std::map<int, int> TypeSplitLength;
732 std::map<int, int>::iterator SLiter;
733 std::map<int, int>::iterator SPoint;
734 std::map<int, int>::iterator TSLiter;
735 std::map<int, int>::iterator TSPoint;
736 wxString PropertyData;
737 wxString PropertyName;
738 wxString PropertyValue;
739 wxString PropertyTokens;
743 wxString TelTypeDetail;
745 wxString FinalFriendlyString;
746 int intSplitsFound = 0;
747 int intSplitSize = 0;
748 int intPrevValue = 5;
750 int intSplitPoint = 0;
754 SplitValues(&wxSPropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
756 // Look for type before continuing.
758 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
759 intiter != SplitPoints.end(); ++intiter){
761 SLiter = SplitLength.find(intiter->first);
763 PropertyData = wxSPropertySeg1.Mid(intPrevValue, (SLiter->second));
765 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
766 PropertyName = PropertyElement.GetNextToken();
767 PropertyValue = PropertyElement.GetNextToken();
769 intPrevValue = intiter->second;
771 if (PropertyName == wxT("TYPE")){
773 // Process each value in type and translate each
776 // Strip out the quotes if they are there.
778 size_t intPropertyValueLen = PropertyValue.Len();
780 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
782 PropertyValue.Trim();
783 PropertyValue.RemoveLast();
787 if (PropertyValue.Mid(0, 1) == wxT("\"")){
789 PropertyValue.Remove(0, 1);
793 TelTypeDetail = PropertyValue;
799 for (int i = 0; i <= intPropertyValueLen; i++){
803 if (PropertyValue.Mid(i, 1) == wxT(",") && PropertyValue.Mid((i - 1), 1) != wxT("\\")){
805 if (intSplitsFound == 0){
807 TypeSplitPoints.insert(std::make_pair(intSplitsFound, intSplitPoint));
808 TypeSplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
812 TypeSplitPoints.insert(std::make_pair(intSplitsFound, intSplitPoint));
813 TypeSplitLength.insert(std::make_pair(intSplitsFound, intSplitSize));
826 TypeSplitPoints.insert(std::make_pair(intSplitsFound, intSplitPoint));
827 TypeSplitLength.insert(std::make_pair(intSplitsFound, intSplitSize));
831 for (std::map<int, int>::iterator typeiter = TypeSplitPoints.begin();
832 typeiter != TypeSplitPoints.end(); ++typeiter){
834 wxString TypePropertyName;
836 TSLiter = TypeSplitLength.find(typeiter->first);
838 TypePropertyName = PropertyValue.Mid(typeiter->second, TSLiter->second);
840 if (intTypeSeek == 0){
845 TelTypeUI.Append(wxT(","));
849 if (TypePropertyName == wxT("home")){
853 } else if (TypePropertyName == wxT("work")){
859 if (TypePropertyName == wxT("text")){
861 if (!FinalFriendlyString.IsEmpty()){ FinalFriendlyString.Append(_(", Text")); } else { FinalFriendlyString.Append(_("Text")); }
863 TelTypeOut.Append(wxT(";"));
864 TelTypeOut.Append(wxT("type=TEXT"));
866 } else if (TypePropertyName == wxT("voice")){
868 if (!FinalFriendlyString.IsEmpty()){ FinalFriendlyString.Append(_(", Voice")); } else { FinalFriendlyString.Append(_("Voice")); }
870 TelTypeOut.Append(wxT(";"));
871 TelTypeOut.Append(wxT("type=VOICE"));
875 } else if (TypePropertyName == wxT("fax")){
877 if (!FinalFriendlyString.IsEmpty()){ FinalFriendlyString.Append(_(", Fax")); } else { FinalFriendlyString.Append(_("Fax")); }
879 TelTypeOut.Append(wxT(";"));
880 TelTypeOut.Append(wxT("type=FAX"));
883 } else if (TypePropertyName == wxT("cell")){
885 if (!FinalFriendlyString.IsEmpty()){ FinalFriendlyString.Append(_(", Mobile")); } else { FinalFriendlyString.Append(_("Mobile")); }
887 TelTypeOut.Append(wxT(";"));
888 TelTypeOut.Append(wxT("type=CELL"));
891 } else if (TypePropertyName == wxT("video")){
893 if (!FinalFriendlyString.IsEmpty()){ FinalFriendlyString.Append(_(", Video")); } else { FinalFriendlyString.Append(_("Video")); }
895 TelTypeOut.Append(wxT(";"));
896 TelTypeOut.Append(wxT("type=VIDEO"));
899 } else if (TypePropertyName == wxT("pager")){
901 if (!FinalFriendlyString.IsEmpty()){ FinalFriendlyString.Append(_(", Pager")); } else { FinalFriendlyString.Append(_("Pager")); }
903 TelTypeOut.Append(wxT(";"));
904 TelTypeOut.Append(wxT("type=PAGER"));
907 } else if (TypePropertyName == wxT("textphone")){
909 if (!FinalFriendlyString.IsEmpty()){ FinalFriendlyString.Append(_(", Textphone")); } else { FinalFriendlyString.Append(_("Textphone")); }
911 TelTypeOut.Append(wxT(";"));
912 TelTypeOut.Append(wxT("type=TEXTPHONE"));
929 // Remove 'tel:' if it is being used.
931 if (wxSPropertySeg2.Mid(0, 4) == wxT("tel:")){
933 FinalTel = wxSPropertySeg2.Mid(4);
937 FinalTel = wxSPropertySeg2;
941 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
943 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".TEL") + TelTypeOut, FinalTel);
944 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".X-ABLabel"), FinalFriendlyString);
945 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".X-VCARD4-TEL"), wxSPropertySeg2);
949 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".TEL") + TelTypeOut, FinalTel);
950 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".X-ABLabel"), FinalFriendlyString);
951 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".X-VCARD4-TEL;") + wxSPropertySeg1.Mid(4), wxSPropertySeg2);
957 } else if (wxSProperty == wxT("LANG")){
959 std::map<int, int> SplitPoints;
960 std::map<int, int> SplitLength;
961 std::map<int, int>::iterator SLiter;
962 wxString PropertyData;
963 wxString PropertyName;
964 wxString PropertyValue;
965 wxString PropertyTokens;
966 int intPrevValue = 6;
970 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
972 ContactDatav3.AddRaw(wxT("X-VCARD4-LANG"), wxSPropertySeg2);
976 ContactDatav3.AddRaw(wxT("X-VCARD4-LANG;") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))), wxSPropertySeg2);
980 } else if (wxSProperty == wxT("GEO")){
982 std::map<int, int> SplitPoints;
983 std::map<int, int> SplitLength;
984 std::map<int, int>::iterator SLiter;
985 wxString PropertyData;
986 wxString PropertyName;
987 wxString PropertyValue;
988 wxString PropertyTokens;
991 int intPrevValue = 5;
995 SplitValues(&wxSPropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
997 wxString strFinalGeoValue;
998 wxString strFinalType;
1000 if (wxSPropertySeg2.Mid(0, 3) == wxT("geo")){
1002 strFinalGeoValue = wxSPropertySeg2.Mid(5);
1003 strFinalType = wxT("geo");
1007 wxStringTokenizer wSTSplit(wxSPropertySeg2, wxT(":"));
1008 strFinalType = wSTSplit.GetNextToken();
1009 strFinalGeoValue = wSTSplit.GetNextToken();
1013 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
1015 ContactDatav3.AddRaw(wxT("X-VCARD4-GEO;X-GEOTYPE=") + strFinalType, wxSPropertySeg2);
1019 ContactDatav3.AddRaw(wxT("X-VCARD4-GEO;X-GEOTYPE=") + strFinalType + wxT(";") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))), wxSPropertySeg2);
1023 } else if (wxSProperty == wxT("RELATED")){
1025 std::map<int, int> SplitPoints;
1026 std::map<int, int> SplitLength;
1027 std::map<int, int>::iterator SLiter;
1028 wxString PropertyData;
1029 wxString PropertyName;
1030 wxString PropertyValue;
1031 wxString PropertyTokens;
1032 wxString RelatedType;
1033 wxString RelatedTypeOriginal;
1034 wxString RelatedName;
1035 bool FirstToken = TRUE;
1036 int intPrevValue = 9;
1040 SplitValues(&wxSPropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
1044 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
1045 intiter != SplitPoints.end(); ++intiter){
1047 SLiter = SplitLength.find(intiter->first);
1049 PropertyData = wxSPropertySeg1.Mid(intPrevValue, (SLiter->second - 1));
1051 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
1052 PropertyName = PropertyElement.GetNextToken();
1053 PropertyValue = PropertyElement.GetNextToken();
1055 if (PropertyName == wxT("TYPE") && FirstToken == TRUE){
1057 if (PropertyValue == wxT("contact")){
1059 strDetail = _("Contact");
1061 } else if (PropertyValue == wxT("acquaintance")){
1063 strDetail = _("Acquaintance");
1065 } else if (PropertyValue == wxT("friend")){
1067 strDetail = _("Friend");
1069 } else if (PropertyValue == wxT("met")){
1071 strDetail = _("Met");
1073 } else if (PropertyValue == wxT("co-worker")){
1075 strDetail = _("Co-worker");
1077 } else if (PropertyValue == wxT("colleague")){
1079 strDetail = _("Colleague");
1081 } else if (PropertyValue == wxT("co-resident")){
1083 strDetail = _("Co-resident");
1085 } else if (PropertyValue == wxT("neighbor")){
1087 strDetail = _("Neighbour");
1089 } else if (PropertyValue == wxT("child")){
1091 strDetail = _("Child");
1093 } else if (PropertyValue == wxT("parent")){
1095 strDetail = _("Parent");
1097 } else if (PropertyValue == wxT("sibling")){
1099 strDetail = _("Sibling");
1101 } else if (PropertyValue == wxT("spouse")){
1103 strDetail = _("Spouse");
1105 } else if (PropertyValue == wxT("kin")){
1107 strDetail = _("Kin");
1109 } else if (PropertyValue == wxT("muse")){
1111 strDetail = _("Muse");
1113 } else if (PropertyValue == wxT("crush")){
1115 strDetail = _("Crush");
1117 } else if (PropertyValue == wxT("date")){
1119 strDetail = _("Date");
1121 } else if (PropertyValue == wxT("sweetheart")){
1123 strDetail = _("Sweetheart");
1125 } else if (PropertyValue == wxT("me")){
1127 strDetail = _("Me");
1129 } else if (PropertyValue == wxT("agent")){
1131 strDetail = _("Agent");
1133 } else if (PropertyValue == wxT("emergency")){
1135 strDetail = _("Emergency");
1139 strDetail = PropertyValue;
1149 if (strDetail.IsEmpty()){
1151 strDetail = _("Relation");
1155 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
1157 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".X-ABRELATEDNAMES"), wxSPropertySeg2);
1158 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".X-ABLabel"), strDetail);
1159 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".X-VCARD4-RELATED"), wxSPropertySeg2);
1163 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".X-ABRELATEDNAMES"), wxSPropertySeg2);
1164 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".X-ABLabel"), strDetail);
1165 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".X-VCARD4-RELATED;") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))), wxSPropertySeg2);
1171 } else if (wxSProperty == wxT("URL")){
1173 std::map<int, int> SplitPoints;
1174 std::map<int, int> SplitLength;
1175 std::map<int, int>::iterator SLiter;
1176 wxString PropertyData;
1177 wxString PropertyName;
1178 wxString PropertyValue;
1179 wxString PropertyTokens;
1180 int intPrevValue = 5;
1184 // Todo: Check for X-ABLabel.
1186 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
1188 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".URL"), wxSPropertySeg2);
1189 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".X-ABLabel"), _("URL"));
1190 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".X-VCARD4-URL"), wxSPropertySeg2);
1194 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".URL"), wxSPropertySeg2);
1195 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".X-ABLabel"), _("URL"));
1196 ContactDatav3.AddRaw(wxT("item") + wxString::Format(wxT("%i"), ItemSeek) + wxT(".X-VCARD4-URL;") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))), wxSPropertySeg2);
1202 } else if (wxSProperty == wxT("TITLE")) {
1204 std::map<int, int> SplitPoints;
1205 std::map<int, int> SplitLength;
1206 std::map<int, int>::iterator SLiter;
1207 wxString PropertyData;
1208 wxString PropertyName;
1209 wxString PropertyValue;
1210 wxString PropertyTokens;
1211 int intPrevValue = 7;
1215 // Look for type before continuing.
1217 if (TitleFirst == FALSE){
1219 ContactDatav3.AddRaw(wxT("TITLE"), wxSPropertySeg2);
1221 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
1225 ContactDatav3.AddRaw(wxT("X-VCARD4-TITLE;X-FIRST=TRUE;")
1226 + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))), wxT(""));
1234 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
1236 ContactDatav3.AddRaw(wxT("X-VCARD4-TITLE"), wxSPropertySeg2);
1240 ContactDatav3.AddRaw(wxT("X-VCARD4-TITLE;") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))) + wxT(":"),
1247 } else if (wxSProperty == wxT("ROLE")) {
1249 std::map<int, int> SplitPoints;
1250 std::map<int, int> SplitLength;
1251 std::map<int, int>::iterator SLiter;
1252 wxString PropertyData;
1253 wxString PropertyName;
1254 wxString PropertyValue;
1255 wxString PropertyTokens;
1256 int intPrevValue = 6;
1260 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
1262 ContactDatav3.AddRaw(wxT("X-VCARD4-ROLE"), wxSPropertySeg2);
1266 ContactDatav3.AddRaw(wxT("X-VCARD4-ROLE;") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))), wxSPropertySeg2);
1270 } else if (wxSProperty == wxT("ORG")) {
1272 std::map<int, int> SplitPoints;
1273 std::map<int, int> SplitLength;
1274 std::map<int, int>::iterator SLiter;
1275 wxString PropertyData;
1276 wxString PropertyName;
1277 wxString PropertyValue;
1278 wxString PropertyTokens;
1279 int intPrevValue = 5;
1283 if (OrganisationFirst == FALSE){
1285 ContactDatav3.AddRaw(wxT("ORG"), wxSPropertySeg2);
1287 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
1291 ContactDatav3.AddRaw(wxT("X-VCARD4-ORG;X-FIRST=TRUE;")
1292 + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))), wxT(""));
1295 OrganisationFirst = TRUE;
1300 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
1302 ContactDatav3.AddRaw(wxT("X-VCARD4-ORG"), wxSPropertySeg2);
1306 ContactDatav3.AddRaw(wxT("X-VCARD4-ORG;") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))) + wxT(":"),
1313 } else if (wxSProperty == wxT("NOTE")) {
1315 std::map<int, int> SplitPoints;
1316 std::map<int, int> SplitLength;
1317 std::map<int, int>::iterator SLiter;
1318 wxString PropertyData;
1319 wxString PropertyName;
1320 wxString PropertyValue;
1321 wxString PropertyTokens;
1322 int intPrevValue = 6;
1326 if (NoteFirst == FALSE){
1328 ContactDatav3.AddRaw(wxT("NOTE"), wxSPropertySeg2);
1330 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
1334 ContactDatav3.AddRaw(wxT("X-VCARD4-NOTE;X-FIRST=TRUE;")
1335 + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))), wxT(""));
1343 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
1345 ContactDatav3.AddRaw(wxT("X-VCARD4-NOTE"), wxSPropertySeg2);
1349 ContactDatav3.AddRaw(wxT("X-VCARD4-NOTE;") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))) + wxT(":"),
1356 } else if (wxSProperty == wxT("CATEGORIES")) {
1358 std::map<int, int> SplitPoints;
1359 std::map<int, int> SplitLength;
1360 std::map<int, int>::iterator SLiter;
1361 wxString PropertyData;
1362 wxString PropertyName;
1363 wxString PropertyValue;
1364 wxString PropertyTokens;
1365 wxString PropertyType;
1366 int intPrevValue = 12;
1370 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
1372 ContactDatav3.AddRaw(wxT("X-VCARD4-CATEGORIES"), wxSPropertySeg2);
1376 ContactDatav3.AddRaw(wxT("X-VCARD4-CATEGORIES;") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))), wxSPropertySeg2);
1380 } else if (wxSProperty == wxT("PHOTO")) {
1382 size_t intPropertyLen = wxSPropertySeg1.Len();
1383 std::map<int, int> SplitPoints;
1384 std::map<int, int> SplitLength;
1385 std::map<int, int>::iterator SLiter;
1386 wxString PropertyData;
1387 wxString PropertyName;
1388 wxString PropertyValue;
1389 wxString PropertyTokens;
1390 int intSplitsFound = 0;
1391 int intSplitSize = 0;
1392 int intPrevValue = 7;
1394 intPropertyLen = wxSPropertySeg2.Len();
1395 SplitPoints.clear();
1396 SplitLength.clear();
1400 CaptureString(&wxSPropertySeg2, FALSE);
1402 for (int i = 0; i <= intPropertyLen; i++){
1406 if (wxSPropertySeg2.Mid(i, 1) == wxT(";")){
1409 SplitPoints.insert(std::make_pair(intSplitsFound, (i + 1)));
1411 if (intSplitsFound == 6){
1413 SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
1418 SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
1428 wxString wxSPhotoURI;
1429 wxString wxSPhotoMIME;
1430 wxString wxSPhotoEncoding;
1431 wxString wxSPhotoData;
1432 std::string base64enc;
1434 if (intSplitsFound == 0){
1438 std::map<int, int>::iterator striter;
1440 striter = SplitLength.find(1);
1442 wxStringTokenizer wSTDataType(wxSPropertySeg2.Mid(0, striter->second), wxT(":"));
1444 while (wSTDataType.HasMoreTokens() == TRUE){
1446 wxSPhotoURI = wSTDataType.GetNextToken();
1447 wxSPhotoMIME = wSTDataType.GetNextToken();
1452 wxStringTokenizer wSTDataInfo(wxSPropertySeg2.Mid((striter->second + 1)), wxT(","));
1454 while (wSTDataInfo.HasMoreTokens() == TRUE){
1456 wxSPhotoEncoding = wSTDataInfo.GetNextToken();
1457 wxSPhotoData = wSTDataInfo.GetNextToken();
1458 base64enc = wxSPhotoData.mb_str();
1466 if (PhotoFirst == FALSE){
1468 bool PhotoKeepData = FALSE;
1470 wxString wxSPhotoMIMEF;
1472 if (wxSPhotoMIME == wxT("image/png")){
1473 wxSPhotoMIMEF = wxT("PNG");
1474 } else if (wxSPhotoMIME == wxT("image/jpeg")){
1475 wxSPhotoMIMEF = wxT("JPEG");
1476 } else if (wxSPhotoMIME == wxT("image/gif")){
1477 wxSPhotoMIMEF = wxT("GIF");
1478 } else if (wxSPhotoMIME == wxT("image/bmp")){
1479 wxSPhotoMIMEF = wxT("BMP");
1481 wxSPhotoMIMEF = wxT("UNKNOWN");
1482 PhotoKeepData = TRUE;
1485 ContactDatav3.AddRaw(wxT("PHOTO;ENCODING=b;TYPE=") + wxSPhotoMIMEF, wxSPhotoData);
1487 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
1491 if (PhotoKeepData == TRUE){
1493 ContactDatav3.AddRaw(wxT("X-VCARD4-PHOTO;X-FIRST=TRUE;")
1494 + ContactLine.Mid((intPrevValue - 1), ((QuoteBreakPoint + 1) - (intPrevValue))), wxSPropertySeg2);
1498 ContactDatav3.AddRaw(wxT("X-VCARD4-PHOTO;X-FIRST=TRUE;")
1499 + ContactLine.Mid((intPrevValue - 1), ((QuoteBreakPoint + 1) - (intPrevValue))), wxT(""));
1509 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
1511 ContactDatav3.AddRaw(wxT("X-VCARD4-PHOTO"), wxSPropertySeg2);
1515 ContactDatav3.AddRaw(wxT("X-VCARD4-PHOTO;") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))) + wxT(":"),
1521 } else if (wxSProperty == wxT("LOGO")) {
1523 std::map<int, int> SplitPoints;
1524 std::map<int, int> SplitLength;
1525 std::map<int, int>::iterator SLiter;
1526 wxString PropertyData;
1527 wxString PropertyName;
1528 wxString PropertyValue;
1529 wxString PropertyTokens;
1530 int intPrevValue = 6;
1534 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
1536 ContactDatav3.AddRaw(wxT("X-VCARD4-LOGO"), wxSPropertySeg2);
1540 ContactDatav3.AddRaw(wxT("X-VCARD4-LOGO;") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))), wxSPropertySeg2);
1544 } else if (wxSProperty == wxT("SOUND")) {
1546 std::map<int, int> SplitPoints;
1547 std::map<int, int> SplitLength;
1548 std::map<int, int>::iterator SLiter;
1549 wxString PropertyData;
1550 wxString PropertyName;
1551 wxString PropertyValue;
1552 wxString PropertyTokens;
1553 int intPrevValue = 7;
1557 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
1559 ContactDatav3.AddRaw(wxT("X-VCARD4-SOUND"), wxSPropertySeg2);
1563 ContactDatav3.AddRaw(wxT("X-VCARD4-SOUND;") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))), wxSPropertySeg2);
1567 } else if (wxSProperty == wxT("CALURI")){
1569 std::map<int, int> SplitPoints;
1570 std::map<int, int> SplitLength;
1571 std::map<int, int>::iterator SLiter;
1572 wxString PropertyData;
1573 wxString PropertyName;
1574 wxString PropertyValue;
1575 wxString PropertyTokens;
1576 int intPrevValue = 8;
1580 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
1582 ContactDatav3.AddRaw(wxT("X-VCARD4-CALURI"), wxSPropertySeg2);
1586 ContactDatav3.AddRaw(wxT("X-VCARD4-CALURI;") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))), wxSPropertySeg2);
1590 } else if (wxSProperty == wxT("CALADRURI")){
1592 std::map<int, int> SplitPoints;
1593 std::map<int, int> SplitLength;
1594 std::map<int, int>::iterator SLiter;
1595 wxString PropertyData;
1596 wxString PropertyName;
1597 wxString PropertyValue;
1598 wxString PropertyTokens;
1599 int intPrevValue = 11;
1603 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
1605 ContactDatav3.AddRaw(wxT("X-VCARD4-CALADRURI"), wxSPropertySeg2);
1609 ContactDatav3.AddRaw(wxT("X-VCARD4-CALADRURI;") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))), wxSPropertySeg2);
1613 } else if (wxSProperty == wxT("FBURL")){
1615 std::map<int, int> SplitPoints;
1616 std::map<int, int> SplitLength;
1617 std::map<int, int>::iterator SLiter;
1618 wxString PropertyData;
1619 wxString PropertyName;
1620 wxString PropertyValue;
1621 wxString PropertyTokens;
1622 int intPrevValue = 7;
1626 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
1628 ContactDatav3.AddRaw(wxT("X-VCARD4-FBURL"), wxSPropertySeg2);
1632 ContactDatav3.AddRaw(wxT("X-VCARD4-FBURL;") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))), wxSPropertySeg2);
1636 } else if (wxSProperty == wxT("KEY")){
1638 std::map<int, int> SplitPoints;
1639 std::map<int, int> SplitLength;
1640 std::map<int, int>::iterator SLiter;
1641 wxString PropertyData;
1642 wxString PropertyName;
1643 wxString PropertyValue;
1644 wxString PropertyTokens;
1645 int intPrevValue = 5;
1649 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
1651 ContactDatav3.AddRaw(wxT("X-VCARD4-KEY"), wxSPropertySeg2);
1655 ContactDatav3.AddRaw(wxT("X-VCARD4-KEY;") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))), wxSPropertySeg2);
1659 } else if (wxSProperty == wxT("UID")){
1661 ContactDatav3.AddRaw(wxT("UID"), wxSPropertySeg2);
1663 } else if (wxSProperty.Mid(0, 3) == wxT("VND")){
1665 // Split the Vendor three ways.
1667 wxStringTokenizer wSTVendorDetails(wxSPropertySeg1, wxT("-"));
1670 wxString wxSVNDPropName;
1672 size_t intPrevValue = (wxSProperty.Len() + 1);
1674 while (wSTVendorDetails.HasMoreTokens() == TRUE){
1676 wSTVendorDetails.GetNextToken();
1677 wxSVNDID = wSTVendorDetails.GetNextToken();
1678 wxSVNDPropName = wSTVendorDetails.GetNextToken();
1683 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
1685 ContactDatav3.AddRaw(wxT("X-VCARD4-") + wxSProperty, wxSPropertySeg2);
1689 ContactDatav3.AddRaw(wxT("X-VCARD4-") + wxSProperty + wxT(";") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))), wxSPropertySeg2);
1693 } else if (wxSProperty.Mid(0, 2) == wxT("X-")){
1695 size_t intPrevValue = (wxSProperty.Len() + 1);
1697 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
1699 ContactDatav3.AddRaw(wxSProperty, wxSPropertySeg2);
1703 ContactDatav3.AddRaw(wxSProperty + wxT(";") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))), wxSPropertySeg2);
1707 } else if (wxSProperty.Mid(0, 12) == wxT("CLIENTPIDMAP")){
1709 // Process the Client PID maps.
1711 int intPrevValue = 14;
1715 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
1717 ContactDatav3.AddRaw(wxT("X-VCARD4-CLIENTPIDMAP"), wxSPropertySeg2);
1721 ContactDatav3.AddRaw(wxT("X-VCARD4-CLIENTPIDMAP;") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))), wxSPropertySeg2);
1725 } else if (wxSProperty.Mid(0, 3) == wxT("XML")){
1727 // Process the XML values.
1729 int intPrevValue = 5;
1733 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
1735 ContactDatav3.AddRaw(wxT("X-VCARD4-XML"), wxSPropertySeg2);
1739 ContactDatav3.AddRaw(wxT("X-VCARD4-XML;") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))), wxSPropertySeg2);
1743 } else if (wxSProperty.Mid(0, 6) == wxT("SOURCE")){
1745 // Process the source links.
1747 int intPrevValue = 8;
1751 if (((QuoteBreakPoint + 1) - intPrevValue) <= 0){
1753 ContactDatav3.AddRaw(wxT("X-VCARD4-SOURCE"), wxSPropertySeg2);
1757 ContactDatav3.AddRaw(wxT("X-VCARD4-SOURCE;") + ContactLine.Mid(intPrevValue, ((QuoteBreakPoint + 1) - (intPrevValue + 1))), wxSPropertySeg2);
1763 // Reset the variables.
1766 PropertyFind = TRUE;
1767 ExtraLineSeek = TRUE;
1769 QuoteBreakPoint = 0;
1770 ContactLine.Clear();
1771 wxSProperty.Clear();
1775 ContactDatav3.AddRaw(wxT("END"), wxT("VCARD"));
1776 *wxSData = ContactDatav3.WriteString();