1 // CalendarTask.cpp - CalendarTask 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 "CalendarTask.h"
23 CalendarObjectValidResult CalendarTaskObject::ValidObject(){
25 bool validBegin = false;
26 bool validEnd = false;
27 bool validDateTimeStamp = false;
28 bool validUniqueID = false;
32 // Look for BEGIN:VTODO.
34 for (vector<string>::iterator iter = objectName.begin();
35 iter != objectName.end(); iter++){
37 if (objectName[seekCount] == "BEGIN" &&
38 objectData[seekCount] == "VTODO"){
40 if (validBegin == false){
43 return CALENDAROBJECTVALID_INVALIDFORMAT;
48 if (objectName[seekCount] == "END" &&
49 objectData[seekCount] == "VTODO" &&
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:VTODO.
122 for (vector<string>::iterator iter = objectName.begin();
123 iter != objectName.end(); iter++){
125 if (objectName[SeekCount] == "END" &&
126 objectData[SeekCount] == "VTODO"){
128 if (validEnd == false){
131 return CALENDAROBJECTVALID_INVALIDFORMAT;
140 // Check if the VTODO is valid.
142 if (validBegin == true &&
144 validDateTimeStamp == true &&
145 validUniqueID == true){
147 return CALENDAROBJECTVALID_OK;
151 return CALENDAROBJECTVALID_INVALIDFORMAT;
157 void CalendarTaskObject::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 // Process the data from COMPLETED.
226 dataReceived = processTextVectors(&ObjectName, &ObjectData, false, "COMPLETED");
228 if (dataReceived.begin() != dataReceived.end()){
231 completedDataTokens = dataReceived.begin()->first.substr(10);
234 catch(const out_of_range &oor){
235 // Do nothing as there is no data.
238 completedData = dataReceived.begin()->second;
242 // Process the data from CREATED.
244 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "CREATED");
246 if (DataReceived.begin() != DataReceived.end()){
249 dateTimeCreatedTokens = dataReceived.begin()->first.substr(8);
252 catch(const out_of_range &oor){
253 // Do nothing as there is no data.
256 dateTimeCreatedData = dataReceived.begin()->second;
260 // Process the data from DESCRIPTION.
262 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "DESCRIPTION");
264 if (dataReceived.begin() != dataReceived.end()){
266 bool tokenData = false;
267 string propertyTokens;
269 propertyNameData = (string*)&dataReceived.begin()->first;
271 propertyData = SplitValues(*propertyNameData);
273 for(map<string,string>::iterator iter = propertyData.begin();
274 iter != propertyData.end(); iter++){
276 if (iter->first == "ALTREP"){
278 descriptionListAltRep.clear();
279 descriptionListAltRep.push_back(iter->second);
281 } else if (iter->first == "LANGUAGE"){
283 descriptionListLanguage.clear();
284 descriptionListLanguage.push_back(iter->second);
288 if (tokenData == false){
291 propertyTokens += ";";
294 propertyTokens += iter->first;
295 propertyTokens += "=";
296 propertyTokens += iter->second;
302 if (propertyTokens.size() > 0){
303 descriptionListTokens.clear();
304 descriptionListTokens.push_back(PropertyTokens);
307 descriptionList.clear();
308 descriptionList.push_back(dataReceived.begin()->second);
312 // Get the Date Time Start value.
314 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "DTSTART");
316 // Process the data from DTSTART.
318 if (dataReceived.begin() != dataReceived.end()){
320 bool tokenData = false;
321 string propertyTokens;
323 propertyNameData = (string*)&dataReceived.begin()->first;
325 propertyData = SplitValues(*propertyNameData);
327 for(map<string,string>::iterator iter = propertyData.begin();
328 iter != propertyData.end(); iter++){
330 if (iter->first == "VALUE"){
332 dateTimeStartDataValue = iter->second;
334 } else if (iter->first == "TZID"){
336 dateTimeStartDataTimeZoneID = iter->second;
340 if (tokenData == false){
343 propertyTokens += ";";
346 propertyTokens += iter->first;
347 propertyTokens += "=";
348 propertyTokens += iter->second;
354 if (propertyTokens.size() > 0){
355 dateTimeStartDataTokens = propertyTokens;
358 dateTimeStartData = dataReceived.begin()->second;
362 // Process the data from GEO.
364 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "GEO");
366 if (dataReceived.begin() != dataReceived.end()){
369 geographicTokens = dataReceived.begin()->first.substr(4);
372 catch(const out_of_range &oor){
373 // Do nothing as there is no data.
376 geographicData = dataReceived.begin()->second;
380 // Process the data from LAST-MODIFIED.
382 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "LAST-MODIFIED");
384 if (dataReceived.begin() != dataReceived.end()){
387 lastModifiedTokens = dataReceived.begin()->first.substr(14);
390 catch(const out_of_range &oor){
391 // Do nothing as there is no data.
394 lastModifiedData = dataReceived.begin()->second;
398 // Process the data from LOCATION.
400 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "LOCATION");
402 if (dataReceived.begin() != dataReceived.end()){
404 bool tokenData = false;
405 string propertyTokens;
407 propertyNameData = (string*)&dataReceived.begin()->first;
409 propertyData = SplitValues(*propertyNameData);
411 for(map<string,string>::iterator iter = propertyData.begin();
412 iter != propertyData.end(); iter++){
414 if (iter->first == "ALTREP"){
416 locationDataAltRep = iter->second;
418 } else if (iter->first == "LANGUAGE"){
420 locationDataLanguage = iter->second;
424 if (tokenData == false){
427 propertyTokens += ";";
430 propertyTokens += iter->first;
431 propertyTokens += "=";
432 propertyTokens += iter->second;
438 if (propertyTokens.size() > 0){
440 locationDataTokens = propertyTokens;
444 locationData = dataReceived.begin()->second;
448 // Process the data from ORGANIZER.
450 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "ORGANIZER");
452 if (dataReceived.begin() != dataReceived.end()){
454 bool tokenData = false;
455 string propertyTokens;
457 propertyNameData = (string*)&dataReceived.begin()->first;
459 propertyData = SplitValues(*propertyNameData);
461 for(map<string,string>::iterator iter = propertyData.begin();
462 iter != propertyData.end(); iter++){
464 if (iter->first == "CN"){
466 organiserDataCommonName = iter->second;
468 } else if (iter->first == "DIR"){
470 organiserDataDirectoryEntry = iter->second;
472 } else if (iter->first == "SENT-BY"){
474 organiserDataSentByParam = iter->second;
476 } else if (iter->first == "LANGUAGE"){
478 organiserDataLanguage = iter->second;
482 if (tokenData == false){
485 propertyTokens += ";";
488 propertyTokens += iter->first;
489 propertyTokens += "=";
490 propertyTokens += iter->second;
496 if (propertyTokens.size() > 0){
498 organiserDataTokens = propertyTokens;
502 organiserData = dataReceived.begin()->second;
506 // Process the data from PERCENT-COMPLETE.
508 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "PERCENT-COMPLETE");
510 if (dataReceived.begin() != dataReceived.end()){
513 percentCompleteTokens = dataReceived.begin()->first.substr(17);
516 catch(const out_of_range &oor){
517 // Do nothing as there is no data.
520 percentCompleteData = dataReceived.begin()->second;
524 // Process the data from PRIORITY.
526 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "PRIORITY");
528 if (dataReceived.begin() != dataReceived.end()){
531 priorityTokens = dataReceived.begin()->first.substr(9);
534 catch(const out_of_range &oor){
535 // Do nothing as there is no data.
539 priorityData = stoi(dataReceived.begin()->second);
542 catch(const invalid_argument &oor){
543 priorityTokens.clear();
548 // Process the data from RECURRENCE-ID.
550 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "RECURRENCE-ID");
552 if (dataReceived.begin() != dataReceived.end()){
554 bool tokenData = false;
555 string propertyTokens;
557 propertyNameData = (string*)&dataReceived.begin()->first;
559 propertyData = SplitValues(*propertyNameData);
561 for(map<string,string>::iterator iter = propertyData.begin();
562 iter != propertyData.end(); iter++){
564 if (iter->first == "TZID"){
566 recurranceIDDataTimeZoneParam = iter->second;
568 } else if (iter->first == "VALUE"){
570 recurranceIDDataValue = iter->second;
572 } else if (iter->first == "RANGE"){
574 recurranceIDDataRangeParam = iter->second;
578 if (tokenData == false){
581 propertyTokens += ";";
584 propertyTokens += iter->first;
585 propertyTokens += "=";
586 propertyTokens += iter->second;
592 if (propertyTokens.size() > 0){
594 recurranceIDDataTokens = propertyTokens;
598 recurranceIDData = dataReceived.begin()->second;
602 // Process the data from SEQUENCE.
604 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "SEQUENCE");
606 if (dataReceived.begin() != dataReceived.end()){
609 sequenceTokens = dataReceived.begin()->first.substr(9);
612 catch(const out_of_range &oor){
613 // Do nothing as there is no data.
617 sequenceData = stoi(dataReceived.begin()->second);
620 catch(const invalid_argument &oor){
621 sequenceTokens.clear();
626 // Process the data from STATUS.
628 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "STATUS");
630 if (dataReceived.begin() != dataReceived.end()){
632 bool tokenData = false;
633 string propertyTokens;
635 propertyNameData = (string*)&dataReceived.begin()->first;
637 propertyData = SplitValues(*propertyNameData);
639 for(map<string,string>::iterator iter = propertyData.begin();
640 iter != propertyData.end(); iter++){
642 if (iter->first == "LANGUAGE"){
644 statusLanguage = iter->second;
648 if (tokenData == false){
651 propertyTokens += ";";
654 propertyTokens += iter->first;
655 propertyTokens += "=";
656 propertyTokens += iter->second;
662 if (propertyTokens.size() > 0){
664 statusTokens = propertyTokens;
668 statusData = dataReceived.begin()->second;
672 // Process the data from SUMMARY.
674 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "SUMMARY");
676 if (dataReceived.begin() != dataReceived.end()){
678 bool tokenData = false;
679 string propertyTokens;
681 propertyNameData = (string*)&dataReceived.begin()->first;
683 propertyData = SplitValues(*propertyNameData);
685 for(map<string,string>::iterator iter = propertyData.begin();
686 iter != propertyData.end(); iter++){
688 if (iter->first == "ALTREP"){
690 summaryDataAltRep = iter->second;
692 } else if (iter->first == "LANGUAGE"){
694 summaryDataLanguage = iter->second;
698 if (tokenData == false){
701 propertyTokens += ";";
704 propertyTokens += iter->first;
705 propertyTokens += "=";
706 propertyTokens += iter->second;
712 if (propertyTokens.size() > 0){
714 summaryDataTokens = propertyTokens;
718 summaryData = dataReceived.begin()->second;
722 // Process the data from URL.
724 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "URL");
726 if (dataReceived.begin() != dataReceived.end()){
729 urlDataTokens = dataReceived.begin()->first.substr(4);
732 catch(const out_of_range &oor){
733 // Do nothing as there is no data.
736 urlData = dataReceived.begin()->second;
740 // Process the data from RRULE.
742 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "RRULE");
744 if (dataReceived.begin() != dataReceived.end()){
747 recurranceRuleDataTokens = dataReceived.begin()->first.substr(6);
750 catch(const out_of_range &oor){
751 // Do nothing as there is no data.
754 recurranceRuleData = dataReceived.begin()->second;
758 bool dueProcessed = false;
760 // Process the data from DUE.
762 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "DUE");
764 if (dataReceived.begin() != dataReceived.end()){
766 bool tokenData = false;
767 string propertyTokens;
769 propertyNameData = (string*)&dataReceived.begin()->first;
771 propertyData = SplitValues(*propertyNameData);
773 for(map<string,string>::iterator iter = propertyData.begin();
774 iter != propertyData.end(); iter++){
776 if (iter->first == "TZID"){
778 dueDataTimeZoneID = iter->second;
780 } else if (iter->first == "VALUE"){
782 dueDataValue = iter->second;
786 if (tokenData == false){
789 propertyTokens += ";";
792 propertyTokens += iter->first;
793 propertyTokens += "=";
794 propertyTokens += iter->second;
800 if (propertyTokens.size() > 0){
802 dueDataTokens = propertyTokens;
806 dueData = dataReceived.begin()->second;
811 // If there is no DUE, then check for DURATION.
813 if (dueProcessed == false){
815 dataReceived = ProcessTextVectors(&objectName, &objectData, false, "DURATION");
817 if (dataReceived.begin() != dataReceived.end()){
820 durationDataTokens = dataReceived.begin()->first.substr(9);
823 catch(const out_of_range &oor){
824 // Do nothing as there is no data.
827 durationData = dataReceived.begin()->second;
833 // Process the data from ATTACH.
835 dataReceived = ProcessTextVectors(&objectName, &objectData, true, "ATTACH");
837 for(multimap<string,string>::iterator iter = dataReceived.begin();
838 iter != dataReceived.end();
841 attachListEncoding.push_back("");
842 attachListValue.push_back("");
843 attachListFormatType.push_back("");
844 attachListTokens.push_back("");
845 attachList.push_back("");
847 bool tokenData = false;
848 string propertyTokens;
850 propertyNameData = (string*)&iter->first;
852 propertyData = SplitValues(*propertyNameData);
854 for(map<string,string>::iterator dataiter = propertyData.begin();
855 dataiter != propertyData.end(); dataiter++){
857 if (dataiter->first == "ENCODING"){
859 attachListEncoding[objectSeekCount] = dataiter->second;
861 } else if (dataiter->first == "VALUE"){
863 attachListValue[objectSeekCount] = dataiter->second;
865 } else if (dataiter->first == "FMTTYPE"){
867 attachListFormatType[objectSeekCount] = dataiter->second;
871 if (tokenData == false){
874 propertyTokens += ";";
877 propertyTokens += dataiter->first;
878 propertyTokens += "=";
879 propertyTokens += dataiter->second;
885 if (propertyTokens.size() > 0){
886 attachListTokens[objectSeekCount] = propertyTokens;
889 attachList[objectSeekCount] = iter->second;
895 // Process the data from ATTENDEE.
897 dataReceived = ProcessTextVectors(&objectName, &objectData, true, "ATTENDEE");
901 for(multimap<string,string>::iterator iter = dataReceived.begin();
902 iter != dataReceived.end();
905 attendeeListMember.push_back("");
906 attendeeListDelegatedFrom.push_back("");
907 attendeeListDelegatedTo.push_back("");
908 attendeeListRole.push_back("");
909 attendeeListRSVP.push_back("");
910 attendeeListDirectoryEntry.push_back("");
911 attendeeListSentBy.push_back("");
912 attendeeListCommonName.push_back("");
913 attendeeListCalendarUserType.push_back("");
914 attendeeListParticipationStatus.push_back("");
915 attendeeListLanguage.push_back("");
916 attendeeListTokens.push_back("");
917 attendeeList.push_back("");
919 bool tokenData = false;
920 string propertyTokens;
922 propertyNameData = (string*)&iter->first;
924 propertyData = SplitValues(*propertyNameData);
926 for(map<string,string>::iterator dataiter = propertyData.begin();
927 dataiter != propertyData.end(); dataiter++){
929 if (dataiter->first == "CUTYPE"){
931 attendeeListCalendarUserType[objectSeekCount] = dataiter->second;
933 } else if (dataiter->first == "MEMBER"){
935 attendeeListMember[objectSeekCount] = dataiter->second;
937 } else if (dataiter->first == "ROLE"){
939 attendeeListRole[objectSeekCount] = dataiter->second;
941 } else if (dataiter->first == "PARTSTAT"){
943 attendeeListParticipationStatus[objectSeekCount] = dataiter->second;
945 } else if (dataiter->first == "RSVP"){
947 attendeeListRSVP[objectSeekCount] = dataiter->second;
949 } else if (dataiter->first == "DELEGATED-TO"){
951 attendeeListDelegatedTo[objectSeekCount] = dataiter->second;
953 } else if (dataiter->first == "DELEGATED-FROM"){
955 attendeeListDelegatedFrom[objectSeekCount] = dataiter->second;
957 } else if (dataiter->first == "SENT-BY"){
959 attendeeListSentBy[objectSeekCount] = dataiter->second;
961 } else if (dataiter->first == "CN"){
963 attendeeListCommonName[objectSeekCount] = dataiter->second;
965 } else if (dataiter->first == "DIR"){
967 attendeeListDirectoryEntry[objectSeekCount] = dataiter->second;
969 } else if (dataiter->first == "LANGUAGE"){
971 attendeeListLanguage[objectSeekCount] = dataiter->second;
975 if (tokenData == false){
978 propertyTokens += ";";
981 propertyTokens += dataiter->first;
982 propertyTokens += "=";
983 propertyTokens += dataiter->second;
989 if (propertyTokens.size() > 0){
990 attendeeListTokens[objectSeekCount] = propertyTokens;
993 attendeeList[objectSeekCount] = iter->second;
999 // Process the data from CATEGORIES.
1001 dataReceived = ProcessTextVectors(&objectName, &objectData, true, "CATEGORIES");
1003 objectSeekCount = 0;
1005 for(multimap<string,string>::iterator iter = dataReceived.begin();
1006 iter != dataReceived.end();
1009 categoriesListTokens.push_back("");
1010 categoriesListLanguage.push_back("");
1011 categoriesList.push_back("");
1013 bool tokenData = false;
1014 string propertyTokens;
1016 propertyNameData = (string*)&iter->first;
1018 propertyData = SplitValues(*propertyNameData);
1020 for(map<string,string>::iterator dataiter = propertyData.begin();
1021 dataiter != propertyData.end(); dataiter++){
1023 if (dataiter->first == "LANGUAGE"){
1025 categoriesListLanguage[objectSeekCount] = dataiter->second;
1029 if (tokenData == false){
1032 propertyTokens += ";";
1035 propertyTokens += dataiter->first;
1036 propertyTokens += "=";
1037 propertyTokens += dataiter->second;
1043 if (propertyTokens.size() > 0){
1044 categoriesListTokens[objectSeekCount] = propertyTokens;
1047 categoriesList[objectSeekCount] = iter->second;
1053 // Process the data from COMMENT.
1055 dataReceived = ProcessTextVectors(&objectName, &objectData, true, "COMMENT");
1057 objectSeekCount = 0;
1059 for(multimap<string,string>::iterator iter = dataReceived.begin();
1060 iter != dataReceived.end();
1063 commentListTokens.push_back("");
1064 commentListAltRep.push_back("");
1065 commentListLanguage.push_back("");
1066 commentList.push_back("");
1068 bool tokenData = false;
1069 string propertyTokens;
1071 propertyNameData = (string*)&iter->first;
1073 propertyData = SplitValues(*propertyNameData);
1075 for(map<string,string>::iterator dataiter = propertyData.begin();
1076 dataiter != propertyData.end(); dataiter++){
1078 if (dataiter->first == "ALTREP"){
1080 commentListAltRep[objectSeekCount] = dataiter->second;
1082 } else if (dataiter->first == "LANGUAGE"){
1084 commentListLanguage[objectSeekCount] = dataiter->second;
1088 if (tokenData == false){
1091 propertyTokens += ";";
1094 propertyTokens += dataiter->first;
1095 propertyTokens += "=";
1096 propertyTokens += dataiter->second;
1102 if (propertyTokens.size() > 0){
1103 commentListTokens[objectSeekCount] = PropertyTokens;
1106 commentList[objectSeekCount] = iter->second;
1112 // Process the data from CONTACT.
1114 dataReceived = ProcessTextVectors(&objectName, &objectData, true, "CONTACT");
1116 objectSeekCount = 0;
1118 for(multimap<string,string>::iterator iter = dataReceived.begin();
1119 iter != dataReceived.end();
1122 contactListTokens.push_back("");
1123 contactListAltRep.push_back("");
1124 contactListLanguage.push_back("");
1125 contactList.push_back("");
1127 bool tokenData = false;
1128 string propertyTokens;
1130 propertyNameData = (string*)&iter->first;
1132 propertyData = SplitValues(*propertyNameData);
1134 for(map<string,string>::iterator dataiter = propertyData.begin();
1135 dataiter != propertyData.end(); dataiter++){
1137 if (dataiter->first == "ALTREP"){
1139 contactListAltRep[objectSeekCount] = dataiter->second;
1141 } else if (dataiter->first == "LANGUAGE"){
1143 contactListLanguage[objectSeekCount] = dataiter->second;
1147 if (tokenData == false){
1150 propertyTokens += ";";
1153 propertyTokens += dataiter->first;
1154 propertyTokens += "=";
1155 propertyTokens += dataiter->second;
1161 if (propertyTokens.size() > 0){
1162 contactListTokens[objectSeekCount] = propertyTokens;
1165 contactList[objectSeekCount] = iter->second;
1171 // Process the data from EXDATE.
1173 dataReceived = ProcessTextVectors(&objectName, &objectData, true, "EXDATE");
1175 objectSeekCount = 0;
1177 for(multimap<string,string>::iterator iter = dataReceived.begin();
1178 iter != dataReceived.end();
1181 excludeDateDataTokens.push_back("");
1182 excludeDateDataValue.push_back("");
1183 excludeDateDataTimeZoneParam.push_back("");
1184 excludeDateData.push_back("");
1186 bool tokenData = false;
1187 string propertyTokens;
1189 propertyNameData = (string*)&iter->first;
1191 propertyData = SplitValues(*propertyNameData);
1193 for(map<string,string>::iterator dataiter = propertyData.begin();
1194 dataiter != propertyData.end(); dataiter++){
1196 if (dataiter->first == "VALUE"){
1198 excludeDateDataValue[objectSeekCount] = dataiter->second;
1200 } else if (dataiter->first == "TZID"){
1202 excludeDateDataTimeZoneParam[objectSeekCount] = dataiter->second;
1206 if (tokenData == false){
1209 propertyTokens += ";";
1212 propertyTokens += dataiter->first;
1213 propertyTokens += "=";
1214 propertyTokens += dataiter->second;
1220 if (propertyTokens.size() > 0){
1221 excludeDateDataTokens[ObjectSeekCount] = propertyTokens;
1224 excludeDateData[objectSeekCount] = iter->second;
1230 // Process the data from REQUEST-STATUS.
1232 dataReceived = ProcessTextVectors(&objectName, &objectData, true, "REQUEST-STATUS");
1234 objectSeekCount = 0;
1236 for(multimap<string,string>::iterator iter = dataReceived.begin();
1237 iter != dataReceived.end();
1240 requestStatusTokens.push_back("");
1241 requestStatusLanguage.push_back("");
1242 requestStatusData.push_back("");
1244 bool tokenData = false;
1245 string propertyTokens;
1247 propertyNameData = (string*)&iter->first;
1249 propertyData = SplitValues(*propertyNameData);
1251 for(map<string,string>::iterator dataiter = propertyData.begin();
1252 dataiter != propertyData.end(); dataiter++){
1254 if (dataiter->first == "LANGUAGE"){
1256 requestStatusLanguage[objectSeekCount] = dataiter->second;
1260 if (tokenData == false){
1263 propertyTokens += ";";
1266 propertyTokens += dataiter->first;
1267 propertyTokens += "=";
1268 propertyTokens += dataiter->second;
1274 if (propertyTokens.size() > 0){
1275 requestStatusTokens[objectSeekCount] = propertyTokens;
1278 requestStatusData[objectSeekCount] = iter->second;
1284 // Process the data from RELATED-TO.
1286 dataReceived = ProcessTextVectors(&objectName, &objectData, true, "RELATED-TO");
1288 objectSeekCount = 0;
1290 for(multimap<string,string>::iterator iter = dataReceived.begin();
1291 iter != dataReceived.end();
1294 relatedToDataTokens.push_back("");
1295 relatedToDataRelationType.push_back("");
1296 relatedToData.push_back("");
1298 bool tokenData = false;
1299 string propertyTokens;
1301 propertyNameData = (string*)&iter->first;
1303 propertyData = SplitValues(*propertyNameData);
1305 for(map<string,string>::iterator dataiter = propertyData.begin();
1306 dataiter != propertyData.end(); dataiter++){
1308 if (dataiter->first == "RELTYPE"){
1310 relatedToDataRelationType[objectSeekCount] = dataiter->second;
1314 if (tokenData == false){
1317 propertyTokens += ";";
1320 propertyTokens += dataiter->first;
1321 propertyTokens += "=";
1322 propertyTokens += dataiter->second;
1328 if (propertyTokens.size() > 0){
1329 relatedToDataTokens[objectSeekCount] = propertyTokens;
1332 relatedToData[objectSeekCount] = iter->second;
1338 // Process the data from RESOURCES.
1340 dataReceived = ProcessTextVectors(&objectName, &objectData, true, "RESOURCES");
1342 objectSeekCount = 0;
1344 for(multimap<string,string>::iterator iter = dataReceived.begin();
1345 iter != dataReceived.end();
1348 resourcesDataTokens.push_back("");
1349 resourcesDataAltRep.push_back("");
1350 resourcesDataLanguage.push_back("");
1351 resourcesData.push_back("");
1353 bool tokenData = false;
1354 string propertyTokens;
1356 propertyNameData = (string*)&iter->first;
1358 propertyData = SplitValues(*propertyNameData);
1360 for(map<string,string>::iterator dataiter = propertyData.begin();
1361 dataiter != propertyData.end(); dataiter++){
1363 if (dataiter->first == "ALTREP"){
1365 resourcesDataAltRep[objectSeekCount] = dataiter->second;
1367 } else if (dataiter->first == "LANGUAGE"){
1369 resourcesDataLanguage[objectSeekCount] = dataiter->second;
1373 if (tokenData == false){
1376 propertyTokens += ";";
1379 propertyTokens += dataiter->first;
1380 propertyTokens += "=";
1381 propertyTokens += dataiter->second;
1387 if (propertyTokens.size() > 0){
1388 resourcesDataTokens[objectSeekCount] = PropertyTokens;
1391 resourcesData[objectSeekCount] = iter->second;
1397 // Process the data from RDATE.
1399 dataReceived = ProcessTextVectors(&objectName, &objectData, true, "RDATE");
1401 objectSeekCount = 0;
1403 for(multimap<string,string>::iterator iter = dataReceived.begin();
1404 iter != dataReceived.end();
1407 recurranceDateDataTokens.push_back("");
1408 recurranceDateDataValue.push_back("");
1409 recurranceDateDataTimeZoneParam.push_back("");
1410 recurranceDateData.push_back("");
1412 bool tokenData = false;
1413 string propertyTokens;
1415 propertyNameData = (string*)&iter->first;
1417 propertyData = SplitValues(*propertyNameData);
1419 for(map<string,string>::iterator dataiter = propertyData.begin();
1420 dataiter != propertyData.end(); dataiter++){
1422 if (dataiter->first == "VALUE"){
1424 recurranceDateDataValue[objectSeekCount] = dataiter->second;
1426 } else if (dataiter->first == "TZID"){
1428 recurranceDateDataTimeZoneParam[objectSeekCount] = dataiter->second;
1432 if (tokenData == false){
1435 propertyTokens += ";";
1438 propertyTokens += dataiter->first;
1439 propertyTokens += "=";
1440 propertyTokens += dataiter->second;
1446 if (propertyTokens.size() > 0){
1447 recurranceDateDataTokens[objectSeekCount] = propertyTokens;
1450 recurranceDateData[objectSeekCount] = iter->second;
1456 // Process VALARM section.
1459 int alarmObjectCount = 0;
1461 bool alarmActionFound = false;
1463 for (vector<vector<string>>::iterator iter = eventAlarmName.begin();
1464 iter != eventAlarmName.end(); iter++){
1466 CalendarAlarmDataStruct newAlarmData;
1468 // Process the data from ACTION.
1470 bool alarmActionFound = false;
1471 bool alarmTriggerFound = false;
1472 bool alarmDurationFound = false;
1473 bool alarmDescriptionFound = false;
1474 bool alarmSummaryFound = false;
1476 dataReceived = ProcessTextVectors(&eventAlarmName[seekCount],
1477 &eventAlarmData[seekCount], false, "ACTION");
1479 if (dataReceived.begin() != dataReceived.end()){
1482 newAlarmData.alarmActionTokens = dataReceived.begin()->first.substr(7);
1485 catch(const out_of_range &oor){
1486 // Do nothing as there is no data.
1489 newAlarmData.alarmAction = dataReceived.begin()->second;
1490 alarmActionFound = true;
1494 // Check if a value was set for AlarmAction, otherwise
1495 // process the next VALARM section.
1497 if (newAlarmData.alarmAction.size() < 1){
1504 // Check if AlarmAction is DISPLAY, AUDIO or EMAIL.
1505 // Process the next VALARM section if not.
1507 if (newAlarmData.alarmAction == "AUDIO"){
1509 newAlarmData.alarmType = CALENDARALARM_AUDIO;
1511 } else if (newAlarmData.alarmAction == "DISPLAY"){
1513 newAlarmData.alarmType = CALENDARALARM_DISPLAY;
1515 } else if (newAlarmData.alarmAction == "EMAIL"){
1517 newAlarmData.alarmType = CALENDARALARM_EMAIL;
1526 // Process the data from TRIGGER.
1528 dataReceived = ProcessTextVectors(&eventAlarmName[seekCount], &eventAlarmData[seekCount], false, "TRIGGER");
1530 if (dataReceived.begin() != dataReceived.end()){
1532 bool tokenData = false;
1533 string propertyTokens;
1535 propertyNameData = (string*)&dataReceived.begin()->first;
1537 propertyData = SplitValues(*propertyNameData);
1539 for(map<string,string>::iterator iter = propertyData.begin();
1540 iter != propertyData.end(); iter++){
1542 if (iter->first == "VALUE"){
1544 newAlarmData.triggerValue = iter->second;
1546 } else if (iter->first == "RELATED"){
1548 newAlarmData.triggerRelated = iter->second;
1552 if (tokenData == false){
1555 propertyTokens += ";";
1558 propertyTokens += iter->first;
1559 propertyTokens += "=";
1560 propertyTokens += iter->second;
1566 if (propertyTokens.size() > 0){
1567 newAlarmData.triggerTokens = propertyTokens;
1570 newAlarmData.triggerData = dataReceived.begin()->second;
1571 alarmTriggerFound = true;
1575 // Process the data from DESCRIPTION.
1577 dataReceived = ProcessTextVectors(&eventAlarmName[seekCount], &eventAlarmData[seekCount], false, "DESCRIPTION");
1579 if (dataReceived.begin() != dataReceived.end() &&
1580 (newAlarmData.alarmType == CALENDARALARM_DISPLAY ||
1581 newAlarmData.alarmType == CALENDARALARM_EMAIL)){
1583 bool tokenData = false;
1584 string propertyTokens;
1586 propertyameData = (string*)&dataReceived.begin()->first;
1588 propertyData = SplitValues(*propertyNameData);
1590 for(map<string,string>::iterator iter = propertyData.begin();
1591 iter != propertyData.end(); iter++){
1593 if (iter->first == "ALTREP"){
1595 newAlarmData.descriptionAltRep = iter->second;
1597 } else if (iter->first == "LANGUAGE"){
1599 newAlarmData.descriptionLanguage = iter->second;
1603 if (tokenData == false){
1606 propertyTokens += ";";
1609 propertyTokens += iter->first;
1610 propertyTokens += "=";
1611 propertyTokens += iter->second;
1617 if (propertyTokens.size() > 0){
1618 newAlarmData.descriptionTokens = propertyTokens;
1621 newAlarmData.descriptionData = dataReceived.begin()->second;
1622 alarmDescriptionFound = true;
1626 // Process data from SUMMARY.
1628 dataReceived = ProcessTextVectors(&eventAlarmName[seekCount], &eventAlarmData[seekCount], false, "SUMMARY");
1630 if (dataReceived.begin() != dataReceived.end() &&
1631 newAlarmData.alarmType == CALENDARALARM_EMAIL){
1633 bool tokenData = false;
1634 string propertyTokens;
1636 propertyNameData = (string*)&dataReceived.begin()->first;
1638 propertyData = SplitValues(*propertyNameData);
1640 for(map<string,string>::iterator iter = propertyData.begin();
1641 iter != propertyData.end(); iter++){
1643 if (iter->first == "ALTREP"){
1645 newAlarmData.summaryAltRep = iter->second;
1647 } else if (iter->first == "LANGUAGE"){
1649 newAlarmData.summaryLanguage = iter->second;
1653 if (tokenData == false){
1656 propertyTokens += ";";
1659 propertyTokens += iter->first;
1660 propertyTokens += "=";
1661 propertyTokens += iter->second;
1667 if (propertyTokens.size() > 0){
1668 newAlarmData.summaryTokens = propertyTokens;
1671 newAlarmData.summaryData = dataReceived.begin()->second;
1672 alarmSummaryFound = true;
1676 // Process data from DURATION.
1678 dataReceived = ProcessTextVectors(&eventAlarmName[seekCount], &eventAlarmData[seekCount], false, "DURATION");
1680 if (dataReceived.begin() != dataReceived.end()){
1683 newAlarmData.durationTokens = dataReceived.begin()->first.substr(9);
1686 catch(const out_of_range &oor){
1687 // Do nothing as there is no data.
1690 newAlarmData.durationData = dataReceived.begin()->second;
1691 alarmDurationFound = true;
1695 // Process data from REPEAT.
1697 dataReceived = ProcessTextVectors(&eventAlarmName[seekCount], &eventAlarmData[seekCount], false, "REPEAT");
1699 if (dataReceived.begin() != dataReceived.end() && alarmDurationFound == true){
1702 newAlarmData.repeatTokens = dataReceived.begin()->first.substr(7);
1705 catch(const out_of_range &oor){
1706 // Do nothing as there is no data.
1709 newAlarmData.repeatData = dataReceived.begin()->second;
1713 newAlarmData.durationData.clear();
1714 newAlarmData.durationTokens.clear();
1718 // Process data from ATTENDEE.
1720 dataReceived = ProcessTextVectors(&eventAlarmName[seekCount], &eventAlarmData[seekCount], true, "ATTENDEE");
1722 objectSeekCount = 0;
1724 for(multimap<string,string>::iterator iter = dataReceived.begin();
1725 iter != dataReceived.end();
1728 newAlarmData.attendeeListMember.push_back("");
1729 newAlarmData.attendeeListDelegatedFrom.push_back("");
1730 newAlarmData.attendeeListDelegatedTo.push_back("");
1731 newAlarmData.attendeeListRole.push_back("");
1732 newAlarmData.attendeeListRSVP.push_back("");
1733 newAlarmData.attendeeListDirectoryEntry.push_back("");
1734 newAlarmData.attendeeListSentBy.push_back("");
1735 newAlarmData.attendeeListCommonName.push_back("");
1736 newAlarmData.attendeeListCalendarUserType.push_back("");
1737 newAlarmData.attendeeListParticipationStatus.push_back("");
1738 newAlarmData.attendeeListLanguage.push_back("");
1739 newAlarmData.attendeeListTokens.push_back("");
1740 newAlarmData.attendeeList.push_back("");
1742 bool tokenData = false;
1743 string propertyTokens;
1745 propertyNameData = (string*)&iter->first;
1747 propertyData = SplitValues(*propertyNameData);
1749 for(map<string,string>::iterator dataiter = propertyData.begin();
1750 dataiter != propertyData.end(); dataiter++){
1752 if (dataiter->first == "CUTYPE"){
1754 newAlarmData.attendeeListCalendarUserType[objectSeekCount] = dataiter->second;
1756 } else if (dataiter->first == "MEMBER"){
1758 newAlarmData.attendeeListMember[objectSeekCount] = dataiter->second;
1760 } else if (dataiter->first == "ROLE"){
1762 newAlarmData.attendeeListRole[objectSeekCount] = dataiter->second;
1764 } else if (dataiter->first == "PARTSTAT"){
1766 newAlarmData.attendeeListParticipationStatus[objectSeekCount] = dataiter->second;
1768 } else if (dataiter->first == "RSVP"){
1770 newAlarmData.attendeeListRSVP[objectSeekCount] = dataiter->second;
1772 } else if (dataiter->first == "DELEGATED-TO"){
1774 newAlarmData.attendeeListDelegatedTo[objectSeekCount] = dataiter->second;
1776 } else if (dataiter->first == "DELEGATED-FROM"){
1778 newAlarmData.attendeeListDelegatedFrom[objectSeekCount] = dataiter->second;
1780 } else if (dataiter->first == "SENT-BY"){
1782 newAlarmData.attendeeListSentBy[objectSeekCount] = dataiter->second;
1784 } else if (dataiter->first == "CN"){
1786 newAlarmData.attendeeListCommonName[objectSeekCount] = dataiter->second;
1788 } else if (dataiter->first == "DIR"){
1790 newAlarmData.attendeeListDirectoryEntry[objectSeekCount] = dataiter->second;
1792 } else if (dataiter->first == "LANGUAGE"){
1794 newAlarmData.attendeeListLanguage[objectSeekCount] = dataiter->second;
1798 if (tokenData == false){
1801 propertyTokens += ";";
1804 propertyTokens += dataiter->first;
1805 propertyTokens += "=";
1806 propertyTokens += dataiter->second;
1812 if (propertyTokens.size() > 0){
1813 newAlarmData.attendeeListTokens[objectSeekCount] = propertyTokens;
1816 newAlarmData.attendeeList[objectSeekCount] = iter->second;
1822 // Process data from ATTACH.
1824 dataReceived = ProcessTextVectors(&eventAlarmName[seekCount], &eventAlarmData[seekCount], true, "ATTACH");
1826 objectSeekCount = 0;
1828 for(multimap<string,string>::iterator iter = dataReceived.begin();
1829 iter != dataReceived.end();
1832 newAlarmData.attachListEncoding.push_back("");
1833 newAlarmData.attachListValue.push_back("");
1834 newAlarmData.attachListFormatType.push_back("");
1835 newAlarmData.attachListTokens.push_back("");
1836 newAlarmData.attachList.push_back("");
1838 bool tokenData = false;
1839 string propertyTokens;
1841 propertyNameData = (string*)&iter->first;
1843 propertyData = SplitValues(*propertyNameData);
1845 for(map<string,string>::iterator dataiter = propertyData.begin();
1846 dataiter != propertyData.end(); dataiter++){
1848 if (dataiter->first == "ENCODING"){
1850 newAlarmData.attachListEncoding[objectSeekCount] = dataiter->second;
1852 } else if (dataiter->first == "VALUE"){
1854 newAlarmData.attachListValue[objectSeekCount] = dataiter->second;
1856 } else if (dataiter->first == "FMTTYPE"){
1858 newAlarmData.attachListFormatType[objectSeekCount] = dataiter->second;
1862 if (tokenData == false){
1865 propertyTokens += ";";
1868 propertyTokens += dataiter->first;
1869 propertyTokens += "=";
1870 propertyTokens += dataiter->second;
1876 if (propertyTokens.size() > 0){
1877 newAlarmData.attachListTokens[objectSeekCount] = propertyTokens;
1880 newAlarmData.attachList[objectSeekCount] = iter->second;
1886 // Process data from X-*
1888 alarmObjectCount = 0;
1890 for(vector<string>::iterator xtokeniter = eventAlarmName[seekCount].begin();
1891 xtokeniter != eventAlarmName[seekCount].end(); ++xtokeniter){
1893 bool tokenData = false;
1894 string propertyTokens;
1896 if (xtokeniter->substr(0,2) == "X-" &&
1897 xtokeniter->size() > 2){
1899 newAlarmData.xTokensData.push_back(eventAlarmData[seekCount][alarmObjectCount]);
1900 newAlarmData.xTokensDataTokens.push_back(EventAlarmName[seekCount][alarmObjectCount]);
1908 if (newAlarmData.alarmType == CALENDARALARM_AUDIO &&
1909 alarmActionFound == true &&
1910 alarmTriggerFound == true){
1912 calendarAlarmData.push_back(newAlarmData);
1914 } else if (newAlarmData.alarmType == CALENDARALARM_DISPLAY &&
1915 alarmActionFound == true &&
1916 alarmTriggerFound == true &&
1917 alarmDescriptionFound == true){
1919 calendarAlarmData.push_back(newAlarmData);
1921 } else if (newAlarmData.alarmType == CALENDARALARM_EMAIL &&
1922 alarmActionFound == true &&
1923 alarmTriggerFound == true &&
1924 alarmDescriptionFound == true &&
1925 alarmSummaryFound == true){
1927 calendarAlarmData.push_back(newAlarmData);
1935 objectSeekCount = 0;
1937 // Process data from X-*
1939 for(vector<string>::iterator iter = objectName.begin();
1940 iter != objectName.end(); ++iter){
1942 bool tokenData = false;
1943 string propertyTokens;
1945 if (iter->substr(0,2) == "X-" &&
1948 xTokensData.push_back(objectData[objectSeekCount]);
1949 xTokensDataTokens.push_back(objectName[objectSeekCount]);