1 #include "CalendarEvent.h"
5 CalendarObjectValidResult CalendarEventObject::ValidObject(){
7 bool ValidBegin = false;
9 bool ValidDateTimeStamp = false;
10 bool ValidUniqueID = false;
11 bool ValidDateTimeStart = false;
15 // Look for BEGIN:VEVENT.
17 for (vector<string>::iterator iter = ObjectName.begin();
18 iter != ObjectName.end(); iter++){
20 if (ObjectName[SeekCount] == "BEGIN" &&
21 ObjectData[SeekCount] == "VEVENT"){
23 if (ValidBegin == false){
26 return CALENDAROBJECTVALID_INVALIDFORMAT;
31 if (ObjectName[SeekCount] == "END" &&
32 ObjectData[SeekCount] == "VEVENT" &&
35 return CALENDAROBJECTVALID_INVALIDFORMAT;
47 for (vector<string>::iterator iter = ObjectName.begin();
48 iter != ObjectName.end(); iter++){
51 PropertyName = ObjectName[SeekCount].substr(0,7);
54 catch(const out_of_range& oor){
58 if (PropertyName == "DTSTAMP"){
60 if (ValidDateTimeStamp == false){
61 ValidDateTimeStamp = true;
63 return CALENDAROBJECTVALID_INVALIDFORMAT;
76 for (vector<string>::iterator iter = ObjectName.begin();
77 iter != ObjectName.end(); iter++){
80 PropertyName = ObjectName[SeekCount].substr(0,3);
83 catch(const out_of_range& oor){
87 if (PropertyName == "UID"){
89 if (ValidUniqueID == false){
92 return CALENDAROBJECTVALID_INVALIDFORMAT;
103 // Look for DTSTART if nothing is set for METHOD..
105 if (MethodData.size() == 0){
107 for (vector<string>::iterator iter = ObjectName.begin();
108 iter != ObjectName.end(); iter++){
111 PropertyName = ObjectName[SeekCount].substr(0,7);
114 catch(const out_of_range& oor){
118 if (PropertyName == "DTSTART"){
120 if (ValidDateTimeStart == false){
121 ValidDateTimeStart = true;
123 return CALENDAROBJECTVALID_INVALIDFORMAT;
133 ValidDateTimeStart = true;
138 // Look for END:VEVENT.
140 for (vector<string>::iterator iter = ObjectName.begin();
141 iter != ObjectName.end(); iter++){
143 if (ObjectName[SeekCount] == "END" &&
144 ObjectData[SeekCount] == "VEVENT"){
146 if (ValidEnd == false){
149 return CALENDAROBJECTVALID_INVALIDFORMAT;
158 // Check if the VEVENT is valid.
160 if (ValidBegin == true &&
162 ValidDateTimeStamp == true &&
163 ValidDateTimeStart == true &&
164 ValidUniqueID == true){
166 return CALENDAROBJECTVALID_OK;
170 return CALENDAROBJECTVALID_INVALIDFORMAT;
176 void CalendarEventObject::ProcessData(){
180 multimap<string,string> DataReceived;
181 map<string,string> PropertyData;
182 string *PropertyNameData = nullptr;
183 int ObjectSeekCount = 0;
185 // Get the Date Time Stamp (DTSTAMP).
187 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "DTSTAMP");
189 // Process the data from DTSTAMP.
191 if (DataReceived.begin() != DataReceived.end()){
194 DateTimeStampTokens = DataReceived.begin()->first.substr(8);
197 catch(const out_of_range &oor){
198 // Do nothing as there is no data.
201 DateTimeStampData = DataReceived.begin()->second;
205 // Get the Unique ID (UID).
207 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "UID");
209 // Process the data from UID.
211 if (DataReceived.begin() != DataReceived.end()){
214 UniqueIDTokens = DataReceived.begin()->first.substr(4);
217 catch(const out_of_range &oor){
218 // Do nothing as there is no data.
221 UniqueID = DataReceived.begin()->second;
225 // Get the Date Time Start value.
227 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "DTSTART");
229 // Process the data from DTSTART.
231 if (DataReceived.begin() != DataReceived.end()){
233 bool TokenData = false;
234 string PropertyTokens;
236 PropertyNameData = (string*)&DataReceived.begin()->first;
238 PropertyData = SplitValues(*PropertyNameData);
240 for(map<string,string>::iterator iter = PropertyData.begin();
241 iter != PropertyData.end(); iter++){
243 if (iter->first == "VALUE"){
245 DateTimeStartDataValue = iter->second;
247 } else if (iter->first == "TZID"){
249 DateTimeStartDataTimeZoneID = iter->second;
253 if (TokenData == false){
256 PropertyTokens += ";";
259 PropertyTokens += iter->first;
260 PropertyTokens += "=";
261 PropertyTokens += iter->second;
267 if (PropertyTokens.size() > 0){
268 DateTimeStartDataTokens = PropertyTokens;
271 DateTimeStartData = DataReceived.begin()->second;
275 // Process the data from CLASS.
277 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "CLASS");
279 if (DataReceived.begin() != DataReceived.end()){
282 ClassDataTokens = DataReceived.begin()->first.substr(6);
285 catch(const out_of_range &oor){
286 // Do nothing as there is no data.
289 ClassData = DataReceived.begin()->second;
293 // Process the data from CREATED.
295 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "CREATED");
297 if (DataReceived.begin() != DataReceived.end()){
300 DateTimeCreatedTokens = DataReceived.begin()->first.substr(8);
303 catch(const out_of_range &oor){
304 // Do nothing as there is no data.
307 DateTimeCreatedData = DataReceived.begin()->second;
311 // Process the data from DESCRIPTION.
313 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "DESCRIPTION");
315 if (DataReceived.begin() != DataReceived.end()){
317 bool TokenData = false;
318 string PropertyTokens;
320 PropertyNameData = (string*)&DataReceived.begin()->first;
322 PropertyData = SplitValues(*PropertyNameData);
324 for(map<string,string>::iterator iter = PropertyData.begin();
325 iter != PropertyData.end(); iter++){
327 if (iter->first == "ALTREP"){
329 DescriptionListAltRep.clear();
330 DescriptionListAltRep.push_back(iter->second);
332 } else if (iter->first == "LANGUAGE"){
334 DescriptionListLanguage.clear();
335 DescriptionListLanguage.push_back(iter->second);
339 if (TokenData == false){
342 PropertyTokens += ";";
345 PropertyTokens += iter->first;
346 PropertyTokens += "=";
347 PropertyTokens += iter->second;
353 if (PropertyTokens.size() > 0){
354 DescriptionListTokens.clear();
355 DescriptionListTokens.push_back(PropertyTokens);
358 DescriptionList.clear();
359 DescriptionList.push_back(DataReceived.begin()->second);
363 // Process the data from GEO.
365 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "GEO");
367 if (DataReceived.begin() != DataReceived.end()){
370 GeographicTokens = DataReceived.begin()->first.substr(4);
373 catch(const out_of_range &oor){
374 // Do nothing as there is no data.
377 GeographicData = DataReceived.begin()->second;
381 // Process the data from LAST-MODIFIED.
383 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "LAST-MODIFIED");
385 if (DataReceived.begin() != DataReceived.end()){
388 LastModifiedTokens = DataReceived.begin()->first.substr(14);
391 catch(const out_of_range &oor){
392 // Do nothing as there is no data.
395 LastModifiedData = DataReceived.begin()->second;
399 // Process the data from LOCATION.
401 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "LOCATION");
403 if (DataReceived.begin() != DataReceived.end()){
405 bool TokenData = false;
406 string PropertyTokens;
408 PropertyNameData = (string*)&DataReceived.begin()->first;
410 PropertyData = SplitValues(*PropertyNameData);
412 for(map<string,string>::iterator iter = PropertyData.begin();
413 iter != PropertyData.end(); iter++){
415 if (iter->first == "ALTREP"){
417 LocationDataAltRep = iter->second;
419 } else if (iter->first == "LANGUAGE"){
421 LocationDataLanguage = iter->second;
425 if (TokenData == false){
428 PropertyTokens += ";";
431 PropertyTokens += iter->first;
432 PropertyTokens += "=";
433 PropertyTokens += iter->second;
439 if (PropertyTokens.size() > 0){
441 LocationDataTokens = PropertyTokens;
445 LocationData = DataReceived.begin()->second;
449 // Process the data from ORGANIZER.
451 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "ORGANIZER");
453 if (DataReceived.begin() != DataReceived.end()){
455 bool TokenData = false;
456 string PropertyTokens;
458 PropertyNameData = (string*)&DataReceived.begin()->first;
460 PropertyData = SplitValues(*PropertyNameData);
462 for(map<string,string>::iterator iter = PropertyData.begin();
463 iter != PropertyData.end(); iter++){
465 if (iter->first == "CN"){
467 OrganiserDataCommonName = iter->second;
469 } else if (iter->first == "DIR"){
471 OrganiserDataDirectoryEntry = iter->second;
473 } else if (iter->first == "SENT-BY"){
475 OrganiserDataSentByParam = iter->second;
477 } else if (iter->first == "LANGUAGE"){
479 OrganiserDataLanguage = iter->second;
483 if (TokenData == false){
486 PropertyTokens += ";";
489 PropertyTokens += iter->first;
490 PropertyTokens += "=";
491 PropertyTokens += iter->second;
497 if (PropertyTokens.size() > 0){
499 OrganiserDataTokens = PropertyTokens;
503 OrganiserData = DataReceived.begin()->second;
507 // Process the data from PRIORITY.
509 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "PRIORITY");
511 if (DataReceived.begin() != DataReceived.end()){
514 PriorityTokens = DataReceived.begin()->first.substr(9);
517 catch(const out_of_range &oor){
518 // Do nothing as there is no data.
522 PriorityData = stoi(DataReceived.begin()->second);
525 catch(const invalid_argument &oor){
526 PriorityTokens.clear();
531 // Process the data from SEQUENCE.
533 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "SEQUENCE");
535 if (DataReceived.begin() != DataReceived.end()){
538 SequenceTokens = DataReceived.begin()->first.substr(9);
541 catch(const out_of_range &oor){
542 // Do nothing as there is no data.
546 SequenceData = stoi(DataReceived.begin()->second);
549 catch(const invalid_argument &oor){
550 SequenceTokens.clear();
555 // Process the data from STATUS.
557 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "STATUS");
559 if (DataReceived.begin() != DataReceived.end()){
561 bool TokenData = false;
562 string PropertyTokens;
564 PropertyNameData = (string*)&DataReceived.begin()->first;
566 PropertyData = SplitValues(*PropertyNameData);
568 for(map<string,string>::iterator iter = PropertyData.begin();
569 iter != PropertyData.end(); iter++){
571 if (iter->first == "LANGUAGE"){
573 StatusLanguage = iter->second;
577 if (TokenData == false){
580 PropertyTokens += ";";
583 PropertyTokens += iter->first;
584 PropertyTokens += "=";
585 PropertyTokens += iter->second;
591 if (PropertyTokens.size() > 0){
593 StatusTokens = PropertyTokens;
597 StatusData = DataReceived.begin()->second;
601 // Process the data from SUMMARY.
603 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "SUMMARY");
605 if (DataReceived.begin() != DataReceived.end()){
607 bool TokenData = false;
608 string PropertyTokens;
610 PropertyNameData = (string*)&DataReceived.begin()->first;
612 PropertyData = SplitValues(*PropertyNameData);
614 for(map<string,string>::iterator iter = PropertyData.begin();
615 iter != PropertyData.end(); iter++){
617 if (iter->first == "ALTREP"){
619 SummaryDataAltRep = iter->second;
621 } else if (iter->first == "LANGUAGE"){
623 SummaryDataLanguage = iter->second;
627 if (TokenData == false){
630 PropertyTokens += ";";
633 PropertyTokens += iter->first;
634 PropertyTokens += "=";
635 PropertyTokens += iter->second;
641 if (PropertyTokens.size() > 0){
643 SummaryDataTokens = PropertyTokens;
647 SummaryData = DataReceived.begin()->second;
651 // Process the data from TRANSP.
653 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "TRANSP");
655 if (DataReceived.begin() != DataReceived.end()){
658 TimeTransparencyDataTokens = DataReceived.begin()->first.substr(7);
661 catch(const out_of_range &oor){
662 // Do nothing as there is no data.
665 TimeTransparencyData = DataReceived.begin()->second;
669 // Process the data from URL.
671 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "URL");
673 if (DataReceived.begin() != DataReceived.end()){
676 URLDataTokens = DataReceived.begin()->first.substr(4);
679 catch(const out_of_range &oor){
680 // Do nothing as there is no data.
683 URLData = DataReceived.begin()->second;
687 // Process the data from RECURRENCE-ID.
689 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "RECURRENCE-ID");
691 if (DataReceived.begin() != DataReceived.end()){
693 bool TokenData = false;
694 string PropertyTokens;
696 PropertyNameData = (string*)&DataReceived.begin()->first;
698 PropertyData = SplitValues(*PropertyNameData);
700 for(map<string,string>::iterator iter = PropertyData.begin();
701 iter != PropertyData.end(); iter++){
703 if (iter->first == "TZID"){
705 RecurranceIDDataTimeZoneParam = iter->second;
707 } else if (iter->first == "VALUE"){
709 RecurranceIDDataValue = iter->second;
711 } else if (iter->first == "RANGE"){
713 RecurranceIDDataRangeParam = iter->second;
717 if (TokenData == false){
720 PropertyTokens += ";";
723 PropertyTokens += iter->first;
724 PropertyTokens += "=";
725 PropertyTokens += iter->second;
731 if (PropertyTokens.size() > 0){
733 RecurranceIDDataTokens = PropertyTokens;
737 RecurranceIDData = DataReceived.begin()->second;
741 // Process the data from RRULE.
743 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "RRULE");
745 if (DataReceived.begin() != DataReceived.end()){
748 RecurranceRuleDataTokens = DataReceived.begin()->first.substr(6);
751 catch(const out_of_range &oor){
752 // Do nothing as there is no data.
755 RecurranceRuleData = DataReceived.begin()->second;
759 // Process the data from DTEND.
761 bool DateTimeEndProcessed = false;
763 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "DTEND");
765 if (DataReceived.begin() != DataReceived.end()){
767 bool TokenData = false;
768 string PropertyTokens;
770 PropertyNameData = (string*)&DataReceived.begin()->first;
772 PropertyData = SplitValues(*PropertyNameData);
774 for(map<string,string>::iterator iter = PropertyData.begin();
775 iter != PropertyData.end(); iter++){
777 if (iter->first == "VALUE"){
779 DateTimeEndDataValue = iter->second;
781 } else if (iter->first == "TZID"){
783 DateTimeEndDataTimeZoneID = iter->second;
787 if (TokenData == false){
790 PropertyTokens += ";";
793 PropertyTokens += iter->first;
794 PropertyTokens += "=";
795 PropertyTokens += iter->second;
801 if (PropertyTokens.size() > 0){
802 DateTimeEndDataTokens = PropertyTokens;
805 DateTimeEndData = DataReceived.begin()->second;
807 DateTimeEndProcessed = true;
811 if (DateTimeEndProcessed == false){
813 // Process the data from DURATION if DTEND
814 // hasn't already been processed.
816 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "DURATION");
818 if (DataReceived.begin() != DataReceived.end()){
820 DurationData = DataReceived.begin()->second;
826 // Process the data from ATTACH.
828 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, true, "ATTACH");
830 for(multimap<string,string>::iterator iter = DataReceived.begin();
831 iter != DataReceived.end();
834 AttachListEncoding.push_back("");
835 AttachListValue.push_back("");
836 AttachListFormatType.push_back("");
837 AttachListTokens.push_back("");
838 AttachList.push_back("");
840 bool TokenData = false;
841 string PropertyTokens;
843 PropertyNameData = (string*)&iter->first;
845 PropertyData = SplitValues(*PropertyNameData);
847 for(map<string,string>::iterator dataiter = PropertyData.begin();
848 dataiter != PropertyData.end(); dataiter++){
850 if (dataiter->first == "ENCODING"){
852 AttachListEncoding[ObjectSeekCount] = dataiter->second;
854 } else if (dataiter->first == "VALUE"){
856 AttachListValue[ObjectSeekCount] = dataiter->second;
858 } else if (dataiter->first == "FMTTYPE"){
860 AttachListFormatType[ObjectSeekCount] = dataiter->second;
864 if (TokenData == false){
867 PropertyTokens += ";";
870 PropertyTokens += dataiter->first;
871 PropertyTokens += "=";
872 PropertyTokens += dataiter->second;
878 if (PropertyTokens.size() > 0){
879 AttachListTokens[ObjectSeekCount] = PropertyTokens;
882 AttachList[ObjectSeekCount] = iter->second;
888 // Process the data from ATTENDEE.
890 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, true, "ATTENDEE");
894 for(multimap<string,string>::iterator iter = DataReceived.begin();
895 iter != DataReceived.end();
898 AttendeeListMember.push_back("");
899 AttendeeListDelegatedFrom.push_back("");
900 AttendeeListDelegatedTo.push_back("");
901 AttendeeListRole.push_back("");
902 AttendeeListRSVP.push_back("");
903 AttendeeListDirectoryEntry.push_back("");
904 AttendeeListSentBy.push_back("");
905 AttendeeListCommonName.push_back("");
906 AttendeeListCalendarUserType.push_back("");
907 AttendeeListParticipationStatus.push_back("");
908 AttendeeListLanguage.push_back("");
909 AttendeeListTokens.push_back("");
910 AttendeeList.push_back("");
912 bool TokenData = false;
913 string PropertyTokens;
915 PropertyNameData = (string*)&iter->first;
917 PropertyData = SplitValues(*PropertyNameData);
919 for(map<string,string>::iterator dataiter = PropertyData.begin();
920 dataiter != PropertyData.end(); dataiter++){
922 if (dataiter->first == "CUTYPE"){
924 AttendeeListCalendarUserType[ObjectSeekCount] = dataiter->second;
926 } else if (dataiter->first == "MEMBER"){
928 AttendeeListMember[ObjectSeekCount] = dataiter->second;
930 } else if (dataiter->first == "ROLE"){
932 AttendeeListRole[ObjectSeekCount] = dataiter->second;
934 } else if (dataiter->first == "PARTSTAT"){
936 AttendeeListParticipationStatus[ObjectSeekCount] = dataiter->second;
938 } else if (dataiter->first == "RSVP"){
940 AttendeeListRSVP[ObjectSeekCount] = dataiter->second;
942 } else if (dataiter->first == "DELEGATED-TO"){
944 AttendeeListDelegatedTo[ObjectSeekCount] = dataiter->second;
946 } else if (dataiter->first == "DELEGATED-FROM"){
948 AttendeeListDelegatedFrom[ObjectSeekCount] = dataiter->second;
950 } else if (dataiter->first == "SENT-BY"){
952 AttendeeListSentBy[ObjectSeekCount] = dataiter->second;
954 } else if (dataiter->first == "CN"){
956 AttendeeListCommonName[ObjectSeekCount] = dataiter->second;
958 } else if (dataiter->first == "DIR"){
960 AttendeeListDirectoryEntry[ObjectSeekCount] = dataiter->second;
962 } else if (dataiter->first == "LANGUAGE"){
964 AttendeeListLanguage[ObjectSeekCount] = dataiter->second;
968 if (TokenData == false){
971 PropertyTokens += ";";
974 PropertyTokens += dataiter->first;
975 PropertyTokens += "=";
976 PropertyTokens += dataiter->second;
982 if (PropertyTokens.size() > 0){
983 AttendeeListTokens[ObjectSeekCount] = PropertyTokens;
986 AttendeeList[ObjectSeekCount] = iter->second;
992 // Process the data from CATEGORIES.
994 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, true, "CATEGORIES");
998 for(multimap<string,string>::iterator iter = DataReceived.begin();
999 iter != DataReceived.end();
1002 CategoriesListTokens.push_back("");
1003 CategoriesListLanguage.push_back("");
1004 CategoriesList.push_back("");
1006 bool TokenData = false;
1007 string PropertyTokens;
1009 PropertyNameData = (string*)&iter->first;
1011 PropertyData = SplitValues(*PropertyNameData);
1013 for(map<string,string>::iterator dataiter = PropertyData.begin();
1014 dataiter != PropertyData.end(); dataiter++){
1016 if (dataiter->first == "LANGUAGE"){
1018 CategoriesListLanguage[ObjectSeekCount] = dataiter->second;
1022 if (TokenData == false){
1025 PropertyTokens += ";";
1028 PropertyTokens += dataiter->first;
1029 PropertyTokens += "=";
1030 PropertyTokens += dataiter->second;
1036 if (PropertyTokens.size() > 0){
1037 CategoriesListTokens[ObjectSeekCount] = PropertyTokens;
1040 CategoriesList[ObjectSeekCount] = iter->second;
1046 // Process the data from COMMENT.
1048 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, true, "COMMENT");
1050 ObjectSeekCount = 0;
1052 for(multimap<string,string>::iterator iter = DataReceived.begin();
1053 iter != DataReceived.end();
1056 CommentListTokens.push_back("");
1057 CommentListAltRep.push_back("");
1058 CommentListLanguage.push_back("");
1059 CommentList.push_back("");
1061 bool TokenData = false;
1062 string PropertyTokens;
1064 PropertyNameData = (string*)&iter->first;
1066 PropertyData = SplitValues(*PropertyNameData);
1068 for(map<string,string>::iterator dataiter = PropertyData.begin();
1069 dataiter != PropertyData.end(); dataiter++){
1071 if (dataiter->first == "ALTREP"){
1073 CommentListAltRep[ObjectSeekCount] = dataiter->second;
1075 } else if (dataiter->first == "LANGUAGE"){
1077 CommentListLanguage[ObjectSeekCount] = dataiter->second;
1081 if (TokenData == false){
1084 PropertyTokens += ";";
1087 PropertyTokens += dataiter->first;
1088 PropertyTokens += "=";
1089 PropertyTokens += dataiter->second;
1095 if (PropertyTokens.size() > 0){
1096 CommentListTokens[ObjectSeekCount] = PropertyTokens;
1099 CommentList[ObjectSeekCount] = iter->second;
1105 // Process the data from CONTACT.
1107 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, true, "CONTACT");
1109 ObjectSeekCount = 0;
1111 for(multimap<string,string>::iterator iter = DataReceived.begin();
1112 iter != DataReceived.end();
1115 ContactListTokens.push_back("");
1116 ContactListAltRep.push_back("");
1117 ContactListLanguage.push_back("");
1118 ContactList.push_back("");
1120 bool TokenData = false;
1121 string PropertyTokens;
1123 PropertyNameData = (string*)&iter->first;
1125 PropertyData = SplitValues(*PropertyNameData);
1127 for(map<string,string>::iterator dataiter = PropertyData.begin();
1128 dataiter != PropertyData.end(); dataiter++){
1130 if (dataiter->first == "ALTREP"){
1132 ContactListAltRep[ObjectSeekCount] = dataiter->second;
1134 } else if (dataiter->first == "LANGUAGE"){
1136 ContactListLanguage[ObjectSeekCount] = dataiter->second;
1140 if (TokenData == false){
1143 PropertyTokens += ";";
1146 PropertyTokens += dataiter->first;
1147 PropertyTokens += "=";
1148 PropertyTokens += dataiter->second;
1154 if (PropertyTokens.size() > 0){
1155 ContactListTokens[ObjectSeekCount] = PropertyTokens;
1158 ContactList[ObjectSeekCount] = iter->second;
1164 // Process the data from EXDATE.
1166 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, true, "EXDATE");
1168 ObjectSeekCount = 0;
1170 for(multimap<string,string>::iterator iter = DataReceived.begin();
1171 iter != DataReceived.end();
1174 ExcludeDateDataTokens.push_back("");
1175 ExcludeDateDataValue.push_back("");
1176 ExcludeDateDataTimeZoneParam.push_back("");
1177 ExcludeDateData.push_back("");
1179 bool TokenData = false;
1180 string PropertyTokens;
1182 PropertyNameData = (string*)&iter->first;
1184 PropertyData = SplitValues(*PropertyNameData);
1186 for(map<string,string>::iterator dataiter = PropertyData.begin();
1187 dataiter != PropertyData.end(); dataiter++){
1189 if (dataiter->first == "VALUE"){
1191 ExcludeDateDataValue[ObjectSeekCount] = dataiter->second;
1193 } else if (dataiter->first == "TZID"){
1195 ExcludeDateDataTimeZoneParam[ObjectSeekCount] = dataiter->second;
1199 if (TokenData == false){
1202 PropertyTokens += ";";
1205 PropertyTokens += dataiter->first;
1206 PropertyTokens += "=";
1207 PropertyTokens += dataiter->second;
1213 if (PropertyTokens.size() > 0){
1214 ExcludeDateDataTokens[ObjectSeekCount] = PropertyTokens;
1217 ExcludeDateData[ObjectSeekCount] = iter->second;
1223 // Process the data from REQUEST-STATUS.
1225 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, true, "REQUEST-STATUS");
1227 ObjectSeekCount = 0;
1229 for(multimap<string,string>::iterator iter = DataReceived.begin();
1230 iter != DataReceived.end();
1233 RequestStatusTokens.push_back("");
1234 RequestStatusLanguage.push_back("");
1235 RequestStatusData.push_back("");
1237 bool TokenData = false;
1238 string PropertyTokens;
1240 PropertyNameData = (string*)&iter->first;
1242 PropertyData = SplitValues(*PropertyNameData);
1244 for(map<string,string>::iterator dataiter = PropertyData.begin();
1245 dataiter != PropertyData.end(); dataiter++){
1247 if (dataiter->first == "LANGUAGE"){
1249 RequestStatusLanguage[ObjectSeekCount] = dataiter->second;
1253 if (TokenData == false){
1256 PropertyTokens += ";";
1259 PropertyTokens += dataiter->first;
1260 PropertyTokens += "=";
1261 PropertyTokens += dataiter->second;
1267 if (PropertyTokens.size() > 0){
1268 RequestStatusTokens[ObjectSeekCount] = PropertyTokens;
1271 RequestStatusData[ObjectSeekCount] = iter->second;
1277 // Process the data from RELATED-TO.
1279 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, true, "RELATED-TO");
1281 ObjectSeekCount = 0;
1283 for(multimap<string,string>::iterator iter = DataReceived.begin();
1284 iter != DataReceived.end();
1287 RelatedToDataTokens.push_back("");
1288 RelatedToDataRelationType.push_back("");
1289 RelatedToData.push_back("");
1291 bool TokenData = false;
1292 string PropertyTokens;
1294 PropertyNameData = (string*)&iter->first;
1296 PropertyData = SplitValues(*PropertyNameData);
1298 for(map<string,string>::iterator dataiter = PropertyData.begin();
1299 dataiter != PropertyData.end(); dataiter++){
1301 if (dataiter->first == "RELTYPE"){
1303 RelatedToDataRelationType[ObjectSeekCount] = dataiter->second;
1307 if (TokenData == false){
1310 PropertyTokens += ";";
1313 PropertyTokens += dataiter->first;
1314 PropertyTokens += "=";
1315 PropertyTokens += dataiter->second;
1321 if (PropertyTokens.size() > 0){
1322 RelatedToDataTokens[ObjectSeekCount] = PropertyTokens;
1325 RelatedToData[ObjectSeekCount] = iter->second;
1331 // Process the data from RESOURCES.
1333 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, true, "RESOURCES");
1335 ObjectSeekCount = 0;
1337 for(multimap<string,string>::iterator iter = DataReceived.begin();
1338 iter != DataReceived.end();
1341 ResourcesDataTokens.push_back("");
1342 ResourcesDataAltRep.push_back("");
1343 ResourcesDataLanguage.push_back("");
1344 ResourcesData.push_back("");
1346 bool TokenData = false;
1347 string PropertyTokens;
1349 PropertyNameData = (string*)&iter->first;
1351 PropertyData = SplitValues(*PropertyNameData);
1353 for(map<string,string>::iterator dataiter = PropertyData.begin();
1354 dataiter != PropertyData.end(); dataiter++){
1356 if (dataiter->first == "ALTREP"){
1358 ResourcesDataAltRep[ObjectSeekCount] = dataiter->second;
1360 } else if (dataiter->first == "LANGUAGE"){
1362 ResourcesDataLanguage[ObjectSeekCount] = dataiter->second;
1366 if (TokenData == false){
1369 PropertyTokens += ";";
1372 PropertyTokens += dataiter->first;
1373 PropertyTokens += "=";
1374 PropertyTokens += dataiter->second;
1380 if (PropertyTokens.size() > 0){
1381 ResourcesDataTokens[ObjectSeekCount] = PropertyTokens;
1384 ResourcesData[ObjectSeekCount] = iter->second;
1390 // Process the data from RDATE.
1392 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, true, "RDATE");
1394 ObjectSeekCount = 0;
1396 for(multimap<string,string>::iterator iter = DataReceived.begin();
1397 iter != DataReceived.end();
1400 RecurranceDateDataTokens.push_back("");
1401 RecurranceDateDataValue.push_back("");
1402 RecurranceDateDataTimeZoneParam.push_back("");
1403 RecurranceDateData.push_back("");
1405 bool TokenData = false;
1406 string PropertyTokens;
1408 PropertyNameData = (string*)&iter->first;
1410 PropertyData = SplitValues(*PropertyNameData);
1412 for(map<string,string>::iterator dataiter = PropertyData.begin();
1413 dataiter != PropertyData.end(); dataiter++){
1415 if (dataiter->first == "VALUE"){
1417 RecurranceDateDataValue[ObjectSeekCount] = dataiter->second;
1419 } else if (dataiter->first == "TZID"){
1421 RecurranceDateDataTimeZoneParam[ObjectSeekCount] = dataiter->second;
1425 if (TokenData == false){
1428 PropertyTokens += ";";
1431 PropertyTokens += dataiter->first;
1432 PropertyTokens += "=";
1433 PropertyTokens += dataiter->second;
1439 if (PropertyTokens.size() > 0){
1440 RecurranceDateDataTokens[ObjectSeekCount] = PropertyTokens;
1443 RecurranceDateData[ObjectSeekCount] = iter->second;
1449 // Process VALARM section.
1452 int AlarmObjectCount = 0;
1454 bool AlarmActionFound = false;
1456 for (vector<vector<string>>::iterator iter = EventAlarmName.begin();
1457 iter != EventAlarmName.end(); iter++){
1459 CalendarAlarmDataStruct NewAlarmData;
1461 // Process the data from ACTION.
1463 bool AlarmActionFound = false;
1464 bool AlarmTriggerFound = false;
1465 bool AlarmDurationFound = false;
1466 bool AlarmDescriptionFound = false;
1467 bool AlarmSummaryFound = false;
1469 DataReceived = ProcessTextVectors(&EventAlarmName[SeekCount],
1470 &EventAlarmData[SeekCount], false, "ACTION");
1472 if (DataReceived.begin() != DataReceived.end()){
1475 NewAlarmData.AlarmActionTokens = DataReceived.begin()->first.substr(7);
1478 catch(const out_of_range &oor){
1479 // Do nothing as there is no data.
1482 NewAlarmData.AlarmAction = DataReceived.begin()->second;
1483 AlarmActionFound = true;
1487 // Check if a value was set for AlarmAction, otherwise
1488 // process the next VALARM section.
1490 if (NewAlarmData.AlarmAction.size() < 1){
1497 // Check if AlarmAction is DISPLAY, AUDIO or EMAIL.
1498 // Process the next VALARM section if not.
1500 if (NewAlarmData.AlarmAction == "AUDIO"){
1502 NewAlarmData.AlarmType = CALENDARALARM_AUDIO;
1504 } else if (NewAlarmData.AlarmAction == "DISPLAY"){
1506 NewAlarmData.AlarmType = CALENDARALARM_DISPLAY;
1508 } else if (NewAlarmData.AlarmAction == "EMAIL"){
1510 NewAlarmData.AlarmType = CALENDARALARM_EMAIL;
1519 // Process the data from TRIGGER.
1521 DataReceived = ProcessTextVectors(&EventAlarmName[SeekCount], &EventAlarmData[SeekCount], false, "TRIGGER");
1523 if (DataReceived.begin() != DataReceived.end()){
1525 bool TokenData = false;
1526 string PropertyTokens;
1528 PropertyNameData = (string*)&DataReceived.begin()->first;
1530 PropertyData = SplitValues(*PropertyNameData);
1532 for(map<string,string>::iterator iter = PropertyData.begin();
1533 iter != PropertyData.end(); iter++){
1535 if (iter->first == "VALUE"){
1537 NewAlarmData.TriggerValue = iter->second;
1539 } else if (iter->first == "RELATED"){
1541 NewAlarmData.TriggerRelated = iter->second;
1545 if (TokenData == false){
1548 PropertyTokens += ";";
1551 PropertyTokens += iter->first;
1552 PropertyTokens += "=";
1553 PropertyTokens += iter->second;
1559 if (PropertyTokens.size() > 0){
1560 NewAlarmData.TriggerTokens = PropertyTokens;
1563 NewAlarmData.TriggerData = DataReceived.begin()->second;
1564 AlarmTriggerFound = true;
1568 // Process the data from DESCRIPTION.
1570 DataReceived = ProcessTextVectors(&EventAlarmName[SeekCount], &EventAlarmData[SeekCount], false, "DESCRIPTION");
1572 if (DataReceived.begin() != DataReceived.end() &&
1573 (NewAlarmData.AlarmType == CALENDARALARM_DISPLAY ||
1574 NewAlarmData.AlarmType == CALENDARALARM_EMAIL)){
1576 bool TokenData = false;
1577 string PropertyTokens;
1579 PropertyNameData = (string*)&DataReceived.begin()->first;
1581 PropertyData = SplitValues(*PropertyNameData);
1583 for(map<string,string>::iterator iter = PropertyData.begin();
1584 iter != PropertyData.end(); iter++){
1586 if (iter->first == "ALTREP"){
1588 NewAlarmData.DescriptionAltRep = iter->second;
1590 } else if (iter->first == "LANGUAGE"){
1592 NewAlarmData.DescriptionLanguage = iter->second;
1596 if (TokenData == false){
1599 PropertyTokens += ";";
1602 PropertyTokens += iter->first;
1603 PropertyTokens += "=";
1604 PropertyTokens += iter->second;
1610 if (PropertyTokens.size() > 0){
1611 NewAlarmData.DescriptionTokens = PropertyTokens;
1614 NewAlarmData.DescriptionData = DataReceived.begin()->second;
1615 AlarmDescriptionFound = true;
1619 // Process data from SUMMARY.
1621 DataReceived = ProcessTextVectors(&EventAlarmName[SeekCount], &EventAlarmData[SeekCount], false, "SUMMARY");
1623 if (DataReceived.begin() != DataReceived.end() &&
1624 NewAlarmData.AlarmType == CALENDARALARM_EMAIL){
1626 bool TokenData = false;
1627 string PropertyTokens;
1629 PropertyNameData = (string*)&DataReceived.begin()->first;
1631 PropertyData = SplitValues(*PropertyNameData);
1633 for(map<string,string>::iterator iter = PropertyData.begin();
1634 iter != PropertyData.end(); iter++){
1636 if (iter->first == "ALTREP"){
1638 NewAlarmData.SummaryAltRep = iter->second;
1640 } else if (iter->first == "LANGUAGE"){
1642 NewAlarmData.SummaryLanguage = iter->second;
1646 if (TokenData == false){
1649 PropertyTokens += ";";
1652 PropertyTokens += iter->first;
1653 PropertyTokens += "=";
1654 PropertyTokens += iter->second;
1660 if (PropertyTokens.size() > 0){
1661 NewAlarmData.SummaryTokens = PropertyTokens;
1664 NewAlarmData.SummaryData = DataReceived.begin()->second;
1665 AlarmSummaryFound = true;
1669 // Process data from DURATION.
1671 DataReceived = ProcessTextVectors(&EventAlarmName[SeekCount], &EventAlarmData[SeekCount], false, "DURATION");
1673 if (DataReceived.begin() != DataReceived.end()){
1676 NewAlarmData.DurationTokens = DataReceived.begin()->first.substr(9);
1679 catch(const out_of_range &oor){
1680 // Do nothing as there is no data.
1683 NewAlarmData.DurationData = DataReceived.begin()->second;
1684 AlarmDurationFound = true;
1688 // Process data from REPEAT.
1690 DataReceived = ProcessTextVectors(&EventAlarmName[SeekCount], &EventAlarmData[SeekCount], false, "REPEAT");
1692 if (DataReceived.begin() != DataReceived.end() && AlarmDurationFound == true){
1695 NewAlarmData.RepeatTokens = DataReceived.begin()->first.substr(7);
1698 catch(const out_of_range &oor){
1699 // Do nothing as there is no data.
1702 NewAlarmData.RepeatData = DataReceived.begin()->second;
1706 NewAlarmData.DurationData.clear();
1707 NewAlarmData.DurationTokens.clear();
1711 // Process data from ATTENDEE.
1713 DataReceived = ProcessTextVectors(&EventAlarmName[SeekCount], &EventAlarmData[SeekCount], true, "ATTENDEE");
1715 ObjectSeekCount = 0;
1717 for(multimap<string,string>::iterator iter = DataReceived.begin();
1718 iter != DataReceived.end();
1721 NewAlarmData.AttendeeListMember.push_back("");
1722 NewAlarmData.AttendeeListDelegatedFrom.push_back("");
1723 NewAlarmData.AttendeeListDelegatedTo.push_back("");
1724 NewAlarmData.AttendeeListRole.push_back("");
1725 NewAlarmData.AttendeeListRSVP.push_back("");
1726 NewAlarmData.AttendeeListDirectoryEntry.push_back("");
1727 NewAlarmData.AttendeeListSentBy.push_back("");
1728 NewAlarmData.AttendeeListCommonName.push_back("");
1729 NewAlarmData.AttendeeListCalendarUserType.push_back("");
1730 NewAlarmData.AttendeeListParticipationStatus.push_back("");
1731 NewAlarmData.AttendeeListLanguage.push_back("");
1732 NewAlarmData.AttendeeListTokens.push_back("");
1733 NewAlarmData.AttendeeList.push_back("");
1735 bool TokenData = false;
1736 string PropertyTokens;
1738 PropertyNameData = (string*)&iter->first;
1740 PropertyData = SplitValues(*PropertyNameData);
1742 for(map<string,string>::iterator dataiter = PropertyData.begin();
1743 dataiter != PropertyData.end(); dataiter++){
1745 if (dataiter->first == "CUTYPE"){
1747 NewAlarmData.AttendeeListCalendarUserType[ObjectSeekCount] = dataiter->second;
1749 } else if (dataiter->first == "MEMBER"){
1751 NewAlarmData.AttendeeListMember[ObjectSeekCount] = dataiter->second;
1753 } else if (dataiter->first == "ROLE"){
1755 NewAlarmData.AttendeeListRole[ObjectSeekCount] = dataiter->second;
1757 } else if (dataiter->first == "PARTSTAT"){
1759 NewAlarmData.AttendeeListParticipationStatus[ObjectSeekCount] = dataiter->second;
1761 } else if (dataiter->first == "RSVP"){
1763 NewAlarmData.AttendeeListRSVP[ObjectSeekCount] = dataiter->second;
1765 } else if (dataiter->first == "DELEGATED-TO"){
1767 NewAlarmData.AttendeeListDelegatedTo[ObjectSeekCount] = dataiter->second;
1769 } else if (dataiter->first == "DELEGATED-FROM"){
1771 NewAlarmData.AttendeeListDelegatedFrom[ObjectSeekCount] = dataiter->second;
1773 } else if (dataiter->first == "SENT-BY"){
1775 NewAlarmData.AttendeeListSentBy[ObjectSeekCount] = dataiter->second;
1777 } else if (dataiter->first == "CN"){
1779 NewAlarmData.AttendeeListCommonName[ObjectSeekCount] = dataiter->second;
1781 } else if (dataiter->first == "DIR"){
1783 NewAlarmData.AttendeeListDirectoryEntry[ObjectSeekCount] = dataiter->second;
1785 } else if (dataiter->first == "LANGUAGE"){
1787 NewAlarmData.AttendeeListLanguage[ObjectSeekCount] = dataiter->second;
1791 if (TokenData == false){
1794 PropertyTokens += ";";
1797 PropertyTokens += dataiter->first;
1798 PropertyTokens += "=";
1799 PropertyTokens += dataiter->second;
1805 if (PropertyTokens.size() > 0){
1806 NewAlarmData.AttendeeListTokens[ObjectSeekCount] = PropertyTokens;
1809 NewAlarmData.AttendeeList[ObjectSeekCount] = iter->second;
1815 // Process data from ATTACH.
1817 DataReceived = ProcessTextVectors(&EventAlarmName[SeekCount], &EventAlarmData[SeekCount], true, "ATTACH");
1819 ObjectSeekCount = 0;
1821 for(multimap<string,string>::iterator iter = DataReceived.begin();
1822 iter != DataReceived.end();
1825 NewAlarmData.AttachListEncoding.push_back("");
1826 NewAlarmData.AttachListValue.push_back("");
1827 NewAlarmData.AttachListFormatType.push_back("");
1828 NewAlarmData.AttachListTokens.push_back("");
1829 NewAlarmData.AttachList.push_back("");
1831 bool TokenData = false;
1832 string PropertyTokens;
1834 PropertyNameData = (string*)&iter->first;
1836 PropertyData = SplitValues(*PropertyNameData);
1838 for(map<string,string>::iterator dataiter = PropertyData.begin();
1839 dataiter != PropertyData.end(); dataiter++){
1841 if (dataiter->first == "ENCODING"){
1843 NewAlarmData.AttachListEncoding[ObjectSeekCount] = dataiter->second;
1845 } else if (dataiter->first == "VALUE"){
1847 NewAlarmData.AttachListValue[ObjectSeekCount] = dataiter->second;
1849 } else if (dataiter->first == "FMTTYPE"){
1851 NewAlarmData.AttachListFormatType[ObjectSeekCount] = dataiter->second;
1855 if (TokenData == false){
1858 PropertyTokens += ";";
1861 PropertyTokens += dataiter->first;
1862 PropertyTokens += "=";
1863 PropertyTokens += dataiter->second;
1869 if (PropertyTokens.size() > 0){
1870 NewAlarmData.AttachListTokens[ObjectSeekCount] = PropertyTokens;
1873 NewAlarmData.AttachList[ObjectSeekCount] = iter->second;
1879 // Process data from X-*
1881 AlarmObjectCount = 0;
1883 for(vector<string>::iterator xtokeniter = EventAlarmName[SeekCount].begin();
1884 xtokeniter != EventAlarmName[SeekCount].end(); ++xtokeniter){
1886 bool TokenData = false;
1887 string PropertyTokens;
1889 if (xtokeniter->substr(0,2) == "X-" &&
1890 xtokeniter->size() > 2){
1892 NewAlarmData.XTokensData.push_back(EventAlarmData[SeekCount][AlarmObjectCount]);
1893 NewAlarmData.XTokensDataTokens.push_back(EventAlarmName[SeekCount][AlarmObjectCount]);
1901 if (NewAlarmData.AlarmType == CALENDARALARM_AUDIO &&
1902 AlarmActionFound == true &&
1903 AlarmTriggerFound == true){
1905 CalendarAlarmData.push_back(NewAlarmData);
1907 } else if (NewAlarmData.AlarmType == CALENDARALARM_DISPLAY &&
1908 AlarmActionFound == true &&
1909 AlarmTriggerFound == true &&
1910 AlarmDescriptionFound == true){
1912 CalendarAlarmData.push_back(NewAlarmData);
1914 } else if (NewAlarmData.AlarmType == CALENDARALARM_EMAIL &&
1915 AlarmActionFound == true &&
1916 AlarmTriggerFound == true &&
1917 AlarmDescriptionFound == true &&
1918 AlarmSummaryFound == true){
1920 CalendarAlarmData.push_back(NewAlarmData);
1928 ObjectSeekCount = 0;
1930 // Process data from X-*
1932 for(vector<string>::iterator iter = ObjectName.begin();
1933 iter != ObjectName.end(); ++iter){
1935 bool TokenData = false;
1936 string PropertyTokens;
1938 if (iter->substr(0,2) == "X-" &&
1941 XTokensData.push_back(ObjectData[ObjectSeekCount]);
1942 XTokensDataTokens.push_back(ObjectName[ObjectSeekCount]);