1 #include "CalendarJournal.h"
5 CalendarObjectValidResult CalendarJournalObject::ValidObject(){
7 bool ValidBegin = false;
9 bool ValidDateTimeStamp = false;
10 bool ValidUniqueID = false;
14 // Look for BEGIN:VJOURNAL.
16 for (vector<string>::iterator iter = ObjectName.begin();
17 iter != ObjectName.end(); iter++){
19 if (ObjectName[SeekCount] == "BEGIN" &&
20 ObjectData[SeekCount] == "VJOURNAL"){
22 if (ValidBegin == false){
25 return CALENDAROBJECTVALID_INVALIDFORMAT;
30 if (ObjectName[SeekCount] == "END" &&
31 ObjectData[SeekCount] == "VJOURNAL" &&
34 return CALENDAROBJECTVALID_INVALIDFORMAT;
46 for (vector<string>::iterator iter = ObjectName.begin();
47 iter != ObjectName.end(); iter++){
50 PropertyName = ObjectName[SeekCount].substr(0,7);
53 catch(const out_of_range& oor){
57 if (PropertyName == "DTSTAMP"){
59 if (ValidDateTimeStamp == false){
60 ValidDateTimeStamp = true;
62 return CALENDAROBJECTVALID_INVALIDFORMAT;
75 for (vector<string>::iterator iter = ObjectName.begin();
76 iter != ObjectName.end(); iter++){
79 PropertyName = ObjectName[SeekCount].substr(0,3);
82 catch(const out_of_range& oor){
86 if (PropertyName == "UID"){
88 if (ValidUniqueID == false){
91 return CALENDAROBJECTVALID_INVALIDFORMAT;
102 // Look for END:VJOURNAL.
104 for (vector<string>::iterator iter = ObjectName.begin();
105 iter != ObjectName.end(); iter++){
107 if (ObjectName[SeekCount] == "END" &&
108 ObjectData[SeekCount] == "VJOURNAL"){
110 if (ValidEnd == false){
113 return CALENDAROBJECTVALID_INVALIDFORMAT;
122 // Check if the VJOURNAL is valid.
124 if (ValidBegin == true &&
126 ValidDateTimeStamp == true &&
127 ValidUniqueID == true){
129 return CALENDAROBJECTVALID_OK;
133 return CALENDAROBJECTVALID_INVALIDFORMAT;
139 void CalendarJournalObject::ProcessData(){
143 multimap<string,string> DataReceived;
144 map<string,string> PropertyData;
145 string *PropertyNameData = nullptr;
146 int ObjectSeekCount = 0;
148 // Get the Date Time Stamp (DTSTAMP).
150 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "DTSTAMP");
152 // Process the data from DTSTAMP.
154 if (DataReceived.begin() != DataReceived.end()){
157 DateTimeStampTokens = DataReceived.begin()->first.substr(8);
160 catch(const out_of_range &oor){
161 // Do nothing as there is no data.
164 DateTimeStampData = DataReceived.begin()->second;
168 // Get the Unique ID (UID).
170 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "UID");
172 // Process the data from UID.
174 if (DataReceived.begin() != DataReceived.end()){
177 UniqueIDTokens = DataReceived.begin()->first.substr(4);
180 catch(const out_of_range &oor){
181 // Do nothing as there is no data.
184 UniqueID = DataReceived.begin()->second;
188 // Process the data from CLASS.
190 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "CLASS");
192 if (DataReceived.begin() != DataReceived.end()){
195 ClassDataTokens = DataReceived.begin()->first.substr(6);
198 catch(const out_of_range &oor){
199 // Do nothing as there is no data.
202 ClassData = DataReceived.begin()->second;
206 // Get the Date Time Start value.
208 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "DTSTART");
210 // Process the data from DTSTART.
212 if (DataReceived.begin() != DataReceived.end()){
214 bool TokenData = false;
215 string PropertyTokens;
217 PropertyNameData = (string*)&DataReceived.begin()->first;
219 PropertyData = SplitValues(*PropertyNameData);
221 for(map<string,string>::iterator iter = PropertyData.begin();
222 iter != PropertyData.end(); iter++){
224 if (iter->first == "VALUE"){
226 DateTimeStartDataValue = iter->second;
228 } else if (iter->first == "TZID"){
230 DateTimeStartDataTimeZoneID = iter->second;
234 if (TokenData == false){
237 PropertyTokens += ";";
240 PropertyTokens += iter->first;
241 PropertyTokens += "=";
242 PropertyTokens += iter->second;
248 if (PropertyTokens.size() > 0){
249 DateTimeStartDataTokens = PropertyTokens;
252 DateTimeStartData = DataReceived.begin()->second;
256 // Process the data from LAST-MODIFIED.
258 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "LAST-MODIFIED");
260 if (DataReceived.begin() != DataReceived.end()){
263 LastModifiedTokens = DataReceived.begin()->first.substr(14);
266 catch(const out_of_range &oor){
267 // Do nothing as there is no data.
270 LastModifiedData = DataReceived.begin()->second;
274 // Process the data from ORGANIZER.
276 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "ORGANIZER");
278 if (DataReceived.begin() != DataReceived.end()){
280 bool TokenData = false;
281 string PropertyTokens;
283 PropertyNameData = (string*)&DataReceived.begin()->first;
285 PropertyData = SplitValues(*PropertyNameData);
287 for(map<string,string>::iterator iter = PropertyData.begin();
288 iter != PropertyData.end(); iter++){
290 if (iter->first == "CN"){
292 OrganiserDataCommonName = iter->second;
294 } else if (iter->first == "DIR"){
296 OrganiserDataDirectoryEntry = iter->second;
298 } else if (iter->first == "SENT-BY"){
300 OrganiserDataSentByParam = iter->second;
302 } else if (iter->first == "LANGUAGE"){
304 OrganiserDataLanguage = iter->second;
308 if (TokenData == false){
311 PropertyTokens += ";";
314 PropertyTokens += iter->first;
315 PropertyTokens += "=";
316 PropertyTokens += iter->second;
322 if (PropertyTokens.size() > 0){
324 OrganiserDataTokens = PropertyTokens;
328 OrganiserData = DataReceived.begin()->second;
332 // Process the data from RECURRENCE-ID.
334 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "RECURRENCE-ID");
336 if (DataReceived.begin() != DataReceived.end()){
338 bool TokenData = false;
339 string PropertyTokens;
341 PropertyNameData = (string*)&DataReceived.begin()->first;
343 PropertyData = SplitValues(*PropertyNameData);
345 for(map<string,string>::iterator iter = PropertyData.begin();
346 iter != PropertyData.end(); iter++){
348 if (iter->first == "TZID"){
350 RecurranceIDDataTimeZoneParam = iter->second;
352 } else if (iter->first == "VALUE"){
354 RecurranceIDDataValue = iter->second;
356 } else if (iter->first == "RANGE"){
358 RecurranceIDDataRangeParam = iter->second;
362 if (TokenData == false){
365 PropertyTokens += ";";
368 PropertyTokens += iter->first;
369 PropertyTokens += "=";
370 PropertyTokens += iter->second;
376 if (PropertyTokens.size() > 0){
378 RecurranceIDDataTokens = PropertyTokens;
382 RecurranceIDData = DataReceived.begin()->second;
386 // Process the data from SEQUENCE.
388 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "SEQUENCE");
390 if (DataReceived.begin() != DataReceived.end()){
393 SequenceTokens = DataReceived.begin()->first.substr(9);
396 catch(const out_of_range &oor){
397 // Do nothing as there is no data.
401 SequenceData = stoi(DataReceived.begin()->second);
404 catch(const invalid_argument &oor){
405 SequenceTokens.clear();
410 // Process the data from STATUS.
412 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "STATUS");
414 if (DataReceived.begin() != DataReceived.end()){
416 bool TokenData = false;
417 string PropertyTokens;
419 PropertyNameData = (string*)&DataReceived.begin()->first;
421 PropertyData = SplitValues(*PropertyNameData);
423 for(map<string,string>::iterator iter = PropertyData.begin();
424 iter != PropertyData.end(); iter++){
426 if (iter->first == "LANGUAGE"){
428 StatusLanguage = iter->second;
432 if (TokenData == false){
435 PropertyTokens += ";";
438 PropertyTokens += iter->first;
439 PropertyTokens += "=";
440 PropertyTokens += iter->second;
446 if (PropertyTokens.size() > 0){
448 StatusTokens = PropertyTokens;
452 StatusData = DataReceived.begin()->second;
456 // Process the data from SUMMARY.
458 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "SUMMARY");
460 if (DataReceived.begin() != DataReceived.end()){
462 bool TokenData = false;
463 string PropertyTokens;
465 PropertyNameData = (string*)&DataReceived.begin()->first;
467 PropertyData = SplitValues(*PropertyNameData);
469 for(map<string,string>::iterator iter = PropertyData.begin();
470 iter != PropertyData.end(); iter++){
472 if (iter->first == "ALTREP"){
474 SummaryDataAltRep = iter->second;
476 } else if (iter->first == "LANGUAGE"){
478 SummaryDataLanguage = iter->second;
482 if (TokenData == false){
485 PropertyTokens += ";";
488 PropertyTokens += iter->first;
489 PropertyTokens += "=";
490 PropertyTokens += iter->second;
496 if (PropertyTokens.size() > 0){
498 SummaryDataTokens = PropertyTokens;
502 SummaryData = DataReceived.begin()->second;
506 // Process the data from URL.
508 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "URL");
510 if (DataReceived.begin() != DataReceived.end()){
513 URLDataTokens = DataReceived.begin()->first.substr(4);
516 catch(const out_of_range &oor){
517 // Do nothing as there is no data.
520 URLData = DataReceived.begin()->second;
524 // Process the data from RRULE.
526 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "RRULE");
528 if (DataReceived.begin() != DataReceived.end()){
531 RecurranceRuleDataTokens = DataReceived.begin()->first.substr(6);
534 catch(const out_of_range &oor){
535 // Do nothing as there is no data.
538 RecurranceRuleData = DataReceived.begin()->second;
542 // Process the data from ATTACH.
544 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, true, "ATTACH");
546 for(multimap<string,string>::iterator iter = DataReceived.begin();
547 iter != DataReceived.end();
550 AttachListEncoding.push_back("");
551 AttachListValue.push_back("");
552 AttachListFormatType.push_back("");
553 AttachListTokens.push_back("");
554 AttachList.push_back("");
556 bool TokenData = false;
557 string PropertyTokens;
559 PropertyNameData = (string*)&iter->first;
561 PropertyData = SplitValues(*PropertyNameData);
563 for(map<string,string>::iterator dataiter = PropertyData.begin();
564 dataiter != PropertyData.end(); dataiter++){
566 if (dataiter->first == "ENCODING"){
568 AttachListEncoding[ObjectSeekCount] = dataiter->second;
570 } else if (dataiter->first == "VALUE"){
572 AttachListValue[ObjectSeekCount] = dataiter->second;
574 } else if (dataiter->first == "FMTTYPE"){
576 AttachListFormatType[ObjectSeekCount] = dataiter->second;
580 if (TokenData == false){
583 PropertyTokens += ";";
586 PropertyTokens += dataiter->first;
587 PropertyTokens += "=";
588 PropertyTokens += dataiter->second;
594 if (PropertyTokens.size() > 0){
595 AttachListTokens[ObjectSeekCount] = PropertyTokens;
598 AttachList[ObjectSeekCount] = iter->second;
604 // Process the data from ATTENDEE.
606 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, true, "ATTENDEE");
610 for(multimap<string,string>::iterator iter = DataReceived.begin();
611 iter != DataReceived.end();
614 AttendeeListMember.push_back("");
615 AttendeeListDelegatedFrom.push_back("");
616 AttendeeListDelegatedTo.push_back("");
617 AttendeeListRole.push_back("");
618 AttendeeListRSVP.push_back("");
619 AttendeeListDirectoryEntry.push_back("");
620 AttendeeListSentBy.push_back("");
621 AttendeeListCommonName.push_back("");
622 AttendeeListCalendarUserType.push_back("");
623 AttendeeListParticipationStatus.push_back("");
624 AttendeeListLanguage.push_back("");
625 AttendeeListTokens.push_back("");
626 AttendeeList.push_back("");
628 bool TokenData = false;
629 string PropertyTokens;
631 PropertyNameData = (string*)&iter->first;
633 PropertyData = SplitValues(*PropertyNameData);
635 for(map<string,string>::iterator dataiter = PropertyData.begin();
636 dataiter != PropertyData.end(); dataiter++){
638 if (dataiter->first == "CUTYPE"){
640 AttendeeListCalendarUserType[ObjectSeekCount] = dataiter->second;
642 } else if (dataiter->first == "MEMBER"){
644 AttendeeListMember[ObjectSeekCount] = dataiter->second;
646 } else if (dataiter->first == "ROLE"){
648 AttendeeListRole[ObjectSeekCount] = dataiter->second;
650 } else if (dataiter->first == "PARTSTAT"){
652 AttendeeListParticipationStatus[ObjectSeekCount] = dataiter->second;
654 } else if (dataiter->first == "RSVP"){
656 AttendeeListRSVP[ObjectSeekCount] = dataiter->second;
658 } else if (dataiter->first == "DELEGATED-TO"){
660 AttendeeListDelegatedTo[ObjectSeekCount] = dataiter->second;
662 } else if (dataiter->first == "DELEGATED-FROM"){
664 AttendeeListDelegatedFrom[ObjectSeekCount] = dataiter->second;
666 } else if (dataiter->first == "SENT-BY"){
668 AttendeeListSentBy[ObjectSeekCount] = dataiter->second;
670 } else if (dataiter->first == "CN"){
672 AttendeeListCommonName[ObjectSeekCount] = dataiter->second;
674 } else if (dataiter->first == "DIR"){
676 AttendeeListDirectoryEntry[ObjectSeekCount] = dataiter->second;
678 } else if (dataiter->first == "LANGUAGE"){
680 AttendeeListLanguage[ObjectSeekCount] = dataiter->second;
684 if (TokenData == false){
687 PropertyTokens += ";";
690 PropertyTokens += dataiter->first;
691 PropertyTokens += "=";
692 PropertyTokens += dataiter->second;
698 if (PropertyTokens.size() > 0){
699 AttendeeListTokens[ObjectSeekCount] = PropertyTokens;
702 AttendeeList[ObjectSeekCount] = iter->second;
708 // Process the data from CATEGORIES.
710 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, true, "CATEGORIES");
714 for(multimap<string,string>::iterator iter = DataReceived.begin();
715 iter != DataReceived.end();
718 CategoriesListTokens.push_back("");
719 CategoriesListLanguage.push_back("");
720 CategoriesList.push_back("");
722 bool TokenData = false;
723 string PropertyTokens;
725 PropertyNameData = (string*)&iter->first;
727 PropertyData = SplitValues(*PropertyNameData);
729 for(map<string,string>::iterator dataiter = PropertyData.begin();
730 dataiter != PropertyData.end(); dataiter++){
732 if (dataiter->first == "LANGUAGE"){
734 CategoriesListLanguage[ObjectSeekCount] = dataiter->second;
738 if (TokenData == false){
741 PropertyTokens += ";";
744 PropertyTokens += dataiter->first;
745 PropertyTokens += "=";
746 PropertyTokens += dataiter->second;
752 if (PropertyTokens.size() > 0){
753 CategoriesListTokens[ObjectSeekCount] = PropertyTokens;
756 CategoriesList[ObjectSeekCount] = iter->second;
762 // Process the data from COMMENT.
764 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, true, "COMMENT");
768 for(multimap<string,string>::iterator iter = DataReceived.begin();
769 iter != DataReceived.end();
772 CommentListTokens.push_back("");
773 CommentListAltRep.push_back("");
774 CommentListLanguage.push_back("");
775 CommentList.push_back("");
777 bool TokenData = false;
778 string PropertyTokens;
780 PropertyNameData = (string*)&iter->first;
782 PropertyData = SplitValues(*PropertyNameData);
784 for(map<string,string>::iterator dataiter = PropertyData.begin();
785 dataiter != PropertyData.end(); dataiter++){
787 if (dataiter->first == "ALTREP"){
789 CommentListAltRep[ObjectSeekCount] = dataiter->second;
791 } else if (dataiter->first == "LANGUAGE"){
793 CommentListLanguage[ObjectSeekCount] = dataiter->second;
797 if (TokenData == false){
800 PropertyTokens += ";";
803 PropertyTokens += dataiter->first;
804 PropertyTokens += "=";
805 PropertyTokens += dataiter->second;
811 if (PropertyTokens.size() > 0){
812 CommentListTokens[ObjectSeekCount] = PropertyTokens;
815 CommentList[ObjectSeekCount] = iter->second;
821 // Process the data from CONTACT.
823 DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, true, "CONTACT");
827 for(multimap<string,string>::iterator iter = DataReceived.begin();
828 iter != DataReceived.end();
831 ContactListTokens.push_back("");
832 ContactListAltRep.push_back("");
833 ContactListLanguage.push_back("");
834 ContactList.push_back("");
836 bool TokenData = false;
837 string PropertyTokens;
839 PropertyNameData = (string*)&iter->first;
841 PropertyData = SplitValues(*PropertyNameData);
843 for(map<string,string>::iterator dataiter = PropertyData.begin();
844 dataiter != PropertyData.end(); dataiter++){
846 if (dataiter->first == "ALTREP"){
848 ContactListAltRep[ObjectSeekCount] = dataiter->second;
850 } else if (dataiter->first == "LANGUAGE"){
852 ContactListLanguage[ObjectSeekCount] = dataiter->second;
856 if (TokenData == false){
859 PropertyTokens += ";";
862 PropertyTokens += dataiter->first;
863 PropertyTokens += "=";
864 PropertyTokens += dataiter->second;
870 if (PropertyTokens.size() > 0){
871 ContactListTokens[ObjectSeekCount] = PropertyTokens;
874 ContactList[ObjectSeekCount] = iter->second;