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 PropertyNameData = (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]);