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 if (dataReceived.begin() != dataReceived.end()){
838 durationData = dataReceived.begin()->second;
844 // Process the data from ATTACH.
846 dataReceived = ProcessTextVectors(&objectName, &objectData, true, "ATTACH");
848 for(multimap<string,string>::iterator iter = dataReceived.begin();
849 iter != dataReceived.end();
852 attachListEncoding.push_back("");
853 attachListValue.push_back("");
854 attachListFormatType.push_back("");
855 attachListTokens.push_back("");
856 attachList.push_back("");
858 bool tokenData = false;
859 string propertyTokens;
861 propertyNameData = (string*)&iter->first;
863 propertyData = SplitValues(*propertyNameData);
865 for(map<string,string>::iterator dataiter = propertyData.begin();
866 dataiter != propertyData.end(); dataiter++){
868 if (dataiter->first == "ENCODING"){
870 attachListEncoding[objectSeekCount] = dataiter->second;
872 } else if (dataiter->first == "VALUE"){
874 attachListValue[objectSeekCount] = dataiter->second;
876 } else if (dataiter->first == "FMTTYPE"){
878 attachListFormatType[objectSeekCount] = dataiter->second;
882 if (tokenData == false){
885 propertyTokens += ";";
888 propertyTokens += dataiter->first;
889 propertyTokens += "=";
890 propertyTokens += dataiter->second;
896 if (propertyTokens.size() > 0){
897 attachListTokens[objectSeekCount] = propertyTokens;
900 attachList[objectSeekCount] = iter->second;
906 // Process the data from ATTENDEE.
908 dataReceived = ProcessTextVectors(&objectName, &objectData, true, "ATTENDEE");
912 for(multimap<string,string>::iterator iter = dataReceived.begin();
913 iter != dataReceived.end();
916 attendeeListMember.push_back("");
917 attendeeListDelegatedFrom.push_back("");
918 attendeeListDelegatedTo.push_back("");
919 attendeeListRole.push_back("");
920 attendeeListRSVP.push_back("");
921 attendeeListDirectoryEntry.push_back("");
922 attendeeListSentBy.push_back("");
923 attendeeListCommonName.push_back("");
924 attendeeListCalendarUserType.push_back("");
925 attendeeListParticipationStatus.push_back("");
926 attendeeListLanguage.push_back("");
927 attendeeListTokens.push_back("");
928 attendeeList.push_back("");
930 bool tokenData = false;
931 string propertyTokens;
933 propertyNameData = (string*)&iter->first;
935 propertyData = SplitValues(*propertyNameData);
937 for(map<string,string>::iterator dataiter = propertyData.begin();
938 dataiter != propertyData.end(); dataiter++){
940 if (dataiter->first == "CUTYPE"){
942 attendeeListCalendarUserType[objectSeekCount] = dataiter->second;
944 } else if (dataiter->first == "MEMBER"){
946 attendeeListMember[objectSeekCount] = dataiter->second;
948 } else if (dataiter->first == "ROLE"){
950 attendeeListRole[objectSeekCount] = dataiter->second;
952 } else if (dataiter->first == "PARTSTAT"){
954 attendeeListParticipationStatus[objectSeekCount] = dataiter->second;
956 } else if (dataiter->first == "RSVP"){
958 attendeeListRSVP[objectSeekCount] = dataiter->second;
960 } else if (dataiter->first == "DELEGATED-TO"){
962 AttendeeListDelegatedTo[ObjectSeekCount] = dataiter->second;
964 } else if (dataiter->first == "DELEGATED-FROM"){
966 attendeeListDelegatedFrom[objectSeekCount] = dataiter->second;
968 } else if (dataiter->first == "SENT-BY"){
970 attendeeListSentBy[objectSeekCount] = dataiter->second;
972 } else if (dataiter->first == "CN"){
974 attendeeListCommonName[objectSeekCount] = dataiter->second;
976 } else if (dataiter->first == "DIR"){
978 attendeeListDirectoryEntry[objectSeekCount] = dataiter->second;
980 } else if (dataiter->first == "LANGUAGE"){
982 attendeeListLanguage[objectSeekCount] = dataiter->second;
986 if (tokenData == false){
989 propertyTokens += ";";
992 propertyTokens += dataiter->first;
993 propertyTokens += "=";
994 propertyTokens += dataiter->second;
1000 if (propertyTokens.size() > 0){
1001 attendeeListTokens[objectSeekCount] = propertyTokens;
1004 attendeeList[objectSeekCount] = iter->second;
1010 // Process the data from CATEGORIES.
1012 dataReceived = ProcessTextVectors(&objectName, &objectData, true, "CATEGORIES");
1014 objectSeekCount = 0;
1016 for(multimap<string,string>::iterator iter = dataReceived.begin();
1017 iter != dataReceived.end();
1020 categoriesListTokens.push_back("");
1021 categoriesListLanguage.push_back("");
1022 categoriesList.push_back("");
1024 bool tokenData = false;
1025 string propertyTokens;
1027 propertyNameData = (string*)&iter->first;
1029 propertyData = SplitValues(*propertyNameData);
1031 for(map<string,string>::iterator dataiter = propertyData.begin();
1032 dataiter != propertyData.end(); dataiter++){
1034 if (dataiter->first == "LANGUAGE"){
1036 categoriesListLanguage[objectSeekCount] = dataiter->second;
1040 if (tokenData == false){
1043 propertyTokens += ";";
1046 propertyTokens += dataiter->first;
1047 propertyTokens += "=";
1048 propertyTokens += dataiter->second;
1054 if (propertyTokens.size() > 0){
1055 categoriesListTokens[objectSeekCount] = propertyTokens;
1058 categoriesList[objectSeekCount] = iter->second;
1064 // Process the data from COMMENT.
1066 dataReceived = ProcessTextVectors(&objectName, &objectData, true, "COMMENT");
1068 objectSeekCount = 0;
1070 for(multimap<string,string>::iterator iter = dataReceived.begin();
1071 iter != dataReceived.end();
1074 commentListTokens.push_back("");
1075 commentListAltRep.push_back("");
1076 commentListLanguage.push_back("");
1077 commentList.push_back("");
1079 bool tokenData = false;
1080 string propertyTokens;
1082 propertyNameData = (string*)&iter->first;
1084 propertyData = SplitValues(*propertyNameData);
1086 for(map<string,string>::iterator dataiter = propertyData.begin();
1087 dataiter != propertyData.end(); dataiter++){
1089 if (dataiter->first == "ALTREP"){
1091 commentListAltRep[objectSeekCount] = dataiter->second;
1093 } else if (dataiter->first == "LANGUAGE"){
1095 commentListLanguage[objectSeekCount] = dataiter->second;
1099 if (tokenData == false){
1102 propertyTokens += ";";
1105 propertyTokens += dataiter->first;
1106 propertyTokens += "=";
1107 propertyTokens += dataiter->second;
1113 if (propertyTokens.size() > 0){
1114 commentListTokens[objectSeekCount] = propertyTokens;
1117 commentList[objectSeekCount] = iter->second;
1123 // Process the data from CONTACT.
1125 dataReceived = ProcessTextVectors(&objectName, &objectData, true, "CONTACT");
1127 objectSeekCount = 0;
1129 for(multimap<string,string>::iterator iter = dataReceived.begin();
1130 iter != dataReceived.end();
1133 contactListTokens.push_back("");
1134 contactListAltRep.push_back("");
1135 contactListLanguage.push_back("");
1136 contactList.push_back("");
1138 bool tokenData = false;
1139 string propertyTokens;
1141 propertyNameData = (string*)&iter->first;
1143 propertyData = SplitValues(*propertyNameData);
1145 for(map<string,string>::iterator dataiter = propertyData.begin();
1146 dataiter != propertyData.end(); dataiter++){
1148 if (dataiter->first == "ALTREP"){
1150 contactListAltRep[objectSeekCount] = dataiter->second;
1152 } else if (dataiter->first == "LANGUAGE"){
1154 contactListLanguage[objectSeekCount] = dataiter->second;
1158 if (tokenData == false){
1161 propertyTokens += ";";
1164 propertyTokens += dataiter->first;
1165 propertyTokens += "=";
1166 propertyTokens += dataiter->second;
1172 if (propertyTokens.size() > 0){
1173 contactListTokens[objectSeekCount] = propertyTokens;
1176 contactList[objectSeekCount] = iter->second;
1182 // Process the data from EXDATE.
1184 dataReceived = ProcessTextVectors(&objectName, &objectData, true, "EXDATE");
1186 objectSeekCount = 0;
1188 for(multimap<string,string>::iterator iter = dataReceived.begin();
1189 iter != dataReceived.end();
1192 excludeDateDataTokens.push_back("");
1193 excludeDateDataValue.push_back("");
1194 excludeDateDataTimeZoneParam.push_back("");
1195 excludeDateData.push_back("");
1197 bool tokenData = false;
1198 string propertyTokens;
1200 propertyNameData = (string*)&iter->first;
1202 propertyData = SplitValues(*propertyNameData);
1204 for(map<string,string>::iterator dataiter = propertyData.begin();
1205 dataiter != propertyData.end(); dataiter++){
1207 if (dataiter->first == "VALUE"){
1209 excludeDateDataValue[objectSeekCount] = dataiter->second;
1211 } else if (dataiter->first == "TZID"){
1213 excludeDateDataTimeZoneParam[objectSeekCount] = dataiter->second;
1217 if (tokenData == false){
1220 propertyTokens += ";";
1223 propertyTokens += dataiter->first;
1224 propertyTokens += "=";
1225 propertyTokens += dataiter->second;
1231 if (propertyTokens.size() > 0){
1232 excludeDateDataTokens[objectSeekCount] = propertyTokens;
1235 excludeDateData[objectSeekCount] = iter->second;
1241 // Process the data from REQUEST-STATUS.
1243 dataReceived = ProcessTextVectors(&objectName, &objectData, true, "REQUEST-STATUS");
1245 objectSeekCount = 0;
1247 for(multimap<string,string>::iterator iter = dataReceived.begin();
1248 iter != dataReceived.end();
1251 requestStatusTokens.push_back("");
1252 requestStatusLanguage.push_back("");
1253 requestStatusData.push_back("");
1255 bool tokenData = false;
1256 string propertyTokens;
1258 propertyNameData = (string*)&iter->first;
1260 propertyData = SplitValues(*propertyNameData);
1262 for(map<string,string>::iterator dataiter = propertyData.begin();
1263 dataiter != propertyData.end(); dataiter++){
1265 if (dataiter->first == "LANGUAGE"){
1267 requestStatusLanguage[objectSeekCount] = dataiter->second;
1271 if (tokenData == false){
1274 propertyTokens += ";";
1277 propertyTokens += dataiter->first;
1278 propertyTokens += "=";
1279 propertyTokens += dataiter->second;
1285 if (propertyTokens.size() > 0){
1286 requestStatusTokens[objectSeekCount] = propertyTokens;
1289 requestStatusData[objectSeekCount] = iter->second;
1295 // Process the data from RELATED-TO.
1297 dataReceived = ProcessTextVectors(&objectName, &objectData, true, "RELATED-TO");
1299 objectSeekCount = 0;
1301 for(multimap<string,string>::iterator iter = dataReceived.begin();
1302 iter != dataReceived.end();
1305 relatedToDataTokens.push_back("");
1306 relatedToDataRelationType.push_back("");
1307 relatedToData.push_back("");
1309 bool tokenData = false;
1310 string propertyTokens;
1312 PropertyNameData = (string*)&iter->first;
1314 PropertyData = SplitValues(*PropertyNameData);
1316 for(map<string,string>::iterator dataiter = PropertyData.begin();
1317 dataiter != PropertyData.end(); dataiter++){
1319 if (dataiter->first == "RELTYPE"){
1321 RelatedToDataRelationType[ObjectSeekCount] = dataiter->second;
1325 if (TokenData == false){
1328 PropertyTokens += ";";
1331 PropertyTokens += dataiter->first;
1332 PropertyTokens += "=";
1333 PropertyTokens += dataiter->second;
1339 if (PropertyTokens.size() > 0){
1340 RelatedToDataTokens[ObjectSeekCount] = PropertyTokens;
1343 RelatedToData[ObjectSeekCount] = iter->second;
1349 // Process the data from RESOURCES.
1351 dataReceived = ProcessTextVectors(&objectName, &objectData, true, "RESOURCES");
1353 objectSeekCount = 0;
1355 for(multimap<string,string>::iterator iter = dataReceived.begin();
1356 iter != dataReceived.end();
1359 resourcesDataTokens.push_back("");
1360 resourcesDataAltRep.push_back("");
1361 resourcesDataLanguage.push_back("");
1362 resourcesData.push_back("");
1364 bool tokenData = false;
1365 string propertyTokens;
1367 propertyNameData = (string*)&iter->first;
1369 propertyData = SplitValues(*propertyNameData);
1371 for(map<string,string>::iterator dataiter = propertyData.begin();
1372 dataiter != propertyData.end(); dataiter++){
1374 if (dataiter->first == "ALTREP"){
1376 resourcesDataAltRep[objectSeekCount] = dataiter->second;
1378 } else if (dataiter->first == "LANGUAGE"){
1380 resourcesDataLanguage[objectSeekCount] = dataiter->second;
1384 if (tokenData == false){
1387 propertyTokens += ";";
1390 propertyTokens += dataiter->first;
1391 propertyTokens += "=";
1392 propertyTokens += dataiter->second;
1398 if (propertyTokens.size() > 0){
1399 resourcesDataTokens[objectSeekCount] = propertyTokens;
1402 resourcesData[objectSeekCount] = iter->second;
1408 // Process the data from RDATE.
1410 dataReceived = ProcessTextVectors(&objectName, &objectData, true, "RDATE");
1412 objectSeekCount = 0;
1414 for(multimap<string,string>::iterator iter = dataReceived.begin();
1415 iter != dataReceived.end();
1418 recurranceDateDataTokens.push_back("");
1419 recurranceDateDataValue.push_back("");
1420 recurranceDateDataTimeZoneParam.push_back("");
1421 recurranceDateData.push_back("");
1423 bool tokenData = false;
1424 string propertyTokens;
1426 propertyNameData = (string*)&iter->first;
1428 propertyData = SplitValues(*propertyNameData);
1430 for(map<string,string>::iterator dataiter = propertyData.begin();
1431 dataiter != propertyData.end(); dataiter++){
1433 if (dataiter->first == "VALUE"){
1435 recurranceDateDataValue[objectSeekCount] = dataiter->second;
1437 } else if (dataiter->first == "TZID"){
1439 recurranceDateDataTimeZoneParam[objectSeekCount] = dataiter->second;
1443 if (tokenData == false){
1446 propertyTokens += ";";
1449 propertyTokens += dataiter->first;
1450 propertyTokens += "=";
1451 propertyTokens += dataiter->second;
1457 if (propertyTokens.size() > 0){
1458 recurranceDateDataTokens[objectSeekCount] = propertyTokens;
1461 recurranceDateData[objectSeekCount] = iter->second;
1467 // Process VALARM section.
1470 int alarmObjectCount = 0;
1472 bool alarmActionFound = false;
1474 for (vector<vector<string>>::iterator iter = eventAlarmName.begin();
1475 iter != eventAlarmName.end(); iter++){
1477 CalendarAlarmDataStruct newAlarmData;
1479 // Process the data from ACTION.
1481 bool alarmActionFound = false;
1482 bool alarmTriggerFound = false;
1483 bool alarmDurationFound = false;
1484 bool alarmDescriptionFound = false;
1485 bool alarmSummaryFound = false;
1487 dataReceived = ProcessTextVectors(&eventAlarmName[seekCount],
1488 &eventAlarmData[seekCount], false, "ACTION");
1490 if (dataReceived.begin() != dataReceived.end()){
1493 newAlarmData.alarmActionTokens = dataReceived.begin()->first.substr(7);
1496 catch(const out_of_range &oor){
1497 // Do nothing as there is no data.
1500 newAlarmData.alarmAction = dataReceived.begin()->second;
1501 alarmActionFound = true;
1505 // Check if a value was set for AlarmAction, otherwise
1506 // process the next VALARM section.
1508 if (newAlarmData.alarmAction.size() < 1){
1515 // Check if AlarmAction is DISPLAY, AUDIO or EMAIL.
1516 // Process the next VALARM section if not.
1518 if (newAlarmData.alarmAction == "AUDIO"){
1520 newAlarmData.alarmType = CALENDARALARM_AUDIO;
1522 } else if (newAlarmData.alarmAction == "DISPLAY"){
1524 newAlarmData.alarmType = CALENDARALARM_DISPLAY;
1526 } else if (newAlarmData.alarmAction == "EMAIL"){
1528 newAlarmData.alarmType = CALENDARALARM_EMAIL;
1537 // Process the data from TRIGGER.
1539 dataReceived = ProcessTextVectors(&eventAlarmName[seekCount], &eventAlarmData[seekCount], false, "TRIGGER");
1541 if (dataReceived.begin() != dataReceived.end()){
1543 bool tokenData = false;
1544 string propertyTokens;
1546 propertyNameData = (string*)&dataReceived.begin()->first;
1548 propertyData = SplitValues(*propertyNameData);
1550 for(map<string,string>::iterator iter = propertyData.begin();
1551 iter != propertyData.end(); iter++){
1553 if (iter->first == "VALUE"){
1555 newAlarmData.triggerValue = iter->second;
1557 } else if (iter->first == "RELATED"){
1559 newAlarmData.triggerRelated = iter->second;
1563 if (tokenData == false){
1566 propertyTokens += ";";
1569 propertyTokens += iter->first;
1570 propertyTokens += "=";
1571 propertyTokens += iter->second;
1577 if (propertyTokens.size() > 0){
1578 newAlarmData.triggerTokens = propertyTokens;
1581 newAlarmData.triggerData = dataReceived.begin()->second;
1582 alarmTriggerFound = true;
1586 // Process the data from DESCRIPTION.
1588 dataReceived = ProcessTextVectors(&eventAlarmName[seekCount], &eventAlarmData[seekCount], false, "DESCRIPTION");
1590 if (dataReceived.begin() != dataReceived.end() &&
1591 (newAlarmData.alarmType == CALENDARALARM_DISPLAY ||
1592 newAlarmData.alarmType == CALENDARALARM_EMAIL)){
1594 bool tokenData = false;
1595 string propertyTokens;
1597 propertyNameData = (string*)&dataReceived.begin()->first;
1599 propertyData = SplitValues(*propertyNameData);
1601 for(map<string,string>::iterator iter = propertyData.begin();
1602 iter != propertyData.end(); iter++){
1604 if (iter->first == "ALTREP"){
1606 newAlarmData.descriptionAltRep = iter->second;
1608 } else if (iter->first == "LANGUAGE"){
1610 newAlarmData.descriptionLanguage = iter->second;
1614 if (tokenData == false){
1617 propertyTokens += ";";
1620 propertyTokens += iter->first;
1621 propertyTokens += "=";
1622 propertyTokens += iter->second;
1628 if (propertyTokens.size() > 0){
1629 newAlarmData.descriptionTokens = propertyTokens;
1632 newAlarmData.descriptionData = dataReceived.begin()->second;
1633 alarmDescriptionFound = true;
1637 // Process data from SUMMARY.
1639 dataReceived = ProcessTextVectors(&eventAlarmName[seekCount], &eventAlarmData[seekCount], false, "SUMMARY");
1641 if (dataReceived.begin() != dataReceived.end() &&
1642 newAlarmData.alarmType == CALENDARALARM_EMAIL){
1644 bool tokenData = false;
1645 string propertyTokens;
1647 propertyNameData = (string*)&dataReceived.begin()->first;
1649 propertyData = SplitValues(*propertyNameData);
1651 for(map<string,string>::iterator iter = propertyData.begin();
1652 iter != propertyData.end(); iter++){
1654 if (iter->first == "ALTREP"){
1656 newAlarmData.summaryAltRep = iter->second;
1658 } else if (iter->first == "LANGUAGE"){
1660 newAlarmData.summaryLanguage = iter->second;
1664 if (tokenData == false){
1667 propertyTokens += ";";
1670 propertyTokens += iter->first;
1671 propertyTokens += "=";
1672 propertyTokens += iter->second;
1678 if (propertyTokens.size() > 0){
1679 newAlarmData.summaryTokens = propertyTokens;
1682 newAlarmData.summaryData = dataReceived.begin()->second;
1683 alarmSummaryFound = true;
1687 // Process data from DURATION.
1689 dataReceived = ProcessTextVectors(&eventAlarmName[seekCount], &eventAlarmData[seekCount], false, "DURATION");
1691 if (dataReceived.begin() != dataReceived.end()){
1694 newAlarmData.durationTokens = dataReceived.begin()->first.substr(9);
1697 catch(const out_of_range &oor){
1698 // Do nothing as there is no data.
1701 newAlarmData.durationData = dataReceived.begin()->second;
1702 alarmDurationFound = true;
1706 // Process data from REPEAT.
1708 dataReceived = ProcessTextVectors(&eventAlarmName[seekCount], &eventAlarmData[seekCount], false, "REPEAT");
1710 if (dataReceived.begin() != dataReceived.end() && alarmDurationFound == true){
1713 newAlarmData.repeatTokens = dataReceived.begin()->first.substr(7);
1716 catch(const out_of_range &oor){
1717 // Do nothing as there is no data.
1720 newAlarmData.repeatData = dataReceived.begin()->second;
1724 newAlarmData.durationData.clear();
1725 newAlarmData.durationTokens.clear();
1729 // Process data from ATTENDEE.
1731 dataReceived = ProcessTextVectors(&eventAlarmName[seekCount], &eventAlarmData[seekCount], true, "ATTENDEE");
1733 objectSeekCount = 0;
1735 for(multimap<string,string>::iterator iter = dataReceived.begin();
1736 iter != dataReceived.end();
1739 newAlarmData.attendeeListMember.push_back("");
1740 newAlarmData.attendeeListDelegatedFrom.push_back("");
1741 newAlarmData.attendeeListDelegatedTo.push_back("");
1742 newAlarmData.attendeeListRole.push_back("");
1743 newAlarmData.attendeeListRSVP.push_back("");
1744 newAlarmData.attendeeListDirectoryEntry.push_back("");
1745 newAlarmData.attendeeListSentBy.push_back("");
1746 newAlarmData.attendeeListCommonName.push_back("");
1747 newAlarmData.attendeeListCalendarUserType.push_back("");
1748 newAlarmData.attendeeListParticipationStatus.push_back("");
1749 newAlarmData.attendeeListLanguage.push_back("");
1750 newAlarmData.attendeeListTokens.push_back("");
1751 newAlarmData.attendeeList.push_back("");
1753 bool tokenData = false;
1754 string propertyTokens;
1756 propertyNameData = (string*)&iter->first;
1758 propertyData = SplitValues(*propertyNameData);
1760 for(map<string,string>::iterator dataiter = propertyData.begin();
1761 dataiter != propertyData.end(); dataiter++){
1763 if (dataiter->first == "CUTYPE"){
1765 newAlarmData.attendeeListCalendarUserType[objectSeekCount] = dataiter->second;
1767 } else if (dataiter->first == "MEMBER"){
1769 newAlarmData.attendeeListMember[objectSeekCount] = dataiter->second;
1771 } else if (dataiter->first == "ROLE"){
1773 newAlarmData.attendeeListRole[objectSeekCount] = dataiter->second;
1775 } else if (dataiter->first == "PARTSTAT"){
1777 newAlarmData.attendeeListParticipationStatus[objectSeekCount] = dataiter->second;
1779 } else if (dataiter->first == "RSVP"){
1781 newAlarmData.attendeeListRSVP[objectSeekCount] = dataiter->second;
1783 } else if (dataiter->first == "DELEGATED-TO"){
1785 newAlarmData.attendeeListDelegatedTo[objectSeekCount] = dataiter->second;
1787 } else if (dataiter->first == "DELEGATED-FROM"){
1789 newAlarmData.attendeeListDelegatedFrom[objectSeekCount] = dataiter->second;
1791 } else if (dataiter->first == "SENT-BY"){
1793 newAlarmData.attendeeListSentBy[objectSeekCount] = dataiter->second;
1795 } else if (dataiter->first == "CN"){
1797 newAlarmData.attendeeListCommonName[objectSeekCount] = dataiter->second;
1799 } else if (dataiter->first == "DIR"){
1801 newAlarmData.attendeeListDirectoryEntry[objectSeekCount] = dataiter->second;
1803 } else if (dataiter->first == "LANGUAGE"){
1805 newAlarmData.attendeeListLanguage[objectSeekCount] = dataiter->second;
1809 if (tokenData == false){
1812 propertyTokens += ";";
1815 propertyTokens += dataiter->first;
1816 propertyTokens += "=";
1817 propertyTokens += dataiter->second;
1823 if (propertyTokens.size() > 0){
1824 newAlarmData.attendeeListTokens[objectSeekCount] = PropertyTokens;
1827 newAlarmData.attendeeList[objectSeekCount] = iter->second;
1833 // Process data from ATTACH.
1835 dataReceived = ProcessTextVectors(&eventAlarmName[seekCount], &eventAlarmData[seekCount], true, "ATTACH");
1837 objectSeekCount = 0;
1839 for(multimap<string,string>::iterator iter = dataReceived.begin();
1840 iter != dataReceived.end();
1843 newAlarmData.attachListEncoding.push_back("");
1844 newAlarmData.attachListValue.push_back("");
1845 newAlarmData.attachListFormatType.push_back("");
1846 newAlarmData.attachListTokens.push_back("");
1847 newAlarmData.attachList.push_back("");
1849 bool tokenData = false;
1850 string propertyTokens;
1852 propertyNameData = (string*)&iter->first;
1854 propertyData = SplitValues(*propertyNameData);
1856 for(map<string,string>::iterator dataiter = propertyData.begin();
1857 dataiter != propertyData.end(); dataiter++){
1859 if (dataiter->first == "ENCODING"){
1861 newAlarmData.attachListEncoding[objectSeekCount] = dataiter->second;
1863 } else if (dataiter->first == "VALUE"){
1865 newAlarmData.attachListValue[objectSeekCount] = dataiter->second;
1867 } else if (dataiter->first == "FMTTYPE"){
1869 newAlarmData.attachListFormatType[objectSeekCount] = dataiter->second;
1873 if (tokenData == false){
1876 propertyTokens += ";";
1879 propertyTokens += dataiter->first;
1880 propertyTokens += "=";
1881 propertyTokens += dataiter->second;
1887 if (propertyTokens.size() > 0){
1888 newAlarmData.attachListTokens[objectSeekCount] = propertyTokens;
1891 newAlarmData.attachList[objectSeekCount] = iter->second;
1897 // Process data from X-*
1899 alarmObjectCount = 0;
1901 for(vector<string>::iterator xtokeniter = eventAlarmName[seekCount].begin();
1902 xtokeniter != eventAlarmName[seekCount].end(); ++xtokeniter){
1904 bool tokenData = false;
1905 string propertyTokens;
1907 if (xtokeniter->substr(0,2) == "X-" &&
1908 xtokeniter->size() > 2){
1910 newAlarmData.xTokensData.push_back(EventAlarmData[seekCount][alarmObjectCount]);
1911 newAlarmData.xTokensDataTokens.push_back(EventAlarmName[seekCount][alarmObjectCount]);
1919 if (newAlarmData.alarmType == CALENDARALARM_AUDIO &&
1920 alarmActionFound == true &&
1921 alarmTriggerFound == true){
1923 calendarAlarmData.push_back(newAlarmData);
1925 } else if (newAlarmData.alarmType == CALENDARALARM_DISPLAY &&
1926 alarmActionFound == true &&
1927 alarmTriggerFound == true &&
1928 alarmDescriptionFound == true){
1930 calendarAlarmData.push_back(newAlarmData);
1932 } else if (newAlarmData.alarmType == CALENDARALARM_EMAIL &&
1933 alarmActionFound == true &&
1934 alarmTriggerFound == true &&
1935 alarmDescriptionFound == true &&
1936 alarmSummaryFound == true){
1938 calendarAlarmData.push_back(newAlarmData);
1946 objectSeekCount = 0;
1948 // Process data from X-*
1950 for(vector<string>::iterator iter = objectName.begin();
1951 iter != objectName.end(); ++iter){
1953 bool tokenData = false;
1954 string propertyTokens;
1956 if (iter->substr(0,2) == "X-" &&
1959 xTokensData.push_back(objectData[objectSeekCount]);
1960 xTokensDataTokens.push_back(objectName[objectSeekCount]);