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]);