1 // CalendarEvent.cpp - CalendarEventObject 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 "CalendarEvent.h"
23 CalendarObjectValidResult CalendarEventObject::ValidObject(){
25 bool validBegin = false;
26 bool validEnd = false;
27 bool validDateTimeStamp = false;
28 bool validUniqueID = false;
29 bool validDateTimeStart = false;
33 // Look for BEGIN:VEVENT.
35 for (vector<string>::iterator iter = objectName.begin();
36 iter != objectName.end(); iter++){
38 if (objectName[seekCount] == "BEGIN" &&
39 objectData[seekCount] == "VEVENT"){
41 if (validBegin == false){
44 return CALENDAROBJECTVALID_INVALIDFORMAT;
49 if (objectName[seekCount] == "END" &&
50 objectData[seekCount] == "VEVENT" &&
53 return CALENDAROBJECTVALID_INVALIDFORMAT;
65 for (vector<string>::iterator iter = objectName.begin();
66 iter != objectName.end(); iter++){
69 propertyName = objectName[seekCount].substr(0,7);
72 catch(const out_of_range& oor){
76 if (propertyName == "DTSTAMP"){
78 if (validDateTimeStamp == false){
79 validDateTimeStamp = true;
81 return CALENDAROBJECTVALID_INVALIDFORMAT;
94 for (vector<string>::iterator iter = objectName.begin();
95 iter != objectName.end(); iter++){
98 propertyName = objectName[seekCount].substr(0,3);
101 catch(const out_of_range& oor){
105 if (propertyName == "UID"){
107 if (validUniqueID == false){
108 validUniqueID = true;
110 return CALENDAROBJECTVALID_INVALIDFORMAT;
121 // Look for DTSTART if nothing is set for METHOD..
123 if (methodData.size() == 0){
125 for (vector<string>::iterator iter = objectName.begin();
126 iter != objectName.end(); iter++){
129 propertyName = objectName[seekCount].substr(0,7);
132 catch(const out_of_range& oor){
136 if (propertyName == "DTSTART"){
138 if (validDateTimeStart == false){
139 validDateTimeStart = true;
141 return CALENDAROBJECTVALID_INVALIDFORMAT;
151 validDateTimeStart = true;
156 // Look for END:VEVENT.
158 for (vector<string>::iterator iter = objectName.begin();
159 iter != objectName.end(); iter++){
161 if (objectName[seekCount] == "END" &&
162 objectData[seekCount] == "VEVENT"){
164 if (validEnd == false){
167 return CALENDAROBJECTVALID_INVALIDFORMAT;
176 // Check if the VEVENT is valid.
178 if (validBegin == true &&
180 validDateTimeStamp == true &&
181 validDateTimeStart == true &&
182 validUniqueID == true){
184 return CALENDAROBJECTVALID_OK;
188 return CALENDAROBJECTVALID_INVALIDFORMAT;
194 void CalendarEventObject::ProcessData(){
198 multimap<string,string> dataReceived;
199 map<string,string> propertyData;
200 string *propertyNameData = nullptr;
201 int objectSeekCount = 0;
203 // Get the Date Time Stamp (DTSTAMP).
205 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "DTSTAMP");
207 // Process the data from DTSTAMP.
209 if (dataReceived.begin() != dataReceived.end()){
212 dateTimeStampTokens = dataReceived.begin()->first.substr(8);
215 catch(const out_of_range &oor){
216 // Do nothing as there is no data.
219 dateTimeStampData = dataReceived.begin()->second;
223 // Get the Unique ID (UID).
225 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "UID");
227 // Process the data from UID.
229 if (dataReceived.begin() != dataReceived.end()){
232 uniqueIDTokens = dataReceived.begin()->first.substr(4);
235 catch(const out_of_range &oor){
236 // Do nothing as there is no data.
239 uniqueID = dataReceived.begin()->second;
243 // Get the Date Time Start value.
245 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "DTSTART");
247 // Process the data from DTSTART.
249 if (dataReceived.begin() != dataReceived.end()){
251 bool tokenData = false;
252 string propertyTokens;
254 propertyNameData = (string*)&dataReceived.begin()->first;
256 propertyData = SplitValues(*propertyNameData);
258 for(map<string,string>::iterator iter = propertyData.begin();
259 iter != propertyData.end(); iter++){
261 if (iter->first == "VALUE"){
263 dateTimeStartDataValue = iter->second;
265 } else if (iter->first == "TZID"){
267 dateTimeStartDataTimeZoneID = iter->second;
271 if (tokenData == false){
274 propertyTokens += ";";
277 propertyTokens += iter->first;
278 propertyTokens += "=";
279 propertyTokens += iter->second;
285 if (propertyTokens.size() > 0){
286 dateTimeStartDataTokens = propertyTokens;
289 dateTimeStartData = dataReceived.begin()->second;
293 // Process the data from CLASS.
295 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "CLASS");
297 if (dataReceived.begin() != dataReceived.end()){
300 classDataTokens = dataReceived.begin()->first.substr(6);
303 catch(const out_of_range &oor){
304 // Do nothing as there is no data.
307 classData = dataReceived.begin()->second;
311 // Process the data from CREATED.
313 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "CREATED");
315 if (dataReceived.begin() != dataReceived.end()){
318 dateTimeCreatedTokens = dataReceived.begin()->first.substr(8);
321 catch(const out_of_range &oor){
322 // Do nothing as there is no data.
325 dateTimeCreatedData = dataReceived.begin()->second;
329 // Process the data from DESCRIPTION.
331 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "DESCRIPTION");
333 if (dataReceived.begin() != dataReceived.end()){
335 bool tokenData = false;
336 string propertyTokens;
338 propertyNameData = (string*)&dataReceived.begin()->first;
340 propertyData = SplitValues(*propertyNameData);
342 for(map<string,string>::iterator iter = propertyData.begin();
343 iter != propertyData.end(); iter++){
345 if (iter->first == "ALTREP"){
347 descriptionListAltRep.clear();
348 descriptionListAltRep.push_back(iter->second);
350 } else if (iter->first == "LANGUAGE"){
352 descriptionListLanguage.clear();
353 descriptionListLanguage.push_back(iter->second);
357 if (tokenData == false){
360 propertyTokens += ";";
363 propertyTokens += iter->first;
364 propertyTokens += "=";
365 propertyTokens += iter->second;
371 if (propertyTokens.size() > 0){
372 descriptionListTokens.clear();
373 descriptionListTokens.push_back(propertyTokens);
376 descriptionList.clear();
377 descriptionList.push_back(dataReceived.begin()->second);
381 // Process the data from GEO.
383 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "GEO");
385 if (dataReceived.begin() != dataReceived.end()){
388 geographicTokens = dataReceived.begin()->first.substr(4);
391 catch(const out_of_range &oor){
392 // Do nothing as there is no data.
395 geographicData = dataReceived.begin()->second;
399 // Process the data from LAST-MODIFIED.
401 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "LAST-MODIFIED");
403 if (dataReceived.begin() != dataReceived.end()){
406 lastModifiedTokens = dataReceived.begin()->first.substr(14);
409 catch(const out_of_range &oor){
410 // Do nothing as there is no data.
413 lastModifiedData = dataReceived.begin()->second;
417 // Process the data from LOCATION.
419 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "LOCATION");
421 if (dataReceived.begin() != dataReceived.end()){
423 bool tokenData = false;
424 string propertyTokens;
426 propertyNameData = (string*)&dataReceived.begin()->first;
428 propertyData = SplitValues(*propertyNameData);
430 for(map<string,string>::iterator iter = propertyData.begin();
431 iter != propertyData.end(); iter++){
433 if (iter->first == "ALTREP"){
435 locationDataAltRep = iter->second;
437 } else if (iter->first == "LANGUAGE"){
439 locationDataLanguage = iter->second;
443 if (tokenData == false){
446 propertyTokens += ";";
449 propertyTokens += iter->first;
450 propertyTokens += "=";
451 propertyTokens += iter->second;
457 if (propertyTokens.size() > 0){
459 locationDataTokens = propertyTokens;
463 locationData = dataReceived.begin()->second;
467 // Process the data from ORGANIZER.
469 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "ORGANIZER");
471 if (dataReceived.begin() != dataReceived.end()){
473 bool tokenData = false;
474 string propertyTokens;
476 propertyNameData = (string*)&dataReceived.begin()->first;
478 propertyData = SplitValues(*propertyNameData);
480 for(map<string,string>::iterator iter = propertyData.begin();
481 iter != propertyData.end(); iter++){
483 if (iter->first == "CN"){
485 organiserDataCommonName = iter->second;
487 } else if (iter->first == "DIR"){
489 organiserDataDirectoryEntry = iter->second;
491 } else if (iter->first == "SENT-BY"){
493 organiserDataSentByParam = iter->second;
495 } else if (iter->first == "LANGUAGE"){
497 organiserDataLanguage = iter->second;
501 if (tokenData == false){
504 propertyTokens += ";";
507 propertyTokens += iter->first;
508 propertyTokens += "=";
509 propertyTokens += iter->second;
515 if (propertyTokens.size() > 0){
517 organiserDataTokens = propertyTokens;
521 organiserData = dataReceived.begin()->second;
525 // Process the data from PRIORITY.
527 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "PRIORITY");
529 if (dataReceived.begin() != dataReceived.end()){
532 priorityTokens = dataReceived.begin()->first.substr(9);
535 catch(const out_of_range &oor){
536 // Do nothing as there is no data.
540 priorityData = stoi(dataReceived.begin()->second);
543 catch(const invalid_argument &oor){
544 priorityTokens.clear();
549 // Process the data from SEQUENCE.
551 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "SEQUENCE");
553 if (dataReceived.begin() != dataReceived.end()){
556 sequenceTokens = dataReceived.begin()->first.substr(9);
559 catch(const out_of_range &oor){
560 // Do nothing as there is no data.
564 sequenceData = stoi(dataReceived.begin()->second);
567 catch(const invalid_argument &oor){
568 sequenceTokens.clear();
573 // Process the data from STATUS.
575 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "STATUS");
577 if (dataReceived.begin() != dataReceived.end()){
579 bool tokenData = false;
580 string propertyTokens;
582 propertyNameData = (string*)&dataReceived.begin()->first;
584 propertyData = SplitValues(*propertyNameData);
586 for(map<string,string>::iterator iter = propertyData.begin();
587 iter != propertyData.end(); iter++){
589 if (iter->first == "LANGUAGE"){
591 statusLanguage = iter->second;
595 if (tokenData == false){
598 propertyTokens += ";";
601 propertyTokens += iter->first;
602 propertyTokens += "=";
603 propertyTokens += iter->second;
609 if (propertyTokens.size() > 0){
611 statusTokens = propertyTokens;
615 statusData = dataReceived.begin()->second;
619 // Process the data from SUMMARY.
621 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "SUMMARY");
623 if (dataReceived.begin() != dataReceived.end()){
625 bool tokenData = false;
626 string propertyTokens;
628 propertyNameData = (string*)&dataReceived.begin()->first;
630 propertyData = SplitValues(*propertyNameData);
632 for(map<string,string>::iterator iter = propertyData.begin();
633 iter != propertyData.end(); iter++){
635 if (iter->first == "ALTREP"){
637 summaryDataAltRep = iter->second;
639 } else if (iter->first == "LANGUAGE"){
641 summaryDataLanguage = iter->second;
645 if (tokenData == false){
648 propertyTokens += ";";
651 propertyTokens += iter->first;
652 propertyTokens += "=";
653 propertyTokens += iter->second;
659 if (propertyTokens.size() > 0){
661 summaryDataTokens = propertyTokens;
665 summaryData = dataReceived.begin()->second;
669 // Process the data from TRANSP.
671 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "TRANSP");
673 if (dataReceived.begin() != dataReceived.end()){
676 timeTransparencyDataTokens = dataReceived.begin()->first.substr(7);
679 catch(const out_of_range &oor){
680 // Do nothing as there is no data.
683 timeTransparencyData = dataReceived.begin()->second;
687 // Process the data from URL.
689 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "URL");
691 if (dataReceived.begin() != dataReceived.end()){
694 urlDataTokens = dataReceived.begin()->first.substr(4);
697 catch(const out_of_range &oor){
698 // Do nothing as there is no data.
701 urlData = dataReceived.begin()->second;
705 // Process the data from RECURRENCE-ID.
707 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "RECURRENCE-ID");
709 if (dataReceived.begin() != dataReceived.end()){
711 bool tokenData = false;
712 string propertyTokens;
714 propertyNameData = (string*)&dataReceived.begin()->first;
716 propertyData = SplitValues(*propertyNameData);
718 for(map<string,string>::iterator iter = propertyData.begin();
719 iter != propertyData.end(); iter++){
721 if (iter->first == "TZID"){
723 recurranceIDDataTimeZoneParam = iter->second;
725 } else if (iter->first == "VALUE"){
727 recurranceIDDataValue = iter->second;
729 } else if (iter->first == "RANGE"){
731 recurranceIDDataRangeParam = iter->second;
735 if (tokenData == false){
738 propertyTokens += ";";
741 propertyTokens += iter->first;
742 propertyTokens += "=";
743 propertyTokens += iter->second;
749 if (propertyTokens.size() > 0){
751 recurranceIDDataTokens = propertyTokens;
755 recurranceIDData = dataReceived.begin()->second;
759 // Process the data from RRULE.
761 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "RRULE");
763 if (dataReceived.begin() != dataReceived.end()){
766 recurranceRuleDataTokens = dataReceived.begin()->first.substr(6);
769 catch(const out_of_range &oor){
770 // Do nothing as there is no data.
773 recurranceRuleData = dataReceived.begin()->second;
777 // Process the data from DTEND.
779 bool dateTimeEndProcessed = false;
781 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "DTEND");
783 if (dataReceived.begin() != dataReceived.end()){
785 bool tokenData = false;
786 string propertyTokens;
788 propertyNameData = (string*)&dataReceived.begin()->first;
790 propertyData = SplitValues(*propertyNameData);
792 for(map<string,string>::iterator iter = propertyData.begin();
793 iter != propertyData.end(); iter++){
795 if (iter->first == "VALUE"){
797 dateTimeEndDataValue = iter->second;
799 } else if (iter->first == "TZID"){
801 dateTimeEndDataTimeZoneID = iter->second;
805 if (tokenData == false){
808 propertyTokens += ";";
811 propertyTokens += iter->first;
812 propertyTokens += "=";
813 propertyTokens += iter->second;
819 if (propertyTokens.size() > 0){
820 dateTimeEndDataTokens = propertyTokens;
823 dateTimeEndData = dataReceived.begin()->second;
825 dateTimeEndProcessed = true;
829 if (dateTimeEndProcessed == false){
831 // Process the data from DURATION if DTEND
832 // hasn't already been processed.
834 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "DURATION");
836 bool tokenData = false;
837 string propertyTokens;
839 if (dataReceived.begin() != dataReceived.end()){
841 durationData = dataReceived.begin()->second;
843 propertyNameData = (string*)&dataReceived.begin()->first;
845 propertyData = SplitValues(*propertyNameData);
847 for(map<string,string>::iterator dataiter = propertyData.begin();
848 dataiter != propertyData.end(); dataiter++){
850 if (tokenData == false){
853 propertyTokens += ";";
856 propertyTokens += dataiter->first;
857 propertyTokens += "=";
858 propertyTokens += dataiter->second;
862 if (propertyTokens.size() > 0){
863 durationDataTokens = propertyTokens;
870 // Process the data from ATTACH.
872 dataReceived = ProcessTextVectors(&objectName, &objectData, true, "ATTACH");
874 for(multimap<string,string>::iterator iter = dataReceived.begin();
875 iter != dataReceived.end();
878 attachListEncoding.push_back("");
879 attachListValue.push_back("");
880 attachListFormatType.push_back("");
881 attachListTokens.push_back("");
882 attachList.push_back("");
884 bool tokenData = false;
885 string propertyTokens;
887 propertyNameData = (string*)&iter->first;
889 propertyData = SplitValues(*propertyNameData);
891 for(map<string,string>::iterator dataiter = propertyData.begin();
892 dataiter != propertyData.end(); dataiter++){
894 if (dataiter->first == "ENCODING"){
896 attachListEncoding[objectSeekCount] = dataiter->second;
898 } else if (dataiter->first == "VALUE"){
900 attachListValue[objectSeekCount] = dataiter->second;
902 } else if (dataiter->first == "FMTTYPE"){
904 attachListFormatType[objectSeekCount] = dataiter->second;
908 if (tokenData == false){
911 propertyTokens += ";";
914 propertyTokens += dataiter->first;
915 propertyTokens += "=";
916 propertyTokens += dataiter->second;
922 if (propertyTokens.size() > 0){
923 attachListTokens[objectSeekCount] = propertyTokens;
926 attachList[objectSeekCount] = iter->second;
932 // Process the data from ATTENDEE.
934 dataReceived = ProcessTextVectors(&objectName, &objectData, true, "ATTENDEE");
938 for(multimap<string,string>::iterator iter = dataReceived.begin();
939 iter != dataReceived.end();
942 attendeeListMember.push_back("");
943 attendeeListDelegatedFrom.push_back("");
944 attendeeListDelegatedTo.push_back("");
945 attendeeListRole.push_back("");
946 attendeeListRSVP.push_back("");
947 attendeeListDirectoryEntry.push_back("");
948 attendeeListSentBy.push_back("");
949 attendeeListCommonName.push_back("");
950 attendeeListCalendarUserType.push_back("");
951 attendeeListParticipationStatus.push_back("");
952 attendeeListLanguage.push_back("");
953 attendeeListTokens.push_back("");
954 attendeeList.push_back("");
956 bool tokenData = false;
957 string propertyTokens;
959 propertyNameData = (string*)&iter->first;
961 propertyData = SplitValues(*propertyNameData);
963 for(map<string,string>::iterator dataiter = propertyData.begin();
964 dataiter != propertyData.end(); dataiter++){
966 if (dataiter->first == "CUTYPE"){
968 attendeeListCalendarUserType[objectSeekCount] = dataiter->second;
970 } else if (dataiter->first == "MEMBER"){
972 attendeeListMember[objectSeekCount] = dataiter->second;
974 } else if (dataiter->first == "ROLE"){
976 attendeeListRole[objectSeekCount] = dataiter->second;
978 } else if (dataiter->first == "PARTSTAT"){
980 attendeeListParticipationStatus[objectSeekCount] = dataiter->second;
982 } else if (dataiter->first == "RSVP"){
984 attendeeListRSVP[objectSeekCount] = dataiter->second;
986 } else if (dataiter->first == "DELEGATED-TO"){
988 attendeeListDelegatedTo[objectSeekCount] = dataiter->second;
990 } else if (dataiter->first == "DELEGATED-FROM"){
992 attendeeListDelegatedFrom[objectSeekCount] = dataiter->second;
994 } else if (dataiter->first == "SENT-BY"){
996 attendeeListSentBy[objectSeekCount] = dataiter->second;
998 } else if (dataiter->first == "CN"){
1000 attendeeListCommonName[objectSeekCount] = dataiter->second;
1002 } else if (dataiter->first == "DIR"){
1004 attendeeListDirectoryEntry[objectSeekCount] = dataiter->second;
1006 } else if (dataiter->first == "LANGUAGE"){
1008 attendeeListLanguage[objectSeekCount] = dataiter->second;
1012 if (tokenData == false){
1015 propertyTokens += ";";
1018 propertyTokens += dataiter->first;
1019 propertyTokens += "=";
1020 propertyTokens += dataiter->second;
1026 if (propertyTokens.size() > 0){
1027 attendeeListTokens[objectSeekCount] = propertyTokens;
1030 attendeeList[objectSeekCount] = iter->second;
1036 // Process the data from CATEGORIES.
1038 dataReceived = ProcessTextVectors(&objectName, &objectData, true, "CATEGORIES");
1040 objectSeekCount = 0;
1042 for(multimap<string,string>::iterator iter = dataReceived.begin();
1043 iter != dataReceived.end();
1046 categoriesListTokens.push_back("");
1047 categoriesListLanguage.push_back("");
1048 categoriesList.push_back("");
1050 bool tokenData = false;
1051 string propertyTokens;
1053 propertyNameData = (string*)&iter->first;
1055 propertyData = SplitValues(*propertyNameData);
1057 for(map<string,string>::iterator dataiter = propertyData.begin();
1058 dataiter != propertyData.end(); dataiter++){
1060 if (dataiter->first == "LANGUAGE"){
1062 categoriesListLanguage[objectSeekCount] = dataiter->second;
1066 if (tokenData == false){
1069 propertyTokens += ";";
1072 propertyTokens += dataiter->first;
1073 propertyTokens += "=";
1074 propertyTokens += dataiter->second;
1080 if (propertyTokens.size() > 0){
1081 categoriesListTokens[objectSeekCount] = propertyTokens;
1084 categoriesList[objectSeekCount] = iter->second;
1090 // Process the data from COMMENT.
1092 dataReceived = ProcessTextVectors(&objectName, &objectData, true, "COMMENT");
1094 objectSeekCount = 0;
1096 for(multimap<string,string>::iterator iter = dataReceived.begin();
1097 iter != dataReceived.end();
1100 commentListTokens.push_back("");
1101 commentListAltRep.push_back("");
1102 commentListLanguage.push_back("");
1103 commentList.push_back("");
1105 bool tokenData = false;
1106 string propertyTokens;
1108 propertyNameData = (string*)&iter->first;
1110 propertyData = SplitValues(*propertyNameData);
1112 for(map<string,string>::iterator dataiter = propertyData.begin();
1113 dataiter != propertyData.end(); dataiter++){
1115 if (dataiter->first == "ALTREP"){
1117 commentListAltRep[objectSeekCount] = dataiter->second;
1119 } else if (dataiter->first == "LANGUAGE"){
1121 commentListLanguage[objectSeekCount] = dataiter->second;
1125 if (tokenData == false){
1128 propertyTokens += ";";
1131 propertyTokens += dataiter->first;
1132 propertyTokens += "=";
1133 propertyTokens += dataiter->second;
1139 if (propertyTokens.size() > 0){
1140 commentListTokens[objectSeekCount] = propertyTokens;
1143 commentList[objectSeekCount] = iter->second;
1149 // Process the data from CONTACT.
1151 dataReceived = ProcessTextVectors(&objectName, &objectData, true, "CONTACT");
1153 objectSeekCount = 0;
1155 for(multimap<string,string>::iterator iter = dataReceived.begin();
1156 iter != dataReceived.end();
1159 contactListTokens.push_back("");
1160 contactListAltRep.push_back("");
1161 contactListLanguage.push_back("");
1162 contactList.push_back("");
1164 bool tokenData = false;
1165 string propertyTokens;
1167 propertyNameData = (string*)&iter->first;
1169 propertyData = SplitValues(*propertyNameData);
1171 for(map<string,string>::iterator dataiter = propertyData.begin();
1172 dataiter != propertyData.end(); dataiter++){
1174 if (dataiter->first == "ALTREP"){
1176 contactListAltRep[objectSeekCount] = dataiter->second;
1178 } else if (dataiter->first == "LANGUAGE"){
1180 contactListLanguage[objectSeekCount] = dataiter->second;
1184 if (tokenData == false){
1187 propertyTokens += ";";
1190 propertyTokens += dataiter->first;
1191 propertyTokens += "=";
1192 propertyTokens += dataiter->second;
1198 if (propertyTokens.size() > 0){
1199 contactListTokens[objectSeekCount] = propertyTokens;
1202 contactList[objectSeekCount] = iter->second;
1208 // Process the data from EXDATE.
1210 dataReceived = ProcessTextVectors(&objectName, &objectData, true, "EXDATE");
1212 objectSeekCount = 0;
1214 for(multimap<string,string>::iterator iter = dataReceived.begin();
1215 iter != dataReceived.end();
1218 excludeDateDataTokens.push_back("");
1219 excludeDateDataValue.push_back("");
1220 excludeDateDataTimeZoneParam.push_back("");
1221 excludeDateData.push_back("");
1223 bool tokenData = false;
1224 string propertyTokens;
1226 propertyNameData = (string*)&iter->first;
1228 propertyData = SplitValues(*propertyNameData);
1230 for(map<string,string>::iterator dataiter = propertyData.begin();
1231 dataiter != propertyData.end(); dataiter++){
1233 if (dataiter->first == "VALUE"){
1235 excludeDateDataValue[objectSeekCount] = dataiter->second;
1237 } else if (dataiter->first == "TZID"){
1239 excludeDateDataTimeZoneParam[objectSeekCount] = dataiter->second;
1243 if (tokenData == false){
1246 propertyTokens += ";";
1249 propertyTokens += dataiter->first;
1250 propertyTokens += "=";
1251 propertyTokens += dataiter->second;
1257 if (propertyTokens.size() > 0){
1258 excludeDateDataTokens[objectSeekCount] = propertyTokens;
1261 excludeDateData[objectSeekCount] = iter->second;
1267 // Process the data from REQUEST-STATUS.
1269 dataReceived = ProcessTextVectors(&objectName, &objectData, true, "REQUEST-STATUS");
1271 objectSeekCount = 0;
1273 for(multimap<string,string>::iterator iter = dataReceived.begin();
1274 iter != dataReceived.end();
1277 requestStatusTokens.push_back("");
1278 requestStatusLanguage.push_back("");
1279 requestStatusData.push_back("");
1281 bool tokenData = false;
1282 string propertyTokens;
1284 propertyNameData = (string*)&iter->first;
1286 propertyData = SplitValues(*propertyNameData);
1288 for(map<string,string>::iterator dataiter = propertyData.begin();
1289 dataiter != propertyData.end(); dataiter++){
1291 if (dataiter->first == "LANGUAGE"){
1293 requestStatusLanguage[objectSeekCount] = dataiter->second;
1297 if (tokenData == false){
1300 propertyTokens += ";";
1303 propertyTokens += dataiter->first;
1304 propertyTokens += "=";
1305 propertyTokens += dataiter->second;
1311 if (propertyTokens.size() > 0){
1312 requestStatusTokens[objectSeekCount] = propertyTokens;
1315 requestStatusData[objectSeekCount] = iter->second;
1321 // Process the data from RELATED-TO.
1323 dataReceived = ProcessTextVectors(&objectName, &objectData, true, "RELATED-TO");
1325 objectSeekCount = 0;
1327 for(multimap<string,string>::iterator iter = dataReceived.begin();
1328 iter != dataReceived.end();
1331 relatedToDataTokens.push_back("");
1332 relatedToDataRelationType.push_back("");
1333 relatedToData.push_back("");
1335 bool tokenData = false;
1336 string propertyTokens;
1338 propertyNameData = (string*)&iter->first;
1340 propertyData = SplitValues(*propertyNameData);
1342 for(map<string,string>::iterator dataiter = propertyData.begin();
1343 dataiter != propertyData.end(); dataiter++){
1345 if (dataiter->first == "RELTYPE"){
1347 relatedToDataRelationType[objectSeekCount] = dataiter->second;
1351 if (tokenData == false){
1354 propertyTokens += ";";
1357 propertyTokens += dataiter->first;
1358 propertyTokens += "=";
1359 propertyTokens += dataiter->second;
1365 if (propertyTokens.size() > 0){
1366 relatedToDataTokens[objectSeekCount] = propertyTokens;
1369 relatedToData[objectSeekCount] = iter->second;
1375 // Process the data from RESOURCES.
1377 dataReceived = ProcessTextVectors(&objectName, &objectData, true, "RESOURCES");
1379 objectSeekCount = 0;
1381 for(multimap<string,string>::iterator iter = dataReceived.begin();
1382 iter != dataReceived.end();
1385 resourcesDataTokens.push_back("");
1386 resourcesDataAltRep.push_back("");
1387 resourcesDataLanguage.push_back("");
1388 resourcesData.push_back("");
1390 bool tokenData = false;
1391 string propertyTokens;
1393 propertyNameData = (string*)&iter->first;
1395 propertyData = SplitValues(*propertyNameData);
1397 for(map<string,string>::iterator dataiter = propertyData.begin();
1398 dataiter != propertyData.end(); dataiter++){
1400 if (dataiter->first == "ALTREP"){
1402 resourcesDataAltRep[objectSeekCount] = dataiter->second;
1404 } else if (dataiter->first == "LANGUAGE"){
1406 resourcesDataLanguage[objectSeekCount] = dataiter->second;
1410 if (tokenData == false){
1413 propertyTokens += ";";
1416 propertyTokens += dataiter->first;
1417 propertyTokens += "=";
1418 propertyTokens += dataiter->second;
1424 if (propertyTokens.size() > 0){
1425 resourcesDataTokens[objectSeekCount] = propertyTokens;
1428 resourcesData[objectSeekCount] = iter->second;
1434 // Process the data from RDATE.
1436 dataReceived = ProcessTextVectors(&objectName, &objectData, true, "RDATE");
1438 objectSeekCount = 0;
1440 for(multimap<string,string>::iterator iter = dataReceived.begin();
1441 iter != dataReceived.end();
1444 recurranceDateDataTokens.push_back("");
1445 recurranceDateDataValue.push_back("");
1446 recurranceDateDataTimeZoneParam.push_back("");
1447 recurranceDateData.push_back("");
1449 bool tokenData = false;
1450 string propertyTokens;
1452 propertyNameData = (string*)&iter->first;
1454 propertyData = SplitValues(*propertyNameData);
1456 for(map<string,string>::iterator dataiter = propertyData.begin();
1457 dataiter != propertyData.end(); dataiter++){
1459 if (dataiter->first == "VALUE"){
1461 recurranceDateDataValue[objectSeekCount] = dataiter->second;
1463 } else if (dataiter->first == "TZID"){
1465 recurranceDateDataTimeZoneParam[objectSeekCount] = dataiter->second;
1469 if (tokenData == false){
1472 propertyTokens += ";";
1475 propertyTokens += dataiter->first;
1476 propertyTokens += "=";
1477 propertyTokens += dataiter->second;
1483 if (propertyTokens.size() > 0){
1484 recurranceDateDataTokens[objectSeekCount] = propertyTokens;
1487 recurranceDateData[objectSeekCount] = iter->second;
1493 // Process VALARM section.
1496 int alarmObjectCount = 0;
1498 bool alarmActionFound = false;
1500 for (vector<vector<string>>::iterator iter = eventAlarmName.begin();
1501 iter != eventAlarmName.end(); iter++){
1503 CalendarAlarmDataStruct newAlarmData;
1505 // Process the data from ACTION.
1507 bool alarmActionFound = false;
1508 bool alarmTriggerFound = false;
1509 bool alarmDurationFound = false;
1510 bool alarmDescriptionFound = false;
1511 bool alarmSummaryFound = false;
1513 dataReceived = ProcessTextVectors(&eventAlarmName[seekCount],
1514 &eventAlarmData[seekCount], false, "ACTION");
1516 if (dataReceived.begin() != dataReceived.end()){
1519 newAlarmData.alarmActionTokens = dataReceived.begin()->first.substr(7);
1522 catch(const out_of_range &oor){
1523 // Do nothing as there is no data.
1526 newAlarmData.alarmAction = dataReceived.begin()->second;
1527 alarmActionFound = true;
1531 // Check if a value was set for AlarmAction, otherwise
1532 // process the next VALARM section.
1534 if (newAlarmData.alarmAction.size() < 1){
1541 // Check if AlarmAction is DISPLAY, AUDIO or EMAIL.
1542 // Process the next VALARM section if not.
1544 if (newAlarmData.alarmAction == "AUDIO"){
1546 newAlarmData.alarmType = CALENDARALARM_AUDIO;
1548 } else if (newAlarmData.alarmAction == "DISPLAY"){
1550 newAlarmData.alarmType = CALENDARALARM_DISPLAY;
1552 } else if (newAlarmData.alarmAction == "EMAIL"){
1554 newAlarmData.alarmType = CALENDARALARM_EMAIL;
1563 // Process the data from TRIGGER.
1565 dataReceived = ProcessTextVectors(&eventAlarmName[seekCount], &eventAlarmData[seekCount], false, "TRIGGER");
1567 if (dataReceived.begin() != dataReceived.end()){
1569 bool tokenData = false;
1570 string propertyTokens;
1572 propertyNameData = (string*)&dataReceived.begin()->first;
1574 propertyData = SplitValues(*propertyNameData);
1576 for(map<string,string>::iterator iter = propertyData.begin();
1577 iter != propertyData.end(); iter++){
1579 if (iter->first == "VALUE"){
1581 newAlarmData.triggerValue = iter->second;
1583 } else if (iter->first == "RELATED"){
1585 newAlarmData.triggerRelated = iter->second;
1589 if (tokenData == false){
1592 propertyTokens += ";";
1595 propertyTokens += iter->first;
1596 propertyTokens += "=";
1597 propertyTokens += iter->second;
1603 if (propertyTokens.size() > 0){
1604 newAlarmData.triggerTokens = propertyTokens;
1607 newAlarmData.triggerData = dataReceived.begin()->second;
1608 alarmTriggerFound = true;
1612 // Process the data from DESCRIPTION.
1614 dataReceived = ProcessTextVectors(&eventAlarmName[seekCount], &eventAlarmData[seekCount], false, "DESCRIPTION");
1616 if (dataReceived.begin() != dataReceived.end() &&
1617 (newAlarmData.alarmType == CALENDARALARM_DISPLAY ||
1618 newAlarmData.alarmType == CALENDARALARM_EMAIL)){
1620 bool tokenData = false;
1621 string propertyTokens;
1623 propertyNameData = (string*)&dataReceived.begin()->first;
1625 propertyData = SplitValues(*propertyNameData);
1627 for(map<string,string>::iterator iter = propertyData.begin();
1628 iter != propertyData.end(); iter++){
1630 if (iter->first == "ALTREP"){
1632 newAlarmData.descriptionAltRep = iter->second;
1634 } else if (iter->first == "LANGUAGE"){
1636 newAlarmData.descriptionLanguage = iter->second;
1640 if (tokenData == false){
1643 propertyTokens += ";";
1646 propertyTokens += iter->first;
1647 propertyTokens += "=";
1648 propertyTokens += iter->second;
1654 if (propertyTokens.size() > 0){
1655 newAlarmData.descriptionTokens = propertyTokens;
1658 newAlarmData.descriptionData = dataReceived.begin()->second;
1659 alarmDescriptionFound = true;
1663 // Process data from SUMMARY.
1665 dataReceived = ProcessTextVectors(&eventAlarmName[seekCount], &eventAlarmData[seekCount], false, "SUMMARY");
1667 if (dataReceived.begin() != dataReceived.end() &&
1668 newAlarmData.alarmType == CALENDARALARM_EMAIL){
1670 bool tokenData = false;
1671 string propertyTokens;
1673 propertyNameData = (string*)&dataReceived.begin()->first;
1675 propertyData = SplitValues(*propertyNameData);
1677 for(map<string,string>::iterator iter = propertyData.begin();
1678 iter != propertyData.end(); iter++){
1680 if (iter->first == "ALTREP"){
1682 newAlarmData.summaryAltRep = iter->second;
1684 } else if (iter->first == "LANGUAGE"){
1686 newAlarmData.summaryLanguage = iter->second;
1690 if (tokenData == false){
1693 propertyTokens += ";";
1696 propertyTokens += iter->first;
1697 propertyTokens += "=";
1698 propertyTokens += iter->second;
1704 if (propertyTokens.size() > 0){
1705 newAlarmData.summaryTokens = propertyTokens;
1708 newAlarmData.summaryData = dataReceived.begin()->second;
1709 alarmSummaryFound = true;
1713 // Process data from DURATION.
1715 dataReceived = ProcessTextVectors(&eventAlarmName[seekCount], &eventAlarmData[seekCount], false, "DURATION");
1717 if (dataReceived.begin() != dataReceived.end()){
1720 newAlarmData.durationTokens = dataReceived.begin()->first.substr(9);
1723 catch(const out_of_range &oor){
1724 // Do nothing as there is no data.
1727 newAlarmData.durationData = dataReceived.begin()->second;
1728 alarmDurationFound = true;
1732 // Process data from REPEAT.
1734 dataReceived = ProcessTextVectors(&eventAlarmName[seekCount], &eventAlarmData[seekCount], false, "REPEAT");
1736 if (dataReceived.begin() != dataReceived.end() && alarmDurationFound == true){
1739 newAlarmData.repeatTokens = dataReceived.begin()->first.substr(7);
1742 catch(const out_of_range &oor){
1743 // Do nothing as there is no data.
1746 newAlarmData.repeatData = dataReceived.begin()->second;
1750 newAlarmData.durationData.clear();
1751 newAlarmData.durationTokens.clear();
1755 // Process data from ATTENDEE.
1757 dataReceived = ProcessTextVectors(&eventAlarmName[seekCount], &eventAlarmData[seekCount], true, "ATTENDEE");
1759 objectSeekCount = 0;
1761 for(multimap<string,string>::iterator iter = dataReceived.begin();
1762 iter != dataReceived.end();
1765 newAlarmData.attendeeListMember.push_back("");
1766 newAlarmData.attendeeListDelegatedFrom.push_back("");
1767 newAlarmData.attendeeListDelegatedTo.push_back("");
1768 newAlarmData.attendeeListRole.push_back("");
1769 newAlarmData.attendeeListRSVP.push_back("");
1770 newAlarmData.attendeeListDirectoryEntry.push_back("");
1771 newAlarmData.attendeeListSentBy.push_back("");
1772 newAlarmData.attendeeListCommonName.push_back("");
1773 newAlarmData.attendeeListCalendarUserType.push_back("");
1774 newAlarmData.attendeeListParticipationStatus.push_back("");
1775 newAlarmData.attendeeListLanguage.push_back("");
1776 newAlarmData.attendeeListTokens.push_back("");
1777 newAlarmData.attendeeList.push_back("");
1779 bool tokenData = false;
1780 string propertyTokens;
1782 propertyNameData = (string*)&iter->first;
1784 propertyData = SplitValues(*propertyNameData);
1786 for(map<string,string>::iterator dataiter = propertyData.begin();
1787 dataiter != propertyData.end(); dataiter++){
1789 if (dataiter->first == "CUTYPE"){
1791 newAlarmData.attendeeListCalendarUserType[objectSeekCount] = dataiter->second;
1793 } else if (dataiter->first == "MEMBER"){
1795 newAlarmData.attendeeListMember[objectSeekCount] = dataiter->second;
1797 } else if (dataiter->first == "ROLE"){
1799 newAlarmData.attendeeListRole[objectSeekCount] = dataiter->second;
1801 } else if (dataiter->first == "PARTSTAT"){
1803 newAlarmData.attendeeListParticipationStatus[objectSeekCount] = dataiter->second;
1805 } else if (dataiter->first == "RSVP"){
1807 newAlarmData.attendeeListRSVP[objectSeekCount] = dataiter->second;
1809 } else if (dataiter->first == "DELEGATED-TO"){
1811 newAlarmData.attendeeListDelegatedTo[objectSeekCount] = dataiter->second;
1813 } else if (dataiter->first == "DELEGATED-FROM"){
1815 newAlarmData.attendeeListDelegatedFrom[objectSeekCount] = dataiter->second;
1817 } else if (dataiter->first == "SENT-BY"){
1819 newAlarmData.attendeeListSentBy[objectSeekCount] = dataiter->second;
1821 } else if (dataiter->first == "CN"){
1823 newAlarmData.attendeeListCommonName[objectSeekCount] = dataiter->second;
1825 } else if (dataiter->first == "DIR"){
1827 newAlarmData.attendeeListDirectoryEntry[objectSeekCount] = dataiter->second;
1829 } else if (dataiter->first == "LANGUAGE"){
1831 newAlarmData.attendeeListLanguage[objectSeekCount] = dataiter->second;
1835 if (tokenData == false){
1838 propertyTokens += ";";
1841 propertyTokens += dataiter->first;
1842 propertyTokens += "=";
1843 propertyTokens += dataiter->second;
1849 if (propertyTokens.size() > 0){
1850 newAlarmData.attendeeListTokens[objectSeekCount] = propertyTokens;
1853 newAlarmData.attendeeList[objectSeekCount] = iter->second;
1859 // Process data from ATTACH.
1861 dataReceived = ProcessTextVectors(&eventAlarmName[seekCount], &eventAlarmData[seekCount], true, "ATTACH");
1863 objectSeekCount = 0;
1865 for(multimap<string,string>::iterator iter = dataReceived.begin();
1866 iter != dataReceived.end();
1869 newAlarmData.attachListEncoding.push_back("");
1870 newAlarmData.attachListValue.push_back("");
1871 newAlarmData.attachListFormatType.push_back("");
1872 newAlarmData.attachListTokens.push_back("");
1873 newAlarmData.attachList.push_back("");
1875 bool tokenData = false;
1876 string propertyTokens;
1878 propertyNameData = (string*)&iter->first;
1880 propertyData = SplitValues(*propertyNameData);
1882 for(map<string,string>::iterator dataiter = propertyData.begin();
1883 dataiter != propertyData.end(); dataiter++){
1885 if (dataiter->first == "ENCODING"){
1887 newAlarmData.attachListEncoding[objectSeekCount] = dataiter->second;
1889 } else if (dataiter->first == "VALUE"){
1891 newAlarmData.attachListValue[objectSeekCount] = dataiter->second;
1893 } else if (dataiter->first == "FMTTYPE"){
1895 newAlarmData.attachListFormatType[objectSeekCount] = dataiter->second;
1899 if (tokenData == false){
1902 propertyTokens += ";";
1905 propertyTokens += dataiter->first;
1906 propertyTokens += "=";
1907 propertyTokens += dataiter->second;
1913 if (propertyTokens.size() > 0){
1914 newAlarmData.attachListTokens[objectSeekCount] = propertyTokens;
1917 newAlarmData.attachList[objectSeekCount] = iter->second;
1923 // Process data from X-*
1925 alarmObjectCount = 0;
1927 for(vector<string>::iterator xtokeniter = eventAlarmName[seekCount].begin();
1928 xtokeniter != eventAlarmName[seekCount].end(); ++xtokeniter){
1930 bool tokenData = false;
1931 string propertyTokens;
1933 if (xtokeniter->substr(0,2) == "X-" &&
1934 xtokeniter->size() > 2){
1936 newAlarmData.xTokensData.push_back(eventAlarmData[seekCount][alarmObjectCount]);
1937 newAlarmData.xTokensDataTokens.push_back(eventAlarmName[seekCount][alarmObjectCount]);
1945 if (newAlarmData.alarmType == CALENDARALARM_AUDIO &&
1946 alarmActionFound == true &&
1947 alarmTriggerFound == true){
1949 calendarAlarmData.push_back(newAlarmData);
1951 } else if (newAlarmData.alarmType == CALENDARALARM_DISPLAY &&
1952 alarmActionFound == true &&
1953 alarmTriggerFound == true &&
1954 alarmDescriptionFound == true){
1956 calendarAlarmData.push_back(newAlarmData);
1958 } else if (newAlarmData.alarmType == CALENDARALARM_EMAIL &&
1959 alarmActionFound == true &&
1960 alarmTriggerFound == true &&
1961 alarmDescriptionFound == true &&
1962 alarmSummaryFound == true){
1964 calendarAlarmData.push_back(newAlarmData);
1972 objectSeekCount = 0;
1974 // Process data from X-*
1976 for(vector<string>::iterator iter = objectName.begin();
1977 iter != objectName.end(); ++iter){
1979 bool tokenData = false;
1980 string propertyTokens;
1982 if (iter->substr(0,2) == "X-" &&
1985 xTokensData.push_back(objectData[objectSeekCount]);
1986 xTokensDataTokens.push_back(objectName[objectSeekCount]);