1 // CalendarJournal.cpp - CalendarJournal class functions
3 // (c) 2016-2017 Xestia Software Development.
5 // This file is part of Xestia Calendar.
7 // Xestia Calendar is free software: you can redistribute it and/or modify
8 // it under the terms of the GNU General Public License as published by the
9 // Free Software Foundation, version 3 of the license.
11 // Xestia Calendar is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License along
17 // with Xestia Calendar. If not, see <http://www.gnu.org/licenses/>
19 #include "CalendarJournal.h"
23 CalendarObjectValidResult CalendarJournalObject::ValidObject(){
25 bool ValidBegin = false;
26 bool ValidEnd = false;
27 bool ValidDateTimeStamp = false;
28 bool ValidUniqueID = false;
32 // Look for BEGIN:VJOURNAL.
34 for (vector<string>::iterator iter = ObjectName.begin();
35 iter != ObjectName.end(); iter++){
37 if (ObjectName[SeekCount] == "BEGIN" &&
38 ObjectData[SeekCount] == "VJOURNAL"){
40 if (ValidBegin == false){
43 return CALENDAROBJECTVALID_INVALIDFORMAT;
48 if (ObjectName[SeekCount] == "END" &&
49 ObjectData[SeekCount] == "VJOURNAL" &&
52 return CALENDAROBJECTVALID_INVALIDFORMAT;
64 for (vector<string>::iterator iter = ObjectName.begin();
65 iter != ObjectName.end(); iter++){
68 PropertyName = ObjectName[SeekCount].substr(0,7);
71 catch(const out_of_range& oor){
75 if (PropertyName == "DTSTAMP"){
77 if (ValidDateTimeStamp == false){
78 ValidDateTimeStamp = true;
80 return CALENDAROBJECTVALID_INVALIDFORMAT;
93 for (vector<string>::iterator iter = ObjectName.begin();
94 iter != ObjectName.end(); iter++){
97 PropertyName = ObjectName[SeekCount].substr(0,3);
100 catch(const out_of_range& oor){
104 if (PropertyName == "UID"){
106 if (ValidUniqueID == false){
107 ValidUniqueID = true;
109 return CALENDAROBJECTVALID_INVALIDFORMAT;
120 // Look for END:VJOURNAL.
122 for (vector<string>::iterator iter = ObjectName.begin();
123 iter != ObjectName.end(); iter++){
125 if (ObjectName[SeekCount] == "END" &&
126 ObjectData[SeekCount] == "VJOURNAL"){
128 if (ValidEnd == false){
131 return CALENDAROBJECTVALID_INVALIDFORMAT;
140 // Check if the VJOURNAL is valid.
142 if (ValidBegin == true &&
144 ValidDateTimeStamp == true &&
145 ValidUniqueID == true){
147 return CALENDAROBJECTVALID_OK;
151 return CALENDAROBJECTVALID_INVALIDFORMAT;
157 void CalendarJournalObject::ProcessData(){
161 multimap<string,string> DataReceived;
162 map<string,string> PropertyData;
163 string *PropertyNameData = nullptr;
164 int ObjectSeekCount = 0;
166 // Get the Date Time Stamp (DTSTAMP).
168 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "DTSTAMP");
170 // Process the data from DTSTAMP.
172 if (DataReceived.begin() != DataReceived.end()){
175 DateTimeStampTokens = DataReceived.begin()->first.substr(8);
178 catch(const out_of_range &oor){
179 // Do nothing as there is no data.
182 DateTimeStampData = DataReceived.begin()->second;
186 // Get the Unique ID (UID).
188 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "UID");
190 // Process the data from UID.
192 if (DataReceived.begin() != DataReceived.end()){
195 UniqueIDTokens = DataReceived.begin()->first.substr(4);
198 catch(const out_of_range &oor){
199 // Do nothing as there is no data.
202 UniqueID = DataReceived.begin()->second;
206 // Process the data from CLASS.
208 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "CLASS");
210 if (DataReceived.begin() != DataReceived.end()){
213 ClassDataTokens = DataReceived.begin()->first.substr(6);
216 catch(const out_of_range &oor){
217 // Do nothing as there is no data.
220 ClassData = DataReceived.begin()->second;
224 // Get the Date Time Start value.
226 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "DTSTART");
228 // Process the data from DTSTART.
230 if (DataReceived.begin() != DataReceived.end()){
232 bool TokenData = false;
233 string PropertyTokens;
235 PropertyNameData = (string*)&DataReceived.begin()->first;
237 PropertyData = SplitValues(*PropertyNameData);
239 for(map<string,string>::iterator iter = PropertyData.begin();
240 iter != PropertyData.end(); iter++){
242 if (iter->first == "VALUE"){
244 DateTimeStartDataValue = iter->second;
246 } else if (iter->first == "TZID"){
248 DateTimeStartDataTimeZoneID = iter->second;
252 if (TokenData == false){
255 PropertyTokens += ";";
258 PropertyTokens += iter->first;
259 PropertyTokens += "=";
260 PropertyTokens += iter->second;
266 if (PropertyTokens.size() > 0){
267 DateTimeStartDataTokens = PropertyTokens;
270 DateTimeStartData = DataReceived.begin()->second;
274 // Process the data from LAST-MODIFIED.
276 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "LAST-MODIFIED");
278 if (DataReceived.begin() != DataReceived.end()){
281 LastModifiedTokens = DataReceived.begin()->first.substr(14);
284 catch(const out_of_range &oor){
285 // Do nothing as there is no data.
288 LastModifiedData = DataReceived.begin()->second;
292 // Process the data from ORGANIZER.
294 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "ORGANIZER");
296 if (DataReceived.begin() != DataReceived.end()){
298 bool TokenData = false;
299 string PropertyTokens;
301 PropertyNameData = (string*)&DataReceived.begin()->first;
303 PropertyData = SplitValues(*PropertyNameData);
305 for(map<string,string>::iterator iter = PropertyData.begin();
306 iter != PropertyData.end(); iter++){
308 if (iter->first == "CN"){
310 OrganiserDataCommonName = iter->second;
312 } else if (iter->first == "DIR"){
314 OrganiserDataDirectoryEntry = iter->second;
316 } else if (iter->first == "SENT-BY"){
318 OrganiserDataSentByParam = iter->second;
320 } else if (iter->first == "LANGUAGE"){
322 OrganiserDataLanguage = iter->second;
326 if (TokenData == false){
329 PropertyTokens += ";";
332 PropertyTokens += iter->first;
333 PropertyTokens += "=";
334 PropertyTokens += iter->second;
340 if (PropertyTokens.size() > 0){
342 OrganiserDataTokens = PropertyTokens;
346 OrganiserData = DataReceived.begin()->second;
350 // Process the data from RECURRENCE-ID.
352 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "RECURRENCE-ID");
354 if (DataReceived.begin() != DataReceived.end()){
356 bool TokenData = false;
357 string PropertyTokens;
359 PropertyNameData = (string*)&DataReceived.begin()->first;
361 PropertyData = SplitValues(*PropertyNameData);
363 for(map<string,string>::iterator iter = PropertyData.begin();
364 iter != PropertyData.end(); iter++){
366 if (iter->first == "TZID"){
368 RecurranceIDDataTimeZoneParam = iter->second;
370 } else if (iter->first == "VALUE"){
372 RecurranceIDDataValue = iter->second;
374 } else if (iter->first == "RANGE"){
376 RecurranceIDDataRangeParam = iter->second;
380 if (TokenData == false){
383 PropertyTokens += ";";
386 PropertyTokens += iter->first;
387 PropertyTokens += "=";
388 PropertyTokens += iter->second;
394 if (PropertyTokens.size() > 0){
396 RecurranceIDDataTokens = PropertyTokens;
400 RecurranceIDData = DataReceived.begin()->second;
404 // Process the data from SEQUENCE.
406 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "SEQUENCE");
408 if (DataReceived.begin() != DataReceived.end()){
411 SequenceTokens = DataReceived.begin()->first.substr(9);
414 catch(const out_of_range &oor){
415 // Do nothing as there is no data.
419 SequenceData = stoi(DataReceived.begin()->second);
422 catch(const invalid_argument &oor){
423 SequenceTokens.clear();
428 // Process the data from STATUS.
430 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "STATUS");
432 if (DataReceived.begin() != DataReceived.end()){
434 bool TokenData = false;
435 string PropertyTokens;
437 PropertyNameData = (string*)&DataReceived.begin()->first;
439 PropertyData = SplitValues(*PropertyNameData);
441 for(map<string,string>::iterator iter = PropertyData.begin();
442 iter != PropertyData.end(); iter++){
444 if (iter->first == "LANGUAGE"){
446 StatusLanguage = iter->second;
450 if (TokenData == false){
453 PropertyTokens += ";";
456 PropertyTokens += iter->first;
457 PropertyTokens += "=";
458 PropertyTokens += iter->second;
464 if (PropertyTokens.size() > 0){
466 StatusTokens = PropertyTokens;
470 StatusData = DataReceived.begin()->second;
474 // Process the data from SUMMARY.
476 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "SUMMARY");
478 if (DataReceived.begin() != DataReceived.end()){
480 bool TokenData = false;
481 string PropertyTokens;
483 PropertyNameData = (string*)&DataReceived.begin()->first;
485 PropertyData = SplitValues(*PropertyNameData);
487 for(map<string,string>::iterator iter = PropertyData.begin();
488 iter != PropertyData.end(); iter++){
490 if (iter->first == "ALTREP"){
492 SummaryDataAltRep = iter->second;
494 } else if (iter->first == "LANGUAGE"){
496 SummaryDataLanguage = iter->second;
500 if (TokenData == false){
503 PropertyTokens += ";";
506 PropertyTokens += iter->first;
507 PropertyTokens += "=";
508 PropertyTokens += iter->second;
514 if (PropertyTokens.size() > 0){
516 SummaryDataTokens = PropertyTokens;
520 SummaryData = DataReceived.begin()->second;
524 // Process the data from URL.
526 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "URL");
528 if (DataReceived.begin() != DataReceived.end()){
531 URLDataTokens = DataReceived.begin()->first.substr(4);
534 catch(const out_of_range &oor){
535 // Do nothing as there is no data.
538 URLData = DataReceived.begin()->second;
542 // Process the data from RRULE.
544 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "RRULE");
546 if (DataReceived.begin() != DataReceived.end()){
549 RecurranceRuleDataTokens = DataReceived.begin()->first.substr(6);
552 catch(const out_of_range &oor){
553 // Do nothing as there is no data.
556 RecurranceRuleData = DataReceived.begin()->second;
560 // Process the data from ATTACH.
562 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, true, "ATTACH");
564 for(multimap<string,string>::iterator iter = DataReceived.begin();
565 iter != DataReceived.end();
568 AttachListEncoding.push_back("");
569 AttachListValue.push_back("");
570 AttachListFormatType.push_back("");
571 AttachListTokens.push_back("");
572 AttachList.push_back("");
574 bool TokenData = false;
575 string PropertyTokens;
577 PropertyNameData = (string*)&iter->first;
579 PropertyData = SplitValues(*PropertyNameData);
581 for(map<string,string>::iterator dataiter = PropertyData.begin();
582 dataiter != PropertyData.end(); dataiter++){
584 if (dataiter->first == "ENCODING"){
586 AttachListEncoding[ObjectSeekCount] = dataiter->second;
588 } else if (dataiter->first == "VALUE"){
590 AttachListValue[ObjectSeekCount] = dataiter->second;
592 } else if (dataiter->first == "FMTTYPE"){
594 AttachListFormatType[ObjectSeekCount] = dataiter->second;
598 if (TokenData == false){
601 PropertyTokens += ";";
604 PropertyTokens += dataiter->first;
605 PropertyTokens += "=";
606 PropertyTokens += dataiter->second;
612 if (PropertyTokens.size() > 0){
613 AttachListTokens[ObjectSeekCount] = PropertyTokens;
616 AttachList[ObjectSeekCount] = iter->second;
622 // Process the data from ATTENDEE.
624 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, true, "ATTENDEE");
628 for(multimap<string,string>::iterator iter = DataReceived.begin();
629 iter != DataReceived.end();
632 AttendeeListMember.push_back("");
633 AttendeeListDelegatedFrom.push_back("");
634 AttendeeListDelegatedTo.push_back("");
635 AttendeeListRole.push_back("");
636 AttendeeListRSVP.push_back("");
637 AttendeeListDirectoryEntry.push_back("");
638 AttendeeListSentBy.push_back("");
639 AttendeeListCommonName.push_back("");
640 AttendeeListCalendarUserType.push_back("");
641 AttendeeListParticipationStatus.push_back("");
642 AttendeeListLanguage.push_back("");
643 AttendeeListTokens.push_back("");
644 AttendeeList.push_back("");
646 bool TokenData = false;
647 string PropertyTokens;
649 PropertyNameData = (string*)&iter->first;
651 PropertyData = SplitValues(*PropertyNameData);
653 for(map<string,string>::iterator dataiter = PropertyData.begin();
654 dataiter != PropertyData.end(); dataiter++){
656 if (dataiter->first == "CUTYPE"){
658 AttendeeListCalendarUserType[ObjectSeekCount] = dataiter->second;
660 } else if (dataiter->first == "MEMBER"){
662 AttendeeListMember[ObjectSeekCount] = dataiter->second;
664 } else if (dataiter->first == "ROLE"){
666 AttendeeListRole[ObjectSeekCount] = dataiter->second;
668 } else if (dataiter->first == "PARTSTAT"){
670 AttendeeListParticipationStatus[ObjectSeekCount] = dataiter->second;
672 } else if (dataiter->first == "RSVP"){
674 AttendeeListRSVP[ObjectSeekCount] = dataiter->second;
676 } else if (dataiter->first == "DELEGATED-TO"){
678 AttendeeListDelegatedTo[ObjectSeekCount] = dataiter->second;
680 } else if (dataiter->first == "DELEGATED-FROM"){
682 AttendeeListDelegatedFrom[ObjectSeekCount] = dataiter->second;
684 } else if (dataiter->first == "SENT-BY"){
686 AttendeeListSentBy[ObjectSeekCount] = dataiter->second;
688 } else if (dataiter->first == "CN"){
690 AttendeeListCommonName[ObjectSeekCount] = dataiter->second;
692 } else if (dataiter->first == "DIR"){
694 AttendeeListDirectoryEntry[ObjectSeekCount] = dataiter->second;
696 } else if (dataiter->first == "LANGUAGE"){
698 AttendeeListLanguage[ObjectSeekCount] = dataiter->second;
702 if (TokenData == false){
705 PropertyTokens += ";";
708 PropertyTokens += dataiter->first;
709 PropertyTokens += "=";
710 PropertyTokens += dataiter->second;
716 if (PropertyTokens.size() > 0){
717 AttendeeListTokens[ObjectSeekCount] = PropertyTokens;
720 AttendeeList[ObjectSeekCount] = iter->second;
726 // Process the data from CATEGORIES.
728 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, true, "CATEGORIES");
732 for(multimap<string,string>::iterator iter = DataReceived.begin();
733 iter != DataReceived.end();
736 CategoriesListTokens.push_back("");
737 CategoriesListLanguage.push_back("");
738 CategoriesList.push_back("");
740 bool TokenData = false;
741 string PropertyTokens;
743 PropertyNameData = (string*)&iter->first;
745 PropertyData = SplitValues(*PropertyNameData);
747 for(map<string,string>::iterator dataiter = PropertyData.begin();
748 dataiter != PropertyData.end(); dataiter++){
750 if (dataiter->first == "LANGUAGE"){
752 CategoriesListLanguage[ObjectSeekCount] = dataiter->second;
756 if (TokenData == false){
759 PropertyTokens += ";";
762 PropertyTokens += dataiter->first;
763 PropertyTokens += "=";
764 PropertyTokens += dataiter->second;
770 if (PropertyTokens.size() > 0){
771 CategoriesListTokens[ObjectSeekCount] = PropertyTokens;
774 CategoriesList[ObjectSeekCount] = iter->second;
780 // Process the data from COMMENT.
782 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, true, "COMMENT");
786 for(multimap<string,string>::iterator iter = DataReceived.begin();
787 iter != DataReceived.end();
790 CommentListTokens.push_back("");
791 CommentListAltRep.push_back("");
792 CommentListLanguage.push_back("");
793 CommentList.push_back("");
795 bool TokenData = false;
796 string PropertyTokens;
798 PropertyNameData = (string*)&iter->first;
800 PropertyData = SplitValues(*PropertyNameData);
802 for(map<string,string>::iterator dataiter = PropertyData.begin();
803 dataiter != PropertyData.end(); dataiter++){
805 if (dataiter->first == "ALTREP"){
807 CommentListAltRep[ObjectSeekCount] = dataiter->second;
809 } else if (dataiter->first == "LANGUAGE"){
811 CommentListLanguage[ObjectSeekCount] = dataiter->second;
815 if (TokenData == false){
818 PropertyTokens += ";";
821 PropertyTokens += dataiter->first;
822 PropertyTokens += "=";
823 PropertyTokens += dataiter->second;
829 if (PropertyTokens.size() > 0){
830 CommentListTokens[ObjectSeekCount] = PropertyTokens;
833 CommentList[ObjectSeekCount] = iter->second;
839 // Process the data from CONTACT.
841 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, true, "CONTACT");
845 for(multimap<string,string>::iterator iter = DataReceived.begin();
846 iter != DataReceived.end();
849 ContactListTokens.push_back("");
850 ContactListAltRep.push_back("");
851 ContactListLanguage.push_back("");
852 ContactList.push_back("");
854 bool TokenData = false;
855 string PropertyTokens;
857 PropertyNameData = (string*)&iter->first;
859 PropertyData = SplitValues(*PropertyNameData);
861 for(map<string,string>::iterator dataiter = PropertyData.begin();
862 dataiter != PropertyData.end(); dataiter++){
864 if (dataiter->first == "ALTREP"){
866 ContactListAltRep[ObjectSeekCount] = dataiter->second;
868 } else if (dataiter->first == "LANGUAGE"){
870 ContactListLanguage[ObjectSeekCount] = dataiter->second;
874 if (TokenData == false){
877 PropertyTokens += ";";
880 PropertyTokens += dataiter->first;
881 PropertyTokens += "=";
882 PropertyTokens += dataiter->second;
888 if (PropertyTokens.size() > 0){
889 ContactListTokens[ObjectSeekCount] = PropertyTokens;
892 ContactList[ObjectSeekCount] = iter->second;
898 // Process the data from Description.
900 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, true, "DESCRIPTION");
904 for(multimap<string,string>::iterator iter = DataReceived.begin();
905 iter != DataReceived.end();
908 DescriptionListTokens.push_back("");
909 DescriptionListAltRep.push_back("");
910 DescriptionListLanguage.push_back("");
911 DescriptionList.push_back("");
913 bool TokenData = false;
914 string PropertyTokens;
916 PropertyNameData = (string*)&iter->first;
918 PropertyData = SplitValues(*PropertyNameData);
920 for(map<string,string>::iterator dataiter = PropertyData.begin();
921 dataiter != PropertyData.end(); dataiter++){
923 if (dataiter->first == "ALTREP"){
925 DescriptionListAltRep[ObjectSeekCount] = dataiter->second;
927 } else if (dataiter->first == "LANGUAGE"){
929 DescriptionListLanguage[ObjectSeekCount] = dataiter->second;
933 if (TokenData == false){
936 PropertyTokens += ";";
939 PropertyTokens += dataiter->first;
940 PropertyTokens += "=";
941 PropertyTokens += dataiter->second;
947 if (PropertyTokens.size() > 0){
948 DescriptionListTokens[ObjectSeekCount] = PropertyTokens;
951 DescriptionList[ObjectSeekCount] = iter->second;
957 // Process the data from EXDATE.
959 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, true, "EXDATE");
963 for(multimap<string,string>::iterator iter = DataReceived.begin();
964 iter != DataReceived.end();
967 ExcludeDateDataTokens.push_back("");
968 ExcludeDateDataValue.push_back("");
969 ExcludeDateDataTimeZoneParam.push_back("");
970 ExcludeDateData.push_back("");
972 bool TokenData = false;
973 string PropertyTokens;
975 PropertyNameData = (string*)&iter->first;
977 PropertyData = SplitValues(*PropertyNameData);
979 for(map<string,string>::iterator dataiter = PropertyData.begin();
980 dataiter != PropertyData.end(); dataiter++){
982 if (dataiter->first == "VALUE"){
984 ExcludeDateDataValue[ObjectSeekCount] = dataiter->second;
986 } else if (dataiter->first == "TZID"){
988 ExcludeDateDataTimeZoneParam[ObjectSeekCount] = dataiter->second;
992 if (TokenData == false){
995 PropertyTokens += ";";
998 PropertyTokens += dataiter->first;
999 PropertyTokens += "=";
1000 PropertyTokens += dataiter->second;
1006 if (PropertyTokens.size() > 0){
1007 ExcludeDateDataTokens[ObjectSeekCount] = PropertyTokens;
1010 ExcludeDateData[ObjectSeekCount] = iter->second;
1016 // Process the data from RELATED-TO.
1018 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, true, "RELATED-TO");
1020 ObjectSeekCount = 0;
1022 for(multimap<string,string>::iterator iter = DataReceived.begin();
1023 iter != DataReceived.end();
1026 RelatedToDataTokens.push_back("");
1027 RelatedToDataRelationType.push_back("");
1028 RelatedToData.push_back("");
1030 bool TokenData = false;
1031 string PropertyTokens;
1033 PropertyNameData = (string*)&iter->first;
1035 PropertyData = SplitValues(*PropertyNameData);
1037 for(map<string,string>::iterator dataiter = PropertyData.begin();
1038 dataiter != PropertyData.end(); dataiter++){
1040 if (dataiter->first == "RELTYPE"){
1042 RelatedToDataRelationType[ObjectSeekCount] = dataiter->second;
1046 if (TokenData == false){
1049 PropertyTokens += ";";
1052 PropertyTokens += dataiter->first;
1053 PropertyTokens += "=";
1054 PropertyTokens += dataiter->second;
1060 if (PropertyTokens.size() > 0){
1061 RelatedToDataTokens[ObjectSeekCount] = PropertyTokens;
1064 RelatedToData[ObjectSeekCount] = iter->second;
1070 // Process the data from RDATE.
1072 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, true, "RDATE");
1074 ObjectSeekCount = 0;
1076 for(multimap<string,string>::iterator iter = DataReceived.begin();
1077 iter != DataReceived.end();
1080 RecurranceDateDataTokens.push_back("");
1081 RecurranceDateDataValue.push_back("");
1082 RecurranceDateDataTimeZoneParam.push_back("");
1083 RecurranceDateData.push_back("");
1085 bool TokenData = false;
1086 string PropertyTokens;
1088 PropertyNameData = (string*)&iter->first;
1090 PropertyData = SplitValues(*PropertyNameData);
1092 for(map<string,string>::iterator dataiter = PropertyData.begin();
1093 dataiter != PropertyData.end(); dataiter++){
1095 if (dataiter->first == "VALUE"){
1097 RecurranceDateDataValue[ObjectSeekCount] = dataiter->second;
1099 } else if (dataiter->first == "TZID"){
1101 RecurranceDateDataTimeZoneParam[ObjectSeekCount] = dataiter->second;
1105 if (TokenData == false){
1108 PropertyTokens += ";";
1111 PropertyTokens += dataiter->first;
1112 PropertyTokens += "=";
1113 PropertyTokens += dataiter->second;
1119 if (PropertyTokens.size() > 0){
1120 RecurranceDateDataTokens[ObjectSeekCount] = PropertyTokens;
1123 RecurranceDateData[ObjectSeekCount] = iter->second;
1129 // Process the data from REQUEST-STATUS.
1131 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, true, "REQUEST-STATUS");
1133 ObjectSeekCount = 0;
1135 for(multimap<string,string>::iterator iter = DataReceived.begin();
1136 iter != DataReceived.end();
1139 RequestStatusTokens.push_back("");
1140 RequestStatusLanguage.push_back("");
1141 RequestStatusData.push_back("");
1143 bool TokenData = false;
1144 string PropertyTokens;
1146 PropertyNameData = (string*)&iter->first;
1148 PropertyData = SplitValues(*PropertyNameData);
1150 for(map<string,string>::iterator dataiter = PropertyData.begin();
1151 dataiter != PropertyData.end(); dataiter++){
1153 if (dataiter->first == "LANGUAGE"){
1155 RequestStatusLanguage[ObjectSeekCount] = dataiter->second;
1159 if (TokenData == false){
1162 PropertyTokens += ";";
1165 PropertyTokens += dataiter->first;
1166 PropertyTokens += "=";
1167 PropertyTokens += dataiter->second;
1173 if (PropertyTokens.size() > 0){
1174 RequestStatusTokens[ObjectSeekCount] = PropertyTokens;
1177 RequestStatusData[ObjectSeekCount] = iter->second;
1183 ObjectSeekCount = 0;
1185 // Process data from X-*
1187 for(vector<string>::iterator iter = ObjectName.begin();
1188 iter != ObjectName.end(); ++iter){
1190 bool TokenData = false;
1191 string PropertyTokens;
1193 if (iter->substr(0,2) == "X-" &&
1196 XTokensData.push_back(ObjectData[ObjectSeekCount]);
1197 XTokensDataTokens.push_back(ObjectName[ObjectSeekCount]);