Home | News | Projects | Releases
Bugs | RFE | Repositories | Help
6b80e981077e67113042def4a62487710b9ddebe
[xestiaab/.git] / source / contacteditor / ContactDataObject.cpp
1 // ContactDataObject.cpp - Client Data Object.
2 //
3 // (c) 2012-2015 Xestia Software Development.
4 //
5 // This file is part of Xestia Address Book.
6 //
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.
10 //
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.
15 //
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 "ContactDataObject.h"
21 ContactLoadStatus ContactDataObject::LoadFile(wxString Filename){
22         
23         if (!wxFileExists(Filename)){
24         
25                 return CONTACTLOAD_FILEMISSING;
26         
27         }
28         
29         wxFile ContactFile;
30         
31         if (!ContactFile.Open(Filename, wxFile::read, wxS_DEFAULT)){
32         
33                 return CONTACTLOAD_FILEERROR;
34         
35         }
36         
37         // Check that the vCard is a valid vCard 4.0 file.
39         vCard vCard4FormatCheck;
40         
41         vCard4FormatCheck.LoadFile(Filename);
42         
43         if (vCard4FormatCheck.Get("VERSION") != wxT("4.0")){
44         
45                 return CONTACTLOAD_FILEINVALIDFORMAT;
46         
47         }
49         // Check that the vCard meets the base specification.
50         
51         if (!vCard4FormatCheck.MeetBaseSpecification()){
52         
53                 return CONTACTLOAD_FILEBASESPECFAIL;
54         
55         }
56         
57         wxStringTokenizer wSTContactFileLines(vCard4FormatCheck.WriteString(), wxT("\r\n"));
58         
59         std::map<int, wxString> ContactFileLines;
61         int ContactLineSeek = 0;
63         while (wSTContactFileLines.HasMoreTokens() == TRUE){
65                 wxString ContactLine = wSTContactFileLines.GetNextToken();
66                 ContactFileLines.insert(std::make_pair(ContactLineSeek, ContactLine));
67                 ContactLineSeek++;              
68         
69         }
70         
71         wxString wxSPropertyNextLine;
72         
73         bool ExtraLineSeek = TRUE;
74         bool QuoteMode = FALSE;
75         bool PropertyFind = TRUE;
76         bool KindProcessed = FALSE;
77         bool NameProcessed = FALSE;
78         bool GenderProcessed = FALSE;
79         bool BirthdayProcessed = FALSE;
80         bool AnniversaryProcessed = FALSE;
81         bool UIDProcessed = FALSE;
82         bool RevisionProcessed = FALSE;
83         int ContactLineLen = 0;
84         int QuoteBreakPoint = 0;
85         int SourceCount = 0;
86         int GroupCount = 0;
87         int FNCount = 0;
88         int NicknameCount = 0;
89         int TimeZoneCount = 0;
90         int AddressCount = 0;
91         int EmailCount = 0;
92         int IMCount = 0;
93         int TelephoneCount = 0;
94         int LanguageCount = 0;
95         int GeographicCount = 0;
96         int RelatedCount = 0;
97         int URLCount = 0;
98         int TitleCount = 0;
99         int RoleCount = 0;
100         int OrganisationCount = 0;
101         int NoteCount = 0;
102         int CategoryCount = 0;
103         int PhotoCount = 0;
104         int LogoCount = 0;
105         int SoundCount = 0;
106         int CalendarCount = 0;
107         int CalendarAddressCount = 0;
108         int FreeBusyAddressCount = 0;
109         int KeyCount = 0;
110         int VendorCount = 0;
111         int XTokenCount = 0;
112         int XMLCount = 0;
113         int ClientPIDCount = 0;
114         wxString ContactLine;
115         wxString PropertyLine;
116         wxString PropertySeg1;
117         wxString PropertySeg2;
118         wxString PropertyNextLine;
119         wxString Property;
120         
121         for (std::map<int,wxString>::iterator iter = ContactFileLines.begin(); 
122          iter != ContactFileLines.end(); ++iter){
124                 ExtraLineSeek = TRUE;
125                 QuoteMode = FALSE;
126                 PropertyFind = TRUE;
127                 ContactLineLen = 0;
128                 QuoteBreakPoint = 0;
129                 ContactLine.Clear();
130                 PropertyLine.Clear();
131                 PropertySeg1.Clear();
132                 PropertySeg2.Clear();
133                 Property.Clear();
134          
135                 ContactLine = iter->second;
136                 
137                 while (ExtraLineSeek == TRUE){
138                 
139                         // Check if there is extra data on the next line 
140                         // (indicated by space or tab at the start) and add data.
141                 
142                         iter++;
143                         
144                         if (iter == ContactFileLines.end()){
145                         
146                                 iter--;
147                                 break;
148                         
149                         }                       
150                 
151                         PropertyNextLine = iter->second;
152                 
153                         if (PropertyNextLine.Mid(0, 1) == wxT(" ") || PropertyNextLine.Mid(0, 1) == wxT("\t")){
154                 
155                                 PropertyNextLine.Remove(0, 1);
156                                 ContactLine.Append(PropertyNextLine);
157                 
158                         } else {
159                         
160                                 iter--;
161                                 ExtraLineSeek = FALSE;
162                         
163                         }
164                 
165                 }
167                 ContactLineLen = ContactLine.Len();
168                 
169                 // Make sure we are not in quotation mode.
170                 // Make sure colon does not have \ or \\ before it.
171                 
172                 for (int i = 0; i <= ContactLineLen; i++){
173                 
174                         if ((ContactLine.Mid(i, 1) == wxT(";") || ContactLine.Mid(i, 1) == wxT(":")) && PropertyFind == TRUE){
175                         
176                                 PropertyFind = FALSE;
177                         
178                         } else if (PropertyFind == TRUE){
179                         
180                                 Property.Append(ContactLine.Mid(i, 1));
181                         
182                         }               
183                 
184                         if (ContactLine.Mid(i, 1) == wxT("\"")){
185                         
186                                 if (QuoteMode == TRUE){
187                                 
188                                         QuoteMode = FALSE;
189                                 
190                                 } else {
191                         
192                                         QuoteMode = TRUE;
193                                         
194                                 }
195                         
196                         }
197                         
198                         if (ContactLine.Mid(i, 1) == wxT(":") && ContactLine.Mid((i - 1), 1) != wxT("\\") && QuoteMode == FALSE){
199                         
200                                 QuoteBreakPoint = i;
201                                 break;
202                         
203                         }
204                 
205                 }
206                 
207                 // Split that line at the point into two variables (ignore the colon).
208                 
209                 PropertySeg1 = ContactLine.Mid(0, QuoteBreakPoint);
210                 PropertySeg2 = ContactLine.Mid((QuoteBreakPoint + 1));
211                 
212                  if (Property == wxT("KIND") && KindProcessed == FALSE){
213                                 
214                         ProcessKind(PropertySeg2);
215                 
216                 } else if (Property == wxT("UID") && UIDProcessed == FALSE){
217                 
218                         UIDToken = PropertySeg2;
219                         UIDProcessed = TRUE;
220                 
221                 } else if (Property == wxT("SOURCE")){
222                 
223                         ProcessSource(PropertySeg1, PropertySeg2, &SourceCount);
224                         SourceCount++;
225                 
226                 } else if (Property == wxT("XML")){
227                 
228                         ProcessXML(PropertySeg1, PropertySeg2, &XMLCount);
229                         XMLCount++;
230                 
231                 } else if (Property == wxT("REV") && RevisionProcessed == FALSE){
232                 
233                         ProcessRevision(PropertySeg1, PropertySeg2);
234                         RevisionProcessed = TRUE;
235                 
236                 } else if (Property == wxT("MEMBER")){
238                         ProcessMember(PropertySeg1, PropertySeg2, &GroupCount);
239                         GroupCount++;   
240                 
241                 } else if (Property == wxT("FN")){
242                 
243                         ProcessFN(PropertySeg1, PropertySeg2, &FNCount);
244                         FNCount++;
245                 
246                 } else if (Property == wxT("N") && NameProcessed == FALSE){
247                 
248                         ProcessN(PropertySeg1, PropertySeg2);
249                         NameProcessed = TRUE;
250                 
251                 } else if (Property == wxT("CLIENTPIDMAP")){
252                 
253                         ProcessClientPIDMap(PropertySeg1, PropertySeg2, &ClientPIDCount);
254                         ClientPIDCount++;
255                 
256                 } else if (Property == wxT("NICKNAME")){
257                                                 
258                         ProcessNickname(PropertySeg1, PropertySeg2, &NicknameCount);
259                         NicknameCount++;
260                         
261                 } else if (Property == wxT("GENDER") && GenderProcessed == FALSE){
262                 
263                         ProcessGender(PropertySeg1, PropertySeg2);
264                         GenderProcessed = TRUE;
265                 
266                 } else if (Property == wxT("BDAY") && BirthdayProcessed == FALSE){
267                 
268                         ProcessBirthday(PropertySeg1, PropertySeg2);
269                         BirthdayProcessed = TRUE;
270                 
271                 } else if (Property == wxT("ANNIVERSARY") && AnniversaryProcessed == FALSE){
272                 
273                         ProcessAnniversary(PropertySeg1, PropertySeg2);
274                         AnniversaryProcessed = TRUE;
275                 
276                 } else if (Property == wxT("TZ")){
277                 
278                         ProcessTimeZone(PropertySeg1, PropertySeg2, &TimeZoneCount);
279                         TimeZoneCount++;
280                 
281                 } else if (Property == wxT("ADR")){
282                 
283                         ProcessAddress(PropertySeg1, PropertySeg2, &AddressCount);
284                         AddressCount++;
285                 
286                 } else if (Property == wxT("EMAIL")){
287                                         
288                         ProcessEmail(PropertySeg1, PropertySeg2, &EmailCount);  
289                         EmailCount++;
290                 
291                 } else if (Property == wxT("IMPP")){
292                 
293                         ProcessIM(PropertySeg1, PropertySeg2, &IMCount);
294                         IMCount++;
295                         
296                 } else if (Property == wxT("TEL")){
297                                 
298                         ProcessTelephone(PropertySeg1, PropertySeg2, &TelephoneCount);
299                         TelephoneCount++;
300                 
301                 } else if (Property == wxT("LANG")){
302                 
303                         // See frmContactEditor-LoadLanguage.cpp
304                         
305                         ProcessLanguage(PropertySeg1, PropertySeg2, &LanguageCount);
306                         LanguageCount++;
307                 
308                 } else if (Property == wxT("GEO")){
309                 
310                         // See frmContactEditor-LoadGeo.cpp
311                         
312                         ProcessGeographic(PropertySeg1, PropertySeg2, &GeographicCount);        
313                         GeographicCount++;
314                 
315                 } else if (Property == wxT("RELATED")){
316                         
317                         // See fromContactEditor-LoadRelated.cpp
318                         
319                         ProcessRelated(PropertySeg1, PropertySeg2, &RelatedCount);              
320                         RelatedCount++;
321                         
322                 } else if (Property == wxT("URL")){
324                         // See frmContactEditor-LoadURL.cpp
325                 
326                         ProcessURL(PropertySeg1, PropertySeg2, &URLCount);
327                         URLCount++;
328                 
329                 } else if (Property == wxT("TITLE")) {
330                 
331                         // See frmContactEditor-LoadTitle.cpp
332                         
333                         ProcessTitle(PropertySeg1, PropertySeg2, &TitleCount);
334                         TitleCount++;
335                         
336                 } else if (Property == wxT("ROLE")) {
337                 
338                         // See frmContactEditor-LoadTitle.cpp
339                         
340                         ProcessRole(PropertySeg1, PropertySeg2, &RoleCount);
341                         RoleCount++;
342                         
343                 } else if (Property == wxT("ORG")) {
344                 
345                         // See frmContactEditor-LoadOrg.cpp
346                         
347                         ProcessOrganisation(PropertySeg1, PropertySeg2, &OrganisationCount);
348                         OrganisationCount++;
349                         
350                 } else if (Property == wxT("NOTE")) {
352                         // See frmContactEditor-LoadNote.cpp
354                         ProcessNote(PropertySeg1, PropertySeg2, &NoteCount);
355                         NoteCount++;    
356                         
357                 } else if (Property == wxT("CATEGORIES")) {
358                 
359                         // See frmContactEditor-LoadCategory.cpp
360                 
361                         ProcessCategory(PropertySeg1, PropertySeg2, &CategoryCount);    
362                         CategoryCount++;
363                         
364                 } else if (Property == wxT("PHOTO")) {
365                 
366                         // See frmContactEditor-LoadPhoto.cpp
367                         
368                         ProcessPhoto(PropertySeg1, PropertySeg2, &PhotoCount);
369                         PhotoCount++;
371                 } else if (Property == wxT("LOGO")) {
372                 
373                         // See frmContactEditor-LoadPhoto.cpp
374                         
375                         ProcessLogo(PropertySeg1, PropertySeg2, &LogoCount);
376                         LogoCount++;
378                 } else if (Property == wxT("LOGO")) {
379                 
380                         // See frmContactEditor-LoadPhoto.cpp
381                         
382                         ProcessLogo(PropertySeg1, PropertySeg2, &LogoCount);
383                         LogoCount++;
385                 } else if (Property == wxT("SOUND")) {
386                 
387                         // See frmContactEditor-LoadSound.cpp
388                         
389                         ProcessSound(PropertySeg1, PropertySeg2, &SoundCount);
390                         SoundCount++;
391                         
392                 } else if (Property == wxT("CALURI")){
394                         // See frmContactEditor-LoadCalendar.cpp
395                         
396                         ProcessCalendarURI(PropertySeg1, PropertySeg2, &CalendarCount);
397                         CalendarCount++;
398                 
399                 } else if (Property == wxT("CALADRURI")){
400                 
401                         ProcessCalendarAddressURI(PropertySeg1, PropertySeg2, &CalendarAddressCount);
402                         CalendarAddressCount++;
403                 
404                 } else if (Property == wxT("FBURL")){
406                         // See frmContactEditor-LoadCalendar.cpp
408                         ProcessCalendarFreeBusy(PropertySeg1, PropertySeg2, &FreeBusyAddressCount);
409                         FreeBusyAddressCount++;
411                 } else if (Property == wxT("KEY")){
412                 
413                         // See frmContactEditor-LoadKey.cpp
414                         
415                         ProcessKey(PropertySeg1, PropertySeg2, &KeyCount);
416                         KeyCount++;
417                 
418                 } else if (Property.Mid(0, 3) == wxT("VND")){
419                 
420                         ProcessVendor(PropertySeg1, PropertySeg2, &VendorCount);
421                         VendorCount++;
422                 
423                 } else if (Property.Mid(0, 2) == wxT("X-")){
424                         
425                         XTokenList.insert(std::make_pair(XTokenCount, PropertySeg2));
426                         XTokenListTokens.insert(std::make_pair(XTokenCount, PropertySeg1.Mid(2)));
427                         XTokenCount++;
428                 
429                 }
430                 
431         }
432         
433         return CONTACTLOAD_OK;
437 void ContactDataObject::ProcessKind(wxString KindType){
439         if (KindType == wxT("individual")){
440                         
441                 ContactKind = CONTACTKIND_INDIVIDUAL;
442                         
443         } else if (KindType == wxT("group")){
444                         
445                 ContactKind = CONTACTKIND_GROUP;
446                         
447         } else if (KindType == wxT("org")){
448                         
449                 ContactKind = CONTACTKIND_ORGANISATION;
450                         
451         } else if (KindType == wxT("location")){
452                         
453                 ContactKind = CONTACTKIND_LOCATION;
454                         
455         } else {
456                         
457                 ContactKind = CONTACTKIND_NONE;                 
458         }
462 void ContactDataObject::ProcessRevision(wxString PropertySeg1, wxString PropertySeg2){
464         size_t intPropertyLen = PropertySeg1.Len();
465         std::map<int, int> SplitPoints;
466         std::map<int, int> SplitLength;
467         std::map<int, int>::iterator SLiter;                    
468         wxString PropertyData;
469         wxString PropertyName;
470         wxString PropertyValue;
471         wxString PropertyTokens;
472         bool FirstToken = TRUE;
473         int intSplitsFound = 0;
474         int intSplitSize = 0;
475         int intPrevValue = 5;
476         int intPref = 0;                        
477         int intType = 0;
478         
479         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
480         
481         intPrevValue = 4;
483         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
484         intiter != SplitPoints.end(); ++intiter){
485         
486                 SLiter = SplitLength.find(intiter->first);
487         
488                 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
489                 
490                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
491                 PropertyName = PropertyElement.GetNextToken();                          
492                 PropertyValue = PropertyElement.GetNextToken();
493                 
494                 intPrevValue = intiter->second;
495                 
496                 // Process properties.
497                 
498                 size_t intPropertyValueLen = PropertyValue.Len();
499                 
500                 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
501                         
502                         PropertyValue.Trim();
503                         PropertyValue.RemoveLast();
504                         
505                 }                               
506                 
507                 if (PropertyValue.Mid(0, 1) == wxT("\"")){
508                         
509                         PropertyValue.Remove(0, 1);
510                         
511                 }                       
512                 
513                 CaptureString(&PropertyValue, FALSE);
514                                                                 
515                 if (FirstToken == TRUE){
516                                 
517                         PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
518                         FirstToken = FALSE;
519                                 
520                 } else {
521                                 
522                         PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
523                                 
524                 }
525         
526         }       
527         
528         CaptureString(&PropertySeg2, FALSE);
529         
530         Revision = PropertySeg2;
531         
532         if (!PropertyTokens.IsEmpty()){
533         
534                 RevisionTokens = PropertyTokens;
535         
536         }
541 void ContactDataObject::ProcessSource(wxString PropertySeg1, wxString PropertySeg2, int *SourceCount){
543         size_t intPropertyLen = PropertySeg1.Len();
544         std::map<int, int> SplitPoints;
545         std::map<int, int> SplitLength;
546         std::map<int, int>::iterator SLiter;                    
547         wxString PropertyData;
548         wxString PropertyName;
549         wxString PropertyValue;
550         wxString PropertyTokens;
551         bool FirstToken = TRUE;
552         bool PropertyMatched = FALSE;
553         int intSplitsFound = 0;
554         int intSplitSize = 0;
555         int intPrevValue = 8;
556         int intPref = 0;                        
557         int intType = 0;
558         
559         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
560         
561         intPrevValue = 7;
562         
563         PropertyType PropType = PROPERTY_NONE;
564         
565         // Look for type before continuing.                     
567         CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
569         intPrevValue = 7;
571         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
572         intiter != SplitPoints.end(); ++intiter){
573         
574                 SLiter = SplitLength.find(intiter->first);
575         
576                 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
577                 
578                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
579                 PropertyName = PropertyElement.GetNextToken();                          
580                 PropertyValue = PropertyElement.GetNextToken();
581                 
582                 intPrevValue = intiter->second;
583                 
584                 // Process properties.
585                 
586                 size_t intPropertyValueLen = PropertyValue.Len();
587                 
588                 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
589                         
590                         PropertyValue.Trim();
591                         PropertyValue.RemoveLast();
592                         
593                 }                               
594                 
595                 if (PropertyValue.Mid(0, 1) == wxT("\"")){
596                         
597                         PropertyValue.Remove(0, 1);
598                         
599                 }                       
600                 
601                 CaptureString(&PropertyValue, FALSE);
602                 
603                 ProcessStringValue(&PropertyName, "ALTID", &SourceListAltID, &PropertyValue, SourceCount, &PropertyMatched);
604                 ProcessStringValue(&PropertyName, "PID", &SourceListPID, &PropertyValue, SourceCount, &PropertyMatched);
605                 ProcessStringValue(&PropertyName, "MEDIATYPE", &SourceListMediatype, &PropertyValue, SourceCount, &PropertyMatched);
606                 ProcessIntegerValue(&PropertyName, "PREF", &SourceListPref, &PropertyValue, SourceCount, &PropertyMatched);
607                 
608                 if (PropertyMatched == TRUE){
609                 
610                         PropertyMatched = FALSE;
611                         continue;
612                 
613                 }
614                 
615                 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
616                         
617                         if (FirstToken == TRUE){
618                                 
619                                 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
620                                 FirstToken = FALSE;
621                         
622                         } else {
623                         
624                                 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
625                         
626                         }
627                 
628                 }
629         
630         }       
631         
632         intPropertyLen = PropertySeg2.Len();
633         SplitPoints.clear();
634         SplitLength.clear();
635         intSplitsFound = 0;
636         intSplitSize = 0;
637         intPrevValue = 0;
638         
639         CaptureString(&PropertySeg2, FALSE);
640         
641         // Add the data to the General/Home/Work address variables.
642                 
643         switch(PropType){
644                 case PROPERTY_NONE:
645                         break;
646                 case PROPERTY_HOME:
647                         SourceListType.insert(std::make_pair(*SourceCount, "home"));
648                         break;
649                 case PROPERTY_WORK:
650                         SourceListType.insert(std::make_pair(*SourceCount, "work"));
651                         break;
652         }
653         
654         SourceList.insert(std::make_pair(*SourceCount, PropertySeg2));
655         
656         if (!PropertyTokens.IsEmpty()){
657         
658                 SourceListTokens.insert(std::make_pair(*SourceCount, PropertyTokens));
659         
660         }
664 void ContactDataObject::ProcessXML(wxString PropertySeg1, wxString PropertySeg2, int *XMLCount){
666         std::map<int, int> SplitPoints;
667         std::map<int, int> SplitLength;
669         int intPrevValue = 5;
670         int intPref = 0;                        
671         int intType = 0;
672         
673         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
675         intPrevValue = 4;
676         
677         wxString PropertyName;
678         wxString PropertyValue;
679         wxString PropertyData;
680         wxString PropertyTokens;
681         std::map<int,int>::iterator SLiter;
682         bool FirstToken = TRUE;
683         bool PropertyMatched = FALSE;
684         
685         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
686         intiter != SplitPoints.end(); ++intiter){
687         
688                 SLiter = SplitLength.find(intiter->first);
689         
690                 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
691                 
692                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
693                 PropertyName = PropertyElement.GetNextToken();                          
694                 PropertyValue = PropertyElement.GetNextToken();
695                 
696                 intPrevValue = intiter->second;
697                 
698                 CaptureString(&PropertyValue, FALSE);
699         
700                 ProcessStringValue(&PropertyName, "ALTID", &XMLListAltID, &PropertyValue, XMLCount, &PropertyMatched);
701                 
702                 if (PropertyMatched == TRUE){
703                 
704                         PropertyMatched = FALSE;
705                         continue;
706                 
707                 }
708                 
709         }
711         XMLList.insert(std::make_pair(*XMLCount, PropertySeg2));
715 void ContactDataObject::ProcessMember(wxString PropertySeg1, wxString PropertySeg2, int *GroupCount){
717         std::map<int, int> SplitPoints;
718         std::map<int, int> SplitLength;
720         int intPrevValue = 8;
721         int intPref = 0;                        
722         int intType = 0;
723         
724         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
726         intPrevValue = 7;
727         
728         wxString PropertyName;
729         wxString PropertyValue;
730         wxString PropertyData;
731         wxString PropertyTokens;
732         std::map<int,int>::iterator SLiter;
733         bool FirstToken = TRUE;
734         bool PropertyMatched = FALSE;
735         
736         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
737         intiter != SplitPoints.end(); ++intiter){
738         
739                 SLiter = SplitLength.find(intiter->first);
740         
741                 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
742                 
743                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
744                 PropertyName = PropertyElement.GetNextToken();                          
745                 PropertyValue = PropertyElement.GetNextToken();
746                 
747                 intPrevValue = intiter->second;
748                 
749                 CaptureString(&PropertyValue, FALSE);
750         
751                 ProcessStringValue(&PropertyName, "ALTID", &GroupsListAltID, &PropertyValue, GroupCount, &PropertyMatched);
752                 ProcessStringValue(&PropertyName, "PID", &GroupsListPID, &PropertyValue, GroupCount, &PropertyMatched);
753                 ProcessStringValue(&PropertyName, "MEDIATYPE", &GroupsListMediaType, &PropertyValue, GroupCount, &PropertyMatched);
754                 ProcessIntegerValue(&PropertyName, "PREF", &GroupsListPref, &PropertyValue, GroupCount, &PropertyMatched);
755                 
756                 if (PropertyMatched == TRUE){
757                 
758                         PropertyMatched = FALSE;
759                         continue;
760                 
761                 }
762                 
763                 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty()){
764                         
765                         if (FirstToken == TRUE){
766                                 
767                                 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
768                                 FirstToken = FALSE;
769                                 
770                         } else {
771                         
772                                 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
773                                 
774                         }
775                         
776                 }
777                 
778         }
780         GroupsList.insert(std::make_pair(*GroupCount, PropertySeg2));
782         if (!PropertyTokens.IsEmpty()){
783         
784                 GroupsListTokens.insert(std::make_pair(*GroupCount, PropertyTokens));
785         
786         }
791 void ContactDataObject::ProcessFN(wxString PropertySeg1, wxString PropertySeg2, int *FNCount){
793         std::map<int, int> SplitPoints;
794         std::map<int, int> SplitLength;
796         int intPrevValue = 4;
797         int intPref = 0;                        
798         int intType = 0;
799         
800         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
802         intPrevValue = 3;
803         
804         wxString PropertyName;
805         wxString PropertyValue;
806         wxString PropertyData;
807         wxString PropertyTokens;
808         std::map<int,int>::iterator SLiter;
809         bool FirstToken = TRUE;
810         bool PropertyMatched = FALSE;
811         
812         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
813         intiter != SplitPoints.end(); ++intiter){
814         
815                 SLiter = SplitLength.find(intiter->first);
816         
817                 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
818                 
819                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
820                 PropertyName = PropertyElement.GetNextToken();                          
821                 PropertyValue = PropertyElement.GetNextToken();
822                 
823                 intPrevValue = intiter->second;
824                 
825                 CaptureString(&PropertyValue, FALSE);
826                 
827                 if (PropertyName == wxT("TYPE")){
829                         if (!PropertyValue.IsEmpty() || PropertyValue == wxT("home") ||
830                                 PropertyValue == wxT("work") ){
832                                 FullNamesListType.erase(*FNCount);
833                                 FullNamesListType.insert(std::make_pair(*FNCount, PropertyValue));
834                 
835                         }
836                         
837                         PropertyMatched = TRUE;
838                 
839                 }
840                 
841                 ProcessStringValue(&PropertyName, "ALTID", &FullNamesListAltID, &PropertyValue, FNCount, &PropertyMatched);
842                 ProcessStringValue(&PropertyName, "PID", &FullNamesListPID, &PropertyValue, FNCount, &PropertyMatched);
843                 ProcessStringValue(&PropertyName, "LANGUAGE", &FullNamesListLanguage, &PropertyValue, FNCount, &PropertyMatched);
844                 ProcessIntegerValue(&PropertyName, "PREF", &FullNamesListPref, &PropertyValue, FNCount, &PropertyMatched);
845                 
846                 if (PropertyMatched == TRUE){
847                 
848                         PropertyMatched = FALSE;
849                         continue;
850                 
851                 }
852                 
853                 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty()){
854                         
855                         if (FirstToken == TRUE){
856                                 
857                                 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
858                                 FirstToken = FALSE;
859                                 
860                         } else {
861                         
862                                 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
863                                 
864                         }
865                         
866                 } 
867         
868         }
870         FullNamesList.insert(std::make_pair(*FNCount, PropertySeg2));
872         if (!PropertyTokens.IsEmpty()){
873         
874                 FullNamesListTokens.insert(std::make_pair(*FNCount, PropertyTokens));
875         
876         }
880 void ContactDataObject::ProcessN(wxString PropertySeg1, wxString PropertySeg2){
882         std::map<int, int> SplitPoints;
883         std::map<int, int> SplitLength;
885         int intPrevValue = 3;
886         int intPref = 0;                        
887         int intType = 0;
888         
889         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
890         
891         intPrevValue = 2;
892         
893         wxString PropertyName;
894         wxString PropertyValue;
895         wxString PropertyData;
896         wxString PropertyTokens;
897         std::map<int,int>::iterator SLiter;
898         bool FirstToken = TRUE;
899         
900         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
901         intiter != SplitPoints.end(); ++intiter){
902         
903                 SLiter = SplitLength.find(intiter->first);
904         
905                 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
906                 
907                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
908                 PropertyName = PropertyElement.GetNextToken();                          
909                 PropertyValue = PropertyElement.GetNextToken();
910                 
911                 intPrevValue = intiter->second;
912                 
913                 CaptureString(&PropertyValue, FALSE);
914                 
915                 if (PropertyName == wxT("ALTID")){
917                         NameAltID = PropertyValue;
918                 
919                 } else if (PropertyName == wxT("LANGUAGE")){
920                 
921                         NameLanguage = PropertyValue;
922                 
923                 } else if (PropertyName == wxT("SORT-AS")){
924                 
925                         if (PropertyValue.Left(1) == wxT("\"") && PropertyValue.Right(1) == wxT("\"") &&
926                                 PropertyValue.Len() >= 3){
927                                 NameDisplayAs = PropertyValue.Mid(1, (PropertyValue.Len() - 2));
928                         }
929                 
930                 } else if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty()){
931                         
932                         if (FirstToken == TRUE){
933                                 
934                                 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
935                                 FirstToken = FALSE;
936                                 
937                         } else {
938                         
939                                 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
940                                 
941                         }
942                         
943                 }
944         
945         }
946         
947         // Split the name data.
948         
949         int intSplitSeek = 0;           
950         int intSplitsFound = 0;
951         int intSplitSize = 0;
952         int intPropertyLen = PropertySeg2.Len();
953         
954         std::map<int,wxString> NameValues;
955         intPrevValue = 0;                                       
956         
957         for (int i = 0; i <= intPropertyLen; i++){
958         
959                 if (PropertySeg2.Mid(i, 1) == wxT(";") && PropertySeg2.Mid((i - 1), 1) != wxT("\\")){
960                         
961                         NameValues.insert(std::make_pair(++intSplitsFound, PropertySeg2.Mid(intSplitSeek, intSplitSize)));
962                         
963                         intSplitSeek = i;
964                         intSplitSeek++;
965                         
966                         if (intSplitsFound == 4){
967                         
968                                 NameValues.insert(std::make_pair(++intSplitsFound, PropertySeg2.Mid(intSplitSeek, wxString::npos)));
969                                 break;
970                         
971                         }
972                         
973                         intSplitSize = 0;
974                         continue;
975         
976                 }
977                 
978                 intSplitSize++;
980         }
981         
982         // Split the data into several parts.
983                         
984         for (std::map<int, wxString>::iterator iter = NameValues.begin(); 
985         iter != NameValues.end(); ++iter){
986         
987                 if (iter->first == 1){
988                 
989                         // Deal with family name.
990                         
991                         NameSurname = iter->second;
992                 
993                 } else if (iter->first == 2){
994                 
995                         // Deal with given names.
996                         
997                         NameForename = iter->second;
998                 
999                 } else if (iter->first == 3){
1000                 
1001                         // Deal with additional names.
1002                         
1003                         NameOtherNames = iter->second;
1004                 
1005                 } else if (iter->first == 4){
1006                 
1007                         // Deal with honorifix prefixes and suffixes.
1009                         NameTitle = iter->second;
1010                 
1011                         iter++;
1012                         
1013                         if (iter == NameValues.end()){
1014                         
1015                                 break;
1016                         
1017                         }
1018                 
1019                         NameSuffix = iter->second;
1020                 
1021                 }
1022         
1023         }
1024         
1025         // Add the name token data.
1026         
1027         if (!PropertyTokens.IsEmpty()){
1028         
1029                 NameTokens = PropertyTokens;
1030         
1031         }
1035 void ContactDataObject::ProcessClientPIDMap(wxString PropertySeg1, wxString PropertySeg2, int *ClientPIDCount){
1037         size_t intPropertyLen = PropertySeg1.Len();
1038         std::map<int, int> SplitPoints;
1039         std::map<int, int> SplitLength;
1040         std::map<int, int>::iterator SLiter;                    
1041         wxString PropertyData;
1042         wxString PropertyName;
1043         wxString PropertyValue;
1044         wxString PropertyTokens;
1045         bool FirstToken = TRUE;
1046         int intSplitsFound = 0;
1047         int intSplitSize = 0;
1048         int intPrevValue = 14;
1049         int intPref = 0;                        
1050         int intType = 0;
1051         
1052         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
1053         
1054         intPrevValue = 13;
1056         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
1057         intiter != SplitPoints.end(); ++intiter){
1058         
1059                 SLiter = SplitLength.find(intiter->first);
1060         
1061                 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
1062                 
1063                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
1064                 PropertyName = PropertyElement.GetNextToken();                          
1065                 PropertyValue = PropertyElement.GetNextToken();
1066                 
1067                 intPrevValue = intiter->second;
1068                 
1069                 // Process properties.
1070                                 
1071                 CaptureString(&PropertyValue, FALSE);
1072                                         
1073                 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty()){
1074                                                         
1075                         if (FirstToken == TRUE){
1076                                 
1077                                 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
1078                                 FirstToken = FALSE;
1079                                 
1080                         } else {
1081                                 
1082                                 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
1083                                 
1084                         }
1085                 
1086                 }
1087         
1088         }       
1089         
1090         CaptureString(&PropertySeg2, FALSE);
1091         
1092         ClientPIDList.insert(std::make_pair(*ClientPIDCount, PropertySeg2));
1093         
1094         if (!PropertyTokens.IsEmpty()){
1095         
1096                 ClientPIDListTokens.insert(std::make_pair(*ClientPIDCount, PropertyTokens));
1097         
1098         }
1102 void ContactDataObject::ProcessNickname(wxString PropertySeg1, wxString PropertySeg2, int *NicknameCount){
1104         std::map<int, int> SplitPoints;
1105         std::map<int, int> SplitLength;
1107         int intPrevValue = 10;
1108         int intPref = 0;                        
1109         
1110         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
1111         
1112         intPrevValue = 9;
1113         
1114         PropertyType PropType = PROPERTY_NONE;
1115         
1116         // Look for type before continuing.
1117         
1118         CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
1119         
1120         intPrevValue = 9;
1121         
1122         std::map<int, wxString> *NicknamesList = NULL;
1123         std::map<int, wxString> *NicknamesListType = NULL;
1124         std::map<int, wxString> *NicknamesListLanguage = NULL;
1125         std::map<int, wxString> *NicknamesListAltID = NULL;
1126         std::map<int, wxString> *NicknamesListPID = NULL;
1127         std::map<int, wxString> *NicknamesListTokens = NULL;            
1128         std::map<int, int> *NicknamesListPref = NULL;
1129         
1130         switch(PropType){
1131                 case PROPERTY_NONE:
1132                         NicknamesList = &GeneralNicknamesList;
1133                         NicknamesListType = &GeneralNicknamesListType;
1134                         NicknamesListLanguage = &GeneralNicknamesListLanguage;
1135                         NicknamesListAltID = &GeneralNicknamesListAltID;
1136                         NicknamesListPID = &GeneralNicknamesListPID;
1137                         NicknamesListTokens = &GeneralNicknamesListTokens;
1138                         NicknamesListPref = &GeneralNicknamesListPref;
1139                         break;
1140                 case PROPERTY_HOME:
1141                         NicknamesList = &HomeNicknamesList;
1142                         NicknamesListType = &HomeNicknamesListType;
1143                         NicknamesListLanguage = &HomeNicknamesListLanguage;
1144                         NicknamesListAltID = &HomeNicknamesListAltID;
1145                         NicknamesListPID = &HomeNicknamesListPID;
1146                         NicknamesListTokens = &HomeNicknamesListTokens;
1147                         NicknamesListPref = &HomeNicknamesListPref;
1148                         break;
1149                 case PROPERTY_WORK:
1150                         NicknamesList = &BusinessNicknamesList;
1151                         NicknamesListType = &BusinessNicknamesListType;
1152                         NicknamesListLanguage = &BusinessNicknamesListLanguage;
1153                         NicknamesListAltID = &BusinessNicknamesListAltID;
1154                         NicknamesListPID = &BusinessNicknamesListPID;
1155                         NicknamesListTokens = &BusinessNicknamesListTokens;
1156                         NicknamesListPref = &BusinessNicknamesListPref;
1157                         break;
1158         }
1159         
1160         std::map<int, int>::iterator SLiter;    
1161         wxString PropertyData;
1162         wxString PropertyName;
1163         wxString PropertyValue;
1164         wxString PropertyTokens;
1165         bool FirstToken = TRUE;
1166         bool PropertyMatched = FALSE;
1167         
1168         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
1169         intiter != SplitPoints.end(); ++intiter){
1170         
1171                 SLiter = SplitLength.find(intiter->first);
1172         
1173                 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
1174                 
1175                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
1176                 PropertyName = PropertyElement.GetNextToken();                          
1177                 PropertyValue = PropertyElement.GetNextToken();
1178                 
1179                 intPrevValue = intiter->second;
1180                 
1181                 CaptureString(&PropertyValue, FALSE);
1182                 
1183                 ProcessStringValue(&PropertyName, "ALTID", NicknamesListAltID, &PropertyValue, NicknameCount, &PropertyMatched);
1184                 ProcessStringValue(&PropertyName, "PID", NicknamesListPID, &PropertyValue, NicknameCount, &PropertyMatched);
1185                 ProcessStringValue(&PropertyName, "LANGUAGE", NicknamesListLanguage, &PropertyValue, NicknameCount, &PropertyMatched);
1186                 ProcessIntegerValue(&PropertyName, "PREF", NicknamesListPref, &PropertyValue, NicknameCount, &PropertyMatched);
1187                 
1188                 if (PropertyMatched == TRUE){
1189                 
1190                         PropertyMatched = FALSE;
1191                         continue;
1192                 
1193                 }
1194                 
1195                 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
1196         
1197                         if (FirstToken == TRUE){
1198                 
1199                                 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
1200                                 FirstToken = FALSE;
1201                 
1202                         } else {
1203                 
1204                                 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
1205                 
1206                         }
1207         
1208                 }
1209                 
1210         }
1211         
1212         NicknamesList->insert(std::make_pair(*NicknameCount, PropertySeg2));
1213         
1214         // Add the name token data.
1215         
1216         if (!PropertyTokens.IsEmpty()){
1217         
1218                 NicknamesListTokens->insert(std::make_pair(*NicknameCount, PropertyTokens));
1219         
1220         }
1224 void ContactDataObject::ProcessGender(wxString PropertySeg1, wxString PropertySeg2){
1226         std::map<int, int> SplitPoints;
1227         std::map<int, int> SplitLength;
1228         std::map<int, int>::iterator SLiter;                    
1229         wxString PropertyData;
1230         wxString PropertyName;
1231         wxString PropertyValue;
1232         wxString PropertyTokens;
1233         bool FirstToken = TRUE;
1234         int intPrevValue = 8;
1236         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
1238         intPrevValue = 7;                       
1239         
1240         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
1241         intiter != SplitPoints.end(); ++intiter){
1242         
1243                 SLiter = SplitLength.find(intiter->first);
1244         
1245                 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
1246                 
1247                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
1248                 PropertyName = PropertyElement.GetNextToken();                          
1249                 PropertyValue = PropertyElement.GetNextToken();
1250                 
1251                 intPrevValue = intiter->second;
1252                 
1253                 // Process properties.
1254                 
1255                 size_t intPropertyValueLen = PropertyValue.Len();
1256                 
1257                 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
1258                         
1259                         PropertyValue.Trim();
1260                         PropertyValue.RemoveLast();
1261                         
1262                 }                               
1263                 
1264                 if (PropertyValue.Mid(0, 1) == wxT("\"")){
1265                         
1266                         PropertyValue.Remove(0, 1);
1267                         
1268                 }                               
1269                 
1270                 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty()){
1272                         if (FirstToken == TRUE){
1273         
1274                                 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
1275                                 FirstToken = FALSE;
1276         
1277                         } else {
1278         
1279                                 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
1280         
1281                         }
1283                 }
1284         
1285         }       
1287         wxStringTokenizer GenderData (PropertySeg2, wxT(";"));
1288         
1289         wxString GenderComponent;
1290         
1291         if (GenderData.CountTokens() >= 2){
1292         
1293                 Gender = GenderData.GetNextToken();
1294                 GenderDetails = GenderData.GetString();
1295         
1296                 CaptureString(&GenderDetails, FALSE);
1297                                                 
1298         } else {
1299         
1300                 Gender = GenderData.GetNextToken();
1301         
1302         }
1303         
1304         if (!PropertyTokens.IsEmpty()){
1305         
1306                 GenderTokens = PropertyTokens;
1307         
1308         }
1312 void ContactDataObject::ProcessBirthday(wxString PropertySeg1, wxString PropertySeg2){
1314         // Process date. Preserve the remainder in the string.
1316         std::map<int, int> SplitPoints;
1317         std::map<int, int> SplitLength;
1318         std::map<int, int>::iterator SLiter;                    
1319         wxString PropertyData;
1320         wxString PropertyName;
1321         wxString PropertyValue;
1322         wxString PropertyTokens;
1323         bool BirthdayText = FALSE;
1324         int intPrevValue = 6;
1326         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
1328         intPrevValue = 5;
1330         // Look for type before continuing.
1332         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
1333         intiter != SplitPoints.end(); ++intiter){
1335                 SLiter = SplitLength.find(intiter->first);
1337                 PropertyData = PropertySeg1.Mid(intPrevValue, SLiter->second);
1338         
1339                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
1340                 PropertyName = PropertyElement.GetNextToken();                          
1341                 PropertyValue = PropertyElement.GetNextToken();
1342         
1343                 intPrevValue = intiter->second;
1344         
1345                 if (PropertyName == wxT("VALUE") && PropertyValue == wxT("text") && BirthdayText == FALSE){
1346         
1347                         CaptureString(&PropertySeg2, FALSE);
1348                         Birthday = PropertySeg2;
1349                         BirthdayText = TRUE;
1350         
1351                 }
1353         }
1355         // Setup blank lines for later on.
1356         
1357         intPrevValue = 5;
1358         bool FirstToken = TRUE;
1360         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
1361         intiter != SplitPoints.end(); ++intiter){
1363                 SLiter = SplitLength.find(intiter->first);
1365                 PropertyData = PropertySeg1.Mid(intPrevValue, SLiter->second);
1366         
1367                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
1368                 PropertyName = PropertyElement.GetNextToken();                          
1369                 PropertyValue = PropertyElement.GetNextToken();
1370         
1371                 intPrevValue = intiter->second;
1372         
1373                 // Process properties.
1374         
1375                 CaptureString(&PropertyValue, FALSE);
1376         
1377                 if (PropertyValue.Mid((PropertyValue.Len() - 1), 1) == wxT("\"")){
1378                 
1379                         PropertyValue.Trim();
1380                         PropertyValue.RemoveLast();
1381                 
1382                 }                               
1383         
1384                 if (PropertyValue.Mid(0, 1) == wxT("\"")){
1385                 
1386                         PropertyValue.Remove(0, 1);
1387                 
1388                 }                               
1389         
1390                 if (PropertyName == wxT("ALTID")){
1392                         BirthdayAltID = PropertyValue;
1393         
1394                 } else if (PropertyName == wxT("CALSCALE")){
1395         
1396                         BirthdayCalScale = PropertyValue;
1397         
1398                 } else if (PropertyName != wxT("VALUE")) {
1399         
1400                         // Something else we don't know about so append
1401                         // to the tokens variable.
1402                 
1403                         if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty()){
1404                 
1405                                 if (FirstToken == TRUE){
1406         
1407                                         PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
1408                                         FirstToken = FALSE;
1409         
1410                                 } else {
1411         
1412                                         PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
1413         
1414                                 }
1415                                 
1416                         }
1417                         
1418                 }
1420         }       
1422         // Add the data to the variables and form.
1423         
1424         if (BirthdayText == FALSE){
1425         
1426                 Birthday = PropertySeg2;
1428         }
1429         
1430         if (!PropertyTokens.IsEmpty()){
1431         
1432                 BirthdayTokens = PropertyTokens;
1434         }
1438 void ContactDataObject::ProcessAnniversary(wxString PropertySeg1, wxString PropertySeg2){
1440         // Process date. Preserve the remainder in the string.
1442         std::map<int, int> SplitPoints;
1443         std::map<int, int> SplitLength;
1444         std::map<int, int>::iterator SLiter;                    
1445         wxString PropertyData;
1446         wxString PropertyName;
1447         wxString PropertyValue;
1448         wxString PropertyTokens;
1449         bool AnniversaryText = FALSE;
1450         int intPrevValue = 13;
1452         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
1454         intPrevValue = 12;
1456         // Look for type before continuing.
1458         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
1459         intiter != SplitPoints.end(); ++intiter){
1461                 SLiter = SplitLength.find(intiter->first);
1463                 PropertyData = PropertySeg1.Mid(intPrevValue, SLiter->second);
1464         
1465                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
1466                 PropertyName = PropertyElement.GetNextToken();                          
1467                 PropertyValue = PropertyElement.GetNextToken();
1468         
1469                 intPrevValue = intiter->second;
1470         
1471                 if (PropertyName == wxT("VALUE") && PropertyValue == wxT("text") && AnniversaryText == FALSE){
1472         
1473                         CaptureString(&PropertySeg2, FALSE);
1474                         Anniversary = PropertySeg2;
1475                         AnniversaryText = TRUE;
1476         
1477                 }
1479         }
1481         // Setup blank lines for later on.
1482         
1483         intPrevValue = 12;
1484         bool FirstToken = TRUE;
1486         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
1487         intiter != SplitPoints.end(); ++intiter){
1489                 SLiter = SplitLength.find(intiter->first);
1491                 PropertyData = PropertySeg1.Mid(intPrevValue, SLiter->second);
1492         
1493                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
1494                 PropertyName = PropertyElement.GetNextToken();                          
1495                 PropertyValue = PropertyElement.GetNextToken();
1496         
1497                 intPrevValue = intiter->second;
1498         
1499                 // Process properties.
1500         
1501                 CaptureString(&PropertyValue, FALSE);
1502         
1503                 if (PropertyValue.Mid((PropertyValue.Len() - 1), 1) == wxT("\"")){
1504                 
1505                         PropertyValue.Trim();
1506                         PropertyValue.RemoveLast();
1507                 
1508                 }                               
1509         
1510                 if (PropertyValue.Mid(0, 1) == wxT("\"")){
1511                 
1512                         PropertyValue.Remove(0, 1);
1513                 
1514                 }                               
1515         
1516                 if (PropertyName == wxT("ALTID")){
1518                         AnniversaryAltID = PropertyValue;
1519         
1520                 } else if (PropertyName == wxT("CALSCALE")){
1521         
1522                         AnniversaryCalScale = PropertyValue;
1523         
1524                 } else if (PropertyName != wxT("VALUE")) {
1525         
1526                         // Something else we don't know about so append
1527                         // to the tokens variable.
1528                 
1529                         if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty()){
1530                 
1531                                 if (FirstToken == TRUE){
1532         
1533                                         PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
1534                                         FirstToken = FALSE;
1535         
1536                                 } else {
1537         
1538                                         PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
1539         
1540                                 }
1541                                 
1542                         }
1543                         
1544                 }
1546         }       
1548         // Add the data to the variables and form.
1549         
1550         if (AnniversaryText == FALSE){
1551         
1552                 Anniversary = PropertySeg2;
1554         }
1555         
1556         if (!PropertyTokens.IsEmpty()){
1557         
1558                 AnniversaryTokens = PropertyTokens;
1560         }
1564 void ContactDataObject::ProcessTimeZone(wxString PropertySeg1, wxString PropertySeg2, int *TimeZoneCount){
1566         std::map<int, int> SplitPoints;
1567         std::map<int, int> SplitLength;
1569         int intPrevValue = 4;
1570         int intPref = 0;                        
1571         
1572         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
1573         
1574         intPrevValue = 3;
1575         
1576         PropertyType PropType = PROPERTY_NONE;
1577         
1578         // Look for type before continuing.
1579         
1580         CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
1581         
1582         intPrevValue = 3;
1583         
1584         std::map<int, wxString> *TZList = NULL;
1585         std::map<int, wxString> *TZListType = NULL;
1586         std::map<int, wxString> *TZListMediatype = NULL;
1587         std::map<int, wxString> *TZListAltID = NULL;
1588         std::map<int, wxString> *TZListPID = NULL;
1589         std::map<int, wxString> *TZListTokens = NULL;           
1590         std::map<int, int> *TZListPref = NULL;
1591         
1592         switch(PropType){
1593                 case PROPERTY_NONE:
1594                         TZList = &GeneralTZList;
1595                         TZListType = &GeneralTZListType;
1596                         TZListMediatype = &GeneralTZListMediatype;
1597                         TZListAltID = &GeneralTZListAltID;
1598                         TZListPID = &GeneralTZListPID;
1599                         TZListTokens = &GeneralTZListTokens;
1600                         TZListPref = &GeneralTZListPref;
1601                         break;
1602                 case PROPERTY_HOME:
1603                         TZList = &HomeTZList;
1604                         TZListType = &HomeTZListType;
1605                         TZListMediatype = &HomeTZListMediatype;
1606                         TZListAltID = &HomeTZListAltID;
1607                         TZListPID = &HomeTZListPID;
1608                         TZListTokens = &HomeTZListTokens;
1609                         TZListPref = &HomeTZListPref;
1610                         break;
1611                 case PROPERTY_WORK:
1612                         TZList = &BusinessTZList;
1613                         TZListType = &BusinessTZListType;
1614                         TZListMediatype = &BusinessTZListMediatype;
1615                         TZListAltID = &BusinessTZListAltID;
1616                         TZListPID = &BusinessTZListPID;
1617                         TZListTokens = &BusinessTZListTokens;
1618                         TZListPref = &BusinessTZListPref;
1619                         break;
1620         }
1621         
1622         std::map<int, int>::iterator SLiter;    
1623         wxString PropertyData;
1624         wxString PropertyName;
1625         wxString PropertyValue;
1626         wxString PropertyTokens;
1627         bool FirstToken = TRUE;
1628         bool PropertyMatched = FALSE;
1629         
1630         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
1631         intiter != SplitPoints.end(); ++intiter){
1632         
1633                 SLiter = SplitLength.find(intiter->first);
1634         
1635                 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
1636                 
1637                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
1638                 PropertyName = PropertyElement.GetNextToken();                          
1639                 PropertyValue = PropertyElement.GetNextToken();
1640                 
1641                 intPrevValue = intiter->second;
1642                 
1643                 CaptureString(&PropertyValue, FALSE);
1645                 ProcessStringValue(&PropertyName, "ALTID", TZListAltID, &PropertyValue, TimeZoneCount, &PropertyMatched);
1646                 ProcessStringValue(&PropertyName, "PID", TZListPID, &PropertyValue, TimeZoneCount, &PropertyMatched);
1647                 ProcessStringValue(&PropertyName, "MEDIATYPE", TZListMediatype, &PropertyValue, TimeZoneCount, &PropertyMatched);
1648                 ProcessIntegerValue(&PropertyName, "PREF", TZListPref, &PropertyValue, TimeZoneCount, &PropertyMatched);
1649                 
1650                 if (PropertyMatched == TRUE){
1651                 
1652                         PropertyMatched = FALSE;
1653                         continue;
1654                 
1655                 }
1657                 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
1658         
1659                         if (FirstToken == TRUE){
1660                 
1661                                 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
1662                                 FirstToken = FALSE;
1663                 
1664                         } else {
1665                 
1666                                 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
1667                 
1668                         }
1669         
1670                 }
1671                 
1672         }
1673         
1674         TZList->insert(std::make_pair(*TimeZoneCount, PropertySeg2));
1675         
1676         // Add the name token data.
1677         
1678         if (!PropertyTokens.IsEmpty()){
1679         
1680                 TZListTokens->insert(std::make_pair(*TimeZoneCount, PropertyTokens));
1681         
1682         }
1687 void ContactDataObject::ProcessAddress(wxString PropertySeg1, wxString PropertySeg2, int *AddressCount){
1689         size_t intPropertyLen = PropertySeg1.Len();
1690         std::map<int, int> SplitPoints;
1691         std::map<int, int> SplitLength;
1692         std::map<int, int>::iterator SLiter;                    
1693         wxString PropertyData;
1694         wxString PropertyName;
1695         wxString PropertyValue;
1696         wxString PropertyTokens;
1697         wxString AddressLabel;
1698         wxString AddressLang;
1699         wxString AddressAltID;
1700         wxString AddressPID;
1701         wxString AddressTokens;
1702         wxString AddressGeo;
1703         wxString AddressTimezone;
1704         wxString AddressType;
1705         wxString AddressMediatype;
1706         wxString AddressPOBox;
1707         wxString AddressExtended;
1708         wxString AddressStreet;
1709         wxString AddressLocality;
1710         wxString AddressCity;
1711         wxString AddressRegion;
1712         wxString AddressPostalCode;
1713         wxString AddressCountry;
1714         bool FirstToken = TRUE;                 
1715         int intSplitsFound = 0;
1716         int intSplitSize = 0;
1717         int intPrevValue = 5;
1718         int intPref = 0;                        
1719         int intType = 0;
1720         long ListCtrlIndex;
1721         bool PropertyMatched = FALSE;
1722         
1723         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
1724         
1725         intPrevValue = 4;
1726         
1727         PropertyType PropType = PROPERTY_NONE;
1728                 
1729         // Look for type before continuing.
1730         
1731         CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
1732         
1733         intPrevValue = 4;
1734         
1735         std::map<int, wxString> *AddressList = NULL;
1736         std::map<int, wxString> *AddressListTown = NULL;
1737         std::map<int, wxString> *AddressListCounty = NULL;
1738         std::map<int, wxString> *AddressListPostCode = NULL;
1739         std::map<int, wxString> *AddressListCountry = NULL;
1740         std::map<int, wxString> *AddressListLabel = NULL;
1741         std::map<int, wxString> *AddressListLang = NULL;                
1742         std::map<int, wxString> *AddressListAltID = NULL;
1743         std::map<int, wxString> *AddressListPID = NULL;
1744         std::map<int, wxString> *AddressListTokens = NULL;
1745         std::map<int, wxString> *AddressListGeo = NULL;
1746         std::map<int, wxString> *AddressListTimezone = NULL;            
1747         std::map<int, wxString> *AddressListType = NULL;
1748         std::map<int, wxString> *AddressListMediatype = NULL;
1749         std::map<int, int> *AddressListPref = NULL;
1751         switch(PropType){
1752                 case PROPERTY_NONE:
1753                         AddressList = &GeneralAddressList;
1754                         AddressListTown = &GeneralAddressListTown;
1755                         AddressListCounty = &GeneralAddressListCounty;
1756                         AddressListPostCode = &GeneralAddressListPostCode;
1757                         AddressListCountry = &GeneralAddressListCountry;
1758                         AddressListLabel = &GeneralAddressListLabel;
1759                         AddressListLang = &GeneralAddressListLang;              
1760                         AddressListAltID = &GeneralAddressListAltID;
1761                         AddressListPID = &GeneralAddressListPID;
1762                         AddressListTokens = &GeneralAddressListTokens;
1763                         AddressListGeo = &GeneralAddressListGeo;
1764                         AddressListTimezone = &GeneralAddressListTimezone;
1765                         AddressListType = &GeneralAddressListType;
1766                         AddressListMediatype = &GeneralAddressListMediatype;
1767                         AddressListPref = &GeneralAddressListPref;              
1768                         break;
1769                 case PROPERTY_HOME:
1770                         AddressList = &HomeAddressList;
1771                         AddressListTown = &HomeAddressListTown;
1772                         AddressListCounty = &HomeAddressListCounty;
1773                         AddressListPostCode = &HomeAddressListPostCode;
1774                         AddressListCountry = &HomeAddressListCountry;
1775                         AddressListLabel = &HomeAddressListLabel;
1776                         AddressListLang = &HomeAddressListLang;         
1777                         AddressListAltID = &HomeAddressListAltID;
1778                         AddressListPID = &HomeAddressListPID;
1779                         AddressListTokens = &HomeAddressListTokens;
1780                         AddressListGeo = &HomeAddressListGeo;
1781                         AddressListTimezone = &HomeAddressListTimezone;
1782                         AddressListType = &HomeAddressListType;
1783                         AddressListMediatype = &HomeAddressListMediatype;
1784                         AddressListPref = &HomeAddressListPref;
1785                         break;
1786                 case PROPERTY_WORK:
1787                         AddressList = &BusinessAddressList;
1788                         AddressListTown = &BusinessAddressListTown;
1789                         AddressListCounty = &BusinessAddressListCounty;
1790                         AddressListPostCode = &BusinessAddressListPostCode;
1791                         AddressListCountry = &BusinessAddressListCountry;
1792                         AddressListLabel = &BusinessAddressListLabel;
1793                         AddressListLang = &BusinessAddressListLang;             
1794                         AddressListAltID = &BusinessAddressListAltID;
1795                         AddressListPID = &BusinessAddressListPID;
1796                         AddressListTokens = &BusinessAddressListTokens;
1797                         AddressListGeo = &BusinessAddressListGeo;
1798                         AddressListTimezone = &BusinessAddressListTimezone;
1799                         AddressListType = &BusinessAddressListType;
1800                         AddressListMediatype = &BusinessAddressListMediatype;
1801                         AddressListPref = &BusinessAddressListPref;
1802                         break;
1803         }
1804         
1805         intPrevValue = 4;
1806         
1807         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
1808         intiter != SplitPoints.end(); ++intiter){
1809         
1810                 SLiter = SplitLength.find(intiter->first);
1811         
1812                 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
1813                 
1814                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
1815                 PropertyName = PropertyElement.GetNextToken();                          
1816                 PropertyValue = PropertyElement.GetNextToken();
1817                 
1818                 intPrevValue = intiter->second;
1819                 
1820                 CaptureString(&PropertyValue, FALSE);
1821                 
1822                 // Process properties.
1823                 
1824                 ProcessStringValue(&PropertyName, "LABEL", AddressListLabel, &PropertyValue, AddressCount, &PropertyMatched);
1825                 ProcessStringValue(&PropertyName, "LANGUAGE", AddressListLang, &PropertyValue, AddressCount, &PropertyMatched);
1826                 ProcessStringValue(&PropertyName, "ALTID", AddressListAltID, &PropertyValue, AddressCount, &PropertyMatched);
1827                 ProcessStringValue(&PropertyName, "PID", AddressListPID, &PropertyValue, AddressCount, &PropertyMatched);
1828                 ProcessStringValue(&PropertyName, "GEO", AddressListGeo, &PropertyValue, AddressCount, &PropertyMatched);
1829                 ProcessStringValue(&PropertyName, "TZ", AddressListTimezone, &PropertyValue, AddressCount, &PropertyMatched);
1830                 ProcessStringValue(&PropertyName, "MEDIATYPE", AddressListMediatype, &PropertyValue, AddressCount, &PropertyMatched);
1831                 ProcessIntegerValue(&PropertyName, "PREF", AddressListPref, &PropertyValue, AddressCount, &PropertyMatched);
1832                 
1833                 if (PropertyMatched == TRUE){
1834                 
1835                         PropertyMatched = FALSE;
1836                         continue;
1837                 
1838                 }
1839                 
1840                 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
1841                 
1842                         if (FirstToken == TRUE){
1843                         
1844                                 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
1845                                 FirstToken = FALSE;
1846                         
1847                         } else {
1848                         
1849                                 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
1850                         
1851                         }
1852                         
1853                 }
1854         
1855         }                       
1856         
1857         // Split the address. 
1859         //std::map<int, int>::iterator SLiter;
1860         intPropertyLen = PropertySeg2.Len();
1861         SplitPoints.clear();
1862         SplitLength.clear();
1863         intSplitsFound = 0;
1864         intSplitSize = 0;
1865         intPrevValue = 0;
1866         
1867         for (int i = 0; i <= intPropertyLen; i++){
1869                 intSplitSize++;
1870         
1871                 if (PropertySeg2.Mid(i, 1) == wxT(";") && PropertySeg2.Mid((i - 1), 1) != wxT("\\")){
1872         
1873                         intSplitsFound++;
1874                         SplitPoints.insert(std::make_pair(intSplitsFound, (i + 1)));
1875                         
1876                         if (intSplitsFound == 6){ 
1877                         
1878                                 SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
1879                                 break; 
1880                                 
1881                         } else {
1882                         
1883                                 SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
1884                         
1885                         }
1886                         
1887                         intSplitSize = 0;                                       
1888         
1889                 }
1891         }
1892         
1893         // Split the data into several parts.                   
1894         
1895         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
1896         intiter != SplitPoints.end(); ++intiter){
1897                         
1898                 if (intiter->first == 1){
1899                 
1900                         // Deal with PO Box.
1901                         
1902                         SLiter = SplitLength.find(1);
1903                                                                 
1904                         AddressPOBox = PropertySeg2.Mid(0, SLiter->second);
1905                         intPrevValue = intiter->second;
1906                 
1907                 } else if (intiter->first == 2){
1908                 
1909                         // Deal with extended address.
1910                         
1911                         SLiter = SplitLength.find(2);
1912                         
1913                         AddressExtended = PropertySeg2.Mid(intPrevValue, SLiter->second);
1914                         intPrevValue = intiter->second;
1915                 
1916                 } else if (intiter->first == 3){
1917                 
1918                         // Deal with street address.
1919                         
1920                         SLiter = SplitLength.find(3);
1921                                                                 
1922                         AddressStreet = PropertySeg2.Mid(intPrevValue, SLiter->second);
1923                         intPrevValue = intiter->second;
1924                 
1925                 } else if (intiter->first == 4){
1926                 
1927                         // Deal with locality
1929                         SLiter = SplitLength.find(4);
1930                         
1931                         AddressLocality = PropertySeg2.Mid(intPrevValue, SLiter->second);
1932                         intPrevValue = intiter->second;
1933                 
1934                 } else if (intiter->first == 5){
1935                 
1936                         // Deal with region.
1938                         SLiter = SplitLength.find(5);
1939                         
1940                         AddressRegion = PropertySeg2.Mid(intPrevValue, SLiter->second);
1941                         intPrevValue = intiter->second;
1942                         
1943                 
1944                 } else if (intiter->first == 6){
1945                 
1946                         // Deal with post code.
1948                         SLiter = SplitLength.find(6);
1949                         
1950                         AddressPostalCode = PropertySeg2.Mid(intPrevValue, SLiter->second);
1951                         intPrevValue = intiter->second;
1952                         
1953                         // Deal with country.
1954                                                 
1955                         AddressCountry = PropertySeg2.Mid(intPrevValue, wxString::npos);
1957                         break;
1958                 
1959                 }
1960         
1961         }       
1962         
1963         // Add the data to the General/Home/Work address variables.
1964         
1965         CaptureString(&AddressStreet, FALSE); 
1966         CaptureString(&AddressLocality, FALSE);
1967         CaptureString(&AddressRegion, FALSE);
1968         CaptureString(&AddressPostalCode, FALSE);
1969         CaptureString(&AddressCountry, FALSE);
1970                 
1971         if (!PropertyTokens.IsEmpty()){
1972         
1973                 AddressListTokens->insert(std::make_pair(*AddressCount, PropertyTokens));
1974         
1975         }
1977         AddressListCountry->insert(std::make_pair(*AddressCount, AddressCountry));      
1978         AddressList->insert(std::make_pair(*AddressCount, AddressStreet));
1979         AddressListTown->insert(std::make_pair(*AddressCount, AddressLocality));
1980         AddressListCounty->insert(std::make_pair(*AddressCount, AddressRegion));
1981         AddressListPostCode->insert(std::make_pair(*AddressCount, AddressPostalCode));
1983         switch(PropType){
1984                 case PROPERTY_NONE:
1985                         AddressListType->insert(std::make_pair(*AddressCount, wxT("")));
1986                         break;
1987                 case PROPERTY_HOME:
1988                         AddressListType->insert(std::make_pair(*AddressCount, wxT("home")));
1989                         break;
1990                 case PROPERTY_WORK:
1991                         AddressListType->insert(std::make_pair(*AddressCount, wxT("work")));    
1992                         break;
1993         }
1994         
1995         AddressListTokens->insert(std::make_pair(*AddressCount, PropertyTokens));
1999 void ContactDataObject::ProcessEmail(wxString PropertySeg1, wxString PropertySeg2, int *EmailCount){
2001         std::map<int, int> SplitPoints;
2002         std::map<int, int> SplitLength;
2004         int intPrevValue = 7;
2005         int intPref = 0;                        
2006         
2007         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
2008         
2009         intPrevValue = 6;
2010         
2011         PropertyType PropType = PROPERTY_NONE;
2012                 
2013         // Look for type before continuing.
2014         
2015         CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
2016         
2017         std::map<int, wxString> *EmailList = NULL;
2018         std::map<int, wxString> *EmailListType = NULL;
2019         std::map<int, wxString> *EmailListAltID = NULL;
2020         std::map<int, wxString> *EmailListPID = NULL;
2021         std::map<int, wxString> *EmailListTokens = NULL;                
2022         std::map<int, int> *EmailListPref = NULL;
2024         switch(PropType){
2025                 case PROPERTY_NONE:
2026                         EmailList = &GeneralEmailList;
2027                         EmailListType = &GeneralEmailListType;
2028                         EmailListAltID = &GeneralEmailListAltID;
2029                         EmailListPID = &GeneralEmailListPID;
2030                         EmailListTokens = &GeneralEmailListTokens;              
2031                         EmailListPref = &GeneralEmailListPref;  
2032                         break;
2033                 case PROPERTY_HOME:
2034                         EmailList = &HomeEmailList;
2035                         EmailListType = &HomeEmailListType;
2036                         EmailListAltID = &HomeEmailListAltID;
2037                         EmailListPID = &HomeEmailListPID;
2038                         EmailListTokens = &HomeEmailListTokens;         
2039                         EmailListPref = &HomeEmailListPref;     
2040                         break;
2041                 case PROPERTY_WORK:
2042                         EmailList = &BusinessEmailList;
2043                         EmailListType = &BusinessEmailListType;
2044                         EmailListAltID = &BusinessEmailListAltID;
2045                         EmailListPID = &BusinessEmailListPID;
2046                         EmailListTokens = &BusinessEmailListTokens;             
2047                         EmailListPref = &BusinessEmailListPref; 
2048                         break;
2049         }
2050         
2051         intPrevValue = 6;
2052         
2053         std::map<int,int>::iterator SLiter;
2054         wxString PropertyData;
2055         wxString PropertyName;
2056         wxString PropertyValue;
2057         wxString PropertyTokens;
2058         bool FirstToken = TRUE;
2059         bool PropertyMatched = FALSE;
2060         
2061         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
2062         intiter != SplitPoints.end(); ++intiter){
2063         
2064                 SLiter = SplitLength.find(intiter->first);
2065         
2066                 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
2067                 
2068                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
2069                 PropertyName = PropertyElement.GetNextToken();                          
2070                 PropertyValue = PropertyElement.GetNextToken();
2071                 
2072                 intPrevValue = intiter->second;
2073                 
2074                 CaptureString(&PropertyValue, FALSE);
2075                 
2076                 // Process properties.
2077                 
2078                 ProcessStringValue(&PropertyName, "ALTID", EmailListAltID, &PropertyValue, EmailCount, &PropertyMatched);
2079                 ProcessStringValue(&PropertyName, "PID", EmailListPID, &PropertyValue, EmailCount, &PropertyMatched);
2080                 ProcessIntegerValue(&PropertyName, "PREF", EmailListPref, &PropertyValue, EmailCount, &PropertyMatched);
2081                 
2082                 if (PropertyMatched == TRUE){
2083                 
2084                         PropertyMatched = FALSE;
2085                         continue;
2086                 
2087                 }
2088                 
2089                 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
2090                         
2091                         if (FirstToken == TRUE){
2092                         
2093                                 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
2094                                 FirstToken = FALSE;
2095                         
2096                         } else {
2097                         
2098                                 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
2099                         
2100                         }
2101                         
2102                 }
2103         
2104         }
2105         
2106         EmailList->insert(std::make_pair(*EmailCount, PropertySeg2));
2107         
2108         // Add the name token data.
2109         
2110         if (!PropertyTokens.IsEmpty()){
2111         
2112                 EmailListTokens->insert(std::make_pair(*EmailCount, PropertyTokens));
2113         
2114         }       
2119 void ContactDataObject::ProcessIM(wxString PropertySeg1, wxString PropertySeg2, int *IMCount){
2121         std::map<int, int> SplitPoints;
2122         std::map<int, int> SplitLength;
2124         int intPrevValue = 6;
2125         int intPref = 0;                        
2126         
2127         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
2128         
2129         intPrevValue = 5;
2130         
2131         PropertyType PropType = PROPERTY_NONE;
2132                 
2133         // Look for type before continuing.
2134         
2135         CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
2136         
2137         std::map<int, wxString> *IMList = NULL;
2138         std::map<int, wxString> *IMListType = NULL;
2139         std::map<int, wxString> *IMListAltID = NULL;
2140         std::map<int, wxString> *IMListPID = NULL;
2141         std::map<int, wxString> *IMListTokens = NULL;
2142         std::map<int, wxString> *IMListMediatype = NULL;        
2143         std::map<int, int> *IMListPref = NULL;
2145         switch(PropType){
2146                 case PROPERTY_NONE:
2147                         IMList = &GeneralIMList;
2148                         IMListType = &GeneralIMListType;
2149                         IMListAltID = &GeneralIMListAltID;
2150                         IMListPID = &GeneralIMListPID;
2151                         IMListTokens = &GeneralIMListTokens;
2152                         IMListMediatype = &GeneralIMListMediatype;
2153                         IMListPref = &GeneralIMListPref;        
2154                         break;
2155                 case PROPERTY_HOME:
2156                         IMList = &HomeIMList;
2157                         IMListType = &HomeIMListType;
2158                         IMListAltID = &HomeIMListAltID;
2159                         IMListPID = &HomeIMListPID;
2160                         IMListTokens = &HomeIMListTokens;
2161                         IMListMediatype = &HomeIMListMediatype;         
2162                         IMListPref = &HomeIMListPref;   
2163                         break;
2164                 case PROPERTY_WORK:
2165                         IMList = &BusinessIMList;
2166                         IMListType = &BusinessIMListType;
2167                         IMListAltID = &BusinessIMListAltID;
2168                         IMListPID = &BusinessIMListPID;
2169                         IMListTokens = &BusinessIMListTokens;   
2170                         IMListMediatype = &BusinessIMListMediatype;     
2171                         IMListPref = &BusinessIMListPref;       
2172                         break;
2173         }
2174         
2175         intPrevValue = 5;
2176         
2177         std::map<int,int>::iterator SLiter;
2178         wxString PropertyData;
2179         wxString PropertyName;
2180         wxString PropertyValue;
2181         wxString PropertyTokens;
2182         bool FirstToken = TRUE;
2183         bool PropertyMatched = FALSE;
2184         
2185         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
2186         intiter != SplitPoints.end(); ++intiter){
2187         
2188                 SLiter = SplitLength.find(intiter->first);
2189         
2190                 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
2191                 
2192                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
2193                 PropertyName = PropertyElement.GetNextToken();                          
2194                 PropertyValue = PropertyElement.GetNextToken();
2195                 
2196                 intPrevValue = intiter->second;
2197                 
2198                 CaptureString(&PropertyValue, FALSE);
2199                 
2200                 ProcessStringValue(&PropertyName, "ALTID", IMListAltID, &PropertyValue, IMCount, &PropertyMatched);
2201                 ProcessStringValue(&PropertyName, "PID", IMListPID, &PropertyValue, IMCount, &PropertyMatched);
2202                 ProcessStringValue(&PropertyName, "MEDIATYPE", IMListMediatype, &PropertyValue, IMCount, &PropertyMatched);
2203                 ProcessIntegerValue(&PropertyName, "PREF", IMListPref, &PropertyValue, IMCount, &PropertyMatched);
2204                 
2205                 // Process properties.
2206                 
2207                 if (PropertyMatched == TRUE){
2208                         
2209                         PropertyMatched = FALSE;
2210                         continue;
2211                 
2212                 }
2213                 
2214                 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
2215                 
2216                         if (FirstToken == TRUE){
2217                         
2218                                 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
2219                                 FirstToken = FALSE;
2220                         
2221                         } else {
2222                         
2223                                 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
2224                         
2225                         }
2226                 
2227                 }
2228         
2229         }
2230                 
2231         IMList->insert(std::make_pair(*IMCount, PropertySeg2));
2232         
2233         // Add the name token data.
2234         
2235         if (!PropertyTokens.IsEmpty()){
2236         
2237                 IMListTokens->insert(std::make_pair(*IMCount, PropertyTokens));
2238         
2239         }
2243 void ContactDataObject::ProcessTelephone(wxString PropertySeg1, wxString PropertySeg2, int *TelephoneCount){
2245         std::map<int, int> SplitPoints;
2246         std::map<int, int> SplitLength;
2247         std::map<int, int>::iterator SLiter;
2248         
2249         int intPref = 0;
2250         
2251         PropertyType PropType = PROPERTY_NONE;
2252                 
2253         // Look for type before continuing.
2254         
2255         wxString TelTypeUI;
2256         wxString TelTypeDetail;
2257         wxString PropertyData;
2258         wxString PropertyName;
2259         wxString PropertyValue;
2260         wxString PropertyTokens;
2261         
2262         std::map<int,int> TypeSplitPoints;
2263         std::map<int,int> TypeSplitLength;
2264         std::map<int,int>::iterator TSLiter;
2265         
2266         int intSplitSize = 0;
2267         int intSplitsFound = 0;
2268         int intSplitPoint = 0;
2269         int intType = 0;
2270         int intPrevValue = 5;
2271                 
2272         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
2273         
2274         intPrevValue = 4;
2275         
2276         // Look for type before continuing.
2277         
2278         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
2279         intiter != SplitPoints.end(); ++intiter){
2280         
2281                 SLiter = SplitLength.find(intiter->first);
2282         
2283                 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
2284                 
2285                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
2286                 PropertyName = PropertyElement.GetNextToken();                          
2287                 PropertyValue = PropertyElement.GetNextToken();
2288                 
2289                 intPrevValue = intiter->second;
2291                 if (PropertyName == wxT("TYPE")){
2292                 
2293                         // Process each value in type and translate each
2294                         // part.
2295                 
2296                         // Strip out the quotes if they are there.
2297                 
2298                         size_t intPropertyValueLen = PropertyValue.Len();
2299                 
2300                         if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
2301                         
2302                                 PropertyValue.Trim();
2303                                 PropertyValue.RemoveLast();
2304                         
2305                         }                               
2306                 
2307                         if (PropertyValue.Mid(0, 1) == wxT("\"")){
2308                         
2309                                 PropertyValue.Remove(0, 1);
2310                         
2311                         }
2312                         
2313                         TelTypeDetail = PropertyValue;
2314                         
2315                         intSplitSize = 0;
2316                         intSplitsFound = 0;
2317                         intSplitPoint = 0;
2318                         
2319                         for (int i = 0; i <= intPropertyValueLen; i++){
2320         
2321                                 intSplitSize++;
2322         
2323                                 if (PropertyValue.Mid(i, 1) == wxT(",") && PropertyValue.Mid((i - 1), 1) != wxT("\\")){
2324         
2325                                         if (intSplitsFound == 0){
2327                                                 TypeSplitPoints.insert(std::make_pair(intSplitsFound, intSplitPoint));
2328                                                 TypeSplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
2329                         
2330                                         } else {
2331                         
2332                                                 TypeSplitPoints.insert(std::make_pair(intSplitsFound, intSplitPoint));
2333                                                 TypeSplitLength.insert(std::make_pair(intSplitsFound, intSplitSize));
2334                         
2335                                         }                       
2337                                         intSplitsFound++;
2338                                         i++;
2339                                         intSplitPoint = i;
2340                                         intSplitSize = 0;
2341         
2342                                 }
2343         
2344                         }
2345                         
2346                         TypeSplitPoints.insert(std::make_pair(intSplitsFound, intSplitPoint));
2347                         TypeSplitLength.insert(std::make_pair(intSplitsFound, intSplitSize));                                                           
2348                 
2349                         int intTypeSeek = 0;
2350                 
2351                         for (std::map<int, int>::iterator typeiter = TypeSplitPoints.begin(); 
2352                         typeiter != TypeSplitPoints.end(); ++typeiter){
2353                         
2354                                 wxString TypePropertyName;
2355                                 
2356                                 TSLiter = TypeSplitLength.find(typeiter->first);
2357                                 
2358                                 TypePropertyName = PropertyValue.Mid(typeiter->second, TSLiter->second);
2359                                 
2360                                 if (intTypeSeek == 0){
2361                                 
2362                                 
2363                                 } else {
2364                                                                                 
2365                                         TelTypeUI.Append(wxT(","));                                                     
2366                                 
2367                                 }
2368                         
2369                                 if (TypePropertyName == wxT("home")){
2370                                 
2371                                         PropType = PROPERTY_HOME;
2372                                 
2373                                 } else if (TypePropertyName == wxT("work")){
2374                                 
2375                                         PropType = PROPERTY_WORK;
2376                                                                         
2377                                 }
2378                                 
2379                                 
2380                                 if (TypePropertyName == wxT("text")){
2381                                 
2382                                         TelTypeUI.Append(_("text"));
2383                                         intTypeSeek++;
2384                                 
2385                                 } else if (TypePropertyName == wxT("voice")){
2386                                 
2387                                         TelTypeUI.Append(_("voice"));
2388                                         intTypeSeek++;
2389                                 
2390                                 } else if (TypePropertyName == wxT("fax")){
2391                                 
2392                                         TelTypeUI.Append(_("fax"));
2393                                         intTypeSeek++;
2394                                 
2395                                 } else if (TypePropertyName == wxT("cell")){
2396                                 
2397                                         TelTypeUI.Append(_("mobile"));
2398                                         intTypeSeek++;
2399                                 
2400                                 } else if (TypePropertyName == wxT("video")){
2401                                 
2402                                         TelTypeUI.Append(_("video"));
2403                                         intTypeSeek++;
2404                                 
2405                                 } else if (TypePropertyName == wxT("pager")){
2406                                 
2407                                         TelTypeUI.Append(_("pager"));
2408                                         intTypeSeek++;
2409                                 
2410                                 } else if (TypePropertyName == wxT("textphone")){
2411                                 
2412                                         TelTypeUI.Append(_("textphone"));
2413                                         intTypeSeek++;
2414                                 
2415                                 }
2416                         
2417                         }
2418                 
2419                 }
2420                 
2421         }
2422         
2423         std::map<int, wxString> *TelephoneList = NULL;
2424         std::map<int, wxString> *TelephoneListType = NULL;
2425         std::map<int, wxString> *TelephoneListAltID = NULL;
2426         std::map<int, wxString> *TelephoneListPID = NULL;
2427         std::map<int, wxString> *TelephoneListTokens = NULL;
2428         std::map<int, wxString> *TelephoneListTypeInfo = NULL;  
2429         std::map<int, int> *TelephoneListPref = NULL;
2431         switch(PropType){
2432                 case PROPERTY_NONE:
2433                         TelephoneList = &GeneralTelephoneList;
2434                         TelephoneListType = &GeneralTelephoneListType;
2435                         TelephoneListAltID = &GeneralTelephoneListAltID;
2436                         TelephoneListPID = &GeneralTelephoneListPID;
2437                         TelephoneListTokens = &GeneralTelephoneListTokens;
2438                         TelephoneListTypeInfo = &GeneralTelephoneListTypeInfo;
2439                         TelephoneListPref = &GeneralTelephoneListPref;  
2440                         break;
2441                 case PROPERTY_HOME:
2442                         TelephoneList = &HomeTelephoneList;
2443                         TelephoneListType = &HomeTelephoneListType;
2444                         TelephoneListAltID = &HomeTelephoneListAltID;
2445                         TelephoneListPID = &HomeTelephoneListPID;
2446                         TelephoneListTokens = &HomeTelephoneListTokens;
2447                         TelephoneListTypeInfo = &HomeTelephoneListTypeInfo;     
2448                         TelephoneListPref = &HomeTelephoneListPref;     
2449                         break;
2450                 case PROPERTY_WORK:
2451                         TelephoneList = &BusinessTelephoneList;
2452                         TelephoneListType = &BusinessTelephoneListType;
2453                         TelephoneListAltID = &BusinessTelephoneListAltID;
2454                         TelephoneListPID = &BusinessTelephoneListPID;
2455                         TelephoneListTokens = &BusinessTelephoneListTokens;     
2456                         TelephoneListTypeInfo = &BusinessTelephoneListTypeInfo; 
2457                         TelephoneListPref = &BusinessTelephoneListPref; 
2458                         break;
2459         }
2460                 
2461         // Process the properties.
2462         
2463         bool FirstToken = TRUE;
2464         
2465         intPrevValue = 5;
2466         SplitPoints.clear();
2467         SplitLength.clear();
2469         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
2471         intPrevValue = 4;
2472         
2473         bool PropertyMatched = FALSE;
2474         
2475         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
2476         intiter != SplitPoints.end(); ++intiter){
2477         
2478                 SLiter = SplitLength.find(intiter->first);
2479         
2480                 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
2481                 
2482                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
2483                 PropertyName = PropertyElement.GetNextToken();                          
2484                 PropertyValue = PropertyElement.GetNextToken();
2485                 
2486                 intPrevValue = intiter->second;
2487                 
2488                 CaptureString(&PropertyValue, FALSE);
2489                 
2490                 // Process properties.
2491                 
2492                 ProcessStringValue(&PropertyName, "ALTID", TelephoneListAltID, &PropertyValue, TelephoneCount, &PropertyMatched);
2493                 ProcessStringValue(&PropertyName, "PID", TelephoneListPID, &PropertyValue, TelephoneCount, &PropertyMatched);
2494                 ProcessIntegerValue(&PropertyName, "PREF", TelephoneListPref, &PropertyValue, TelephoneCount, &PropertyMatched);
2495                 
2496                 if (PropertyMatched == TRUE){
2497                 
2498                         PropertyMatched = FALSE;
2499                         continue;
2500                 
2501                 }
2503                 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
2504                 
2505                         if (FirstToken == TRUE){
2506                         
2507                                 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
2508                                 FirstToken = FALSE;
2509                         
2510                         } else {
2511                         
2512                                 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
2513                         
2514                         }
2515                 
2516                 }
2517         
2518         }
2519                 
2520         TelephoneList->insert(std::make_pair(*TelephoneCount, PropertySeg2));
2521         TelephoneListTypeInfo->insert(std::make_pair(*TelephoneCount, TelTypeUI));
2522         
2523         // Add the name token data.
2524         
2525         if (!PropertyTokens.IsEmpty()){
2526         
2527                 TelephoneListTokens->insert(std::make_pair(*TelephoneCount, PropertyTokens));
2528         
2529         }
2533 void ContactDataObject::ProcessLanguage(wxString PropertySeg1, wxString PropertySeg2, int *LanguageCount){
2535         std::map<int, int> SplitPoints;
2536         std::map<int, int> SplitLength;
2538         int intPrevValue = 6;
2539         int intPref = 0;                        
2540         
2541         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
2542         
2543         intPrevValue = 5;
2544         
2545         PropertyType PropType = PROPERTY_NONE;
2546                 
2547         // Look for type before continuing.
2548         
2549         CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
2550         
2551         std::map<int, wxString> *LanguageList = NULL;
2552         std::map<int, wxString> *LanguageListType = NULL;
2553         std::map<int, wxString> *LanguageListAltID = NULL;
2554         std::map<int, wxString> *LanguageListPID = NULL;
2555         std::map<int, wxString> *LanguageListTokens = NULL;
2556         std::map<int, int> *LanguageListPref = NULL;
2558         switch(PropType){
2559                 case PROPERTY_NONE:
2560                         LanguageList = &GeneralLanguageList;
2561                         LanguageListType = &GeneralLanguageListType;
2562                         LanguageListAltID = &GeneralLanguageListAltID;
2563                         LanguageListPID = &GeneralLanguageListPID;
2564                         LanguageListTokens = &GeneralLanguageListTokens;
2565                         LanguageListPref = &GeneralLanguageListPref;    
2566                         break;
2567                 case PROPERTY_HOME:
2568                         LanguageList = &HomeLanguageList;
2569                         LanguageListType = &HomeLanguageListType;
2570                         LanguageListAltID = &HomeLanguageListAltID;
2571                         LanguageListPID = &HomeLanguageListPID;
2572                         LanguageListTokens = &HomeLanguageListTokens;   
2573                         LanguageListPref = &HomeLanguageListPref;       
2574                         break;
2575                 case PROPERTY_WORK:
2576                         LanguageList = &BusinessLanguageList;
2577                         LanguageListType = &BusinessLanguageListType;
2578                         LanguageListAltID = &BusinessLanguageListAltID;
2579                         LanguageListPID = &BusinessLanguageListPID;
2580                         LanguageListTokens = &BusinessLanguageListTokens;       
2581                         LanguageListPref = &BusinessLanguageListPref;
2582                         break;
2583         }
2584         
2585         intPrevValue = 5;
2586         
2587         std::map<int,int>::iterator SLiter;
2588         wxString PropertyData;
2589         wxString PropertyName;
2590         wxString PropertyValue;
2591         wxString PropertyTokens;
2592         bool FirstToken = TRUE;
2593         bool PropertyMatched = FALSE;
2594         
2595         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
2596         intiter != SplitPoints.end(); ++intiter){
2597         
2598                 SLiter = SplitLength.find(intiter->first);
2599         
2600                 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
2601                 
2602                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
2603                 PropertyName = PropertyElement.GetNextToken();                          
2604                 PropertyValue = PropertyElement.GetNextToken();
2605                 
2606                 intPrevValue = intiter->second;
2607                 
2608                 CaptureString(&PropertyValue, FALSE);
2609                 
2610                 // Process properties.
2611                 
2612                 ProcessStringValue(&PropertyName, "ALTID", LanguageListAltID, &PropertyValue, LanguageCount, &PropertyMatched);
2613                 ProcessStringValue(&PropertyName, "PID", LanguageListPID, &PropertyValue, LanguageCount, &PropertyMatched);
2614                 ProcessIntegerValue(&PropertyName, "PREF", LanguageListPref, &PropertyValue, LanguageCount, &PropertyMatched);
2616                 if (PropertyMatched == TRUE){
2617                 
2618                         PropertyMatched = FALSE;
2619                         continue;
2620                 
2621                 }
2622                 
2623                 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
2624                 
2625                         if (FirstToken == TRUE){
2626                         
2627                                 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
2628                                 FirstToken = FALSE;
2629                         
2630                         } else {
2631                         
2632                                 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
2633                         
2634                         }
2635                 
2636                 }
2637         
2638         }
2639                 
2640         LanguageList->insert(std::make_pair(*LanguageCount, PropertySeg2));
2641         
2642         // Add the name token data.
2643         
2644         if (!PropertyTokens.IsEmpty()){
2645         
2646                 LanguageListTokens->insert(std::make_pair(*LanguageCount, PropertyTokens));
2647         
2648         }
2652 void ContactDataObject::ProcessGeographic(wxString PropertySeg1, wxString PropertySeg2, int *GeographicCount){
2654         std::map<int, int> SplitPoints;
2655         std::map<int, int> SplitLength;
2657         int intPrevValue = 5;
2658         int intPref = 0;                        
2659         
2660         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
2661         
2662         intPrevValue = 4;
2663         
2664         PropertyType PropType = PROPERTY_NONE;
2665                 
2666         // Look for type before continuing.
2667         
2668         CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
2669         
2670         std::map<int, wxString> *GeopositionList = NULL;
2671         std::map<int, wxString> *GeopositionListType = NULL;
2672         std::map<int, wxString> *GeopositionListAltID = NULL;
2673         std::map<int, wxString> *GeopositionListPID = NULL;
2674         std::map<int, wxString> *GeopositionListTokens = NULL;
2675         std::map<int, wxString> *GeopositionListMediatype = NULL;
2676         std::map<int, int> *GeopositionListPref = NULL;
2678         switch(PropType){
2679                 case PROPERTY_NONE:
2680                         GeopositionList = &GeneralGeographyList;
2681                         GeopositionListType = &GeneralGeographyListType;
2682                         GeopositionListAltID = &GeneralGeographyListAltID;
2683                         GeopositionListPID = &GeneralGeographyListPID;
2684                         GeopositionListTokens = &GeneralGeographyListTokens;
2685                         GeopositionListMediatype = &GeneralGeographyListMediatype;
2686                         GeopositionListPref = &GeneralGeographyListPref;        
2687                         break;
2688                 case PROPERTY_HOME:
2689                         GeopositionList = &HomeGeographyList;
2690                         GeopositionListType = &HomeGeographyListType;
2691                         GeopositionListAltID = &HomeGeographyListAltID;
2692                         GeopositionListPID = &HomeGeographyListPID;
2693                         GeopositionListTokens = &HomeGeographyListTokens;
2694                         GeopositionListMediatype = &HomeGeographyListMediatype;
2695                         GeopositionListPref = &HomeGeographyListPref;   
2696                         break;
2697                 case PROPERTY_WORK:
2698                         GeopositionList = &BusinessGeographyList;
2699                         GeopositionListType = &BusinessGeographyListType;
2700                         GeopositionListAltID = &BusinessGeographyListAltID;
2701                         GeopositionListPID = &BusinessGeographyListPID;
2702                         GeopositionListTokens = &BusinessGeographyListTokens;
2703                         GeopositionListMediatype = &BusinessGeographyListMediatype;     
2704                         GeopositionListPref = &BusinessGeographyListPref;
2705                         break;
2706         }
2707         
2708         intPrevValue = 4;
2709         
2710         std::map<int,int>::iterator SLiter;
2711         wxString PropertyData;
2712         wxString PropertyName;
2713         wxString PropertyValue;
2714         wxString PropertyTokens;
2715         bool FirstToken = TRUE;
2716         
2717         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
2718         intiter != SplitPoints.end(); ++intiter){
2719         
2720                 SLiter = SplitLength.find(intiter->first);
2721         
2722                 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
2723                 
2724                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
2725                 PropertyName = PropertyElement.GetNextToken();                          
2726                 PropertyValue = PropertyElement.GetNextToken();
2727                 
2728                 intPrevValue = intiter->second;
2729                 
2730                 CaptureString(&PropertyValue, FALSE);
2731                 
2732                 // Process properties.
2733                 
2734                 if (PropertyName == wxT("ALTID")){
2736                         GeopositionListAltID->erase(*GeographicCount);
2737                         GeopositionListAltID->insert(std::make_pair(*GeographicCount, PropertyValue));
2738                 
2739                 } else if (PropertyName == wxT("PID")){
2741                         GeopositionListPID->erase(*GeographicCount);
2742                         GeopositionListPID->insert(std::make_pair(*GeographicCount, PropertyValue));
2743                 
2744                 } else if (PropertyName == wxT("MEDIATYPE")){
2746                         GeopositionListMediatype->erase(*GeographicCount);
2747                         GeopositionListMediatype->insert(std::make_pair(*GeographicCount, PropertyValue));
2748                 
2749                 } else if (PropertyName == wxT("PREF")){
2751                         ProcessIntegerValue(GeopositionListPref, &PropertyValue, GeographicCount);
2752                 
2753                 } else {
2754                 
2755                         if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
2756                         
2757                                 if (FirstToken == TRUE){
2758                                 
2759                                         PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
2760                                         FirstToken = FALSE;
2761                                 
2762                                 } else {
2763                                 
2764                                         PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
2765                                 
2766                                 }
2767                         
2768                         }
2769                 
2770                 }
2771         
2772         }
2773                 
2774         GeopositionList->insert(std::make_pair(*GeographicCount, PropertySeg2));
2775         
2776         // Add the name token data.
2777         
2778         if (!PropertyTokens.IsEmpty()){
2779         
2780                 GeopositionListTokens->insert(std::make_pair(*GeographicCount, PropertyTokens));
2781         
2782         }
2786 void ContactDataObject::ProcessRelated(wxString PropertySeg1, wxString PropertySeg2, int *RelatedCount){
2788         size_t intPropertyLen = PropertySeg1.Len();
2789         std::map<int, int> SplitPoints;
2790         std::map<int, int> SplitLength;
2791         std::map<int, int>::iterator SLiter;                    
2792         wxString PropertyData;
2793         wxString PropertyName;
2794         wxString PropertyValue;
2795         wxString PropertyTokens;
2796         wxString RelatedType;
2797         wxString RelatedTypeOriginal;                   
2798         wxString RelatedName;
2799         bool FirstToken = TRUE;                 
2800         int intSplitsFound = 0;
2801         int intSplitSize = 0;
2802         int intPrevValue = 9;
2803         int intPref = 0;
2804         long ListCtrlIndex;
2805         
2806         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
2807         
2808         intPrevValue = 8;
2809         
2810         // Look for type before continuing.
2811         
2812         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
2813         intiter != SplitPoints.end(); ++intiter){
2814         
2815                 SLiter = SplitLength.find(intiter->first);
2816         
2817                 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
2818                 
2819                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
2820                 PropertyName = PropertyElement.GetNextToken();                          
2821                 PropertyValue = PropertyElement.GetNextToken();
2822                 
2823                 intPrevValue = intiter->second;
2824                 
2825                 // Process these.
2826                 
2827                 RelatedTypeOriginal = PropertyValue;
2828                 
2829                 if (PropertyName == wxT("TYPE")){
2830                 
2831                         if (PropertyValue == wxT("contact")){
2833                                 RelatedType = _("Contact");
2835                         } else if (PropertyValue == wxT("acquaintance")){
2837                                 RelatedType = _("Acquaintance");
2839                         } else if (PropertyValue == wxT("friend")){
2841                                 RelatedType = _("Friend");
2843                         } else if (PropertyValue == wxT("met")){
2845                                 RelatedType = _("Met");
2847                         } else if (PropertyValue == wxT("co-worker")){
2849                                 RelatedType = _("Co-worker");
2851                         } else if (PropertyValue == wxT("colleague")){
2853                                 RelatedType = _("Colleague");
2855                         } else if (PropertyValue == wxT("co-resident")){
2857                                 RelatedType = _("Co-resident");
2859                         } else if (PropertyValue == wxT("neighbor")){
2861                                 RelatedType = _("Neighbour");
2863                         } else if (PropertyValue == wxT("child")){
2865                                 RelatedType = _("Child");
2867                         } else if (PropertyValue == wxT("parent")){
2869                                 RelatedType = _("Parent");
2871                         } else if (PropertyValue == wxT("sibling")){
2873                                 RelatedType = _("Sibling");
2875                         } else if (PropertyValue == wxT("spouse")){
2877                                 RelatedType = _("Spouse");
2879                         } else if (PropertyValue == wxT("kin")){
2881                                 RelatedType = _("Kin");
2883                         } else if (PropertyValue == wxT("muse")){
2885                                 RelatedType = _("Muse");
2887                         } else if (PropertyValue == wxT("crush")){
2889                                 RelatedType = _("Crush");
2891                         } else if (PropertyValue == wxT("date")){
2893                                 RelatedType = _("Date");
2895                         } else if (PropertyValue == wxT("sweetheart")){
2897                                 RelatedType = _("Sweetheart");
2899                         } else if (PropertyValue == wxT("me")){
2901                                 RelatedType = _("Me");
2903                         } else if (PropertyValue == wxT("agent")){
2905                                 RelatedType = _("Agent");
2907                         } else if (PropertyValue == wxT("emergency")){
2909                                 RelatedType = _("Emergency");
2911                         } else {
2913                                 RelatedType = PropertyValue;
2915                         }
2916                 
2917                 }
2918         
2919         }
2920         
2921         intPrevValue = 8;                       
2922         
2923         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
2924         intiter != SplitPoints.end(); ++intiter){
2925         
2926                 SLiter = SplitLength.find(intiter->first);
2927         
2928                 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
2929                 
2930                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
2931                 PropertyName = PropertyElement.GetNextToken();                          
2932                 PropertyValue = PropertyElement.GetNextToken();
2933                 
2934                 intPrevValue = intiter->second;
2935                 
2936                 // Process properties.
2937                 
2938                 size_t intPropertyValueLen = PropertyValue.Len();
2939                 
2940                 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
2941                         
2942                         PropertyValue.Trim();
2943                         PropertyValue.RemoveLast();
2944                         
2945                 }                               
2946                 
2947                 if (PropertyValue.Mid(0, 1) == wxT("\"")){
2948                         
2949                         PropertyValue.Remove(0, 1);
2950                         
2951                 }
2952                 
2953                 CaptureString(&PropertyValue, FALSE);
2954                         
2955                 if (PropertyName == wxT("ALTID")){
2957                         GeneralRelatedListAltID.erase(*RelatedCount);
2958                         GeneralRelatedListAltID.insert(std::make_pair(*RelatedCount, PropertyValue));
2959                 
2960                 } else if (PropertyName == wxT("PID")){
2962                         GeneralRelatedListPID.erase(*RelatedCount);
2963                         GeneralRelatedListPID.insert(std::make_pair(*RelatedCount, PropertyValue));
2964                 
2965                 } else if (PropertyName == wxT("PREF")){
2966                         
2967                         int PriorityNumber = 0;
2968                         bool ValidNumber = TRUE;
2969                         
2970                         try{
2971                                 PriorityNumber = std::stoi(PropertyValue.ToStdString());
2972                         }
2973                         
2974                         catch(std::invalid_argument &e){
2975                                 ValidNumber = FALSE;
2976                         }
2978                         if (ValidNumber == TRUE){
2980                                 GeneralRelatedListPref.erase(*RelatedCount);
2981                                 GeneralRelatedListPref.insert(std::make_pair(*RelatedCount, PriorityNumber));
2983                         }
2984                 
2985                 } else if (PropertyName == wxT("LANGUAGE")){
2987                         ProcessIntegerValue(&GeneralRelatedListPref, &PropertyValue, RelatedCount);
2988                 
2989                 } else if (PropertyName != wxT("TYPE")) {
2990                 
2991                         // Something else we don't know about so append
2992                         // to the tokens variable.
2993                 
2994                         if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
2995                 
2996                                 if (FirstToken == TRUE){
2997                         
2998                                         PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
2999                                         FirstToken = FALSE;
3000                         
3001                                 } else {
3002                         
3003                                         PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
3004                         
3005                                 }
3006                 
3007                         }
3008                 
3009                 }
3010         
3011         }                                       
3012         
3013         // Add the data to the General/Home/Work address variables.
3014                                 
3015         GeneralRelatedList.erase(*RelatedCount);
3016         GeneralRelatedListRelType.erase(*RelatedCount);
3017         GeneralRelatedListType.erase(*RelatedCount);
3018         GeneralRelatedListTokens.erase(*RelatedCount);
3019         GeneralRelatedList.insert(std::make_pair(*RelatedCount, PropertySeg2));
3020         GeneralRelatedListRelType.insert(std::make_pair(*RelatedCount, RelatedType));                   
3021         GeneralRelatedListType.insert(std::make_pair(*RelatedCount, RelatedType));
3022         GeneralRelatedListTokens.insert(std::make_pair(*RelatedCount, PropertyTokens));
3026 void ContactDataObject::ProcessURL(wxString PropertySeg1, wxString PropertySeg2, int *URLCount){
3028         std::map<int, int> SplitPoints;
3029         std::map<int, int> SplitLength;
3030         std::map<int, int>::iterator SLiter;                    
3031         wxString PropertyData;
3032         wxString PropertyName;
3033         wxString PropertyValue;
3034         wxString PropertyTokens;
3035         bool FirstToken = TRUE;
3036         int intPrevValue = 5;
3037         int intPref = 0;                        
3038         int intType = 0;
3039         long ListCtrlIndex;
3040         
3041         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
3042         
3043         intPrevValue = 4;
3044         
3045         PropertyType PropType = PROPERTY_NONE;
3046                 
3047         // Look for type before continuing.
3048         
3049         CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
3050         
3051         // Setup the pointers.
3052         
3053         std::map<int, wxString> *WebsiteList = NULL;
3054         std::map<int, wxString> *WebsiteListAltID = NULL;
3055         std::map<int, wxString> *WebsiteListPID = NULL;
3056         std::map<int, wxString> *WebsiteListType = NULL;
3057         std::map<int, wxString> *WebsiteListTokens = NULL;
3058         std::map<int, wxString> *WebsiteListMediatype = NULL;
3059         std::map<int, int> *WebsiteListPref = NULL;
3060         
3061         // Setup blank lines for later on.
3062         
3063         switch(PropType){
3064                 case PROPERTY_NONE:
3065                         WebsiteList = &GeneralWebsiteList;
3066                         WebsiteListType = &GeneralWebsiteListType;
3067                         WebsiteListAltID = &GeneralWebsiteListAltID;
3068                         WebsiteListPID = &GeneralWebsiteListPID;
3069                         WebsiteListTokens = &GeneralWebsiteListTokens;
3070                         WebsiteListMediatype = &GeneralWebsiteListMediatype;
3071                         WebsiteListPref = &GeneralWebsiteListPref;      
3072                         break;
3073                 case PROPERTY_HOME:
3074                         WebsiteList = &HomeWebsiteList;
3075                         WebsiteListType = &HomeWebsiteListType;
3076                         WebsiteListAltID = &HomeWebsiteListAltID;
3077                         WebsiteListPID = &HomeWebsiteListPID;
3078                         WebsiteListTokens = &HomeWebsiteListTokens;
3079                         WebsiteListMediatype = &HomeWebsiteListMediatype;
3080                         WebsiteListPref = &HomeWebsiteListPref; 
3081                         break;
3082                 case PROPERTY_WORK:
3083                         WebsiteList = &BusinessWebsiteList;
3084                         WebsiteListType = &BusinessWebsiteListType;
3085                         WebsiteListAltID = &BusinessWebsiteListAltID;
3086                         WebsiteListPID = &BusinessWebsiteListPID;
3087                         WebsiteListTokens = &BusinessWebsiteListTokens;
3088                         WebsiteListMediatype = &BusinessWebsiteListMediatype;   
3089                         WebsiteListPref = &BusinessWebsiteListPref;
3090                         break;
3091         }
3092         
3093         intPrevValue = 4;
3094         
3095         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
3096         intiter != SplitPoints.end(); ++intiter){
3097         
3098                 SLiter = SplitLength.find(intiter->first);
3099         
3100                 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
3101                 
3102                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
3103                 PropertyName = PropertyElement.GetNextToken();                          
3104                 PropertyValue = PropertyElement.GetNextToken();
3105                 
3106                 intPrevValue = intiter->second;
3107                 
3108                 // Process properties.
3109                 
3110                 size_t intPropertyValueLen = PropertyValue.Len();
3111                 
3112                 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
3113                         
3114                         PropertyValue.Trim();
3115                         PropertyValue.RemoveLast();
3116                         
3117                 }                               
3118                 
3119                 if (PropertyValue.Mid(0, 1) == wxT("\"")){
3120                         
3121                         PropertyValue.Remove(0, 1);
3122                         
3123                 }
3124                 
3125                 CaptureString(&PropertyValue, FALSE);
3126                 
3127                 if (PropertyName == wxT("ALTID")){
3129                         WebsiteListAltID->erase(*URLCount);
3130                         WebsiteListAltID->insert(std::make_pair(*URLCount, PropertyValue));
3131                 
3132                 } else if (PropertyName == wxT("PID")){
3134                         WebsiteListPID->erase(*URLCount);
3135                         WebsiteListPID->insert(std::make_pair(*URLCount, PropertyValue));
3136                         
3137                 } else if (PropertyName == wxT("PREF")){
3139                         ProcessIntegerValue(WebsiteListPref, &PropertyValue, URLCount);
3140                                                         
3141                 } else if (PropertyName == wxT("MEDIATYPE")){
3142                 
3143                         WebsiteListMediatype->erase(*URLCount);
3144                         WebsiteListMediatype->insert(std::make_pair(*URLCount, PropertyValue));
3145                 
3146                 } else {
3147                 
3148                         // Something else we don't know about so append
3149                         // to the tokens variable.
3150                 
3151                         if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
3152                 
3153                                 if (FirstToken == TRUE){
3154                         
3155                                         PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
3156                                         FirstToken = FALSE;
3157                         
3158                                 } else {
3159                         
3160                                         PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
3161                         
3162                                 }
3163                 
3164                         }
3165                 
3166                 }
3167         
3168         }
3169         
3170         // Add the data to the General/Home/Work address variables.
3171         
3172         CaptureString(&PropertySeg2, FALSE);
3173                         
3174         WebsiteList->insert(std::make_pair(*URLCount, PropertySeg2));
3175         
3176         if (!PropertyTokens.IsEmpty()){
3177         
3178                 WebsiteListTokens->insert(std::make_pair(*URLCount, PropertyTokens));
3179                         
3180         }
3181         
3184 void ContactDataObject::ProcessTitle(wxString PropertySeg1, wxString PropertySeg2, int *TitleCount){
3186         std::map<int, int> SplitPoints;
3187         std::map<int, int> SplitLength;
3188         std::map<int, int>::iterator SLiter;                    
3189         wxString PropertyData;
3190         wxString PropertyName;
3191         wxString PropertyValue;
3192         wxString PropertyTokens;
3193         bool FirstToken = TRUE;
3194         int intPrevValue = 7;
3195         int intPref = 0;                        
3196         int intType = 0;
3197         long ListCtrlIndex;
3198         
3199         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
3200         
3201         intPrevValue = 6;
3202         
3203         PropertyType PropType = PROPERTY_NONE;
3204                 
3205         // Look for type before continuing.
3206         
3207         CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
3208         
3209         // Setup the pointers.
3210         
3211         std::map<int, wxString> *TitleList = NULL;
3212         std::map<int, wxString> *TitleListAltID = NULL;
3213         std::map<int, wxString> *TitleListPID = NULL;
3214         std::map<int, wxString> *TitleListType = NULL;
3215         std::map<int, wxString> *TitleListTokens = NULL;
3216         std::map<int, wxString> *TitleListLanguage = NULL;
3217         std::map<int, int> *TitleListPref = NULL;
3218         
3219         // Setup blank lines for later on.
3220         
3221         switch(PropType){
3222                 case PROPERTY_NONE:
3223                         TitleList = &GeneralTitleList;
3224                         TitleListType = &GeneralTitleListType;
3225                         TitleListAltID = &GeneralTitleListAltID;
3226                         TitleListPID = &GeneralTitleListPID;
3227                         TitleListTokens = &GeneralTitleListTokens;
3228                         TitleListLanguage = &GeneralTitleListLanguage;
3229                         TitleListPref = &GeneralTitleListPref;  
3230                         break;
3231                 case PROPERTY_HOME:
3232                         TitleList = &HomeTitleList;
3233                         TitleListType = &HomeTitleListType;
3234                         TitleListAltID = &HomeTitleListAltID;
3235                         TitleListPID = &HomeTitleListPID;
3236                         TitleListTokens = &HomeTitleListTokens;
3237                         TitleListLanguage = &HomeTitleListLanguage;
3238                         TitleListPref = &HomeTitleListPref;     
3239                         break;
3240                 case PROPERTY_WORK:
3241                         TitleList = &BusinessTitleList;
3242                         TitleListType = &BusinessTitleListType;
3243                         TitleListAltID = &BusinessTitleListAltID;
3244                         TitleListPID = &BusinessTitleListPID;
3245                         TitleListTokens = &BusinessTitleListTokens;
3246                         TitleListLanguage = &BusinessTitleListLanguage; 
3247                         TitleListPref = &BusinessTitleListPref;
3248                         break;
3249         }
3251         intPrevValue = 6;
3252                 
3253         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
3254         intiter != SplitPoints.end(); ++intiter){
3255         
3256                 SLiter = SplitLength.find(intiter->first);
3257         
3258                 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
3259                 
3260                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
3261                 PropertyName = PropertyElement.GetNextToken();                          
3262                 PropertyValue = PropertyElement.GetNextToken();
3263                 
3264                 intPrevValue = intiter->second;
3265                 
3266                 // Process properties.
3267                 
3268                 size_t intPropertyValueLen = PropertyValue.Len();
3269                 
3270                 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
3271                         
3272                         PropertyValue.Trim();
3273                         PropertyValue.RemoveLast();
3274                         
3275                 }                               
3276                 
3277                 if (PropertyValue.Mid(0, 1) == wxT("\"")){
3278                         
3279                         PropertyValue.Remove(0, 1);
3280                         
3281                 }                               
3282                 
3283                 CaptureString(&PropertyValue, FALSE);
3284                 
3285                 if (PropertyName == wxT("ALTID")){
3286                 
3287                         TitleListAltID->erase(*TitleCount);
3288                         TitleListAltID->insert(std::make_pair(*TitleCount, PropertyValue));
3289                 
3290                 } else if (PropertyName == wxT("PID")){
3292                         TitleListPID->erase(*TitleCount);
3293                         TitleListPID->insert(std::make_pair(*TitleCount, PropertyValue));
3294                 
3295                 } else if (PropertyName == wxT("PREF")){
3297                         ProcessIntegerValue(TitleListPref, &PropertyValue, TitleCount);
3298                         
3299                 } else if (PropertyName == wxT("LANGUAGE")){
3300                 
3301                         TitleListLanguage->erase(*TitleCount);
3302                         TitleListLanguage->insert(std::make_pair(*TitleCount, PropertyValue));
3303                 
3304                 } else {
3305                 
3306                         // Something else we don't know about so append
3307                         // to the tokens variable.
3308                 
3309                         if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
3310                 
3311                                 if (FirstToken == TRUE){
3312                         
3313                                         PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
3314                                         FirstToken = FALSE;
3315                         
3316                                 } else {
3317                         
3318                                         PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
3319                         
3320                                 }
3321                 
3322                         }
3323                 
3324                 }
3325         
3326         }
3327         
3328         // Add the data to the General/Home/Work address variables.
3329         
3330         CaptureString(&PropertySeg2, FALSE);
3332         TitleList->insert(std::make_pair(*TitleCount, PropertySeg2));
3333         
3334         if (!PropertyTokens.IsEmpty()){
3335         
3336                 TitleListTokens->insert(std::make_pair(*TitleCount, PropertyTokens));
3337                         
3338         }
3342 void ContactDataObject::ProcessRole(wxString PropertySeg1, wxString PropertySeg2, int *RoleCount){
3344         std::map<int, int> SplitPoints;
3345         std::map<int, int> SplitLength;
3346         std::map<int, int>::iterator SLiter;                    
3347         wxString PropertyData;
3348         wxString PropertyName;
3349         wxString PropertyValue;
3350         wxString PropertyTokens;
3351         bool FirstToken = TRUE;
3352         int intPrevValue = 6;
3353         int intPref = 0;                        
3354         int intType = 0;
3355         long ListCtrlIndex;
3356         
3357         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
3358         
3359         intPrevValue = 5;
3360         
3361         PropertyType PropType = PROPERTY_NONE;
3362                 
3363         // Look for type before continuing.
3364         
3365         CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
3366         
3367         // Setup the pointers.
3368         
3369         std::map<int, wxString> *RoleList = NULL;
3370         std::map<int, wxString> *RoleListAltID = NULL;
3371         std::map<int, wxString> *RoleListPID = NULL;
3372         std::map<int, wxString> *RoleListType = NULL;
3373         std::map<int, wxString> *RoleListTokens = NULL;
3374         std::map<int, wxString> *RoleListLanguage = NULL;
3375         std::map<int, int> *RoleListPref = NULL;
3376         
3377         // Setup blank lines for later on.
3378         
3379         switch(PropType){
3380                 case PROPERTY_NONE:
3381                         RoleList = &GeneralRoleList;
3382                         RoleListType = &GeneralRoleListType;
3383                         RoleListAltID = &GeneralRoleListAltID;
3384                         RoleListPID = &GeneralRoleListPID;
3385                         RoleListTokens = &GeneralRoleListTokens;
3386                         RoleListLanguage = &GeneralRoleListLanguage;
3387                         RoleListPref = &GeneralRoleListPref;    
3388                         break;
3389                 case PROPERTY_HOME:
3390                         RoleList = &HomeRoleList;
3391                         RoleListType = &HomeRoleListType;
3392                         RoleListAltID = &HomeRoleListAltID;
3393                         RoleListPID = &HomeRoleListPID;
3394                         RoleListTokens = &HomeRoleListTokens;
3395                         RoleListLanguage = &HomeRoleListLanguage;
3396                         RoleListPref = &HomeRoleListPref;       
3397                         break;
3398                 case PROPERTY_WORK:
3399                         RoleList = &BusinessRoleList;
3400                         RoleListType = &BusinessRoleListType;
3401                         RoleListAltID = &BusinessRoleListAltID;
3402                         RoleListPID = &BusinessRoleListPID;
3403                         RoleListTokens = &BusinessRoleListTokens;
3404                         RoleListLanguage = &BusinessRoleListLanguage;   
3405                         RoleListPref = &BusinessRoleListPref;
3406                         break;
3407         }
3409         intPrevValue = 5;
3410                 
3411         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
3412         intiter != SplitPoints.end(); ++intiter){
3413         
3414                 SLiter = SplitLength.find(intiter->first);
3415         
3416                 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
3417                 
3418                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
3419                 PropertyName = PropertyElement.GetNextToken();                          
3420                 PropertyValue = PropertyElement.GetNextToken();
3421                 
3422                 intPrevValue = intiter->second;
3423                 
3424                 // Process properties.
3425                 
3426                 size_t intPropertyValueLen = PropertyValue.Len();
3427                 
3428                 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
3429                         
3430                         PropertyValue.Trim();
3431                         PropertyValue.RemoveLast();
3432                         
3433                 }                               
3434                 
3435                 if (PropertyValue.Mid(0, 1) == wxT("\"")){
3436                         
3437                         PropertyValue.Remove(0, 1);
3438                         
3439                 }                               
3440                 
3441                 CaptureString(&PropertyValue, FALSE);
3442                 
3443                 if (PropertyName == wxT("ALTID")){
3444                 
3445                         RoleListAltID->erase(*RoleCount);
3446                         RoleListAltID->insert(std::make_pair(*RoleCount, PropertyValue));
3447                 
3448                 } else if (PropertyName == wxT("PID")){
3450                         RoleListPID->erase(*RoleCount);
3451                         RoleListPID->insert(std::make_pair(*RoleCount, PropertyValue));
3452                 
3453                 } else if (PropertyName == wxT("PREF")){
3455                         ProcessIntegerValue(RoleListPref, &PropertyValue, RoleCount);
3456                                 
3457                 } else if (PropertyName == wxT("LANGUAGE")){
3458                 
3459                         RoleListLanguage->erase(*RoleCount);
3460                         RoleListLanguage->insert(std::make_pair(*RoleCount, PropertyValue));
3461                 
3462                 } else {
3463                 
3464                         // Something else we don't know about so append
3465                         // to the tokens variable.
3466                 
3467                         if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
3468                 
3469                                 if (FirstToken == TRUE){
3470                         
3471                                         PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
3472                                         FirstToken = FALSE;
3473                         
3474                                 } else {
3475                         
3476                                         PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
3477                         
3478                                 }
3479                 
3480                         }
3481                 
3482                 }
3483         
3484         }
3485         
3486         // Add the data to the General/Home/Work address variables.
3487         
3488         CaptureString(&PropertySeg2, FALSE);
3490         RoleList->insert(std::make_pair(*RoleCount, PropertySeg2));
3491         
3492         if (!PropertyTokens.IsEmpty()){
3493         
3494                 RoleListTokens->insert(std::make_pair(*RoleCount, PropertyTokens));
3495                         
3496         }
3500 void ContactDataObject::ProcessOrganisation(wxString PropertySeg1, wxString PropertySeg2, int *OrganisationCount){
3502         std::map<int, int> SplitPoints;
3503         std::map<int, int> SplitLength;
3504         std::map<int, int>::iterator SLiter;                    
3505         wxString PropertyData;
3506         wxString PropertyName;
3507         wxString PropertyValue;
3508         wxString PropertyTokens;
3509         bool FirstToken = TRUE;
3510         int intPrevValue = 5;
3511         int intPref = 0;                        
3512         int intType = 0;
3513         long ListCtrlIndex;
3514         
3515         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
3516         
3517         intPrevValue = 4;
3518         
3519         PropertyType PropType = PROPERTY_NONE;
3520                 
3521         // Look for type before continuing.
3522         
3523         CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
3524         
3525         // Setup the pointers.
3526         
3527         std::map<int, wxString> *OrganisationsList = NULL;
3528         std::map<int, wxString> *OrganisationsListAltID = NULL;
3529         std::map<int, wxString> *OrganisationsListPID = NULL;
3530         std::map<int, wxString> *OrganisationsListType = NULL;
3531         std::map<int, wxString> *OrganisationsListTokens = NULL;
3532         std::map<int, wxString> *OrganisationsListLanguage = NULL;
3533         std::map<int, wxString> *OrganisationsListSortAs = NULL;
3534         std::map<int, int> *OrganisationsListPref = NULL;
3535         
3536         // Setup blank lines for later on.
3537         
3538         switch(PropType){
3539                 case PROPERTY_NONE:
3540                         OrganisationsList = &GeneralOrganisationsList;
3541                         OrganisationsListType = &GeneralOrganisationsListType;
3542                         OrganisationsListAltID = &GeneralOrganisationsListAltID;
3543                         OrganisationsListPID = &GeneralOrganisationsListPID;
3544                         OrganisationsListTokens = &GeneralOrganisationsListTokens;
3545                         OrganisationsListLanguage = &GeneralOrganisationsListLanguage;
3546                         OrganisationsListSortAs = &GeneralOrganisationsListSortAs;
3547                         OrganisationsListPref = &GeneralOrganisationsListPref;  
3548                         break;
3549                 case PROPERTY_HOME:
3550                         OrganisationsList = &HomeOrganisationsList;
3551                         OrganisationsListType = &HomeOrganisationsListType;
3552                         OrganisationsListAltID = &HomeOrganisationsListAltID;
3553                         OrganisationsListPID = &HomeOrganisationsListPID;
3554                         OrganisationsListTokens = &HomeOrganisationsListTokens;
3555                         OrganisationsListLanguage = &HomeOrganisationsListLanguage;
3556                         OrganisationsListSortAs = &HomeOrganisationsListSortAs;
3557                         OrganisationsListPref = &HomeOrganisationsListPref;     
3558                         break;
3559                 case PROPERTY_WORK:
3560                         OrganisationsList = &BusinessOrganisationsList;
3561                         OrganisationsListType = &BusinessOrganisationsListType;
3562                         OrganisationsListAltID = &BusinessOrganisationsListAltID;
3563                         OrganisationsListPID = &BusinessOrganisationsListPID;
3564                         OrganisationsListTokens = &BusinessOrganisationsListTokens;
3565                         OrganisationsListLanguage = &BusinessOrganisationsListLanguage;
3566                         OrganisationsListSortAs = &BusinessOrganisationsListSortAs;     
3567                         OrganisationsListPref = &BusinessOrganisationsListPref;
3568                         break;
3569         }
3571         intPrevValue = 4;
3572                 
3573         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
3574         intiter != SplitPoints.end(); ++intiter){
3575         
3576                 SLiter = SplitLength.find(intiter->first);
3577         
3578                 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
3579                 
3580                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
3581                 PropertyName = PropertyElement.GetNextToken();                          
3582                 PropertyValue = PropertyElement.GetNextToken();
3583                 
3584                 intPrevValue = intiter->second;
3585                 
3586                 // Process properties.
3587                 
3588                 size_t intPropertyValueLen = PropertyValue.Len();
3589                 
3590                 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
3591                         
3592                         PropertyValue.Trim();
3593                         PropertyValue.RemoveLast();
3594                         
3595                 }                               
3596                 
3597                 if (PropertyValue.Mid(0, 1) == wxT("\"")){
3598                         
3599                         PropertyValue.Remove(0, 1);
3600                         
3601                 }                               
3602                 
3603                 CaptureString(&PropertyValue, FALSE);
3604                 
3605                 if (PropertyName == wxT("ALTID")){
3606                 
3607                         OrganisationsListAltID->erase(*OrganisationCount);
3608                         OrganisationsListAltID->insert(std::make_pair(*OrganisationCount, PropertyValue));
3609                 
3610                 } else if (PropertyName == wxT("PID")){
3612                         OrganisationsListPID->erase(*OrganisationCount);
3613                         OrganisationsListPID->insert(std::make_pair(*OrganisationCount, PropertyValue));
3614                 
3615                 } else if (PropertyName == wxT("SORT-AS")){
3617                         OrganisationsListSortAs->erase(*OrganisationCount);
3618                         OrganisationsListSortAs->insert(std::make_pair(*OrganisationCount, PropertyValue));
3619                 
3620                 } else if (PropertyName == wxT("PREF")){
3622                         ProcessIntegerValue(OrganisationsListPref, &PropertyValue, OrganisationCount);
3623                         
3624                 } else if (PropertyName == wxT("LANGUAGE")){
3625                 
3626                         OrganisationsListLanguage->erase(*OrganisationCount);
3627                         OrganisationsListLanguage->insert(std::make_pair(*OrganisationCount, PropertyValue));
3628                 
3629                 } else {
3630                 
3631                         // Something else we don't know about so append
3632                         // to the tokens variable.
3633                 
3634                         if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
3635                 
3636                                 if (FirstToken == TRUE){
3637                         
3638                                         PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
3639                                         FirstToken = FALSE;
3640                         
3641                                 } else {
3642                         
3643                                         PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
3644                         
3645                                 }
3646                 
3647                         }
3648                 
3649                 }
3650         
3651         }
3652         
3653         // Add the data to the General/Home/Work address variables.
3654         
3655         CaptureString(&PropertySeg2, FALSE);
3657         OrganisationsList->insert(std::make_pair(*OrganisationCount, PropertySeg2));
3658         
3659         if (!PropertyTokens.IsEmpty()){
3660         
3661                 OrganisationsListTokens->insert(std::make_pair(*OrganisationCount, PropertyTokens));
3662                         
3663         }
3667 void ContactDataObject::ProcessNote(wxString PropertySeg1, wxString PropertySeg2, int *NoteCount){
3669         std::map<int, int> SplitPoints;
3670         std::map<int, int> SplitLength;
3671         std::map<int, int>::iterator SLiter;                    
3672         wxString PropertyData;
3673         wxString PropertyName;
3674         wxString PropertyValue;
3675         wxString PropertyTokens;
3676         bool FirstToken = TRUE;
3677         int intPrevValue = 6;
3678         int intPref = 0;                        
3679         int intType = 0;
3680         long ListCtrlIndex;
3681         
3682         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
3683         
3684         intPrevValue = 5;
3685         
3686         PropertyType PropType = PROPERTY_NONE;
3687                 
3688         // Look for type before continuing.
3689         
3690         CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
3691         
3692         // Setup the pointers.
3693         
3694         std::map<int, wxString> *NoteList = NULL;
3695         std::map<int, wxString> *NoteListAltID = NULL;
3696         std::map<int, wxString> *NoteListPID = NULL;
3697         std::map<int, wxString> *NoteListType = NULL;
3698         std::map<int, wxString> *NoteListTokens = NULL;
3699         std::map<int, wxString> *NoteListLanguage = NULL;
3700         std::map<int, int> *NoteListPref = NULL;
3701         
3702         // Setup blank lines for later on.
3703         
3704         switch(PropType){
3705                 case PROPERTY_NONE:
3706                         NoteList = &GeneralNoteList;
3707                         NoteListType = &GeneralNoteListType;
3708                         NoteListAltID = &GeneralNoteListAltID;
3709                         NoteListPID = &GeneralNoteListPID;
3710                         NoteListTokens = &GeneralNoteListTokens;
3711                         NoteListLanguage = &GeneralNoteListLanguage;
3712                         NoteListPref = &GeneralNoteListPref;    
3713                         break;
3714                 case PROPERTY_HOME:
3715                         NoteList = &HomeNoteList;
3716                         NoteListType = &HomeNoteListType;
3717                         NoteListAltID = &HomeNoteListAltID;
3718                         NoteListPID = &HomeNoteListPID;
3719                         NoteListTokens = &HomeNoteListTokens;
3720                         NoteListLanguage = &HomeNoteListLanguage;
3721                         NoteListPref = &HomeNoteListPref;       
3722                         break;
3723                 case PROPERTY_WORK:
3724                         NoteList = &BusinessNoteList;
3725                         NoteListType = &BusinessNoteListType;
3726                         NoteListAltID = &BusinessNoteListAltID;
3727                         NoteListPID = &BusinessNoteListPID;
3728                         NoteListTokens = &BusinessNoteListTokens;
3729                         NoteListLanguage = &BusinessNoteListLanguage;   
3730                         NoteListPref = &BusinessNoteListPref;
3731                         break;
3732         }
3734         intPrevValue = 5;
3735                 
3736         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
3737         intiter != SplitPoints.end(); ++intiter){
3738         
3739                 SLiter = SplitLength.find(intiter->first);
3740         
3741                 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
3742                 
3743                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
3744                 PropertyName = PropertyElement.GetNextToken();                          
3745                 PropertyValue = PropertyElement.GetNextToken();
3746                 
3747                 intPrevValue = intiter->second;
3748                 
3749                 // Process properties.
3750                 
3751                 size_t intPropertyValueLen = PropertyValue.Len();
3752                 
3753                 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
3754                         
3755                         PropertyValue.Trim();
3756                         PropertyValue.RemoveLast();
3757                         
3758                 }                               
3759                 
3760                 if (PropertyValue.Mid(0, 1) == wxT("\"")){
3761                         
3762                         PropertyValue.Remove(0, 1);
3763                         
3764                 }                               
3765                 
3766                 CaptureString(&PropertyValue, FALSE);
3767                 
3768                 if (PropertyName == wxT("ALTID")){
3769                 
3770                         NoteListAltID->erase(*NoteCount);
3771                         NoteListAltID->insert(std::make_pair(*NoteCount, PropertyValue));
3772                 
3773                 } else if (PropertyName == wxT("PID")){
3775                         NoteListPID->erase(*NoteCount);
3776                         NoteListPID->insert(std::make_pair(*NoteCount, PropertyValue));
3777                 
3778                 } else if (PropertyName == wxT("PREF")){
3780                         ProcessIntegerValue(NoteListPref, &PropertyValue, NoteCount);
3781                 
3782                 } else if (PropertyName == wxT("LANGUAGE")){
3783                 
3784                         NoteListLanguage->erase(*NoteCount);
3785                         NoteListLanguage->insert(std::make_pair(*NoteCount, PropertyValue));
3786                 
3787                 } else {
3788                 
3789                         // Something else we don't know about so append
3790                         // to the tokens variable.
3791                 
3792                         if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
3793                 
3794                                 if (FirstToken == TRUE){
3795                         
3796                                         PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
3797                                         FirstToken = FALSE;
3798                         
3799                                 } else {
3800                         
3801                                         PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
3802                         
3803                                 }
3804                 
3805                         }
3806                 
3807                 }
3808         
3809         }
3810         
3811         // Add the data to the General/Home/Work address variables.
3812         
3813         CaptureString(&PropertySeg2, FALSE);
3815         NoteList->insert(std::make_pair(*NoteCount, PropertySeg2));
3816         
3817         if (!PropertyTokens.IsEmpty()){
3818         
3819                 NoteListTokens->insert(std::make_pair(*NoteCount, PropertyTokens));
3820                         
3821         }
3825 void ContactDataObject::ProcessCategory(wxString PropertySeg1, wxString PropertySeg2, int *CategoryCount){
3827         std::map<int, int> SplitPoints;
3828         std::map<int, int> SplitLength;
3829         std::map<int, int>::iterator SLiter;                    
3830         wxString PropertyData;
3831         wxString PropertyName;
3832         wxString PropertyValue;
3833         wxString PropertyTokens;
3834         bool FirstToken = TRUE;
3835         int intPrevValue = 12;
3836         int intPref = 0;                        
3837         int intType = 0;
3838         long ListCtrlIndex;
3839         
3840         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
3841         
3842         intPrevValue = 11;
3843         
3844         PropertyType PropType = PROPERTY_NONE;
3845                 
3846         // Look for type before continuing.
3847         
3848         CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
3849         
3850         // Setup blank lines for later on.
3851         
3852         switch(PropType){
3853                 case PROPERTY_NONE:
3854                         break;
3855                 case PROPERTY_HOME:
3856                         CategoriesListType.insert(std::make_pair(*CategoryCount, "home"));
3857                         break;
3858                 case PROPERTY_WORK:
3859                         CategoriesListType.insert(std::make_pair(*CategoryCount, "work"));
3860                         break;
3861         }
3863         intPrevValue = 11;
3864                 
3865         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
3866         intiter != SplitPoints.end(); ++intiter){
3867         
3868                 SLiter = SplitLength.find(intiter->first);
3869         
3870                 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
3871                 
3872                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
3873                 PropertyName = PropertyElement.GetNextToken();                          
3874                 PropertyValue = PropertyElement.GetNextToken();
3875                 
3876                 intPrevValue = intiter->second;
3877                 
3878                 // Process properties.
3879                 
3880                 size_t intPropertyValueLen = PropertyValue.Len();
3881                 
3882                 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
3883                         
3884                         PropertyValue.Trim();
3885                         PropertyValue.RemoveLast();
3886                         
3887                 }                               
3888                 
3889                 if (PropertyValue.Mid(0, 1) == wxT("\"")){
3890                         
3891                         PropertyValue.Remove(0, 1);
3892                         
3893                 }                               
3894                 
3895                 CaptureString(&PropertyValue, FALSE);
3896                 
3897                 if (PropertyName == wxT("ALTID")){
3898                 
3899                         CategoriesListAltID.erase(*CategoryCount);
3900                         CategoriesListAltID.insert(std::make_pair(*CategoryCount, PropertyValue));
3901                 
3902                 } else if (PropertyName == wxT("PID")){
3904                         CategoriesListPID.erase(*CategoryCount);
3905                         CategoriesListPID.insert(std::make_pair(*CategoryCount, PropertyValue));
3906                 
3907                 } else if (PropertyName == wxT("PREF")){
3909                         ProcessIntegerValue(&CategoriesListPref, &PropertyValue, CategoryCount);
3910                         
3911                 } else if (PropertyName == wxT("LANGUAGE")){
3912                 
3913                         CategoriesListLanguage.erase(*CategoryCount);
3914                         CategoriesListLanguage.insert(std::make_pair(*CategoryCount, PropertyValue));
3915                 
3916                 } else {
3917                 
3918                         // Something else we don't know about so append
3919                         // to the tokens variable.
3920                 
3921                         if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
3922                 
3923                                 if (FirstToken == TRUE){
3924                         
3925                                         PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
3926                                         FirstToken = FALSE;
3927                         
3928                                 } else {
3929                         
3930                                         PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
3931                         
3932                                 }
3933                 
3934                         }
3935                 
3936                 }
3937         
3938         }
3939         
3940         // Deal with multiple categories.
3941         
3942         int intOrigCatCount = *CategoryCount;
3943         bool FirstCategoryProcessed = TRUE;
3944         bool AfterFirstToken = FALSE;
3945         int intSplitSize = 0;
3946         int intSplitsFound = 0;
3947         int intSplitSeek = 0;
3948         int intPropertyLen = PropertySeg2.Len();
3949         
3950         SplitPoints.clear();
3951         SplitLength.clear();
3952         intPrevValue = 0;
3953         
3954         for (int i = 0; i <= intPropertyLen; i++){
3955         
3956                 if (intSplitSize == 0 && PropertySeg2.Mid(i, 1) == wxT(" ")){
3957         
3958                         continue;
3959                 
3960                 }
3961         
3962                 intSplitSize++;
3963         
3964                 if (PropertySeg2.Mid(i, 1) == wxT(",") && PropertySeg2.Mid((i - 1), 1) != wxT("\\")){
3965         
3966                         if (AfterFirstToken == TRUE){
3967                 
3968                                 SplitPoints.insert(std::make_pair(intSplitsFound, (i - intSplitSize + 1)));
3969                                 SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 2)));
3970                         
3971                         } else {
3972                         
3973                                 SplitPoints.insert(std::make_pair(intSplitsFound, 0));
3974                                 SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 2)));                                 
3975                                 AfterFirstToken = TRUE;
3977                         }
3979                         intSplitsFound++;
3980                         intSplitSeek = i;
3981                         intSplitSize = 0;                               
3982         
3983                 }                       
3984         
3985         }
3986         
3987         if (SplitPoints.size() > 0){
3988         
3989                 SplitPoints.insert(std::make_pair(intSplitsFound, (intSplitSeek + 1)));
3990                 SplitLength.insert(std::make_pair(intSplitsFound, intSplitSize));
3991         
3992         }
3993         
3994         if (SplitPoints.size() == 0){
3995         
3996                 CategoriesList.insert(std::make_pair(*CategoryCount, PropertySeg2));
3997         
3998                 if (!PropertyTokens.IsEmpty()){
3999                 
4000                         CategoriesListTokens.insert(std::make_pair(*CategoryCount, PropertyTokens));
4001                 
4002                 }
4003         
4004         }
4005         
4006         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
4007         intiter != SplitPoints.end(); ++intiter){
4008         
4009                 SLiter = SplitLength.find(intiter->first);
4010         
4011                 intPrevValue = intiter->second;
4012         
4013                 PropertyData = PropertySeg2.Mid(intPrevValue, (SLiter->second + 1));
4014                 
4015                 // Add the data to the General/Home/Work address variables.
4016         
4017                 // Trim any whitespace from the start and end.
4018         
4019                 PropertyData = PropertyData.Trim(FALSE);
4020                 PropertyData = PropertyData.Trim(TRUE); 
4021         
4022                 CaptureString(&PropertyData, FALSE);
4023                 
4024                 if (FirstCategoryProcessed == TRUE){
4025                 
4026                         FirstCategoryProcessed = FALSE;
4027                         
4028                         CategoriesList.insert(std::make_pair(*CategoryCount, PropertyData));
4029         
4030                         if (!PropertyTokens.IsEmpty()){
4031                 
4032                                 CategoriesListTokens.insert(std::make_pair(*CategoryCount, PropertyTokens));
4033                 
4034                         }
4035                         
4036                         continue;
4037                 
4038                 } else {
4040                         (*CategoryCount)++;
4041                         
4042                         CategoriesList.insert(std::make_pair(*CategoryCount, PropertyData));
4043                 
4044                         if (!PropertyTokens.IsEmpty()){
4045                 
4046                                 CategoriesListTokens.insert(std::make_pair(*CategoryCount, PropertyTokens));
4047                 
4048                         }
4049                 
4050                 }
4051                 
4052                 // Copy the properties to each of the categories (if it exists).
4053                 
4054                 if (!PropertyTokens.IsEmpty()){
4055                 
4056                         CategoriesListTokens.insert(std::make_pair(*CategoryCount, CategoriesListTokens.find(intOrigCatCount)->second));
4057                 
4058                 }
4059                 
4060                 // Check if ALTID was used.
4061                 
4062                 if (CategoriesListAltID.find(intOrigCatCount) != CategoriesListAltID.end()){
4063                 
4064                         CategoriesListAltID.insert(std::make_pair(*CategoryCount, CategoriesListAltID.find(intOrigCatCount)->second));
4065                 
4066                 }
4067                 
4068                 // Check if PID was used.
4069                 
4070                 if (CategoriesListPID.find(intOrigCatCount) != CategoriesListPID.end()){
4071                 
4072                         CategoriesListPID.insert(std::make_pair(*CategoryCount, CategoriesListPID.find(intOrigCatCount)->second));
4073                 
4074                 }
4075         
4076                 // Check if PREF was used.
4077         
4078                 if (CategoriesListPref.find(intOrigCatCount) != CategoriesListPref.end()){
4079                 
4080                         CategoriesListPref.insert(std::make_pair(*CategoryCount, CategoriesListPref.find(intOrigCatCount)->second));
4081                 
4082                 }
4083                 
4084                 // Check if LANGUAGE was used.
4085                 
4086                 if (CategoriesListLanguage.find(intOrigCatCount) != CategoriesListLanguage.end()){
4087                 
4088                         CategoriesListLanguage.insert(std::make_pair(*CategoryCount, CategoriesListLanguage.find(intOrigCatCount)->second));
4089                 
4090                 }
4091                 
4092                 // Check if TYPE was used.
4093                 
4094                 switch(PropType){
4095                         case PROPERTY_NONE:
4096                                 break;
4097                         case PROPERTY_HOME:
4098                                 CategoriesListType.insert(std::make_pair(*CategoryCount, "home"));
4099                                 break;
4100                         case PROPERTY_WORK:
4101                                 CategoriesListType.insert(std::make_pair(*CategoryCount, "work"));
4102                                 break;
4103                 }
4104         
4105         }
4109 void ContactDataObject::ProcessPhoto(wxString PropertySeg1, wxString PropertySeg2, int *PhotoCount){
4111         size_t intPropertyLen = PropertySeg1.Len();
4112         std::map<int, int> SplitPoints;
4113         std::map<int, int> SplitLength;
4114         std::map<int, int>::iterator SLiter;                    
4115         wxString PropertyData;
4116         wxString PropertyName;
4117         wxString PropertyValue;
4118         wxString PropertyTokens;
4119         bool FirstToken = TRUE;
4120         int intSplitsFound = 0;
4121         int intSplitSize = 0;
4122         int intPrevValue = 7;
4123         int intPref = 0;                        
4124         int intType = 0;
4125         
4126         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
4127         
4128         intPrevValue = 6;
4129         
4130         PropertyType PropType = PROPERTY_NONE;
4131                 
4132         // Look for type before continuing.
4133         
4134         CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
4136         intPrevValue = 6;
4138         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
4139         intiter != SplitPoints.end(); ++intiter){
4140         
4141                 SLiter = SplitLength.find(intiter->first);
4142         
4143                 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
4144                 
4145                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
4146                 PropertyName = PropertyElement.GetNextToken();                          
4147                 PropertyValue = PropertyElement.GetNextToken();
4148                 
4149                 intPrevValue = intiter->second;
4150                 
4151                 // Process properties.
4152                 
4153                 size_t intPropertyValueLen = PropertyValue.Len();
4154                 
4155                 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
4156                         
4157                         PropertyValue.Trim();
4158                         PropertyValue.RemoveLast();
4159                         
4160                 }                               
4161                 
4162                 if (PropertyValue.Mid(0, 1) == wxT("\"")){
4163                         
4164                         PropertyValue.Remove(0, 1);
4165                         
4166                 }
4167                 
4168                 CaptureString(&PropertyValue, FALSE);
4169                 
4170                 if (PropertyName == wxT("ALTID")){
4172                         PicturesListAltID.erase(*PhotoCount);
4173                         PicturesListAltID.insert(std::make_pair(*PhotoCount, PropertyValue));
4174                 
4175                 } else if (PropertyName == wxT("PID")){
4177                         PicturesListPID.erase(*PhotoCount);
4178                         PicturesListPID.insert(std::make_pair(*PhotoCount, PropertyValue));
4179                 
4180                 } else if (PropertyName == wxT("PREF")){
4182                         ProcessIntegerValue(&PicturesListPref, &PropertyValue, PhotoCount);
4183                 
4184                 } else if (PropertyName == wxT("MEDIATYPE")){
4185                 
4186                         PicturesListMediatype.erase(*PhotoCount);
4187                         PicturesListMediatype.insert(std::make_pair(*PhotoCount, PropertyValue));
4188                                         
4189                 } else {
4190                 
4191                         // Something else we don't know about so append
4192                         // to the tokens variable.
4193                         
4194                         if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
4195                         
4196                                 if (FirstToken == TRUE){
4197                                 
4198                                         PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
4199                                         FirstToken = FALSE;
4200                                 
4201                                 } else {
4202                                 
4203                                         PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
4204                                 
4205                                 }
4206                         
4207                         }
4208                 
4209                 }
4210         
4211         }       
4212         
4213         intPropertyLen = PropertySeg2.Len();
4214         SplitPoints.clear();
4215         SplitLength.clear();
4216         intSplitsFound = 0;
4217         intSplitSize = 0;
4218         intPrevValue = 0;                       
4219         
4220         CaptureString(&PropertySeg2, FALSE);
4221         
4222         for (int i = 0; i <= intPropertyLen; i++){
4224                 intSplitSize++;
4225         
4226                 if (PropertySeg2.Mid(i, 1) == wxT(";")){
4227         
4228                         intSplitsFound++;
4229                         SplitPoints.insert(std::make_pair(intSplitsFound, (i + 1)));
4230                         
4231                         if (intSplitsFound == 6){ 
4232                         
4233                                 SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
4234                                 break; 
4235                                 
4236                         } else {
4237                         
4238                                 SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
4239                         
4240                         }
4241                         
4242                         intSplitSize = 0;                                       
4243         
4244                 }
4246         }
4247         
4248         wxString wxSPhotoURI;
4249         wxString wxSPhotoMIME;
4250         wxString wxSPhotoEncoding;
4251         wxString wxSPhotoData;
4252         std::string base64enc;
4253         
4254         if (intSplitsFound == 0){
4255         
4256         } else {
4257         
4258                 std::map<int, int>::iterator striter;
4259         
4260                 striter = SplitLength.find(1);
4261         
4262                 wxStringTokenizer wSTDataType(PropertySeg2.Mid(0, striter->second), wxT(":"));
4263         
4264                 while (wSTDataType.HasMoreTokens() == TRUE){
4265                 
4266                         wxSPhotoURI = wSTDataType.GetNextToken();
4267                         wxSPhotoMIME = wSTDataType.GetNextToken();
4268                         break;
4269                 
4270                 }                       
4271         
4272                 wxStringTokenizer wSTDataInfo(PropertySeg2.Mid((striter->second + 1)), wxT(","));                       
4273         
4274                 while (wSTDataInfo.HasMoreTokens() == TRUE){
4275                 
4276                         wxSPhotoEncoding = wSTDataInfo.GetNextToken();
4277                         wxSPhotoData = wSTDataInfo.GetNextToken();
4278                         base64enc = wxSPhotoData.mb_str();
4279                         break;
4280                 
4281                 }
4282         
4283         }
4284         
4285         // Add the data to the General/Home/Work address variables.
4286         
4287         PicturesList.insert(std::make_pair(*PhotoCount, base64enc));
4288         PicturesListPictureType.insert(std::make_pair(*PhotoCount, wxSPhotoMIME));
4289         PicturesListPicEncType.insert(std::make_pair(*PhotoCount, wxSPhotoEncoding));
4290         
4291         switch(PropType){
4292                 case PROPERTY_NONE:
4293                         break;
4294                 case PROPERTY_HOME:
4295                         PicturesListType.insert(std::make_pair(*PhotoCount, "home"));
4296                         break;
4297                 case PROPERTY_WORK:
4298                         PicturesListType.insert(std::make_pair(*PhotoCount, "work"));
4299                         break;
4300         }
4301         
4302         if (!PropertyTokens.IsEmpty()){
4304                 PicturesListTokens.insert(std::make_pair(*PhotoCount, PropertyTokens));
4305         
4306         }
4310 void ContactDataObject::ProcessLogo(wxString PropertySeg1, wxString PropertySeg2, int *LogoCount){
4312         size_t intPropertyLen = PropertySeg1.Len();
4313         std::map<int, int> SplitPoints;
4314         std::map<int, int> SplitLength;
4315         std::map<int, int>::iterator SLiter;                    
4316         wxString PropertyData;
4317         wxString PropertyName;
4318         wxString PropertyValue;
4319         wxString PropertyTokens;
4320         bool FirstToken = TRUE;
4321         int intSplitsFound = 0;
4322         int intSplitSize = 0;
4323         int intPrevValue = 6;
4324         int intPref = 0;                        
4325         int intType = 0;
4326         
4327         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
4328         
4329         intPrevValue = 5;
4330         
4331         PropertyType PropType = PROPERTY_NONE;
4332                 
4333         // Look for type before continuing.
4334         
4335         CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
4337         intPrevValue = 5;
4339         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
4340         intiter != SplitPoints.end(); ++intiter){
4341         
4342                 SLiter = SplitLength.find(intiter->first);
4343         
4344                 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
4345                 
4346                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
4347                 PropertyName = PropertyElement.GetNextToken();                          
4348                 PropertyValue = PropertyElement.GetNextToken();
4349                 
4350                 intPrevValue = intiter->second;
4351                 
4352                 // Process properties.
4353                 
4354                 size_t intPropertyValueLen = PropertyValue.Len();
4355                 
4356                 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
4357                         
4358                         PropertyValue.Trim();
4359                         PropertyValue.RemoveLast();
4360                         
4361                 }                               
4362                 
4363                 if (PropertyValue.Mid(0, 1) == wxT("\"")){
4364                         
4365                         PropertyValue.Remove(0, 1);
4366                         
4367                 }
4368                 
4369                 CaptureString(&PropertyValue, FALSE);
4370                 
4371                 if (PropertyName == wxT("ALTID")){
4373                         LogosListAltID.erase(*LogoCount);
4374                         LogosListAltID.insert(std::make_pair(*LogoCount, PropertyValue));
4375                 
4376                 } else if (PropertyName == wxT("PID")){
4378                         LogosListPID.erase(*LogoCount);
4379                         LogosListPID.insert(std::make_pair(*LogoCount, PropertyValue));
4380                 
4381                 } else if (PropertyName == wxT("PREF")){
4383                         ProcessIntegerValue(&LogosListPref, &PropertyValue, LogoCount);
4384                 
4385                 } else if (PropertyName == wxT("MEDIATYPE")){
4386                 
4387                         LogosListMediatype.erase(*LogoCount);
4388                         LogosListMediatype.insert(std::make_pair(*LogoCount, PropertyValue));
4389                                         
4390                 } else {
4391                 
4392                         // Something else we don't know about so append
4393                         // to the tokens variable.
4394                         
4395                         if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
4396                         
4397                                 if (FirstToken == TRUE){
4398                                 
4399                                         PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
4400                                         FirstToken = FALSE;
4401                                 
4402                                 } else {
4403                                 
4404                                         PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
4405                                 
4406                                 }
4407                         
4408                         }
4409                 
4410                 }
4411         
4412         }       
4413         
4414         intPropertyLen = PropertySeg2.Len();
4415         SplitPoints.clear();
4416         SplitLength.clear();
4417         intSplitsFound = 0;
4418         intSplitSize = 0;
4419         intPrevValue = 0;                       
4420         
4421         CaptureString(&PropertySeg2, FALSE);
4422         
4423         for (int i = 0; i <= intPropertyLen; i++){
4425                 intSplitSize++;
4426         
4427                 if (PropertySeg2.Mid(i, 1) == wxT(";")){
4428         
4429                         intSplitsFound++;
4430                         SplitPoints.insert(std::make_pair(intSplitsFound, (i + 1)));
4431                         
4432                         if (intSplitsFound == 6){ 
4433                         
4434                                 SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
4435                                 break; 
4436                                 
4437                         } else {
4438                         
4439                                 SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
4440                         
4441                         }
4442                         
4443                         intSplitSize = 0;                                       
4444         
4445                 }
4447         }
4448         
4449         wxString wxSPhotoURI;
4450         wxString wxSPhotoMIME;
4451         wxString wxSPhotoEncoding;
4452         wxString wxSPhotoData;
4453         std::string base64enc;
4454         
4455         if (intSplitsFound == 0){
4456         
4457         } else {
4458         
4459                 std::map<int, int>::iterator striter;
4460         
4461                 striter = SplitLength.find(1);
4462         
4463                 wxStringTokenizer wSTDataType(PropertySeg2.Mid(0, striter->second), wxT(":"));
4464         
4465                 while (wSTDataType.HasMoreTokens() == TRUE){
4466                 
4467                         wxSPhotoURI = wSTDataType.GetNextToken();
4468                         wxSPhotoMIME = wSTDataType.GetNextToken();
4469                         break;
4470                 
4471                 }                       
4472         
4473                 wxStringTokenizer wSTDataInfo(PropertySeg2.Mid((striter->second + 1)), wxT(","));                       
4474         
4475                 while (wSTDataInfo.HasMoreTokens() == TRUE){
4476                 
4477                         wxSPhotoEncoding = wSTDataInfo.GetNextToken();
4478                         wxSPhotoData = wSTDataInfo.GetNextToken();
4479                         base64enc = wxSPhotoData.mb_str();
4480                         break;
4481                 
4482                 }
4483         
4484         }
4485         
4486         // Add the data to the General/Home/Work address variables.
4487         
4488         LogosList.insert(std::make_pair(*LogoCount, base64enc));
4489         LogosListPictureType.insert(std::make_pair(*LogoCount, wxSPhotoMIME));
4490         LogosListPicEncType.insert(std::make_pair(*LogoCount, wxSPhotoEncoding));
4491         
4492         switch(PropType){
4493                 case PROPERTY_NONE:
4494                         break;
4495                 case PROPERTY_HOME:
4496                         LogosListType.insert(std::make_pair(*LogoCount, "home"));
4497                         break;
4498                 case PROPERTY_WORK:
4499                         LogosListType.insert(std::make_pair(*LogoCount, "work"));
4500                         break;
4501         }
4502         
4503         if (!PropertyTokens.IsEmpty()){
4505                 LogosListTokens.insert(std::make_pair(*LogoCount, PropertyTokens));
4506         
4507         }
4511 void ContactDataObject::ProcessSound(wxString PropertySeg1, wxString PropertySeg2, int *SoundCount){
4513         size_t intPropertyLen = PropertySeg1.Len();
4514         std::map<int, int> SplitPoints;
4515         std::map<int, int> SplitLength;
4516         std::map<int, int>::iterator SLiter;                    
4517         wxString PropertyData;
4518         wxString PropertyName;
4519         wxString PropertyValue;
4520         wxString PropertyTokens;
4521         bool FirstToken = TRUE;
4522         int intSplitsFound = 0;
4523         int intSplitSize = 0;
4524         int intPrevValue = 7;
4525         int intPref = 0;                        
4526         int intType = 0;
4527         
4528         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
4529         
4530         intPrevValue = 6;
4531         
4532         PropertyType PropType = PROPERTY_NONE;
4533         
4534         // Look for type before continuing.                     
4536         CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
4538         intPrevValue = 6;
4540         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
4541         intiter != SplitPoints.end(); ++intiter){
4542         
4543                 SLiter = SplitLength.find(intiter->first);
4544         
4545                 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
4546                 
4547                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
4548                 PropertyName = PropertyElement.GetNextToken();                          
4549                 PropertyValue = PropertyElement.GetNextToken();
4550                 
4551                 intPrevValue = intiter->second;
4552                 
4553                 // Process properties.
4554                 
4555                 size_t intPropertyValueLen = PropertyValue.Len();
4556                 
4557                 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
4558                         
4559                         PropertyValue.Trim();
4560                         PropertyValue.RemoveLast();
4561                         
4562                 }                               
4563                 
4564                 if (PropertyValue.Mid(0, 1) == wxT("\"")){
4565                         
4566                         PropertyValue.Remove(0, 1);
4567                         
4568                 }                       
4569                 
4570                 CaptureString(&PropertyValue, FALSE);
4571                 
4572                 if (PropertyName == wxT("ALTID")){
4574                         SoundsListAltID.erase(*SoundCount);
4575                         SoundsListAltID.insert(std::make_pair(*SoundCount, PropertyValue));
4576                 
4577                 } else if (PropertyName == wxT("PID")){
4579                         SoundsListPID.erase(*SoundCount);
4580                         SoundsListPID.insert(std::make_pair(*SoundCount, PropertyValue));
4581                 
4582                 } else if (PropertyName == wxT("PREF")){
4584                         ProcessIntegerValue(&SoundsListPref, &PropertyValue, SoundCount);
4585                 
4586                 } else if (PropertyName == wxT("MEDIATYPE")){
4587                 
4588                         SoundsListMediatype.erase(*SoundCount);
4589                         SoundsListMediatype.insert(std::make_pair(*SoundCount, PropertyValue));
4591                 } else if (PropertyName == wxT("LANGUAGE")){
4592                 
4593                         SoundsListLanguage.erase(*SoundCount);
4594                         SoundsListLanguage.insert(std::make_pair(*SoundCount, PropertyValue));
4596                 } else {
4597                 
4598                         // Something else we don't know about so append
4599                         // to the tokens variable.
4600                         
4601                         if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
4602                         
4603                                 if (FirstToken == TRUE){
4604                                 
4605                                         PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
4606                                         FirstToken = FALSE;
4607                                 
4608                                 } else {
4609                                 
4610                                         PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
4611                                 
4612                                 }
4613                         
4614                         }
4615                 
4616                 }
4617         
4618         }       
4619         
4620         intPropertyLen = PropertySeg2.Len();
4621         SplitPoints.clear();
4622         SplitLength.clear();
4623         intSplitsFound = 0;
4624         intSplitSize = 0;
4625         intPrevValue = 0;
4626         
4627         CaptureString(&PropertySeg2, FALSE);
4628         
4629         for (int i = 0; i <= intPropertyLen; i++){
4631                 intSplitSize++;
4632         
4633                 if (PropertySeg2.Mid(i, 1) == wxT(";")){
4634         
4635                         intSplitsFound++;
4636                         SplitPoints.insert(std::make_pair(intSplitsFound, (i + 1)));
4637                         
4638                         if (intSplitsFound == 6){ 
4639                         
4640                                 SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
4641                                 break; 
4642                                 
4643                         } else {
4644                         
4645                                 SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
4646                         
4647                         }
4648                         
4649                         intSplitSize = 0;                                       
4650         
4651                 }
4653         }
4654         
4655         wxString wxSSoundURI;
4656         wxString wxSSoundMIME;
4657         wxString wxSSoundEncoding;
4658         wxString wxSSoundData;
4659         std::string base64enc;
4660         
4661         if (intSplitsFound == 0){
4662         
4663         } else {
4664         
4665                 std::map<int, int>::iterator striter;
4666         
4667                 striter = SplitLength.find(1);
4668         
4669                 wxStringTokenizer wSTDataType(PropertySeg2.Mid(0, striter->second), wxT(":"));
4670         
4671                 while (wSTDataType.HasMoreTokens() == TRUE){
4672                 
4673                         wxSSoundURI = wSTDataType.GetNextToken();
4674                         wxSSoundMIME = wSTDataType.GetNextToken();
4675                         break;
4676                 
4677                 }                       
4678         
4679                 wxStringTokenizer wSTDataInfo(PropertySeg2.Mid((striter->second + 1)), wxT(","));                       
4680         
4681                 while (wSTDataInfo.HasMoreTokens() == TRUE){
4682                 
4683                         wxSSoundEncoding = wSTDataInfo.GetNextToken();
4684                         wxSSoundData = wSTDataInfo.GetNextToken();                                      
4685                         base64enc = wxSSoundData.mb_str();
4686                         break;
4687                 
4688                 }
4689         
4690         }
4691         
4692         // Add the data to the General/Home/Work address variables.
4693                 
4694         switch(PropType){
4695                 case PROPERTY_NONE:
4696                         break;
4697                 case PROPERTY_HOME:
4698                         SoundsListType.insert(std::make_pair(*SoundCount, "home"));
4699                         break;
4700                 case PROPERTY_WORK:
4701                         SoundsListType.insert(std::make_pair(*SoundCount, "work"));
4702                         break;
4703         }
4704         
4705         SoundsList.insert(std::make_pair(*SoundCount, base64enc));
4706         SoundsListAudioEncType.insert(std::make_pair(*SoundCount, wxSSoundEncoding));
4707         SoundsListAudioType.insert(std::make_pair(*SoundCount, wxSSoundMIME));
4708         
4709         if (!PropertyTokens.IsEmpty()){
4710         
4711                 SoundsListTokens.insert(std::make_pair(*SoundCount, PropertyTokens));
4712         
4713         }
4714         
4717 void ContactDataObject::ProcessCalendarURI(wxString PropertySeg1, wxString PropertySeg2, int *CalURICount){
4719         size_t intPropertyLen = PropertySeg1.Len();
4720         std::map<int, int> SplitPoints;
4721         std::map<int, int> SplitLength;
4722         std::map<int, int>::iterator SLiter;                    
4723         wxString PropertyData;
4724         wxString PropertyName;
4725         wxString PropertyValue;
4726         wxString PropertyTokens;
4727         bool FirstToken = TRUE;
4728         int intSplitsFound = 0;
4729         int intSplitSize = 0;
4730         int intPrevValue = 8;
4731         int intPref = 0;                        
4732         int intType = 0;
4733         
4734         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
4735         
4736         intPrevValue = 7;
4737         
4738         PropertyType PropType = PROPERTY_NONE;
4739         
4740         // Look for type before continuing.                     
4742         CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
4744         intPrevValue = 7;
4746         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
4747         intiter != SplitPoints.end(); ++intiter){
4748         
4749                 SLiter = SplitLength.find(intiter->first);
4750         
4751                 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
4752                 
4753                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
4754                 PropertyName = PropertyElement.GetNextToken();                          
4755                 PropertyValue = PropertyElement.GetNextToken();
4756                 
4757                 intPrevValue = intiter->second;
4758                 
4759                 // Process properties.
4760                 
4761                 size_t intPropertyValueLen = PropertyValue.Len();
4762                 
4763                 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
4764                         
4765                         PropertyValue.Trim();
4766                         PropertyValue.RemoveLast();
4767                         
4768                 }                               
4769                 
4770                 if (PropertyValue.Mid(0, 1) == wxT("\"")){
4771                         
4772                         PropertyValue.Remove(0, 1);
4773                         
4774                 }                       
4775                 
4776                 CaptureString(&PropertyValue, FALSE);
4777                 
4778                 if (PropertyName == wxT("ALTID")){
4780                         CalendarListAltID.erase(*CalURICount);
4781                         CalendarListAltID.insert(std::make_pair(*CalURICount, PropertyValue));
4782                 
4783                 } else if (PropertyName == wxT("PID")){
4785                         CalendarListPID.erase(*CalURICount);
4786                         CalendarListPID.insert(std::make_pair(*CalURICount, PropertyValue));
4787                 
4788                 } else if (PropertyName == wxT("PREF")){
4790                         ProcessIntegerValue(&CalendarListPref, &PropertyValue, CalURICount);
4791                 
4792                 } else if (PropertyName == wxT("MEDIATYPE")){
4793                 
4794                         CalendarListMediatype.erase(*CalURICount);
4795                         CalendarListMediatype.insert(std::make_pair(*CalURICount, PropertyValue));
4797                 } else {
4798                 
4799                         // Something else we don't know about so append
4800                         // to the tokens variable.
4801                         
4802                         if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
4803                         
4804                                 if (FirstToken == TRUE){
4805                                 
4806                                         PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
4807                                         FirstToken = FALSE;
4808                                 
4809                                 } else {
4810                                 
4811                                         PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
4812                                 
4813                                 }
4814                         
4815                         }
4816                 
4817                 }
4818         
4819         }       
4820         
4821         intPropertyLen = PropertySeg2.Len();
4822         SplitPoints.clear();
4823         SplitLength.clear();
4824         intSplitsFound = 0;
4825         intSplitSize = 0;
4826         intPrevValue = 0;
4827         
4828         CaptureString(&PropertySeg2, FALSE);
4829         
4830         // Add the data to the General/Home/Work address variables.
4831                 
4832         switch(PropType){
4833                 case PROPERTY_NONE:
4834                         break;
4835                 case PROPERTY_HOME:
4836                         CalendarListType.insert(std::make_pair(*CalURICount, "home"));
4837                         break;
4838                 case PROPERTY_WORK:
4839                         CalendarListType.insert(std::make_pair(*CalURICount, "work"));
4840                         break;
4841         }
4842         
4843         CalendarList.insert(std::make_pair(*CalURICount, PropertySeg2));
4844         
4845         if (!PropertyTokens.IsEmpty()){
4846         
4847                 CalendarListTokens.insert(std::make_pair(*CalURICount, PropertyTokens));
4848         
4849         }
4853 void ContactDataObject::ProcessCalendarAddressURI(wxString PropertySeg1, wxString PropertySeg2, int *CalAdrURICount){
4855         size_t intPropertyLen = PropertySeg1.Len();
4856         std::map<int, int> SplitPoints;
4857         std::map<int, int> SplitLength;
4858         std::map<int, int>::iterator SLiter;                    
4859         wxString PropertyData;
4860         wxString PropertyName;
4861         wxString PropertyValue;
4862         wxString PropertyTokens;
4863         bool FirstToken = TRUE;
4864         int intSplitsFound = 0;
4865         int intSplitSize = 0;
4866         int intPrevValue = 8;
4867         int intPref = 0;                        
4868         int intType = 0;
4869         
4870         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
4871         
4872         intPrevValue = 7;
4873         
4874         PropertyType PropType = PROPERTY_NONE;
4875         
4876         // Look for type before continuing.                     
4878         CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
4880         intPrevValue = 7;
4882         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
4883         intiter != SplitPoints.end(); ++intiter){
4884         
4885                 SLiter = SplitLength.find(intiter->first);
4886         
4887                 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
4888                 
4889                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
4890                 PropertyName = PropertyElement.GetNextToken();                          
4891                 PropertyValue = PropertyElement.GetNextToken();
4892                 
4893                 intPrevValue = intiter->second;
4894                 
4895                 // Process properties.
4896                 
4897                 size_t intPropertyValueLen = PropertyValue.Len();
4898                 
4899                 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
4900                         
4901                         PropertyValue.Trim();
4902                         PropertyValue.RemoveLast();
4903                         
4904                 }                               
4905                 
4906                 if (PropertyValue.Mid(0, 1) == wxT("\"")){
4907                         
4908                         PropertyValue.Remove(0, 1);
4909                         
4910                 }                       
4911                 
4912                 CaptureString(&PropertyValue, FALSE);
4913                 
4914                 if (PropertyName == wxT("ALTID")){
4916                         CalendarRequestListAltID.erase(*CalAdrURICount);
4917                         CalendarRequestListAltID.insert(std::make_pair(*CalAdrURICount, PropertyValue));
4918                 
4919                 } else if (PropertyName == wxT("PID")){
4921                         CalendarRequestListPID.erase(*CalAdrURICount);
4922                         CalendarRequestListPID.insert(std::make_pair(*CalAdrURICount, PropertyValue));
4923                 
4924                 } else if (PropertyName == wxT("PREF")){
4926                         ProcessIntegerValue(&CalendarRequestListPref, &PropertyValue, CalAdrURICount);
4927                 
4928                 } else if (PropertyName == wxT("MEDIATYPE")){
4929                 
4930                         CalendarRequestListMediatype.erase(*CalAdrURICount);
4931                         CalendarRequestListMediatype.insert(std::make_pair(*CalAdrURICount, PropertyValue));
4933                 } else {
4934                 
4935                         // Something else we don't know about so append
4936                         // to the tokens variable.
4937                         
4938                         if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
4939                         
4940                                 if (FirstToken == TRUE){
4941                                 
4942                                         PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
4943                                         FirstToken = FALSE;
4944                                 
4945                                 } else {
4946                                 
4947                                         PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
4948                                 
4949                                 }
4950                         
4951                         }
4952                 
4953                 }
4954         
4955         }       
4956         
4957         intPropertyLen = PropertySeg2.Len();
4958         SplitPoints.clear();
4959         SplitLength.clear();
4960         intSplitsFound = 0;
4961         intSplitSize = 0;
4962         intPrevValue = 0;
4963         
4964         CaptureString(&PropertySeg2, FALSE);
4965         
4966         // Add the data to the General/Home/Work address variables.
4967                 
4968         switch(PropType){
4969                 case PROPERTY_NONE:
4970                         break;
4971                 case PROPERTY_HOME:
4972                         CalendarRequestListType.insert(std::make_pair(*CalAdrURICount, "home"));
4973                         break;
4974                 case PROPERTY_WORK:
4975                         CalendarRequestListType.insert(std::make_pair(*CalAdrURICount, "work"));
4976                         break;
4977         }
4978         
4979         CalendarRequestList.insert(std::make_pair(*CalAdrURICount, PropertySeg2));
4980         
4981         if (!PropertyTokens.IsEmpty()){
4982         
4983                 CalendarRequestListTokens.insert(std::make_pair(*CalAdrURICount, PropertyTokens));
4984         
4985         }       
4986         
4989 void ContactDataObject::ProcessCalendarFreeBusy(wxString PropertySeg1, wxString PropertySeg2, int *FreeBusyAddressCount){
4991         size_t intPropertyLen = PropertySeg1.Len();
4992         std::map<int, int> SplitPoints;
4993         std::map<int, int> SplitLength;
4994         std::map<int, int>::iterator SLiter;                    
4995         wxString PropertyData;
4996         wxString PropertyName;
4997         wxString PropertyValue;
4998         wxString PropertyTokens;
4999         bool FirstToken = TRUE;
5000         int intSplitsFound = 0;
5001         int intSplitSize = 0;
5002         int intPrevValue = 7;
5003         int intPref = 0;                        
5004         int intType = 0;
5005         
5006         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
5007         
5008         intPrevValue = 6;
5009         
5010         PropertyType PropType = PROPERTY_NONE;
5011         
5012         // Look for type before continuing.                     
5014         CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
5016         intPrevValue = 6;
5018         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
5019         intiter != SplitPoints.end(); ++intiter){
5020         
5021                 SLiter = SplitLength.find(intiter->first);
5022         
5023                 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
5024                 
5025                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
5026                 PropertyName = PropertyElement.GetNextToken();                          
5027                 PropertyValue = PropertyElement.GetNextToken();
5028                 
5029                 intPrevValue = intiter->second;
5030                 
5031                 // Process properties.
5032                 
5033                 size_t intPropertyValueLen = PropertyValue.Len();
5034                 
5035                 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
5036                         
5037                         PropertyValue.Trim();
5038                         PropertyValue.RemoveLast();
5039                         
5040                 }                               
5041                 
5042                 if (PropertyValue.Mid(0, 1) == wxT("\"")){
5043                         
5044                         PropertyValue.Remove(0, 1);
5045                         
5046                 }                       
5047                 
5048                 CaptureString(&PropertyValue, FALSE);
5049                 
5050                 if (PropertyName == wxT("ALTID")){
5052                         FreeBusyListAltID.erase(*FreeBusyAddressCount);
5053                         FreeBusyListAltID.insert(std::make_pair(*FreeBusyAddressCount, PropertyValue));
5054                 
5055                 } else if (PropertyName == wxT("PID")){
5057                         FreeBusyListPID.erase(*FreeBusyAddressCount);
5058                         FreeBusyListPID.insert(std::make_pair(*FreeBusyAddressCount, PropertyValue));
5059                 
5060                 } else if (PropertyName == wxT("PREF")){
5062                         ProcessIntegerValue(&FreeBusyListPref, &PropertyValue, FreeBusyAddressCount);
5063                 
5064                 } else if (PropertyName == wxT("MEDIATYPE")){
5065                 
5066                         FreeBusyListMediatype.erase(*FreeBusyAddressCount);
5067                         FreeBusyListMediatype.insert(std::make_pair(*FreeBusyAddressCount, PropertyValue));
5069                 } else {
5070                 
5071                         // Something else we don't know about so append
5072                         // to the tokens variable.
5073                         
5074                         if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
5075                         
5076                                 if (FirstToken == TRUE){
5077                                 
5078                                         PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
5079                                         FirstToken = FALSE;
5080                                 
5081                                 } else {
5082                                 
5083                                         PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
5084                                 
5085                                 }
5086                         
5087                         }
5088                 
5089                 }
5090         
5091         }       
5092         
5093         intPropertyLen = PropertySeg2.Len();
5094         SplitPoints.clear();
5095         SplitLength.clear();
5096         intSplitsFound = 0;
5097         intSplitSize = 0;
5098         intPrevValue = 0;
5099         
5100         CaptureString(&PropertySeg2, FALSE);
5101         
5102         // Add the data to the General/Home/Work address variables.
5103                 
5104         switch(PropType){
5105                 case PROPERTY_NONE:
5106                         break;
5107                 case PROPERTY_HOME:
5108                         FreeBusyListType.insert(std::make_pair(*FreeBusyAddressCount, "home"));
5109                         break;
5110                 case PROPERTY_WORK:
5111                         FreeBusyListType.insert(std::make_pair(*FreeBusyAddressCount, "work"));
5112                         break;
5113         }
5114         
5115         FreeBusyList.insert(std::make_pair(*FreeBusyAddressCount, PropertySeg2));
5116         
5117         if (!PropertyTokens.IsEmpty()){
5118         
5119                 FreeBusyListTokens.insert(std::make_pair(*FreeBusyAddressCount, PropertyTokens));
5120         
5121         }
5125 void ContactDataObject::ProcessKey(wxString PropertySeg1, wxString PropertySeg2, int *KeyCount){
5127         size_t intPropertyLen = PropertySeg1.Len();
5128         std::map<int, int> SplitPoints;
5129         std::map<int, int> SplitLength;
5130         std::map<int, int>::iterator SLiter;                    
5131         wxString PropertyData;
5132         wxString PropertyName;
5133         wxString PropertyValue;
5134         wxString PropertyTokens;
5135         bool FirstToken = TRUE;
5136         int intSplitsFound = 0;
5137         int intSplitSize = 0;
5138         int intPrevValue = 5;
5139         int intPref = 0;                        
5140         int intType = 0;
5141         long ListCtrlIndex;
5142         
5143         SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
5144         
5145         intPrevValue = 4;
5146         
5147         PropertyType PropType = PROPERTY_NONE;
5148         
5149         // Look for type before continuing.
5151         CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
5153         intPrevValue = 4;
5155         for (std::map<int, int>::iterator intiter = SplitPoints.begin(); 
5156         intiter != SplitPoints.end(); ++intiter){
5157         
5158                 SLiter = SplitLength.find(intiter->first);
5159         
5160                 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
5161                 
5162                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
5163                 PropertyName = PropertyElement.GetNextToken();                          
5164                 PropertyValue = PropertyElement.GetNextToken();
5165                 
5166                 intPrevValue = intiter->second;
5167                 
5168                 // Process properties.
5169                 
5170                 size_t intPropertyValueLen = PropertyValue.Len();
5171                 
5172                 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
5173                         
5174                         PropertyValue.Trim();
5175                         PropertyValue.RemoveLast();
5176                         
5177                 }                               
5178                 
5179                 if (PropertyValue.Mid(0, 1) == wxT("\"")){
5180                         
5181                         PropertyValue.Remove(0, 1);
5182                         
5183                 }                               
5184                 
5185                 if (PropertyName == wxT("ALTID")){
5187                         KeyListAltID.erase(*KeyCount);
5188                         KeyListAltID.insert(std::make_pair(*KeyCount, PropertyValue));
5189                 
5190                 } else if (PropertyName == wxT("PID")){
5192                         KeyListPID.erase(*KeyCount);
5193                         KeyListPID.insert(std::make_pair(*KeyCount, PropertyValue));
5194                 
5195                 } else if (PropertyName == wxT("PREF")){
5197                         ProcessIntegerValue(&KeyListPref, &PropertyValue, KeyCount);
5198                 
5199                 } else {
5200                 
5201                         // Something else we don't know about so append
5202                         // to the tokens variable.
5203                         
5204                         if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
5205                         
5206                                 if (FirstToken == TRUE){
5207                                 
5208                                         PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
5209                                         FirstToken = FALSE;
5210                                 
5211                                 } else {
5212                                 
5213                                         PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
5214                                 
5215                                 }
5216                         
5217                         }
5218                 
5219                 }
5220         
5221         }                               
5222         
5223         intPropertyLen = PropertySeg2.Len();
5224         SplitPoints.clear();
5225         SplitLength.clear();
5226         intSplitsFound = 0;
5227         intSplitSize = 0;
5228         intPrevValue = 0;                       
5229         
5230         for (int i = 0; i <= intPropertyLen; i++){
5232                 intSplitSize++;
5233         
5234                 if (PropertySeg2.Mid(i, 1) == wxT(";") && PropertySeg2.Mid((i - 1), 1) != wxT("\\")){
5235         
5236                         intSplitsFound++;
5237                         SplitPoints.insert(std::make_pair(intSplitsFound, (i + 1)));
5238                         
5239                         if (intSplitsFound == 6){ 
5240                         
5241                                 SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
5242                                 break; 
5243                                 
5244                         } else {
5245                         
5246                                 SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
5247                         
5248                         }
5249                         
5250                         intSplitSize = 0;                                       
5251         
5252                 }
5254         }
5255         
5256         wxString wxSKeyURI;
5257         wxString wxSKeyMIME;
5258         wxString wxSKeyEncoding;
5259         wxString wxSKeyData;
5260         std::string base64enc;
5261         
5262         if (intSplitsFound == 0){
5263         
5264         } else {
5265         
5266                 std::map<int, int>::iterator striter;
5267         
5268                 striter = SplitLength.find(1);
5269         
5270                 wxStringTokenizer wSTDataType(PropertySeg2.Mid(0, striter->second), wxT(":"));
5271         
5272                 while (wSTDataType.HasMoreTokens() == TRUE){
5273                 
5274                         wxSKeyURI = wSTDataType.GetNextToken();
5275                         wxSKeyMIME = wSTDataType.GetNextToken();
5276                         break;
5277                 
5278                 }                       
5279         
5280                 if (wxSKeyURI == wxT("data")){
5281                 
5282                                 wxStringTokenizer wSTDataInfo(PropertySeg2.Mid((striter->second + 1)), wxT(","));                       
5283         
5284                                 while (wSTDataInfo.HasMoreTokens() == TRUE){
5285                 
5286                                 wxSKeyEncoding = wSTDataInfo.GetNextToken();
5287                                 wxSKeyData = wSTDataInfo.GetNextToken();
5288                                 break;
5289                 
5290                         }
5291                 
5292                 }
5293         
5294         }
5295         
5296         // Add the data to the General/Home/Work address variables.
5297         
5298         if (wxSKeyURI == wxT("data")){
5299                 
5300                 KeyListDataEncType.erase(*KeyCount);
5301                 KeyListKeyType.erase(*KeyCount);
5302                 KeyListDataEncType.insert(std::make_pair(*KeyCount, wxSKeyEncoding));
5303                 KeyListKeyType.insert(std::make_pair(*KeyCount, TRUE));
5304                 
5305                 KeyList.erase(*KeyCount);
5306                 KeyList.insert(std::make_pair(*KeyCount, wxSKeyData));
5307         
5308         } else {
5309                 
5310                 KeyList.erase(*KeyCount);
5311                 KeyList.insert(std::make_pair(*KeyCount, PropertySeg2));
5312         
5313         }
5314         
5315         KeyListDataType.insert(std::make_pair(*KeyCount, wxSKeyMIME));
5316                 
5317         switch (PropType){
5318                 case PROPERTY_NONE:
5319                         break;
5320                 case PROPERTY_HOME: 
5321                         KeyListType.insert(std::make_pair(*KeyCount, wxT("home")));
5322                         break;
5323                 case PROPERTY_WORK: 
5324                         KeyListType.insert(std::make_pair(*KeyCount, wxT("work")));
5325                         break;
5326         }
5328         if (!PropertyTokens.IsEmpty()){
5330                 KeyListTokens.insert(std::make_pair(*KeyCount, PropertyTokens));
5332         }
5336 void ContactDataObject::ProcessVendor(wxString PropertySeg1, wxString PropertySeg2, int *VendorCount){
5338         // Split the Vendor three ways.
5339         
5340         wxStringTokenizer wSTVendorDetails(PropertySeg1, wxT("-"));
5341         
5342         wxString wxSVNDID;
5343         wxString wxSVNDPropName;
5344         long ListCtrlIndex;                     
5346         while (wSTVendorDetails.HasMoreTokens() == TRUE){
5347         
5348                 wSTVendorDetails.GetNextToken();
5349                 wxSVNDID = wSTVendorDetails.GetNextToken();
5350                 wxSVNDPropName = wSTVendorDetails.GetNextToken();
5351                 break;
5352         
5353         }
5354         
5355         if (!wxSVNDID.IsEmpty() && !wxSVNDPropName.IsEmpty()){
5356         
5357                 // Add the data to the vendor variables.
5358         
5359                 VendorList.erase(*VendorCount);
5360                 VendorListPEN.erase(*VendorCount);
5361                 VendorListElement.erase(*VendorCount);
5362         
5363                 VendorList.insert(std::make_pair(*VendorCount, PropertySeg2));
5364                 VendorListPEN.insert(std::make_pair(*VendorCount, wxSVNDID));
5365                 VendorListElement.insert(std::make_pair(*VendorCount, wxSVNDPropName));
5366         
5367         }
5371 void ProcessStringValue(wxString *PropertyName,
5372         wxString PropertyNameMatch,
5373         std::map<int,wxString> *MapPtr,
5374         wxString *PropertyValue,
5375         int *ItemCount,
5376         bool *PropertyMatched){
5377         
5378         if (*PropertyName == PropertyNameMatch){
5379                 MapPtr->erase(*ItemCount);
5380                 MapPtr->insert(std::make_pair(*ItemCount, *PropertyValue));
5381                 *PropertyMatched = TRUE;
5382         }
5383         
5386 void ProcessIntegerValue(wxString *PropertyName,
5387         wxString PropertyNameMatch,
5388         std::map<int,int> *PrefPtr, 
5389         wxString *PropertyValue, 
5390         int *ItemCount,
5391         bool *PropertyMatched){
5393         if (*PropertyName == PropertyNameMatch){
5394                 *PropertyMatched = TRUE;
5395         } else {
5396                 return;
5397         }
5399         int PriorityNumber = 0; 
5400         bool ValidNumber = TRUE;
5401                         
5402         try{
5403                 PriorityNumber = std::stoi(PropertyValue->ToStdString());
5404         }
5405                         
5406         catch(std::invalid_argument &e){
5407                 ValidNumber = FALSE;
5408         }
5410         if (ValidNumber == TRUE){
5412                 PrefPtr->erase(*ItemCount);
5413                 PrefPtr->insert(std::make_pair(*ItemCount, PriorityNumber));
5415         }
5419 void ProcessIntegerValue(std::map<int,int> *PrefPtr, 
5420         wxString *PropertyValue, 
5421         int *ItemCount){
5423         int PriorityNumber = 0; 
5424         bool ValidNumber = TRUE;
5425                         
5426         try{
5427                 PriorityNumber = std::stoi(PropertyValue->ToStdString());
5428         }
5429                         
5430         catch(std::invalid_argument &e){
5431                 ValidNumber = FALSE;
5432         }
5434         if (ValidNumber == TRUE){
5436                 PrefPtr->erase(*ItemCount);
5437                 PrefPtr->insert(std::make_pair(*ItemCount, PriorityNumber));
5439         }
5443 void SplitValues(wxString *PropertyLine, 
5444         std::map<int,int> *SplitPoints, 
5445         std::map<int,int> *SplitLength, 
5446         int intSize){
5447         
5448         size_t intPropertyLen = PropertyLine->Len();
5449         int intSplitsFound = 0;
5450         int intSplitSize = 0;
5451         int intSplitSeek = 0;
5452         
5453         for (int i = intSize; i <= intPropertyLen; i++){
5455                 intSplitSize++;
5456         
5457                 if (PropertyLine->Mid(i, 1) == wxT(";") &&
5458                     PropertyLine->Mid((i - 1), 1) != wxT("\\")){
5459            
5460                     if (intSplitsFound == 0){
5461             
5462                         SplitLength->insert(std::make_pair(intSplitsFound, (intSplitSize)));
5463           
5464                     } else {
5465            
5466                         SplitLength->insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
5467             
5468                     }
5469             
5470                     SplitPoints->insert(std::make_pair(intSplitsFound, (i + 1)));
5471             
5472                     intSplitsFound++;
5473                     intSplitSeek = i;
5474                     intSplitSize = 0;
5475             
5476                 }
5478         }
5480         if (intSplitsFound == 0){
5482                 SplitPoints->insert(std::make_pair(intSplitsFound, (8 + 1)));
5483                 SplitLength->insert(std::make_pair(intSplitsFound, intSplitSize));
5485         } else {
5487                 SplitPoints->insert(std::make_pair(intSplitsFound, (intSplitSeek + 1)));
5488                 SplitLength->insert(std::make_pair(intSplitsFound, intSplitSize));
5490         }
5494 void CheckType(wxString *PropertySeg1, 
5495         std::map<int,int> *SplitPoints, 
5496         std::map<int,int> *SplitLength, 
5497         int *intPrevValue, 
5498         PropertyType *PropType){
5499         
5500         wxString PropertyData;
5501         wxString PropertyName;
5502         wxString PropertyValue;
5503         std::map<int,int>::iterator SLiter;
5504         
5505         for (std::map<int, int>::iterator intiter = SplitPoints->begin(); 
5506         intiter != SplitPoints->end(); ++intiter){
5507         
5508                 SLiter = SplitLength->find(intiter->first);
5509         
5510                 PropertyData = PropertySeg1->Mid(*intPrevValue, (SLiter->second));
5511                 
5512                 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
5513                 PropertyName = PropertyElement.GetNextToken();                          
5514                 PropertyValue = PropertyElement.GetNextToken();
5515                 
5516                 *intPrevValue = intiter->second;
5517                 
5518                 if (PropertyName == wxT("TYPE")){
5519                                 
5520                         if (PropertyValue == wxT("work")){
5521                         
5522                                 *PropType = PROPERTY_WORK;
5523                                                         
5524                         } else if (PropertyValue == wxT("home")){
5526                                 *PropType = PROPERTY_HOME;
5527                                                         
5528                         } else {
5529                         
5530                                 *PropType = PROPERTY_NONE;
5531                         
5532                         }
5533                 
5534                         return;
5535                 
5536                 }
5537         
5538         }
5539         
Xestia Software Development
Yn Maystri
© 2006 - 2019 Xestia Software Development
Software

Xestia Address Book
Xestia Calendar
Development

Xestia Gelforn
Everything else

About
News
Privacy Policy