#include "CalendarEvent.h" using namespace std; CalendarObjectValidResult CalendarEventObject::ValidObject(){ bool ValidBegin = false; bool ValidEnd = false; bool ValidDateTimeStamp = false; bool ValidUniqueID = false; bool ValidDateTimeStart = false; int SeekCount = 0; string PropertyName; // Look for BEGIN:VEVENT. for (vector::iterator iter = ObjectName.begin(); iter != ObjectName.end(); iter++){ if (ObjectName[SeekCount] == "BEGIN" && ObjectData[SeekCount] == "VEVENT"){ if (ValidBegin == false){ ValidBegin = true; } else { return CALENDAROBJECTVALID_INVALIDFORMAT; } } if (ObjectName[SeekCount] == "END" && ObjectData[SeekCount] == "VEVENT" && ValidBegin == false){ return CALENDAROBJECTVALID_INVALIDFORMAT; } SeekCount++; } SeekCount = 0; // Look for DTSTAMP. for (vector::iterator iter = ObjectName.begin(); iter != ObjectName.end(); iter++){ try{ PropertyName = ObjectName[SeekCount].substr(0,7); } catch(const out_of_range& oor){ continue; } if (PropertyName == "DTSTAMP"){ if (ValidDateTimeStamp == false){ ValidDateTimeStamp = true; } else { return CALENDAROBJECTVALID_INVALIDFORMAT; } } SeekCount++; } SeekCount = 0; // Look for UID. for (vector::iterator iter = ObjectName.begin(); iter != ObjectName.end(); iter++){ try{ PropertyName = ObjectName[SeekCount].substr(0,3); } catch(const out_of_range& oor){ continue; } if (PropertyName == "UID"){ if (ValidUniqueID == false){ ValidUniqueID = true; } else { return CALENDAROBJECTVALID_INVALIDFORMAT; } } SeekCount++; } SeekCount = 0; // Look for DTSTART if nothing is set for METHOD.. if (MethodData.size() == 0){ for (vector::iterator iter = ObjectName.begin(); iter != ObjectName.end(); iter++){ try{ PropertyName = ObjectName[SeekCount].substr(0,7); } catch(const out_of_range& oor){ continue; } if (PropertyName == "DTSTART"){ if (ValidDateTimeStart == false){ ValidDateTimeStart = true; } else { return CALENDAROBJECTVALID_INVALIDFORMAT; } } SeekCount++; } } else { ValidDateTimeStart = true; } SeekCount = 0; // Look for END:VEVENT. for (vector::iterator iter = ObjectName.begin(); iter != ObjectName.end(); iter++){ if (ObjectName[SeekCount] == "END" && ObjectData[SeekCount] == "VEVENT"){ if (ValidEnd == false){ ValidEnd = true; } else { return CALENDAROBJECTVALID_INVALIDFORMAT; } } SeekCount++; } // Check if the VEVENT is valid. if (ValidBegin == true && ValidEnd == true && ValidDateTimeStamp == true && ValidDateTimeStart == true && ValidUniqueID == true){ return CALENDAROBJECTVALID_OK; } else { return CALENDAROBJECTVALID_INVALIDFORMAT; } } void CalendarEventObject::ProcessData(){ // Process the data. multimap DataReceived; map PropertyData; string *PropertyNameData = nullptr; // Get the Date Time Stamp (DTSTAMP). DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "DTSTAMP"); // Process the data from DTSTAMP. if (DataReceived.begin() != DataReceived.end()){ try { DateTimeStampTokens = DataReceived.begin()->first.substr(8); } catch(const out_of_range &oor){ // Do nothing as there is no data. } DateTimeStampData = DataReceived.begin()->second; } // Get the Unique ID (UID). DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "UID"); // Process the data from UID. if (DataReceived.begin() != DataReceived.end()){ try { UniqueIDTokens = DataReceived.begin()->first.substr(4); } catch(const out_of_range &oor){ // Do nothing as there is no data. } UniqueID = DataReceived.begin()->second; } // Get the Date Time Start value. DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "DTSTART"); // Process the data from DTSTART. if (DataReceived.begin() != DataReceived.end()){ bool TokenData = false; string PropertyTokens; PropertyNameData = (string*)&DataReceived.begin()->first; PropertyData = SplitValues(*PropertyNameData); for(map::iterator iter = PropertyData.begin(); iter != PropertyData.end(); iter++){ if (iter->first == "VALUE"){ DateTimeStartDataValue = iter->second; } else if (iter->first == "TZID"){ DateTimeStartDataTimeZoneID = iter->second; } else { if (TokenData == false){ TokenData = true; } else { PropertyTokens += ";"; } PropertyTokens += iter->first; PropertyTokens += "="; PropertyTokens += iter->second; } } if (PropertyTokens.size() > 0){ DateTimeStartDataTokens = PropertyTokens; } DateTimeStartData = DataReceived.begin()->second; } // Process the data from CLASS. DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "CLASS"); if (DataReceived.begin() != DataReceived.end()){ try { ClassDataTokens = DataReceived.begin()->first.substr(6); } catch(const out_of_range &oor){ // Do nothing as there is no data. } ClassData = DataReceived.begin()->second; } // Process the data from CREATED. DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "CREATED"); if (DataReceived.begin() != DataReceived.end()){ try { DateTimeCreatedTokens = DataReceived.begin()->first.substr(8); } catch(const out_of_range &oor){ // Do nothing as there is no data. } DateTimeCreatedData = DataReceived.begin()->second; } // Process the data from DESCRIPTION. DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "DESCRIPTION"); if (DataReceived.begin() != DataReceived.end()){ bool TokenData = false; string PropertyTokens; PropertyNameData = (string*)&DataReceived.begin()->first; PropertyData = SplitValues(*PropertyNameData); for(map::iterator iter = PropertyData.begin(); iter != PropertyData.end(); iter++){ if (iter->first == "ALTREP"){ DescriptionListAltRep.clear(); DescriptionListAltRep.push_back(iter->second); } else if (iter->first == "LANGUAGE"){ DescriptionListLanguage.clear(); DescriptionListLanguage.push_back(iter->second); } else { if (TokenData == false){ TokenData = true; } else { PropertyTokens += ";"; } PropertyTokens += iter->first; PropertyTokens += "="; PropertyTokens += iter->second; } } if (PropertyTokens.size() > 0){ DescriptionListTokens.clear(); DescriptionListTokens.push_back(PropertyTokens); } DescriptionList.clear(); DescriptionList.push_back(DataReceived.begin()->second); } // Process the data from GEO. DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "GEO"); if (DataReceived.begin() != DataReceived.end()){ try { GeographicTokens = DataReceived.begin()->first.substr(4); } catch(const out_of_range &oor){ // Do nothing as there is no data. } GeographicData = DataReceived.begin()->second; } // Process the data from LAST-MODIFIED. DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "LAST-MODIFIED"); if (DataReceived.begin() != DataReceived.end()){ try { LastModifiedTokens = DataReceived.begin()->first.substr(14); } catch(const out_of_range &oor){ // Do nothing as there is no data. } LastModifiedData = DataReceived.begin()->second; } // Process the data from LOCATION. DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "LOCATION"); if (DataReceived.begin() != DataReceived.end()){ bool TokenData = false; string PropertyTokens; PropertyNameData = (string*)&DataReceived.begin()->first; PropertyData = SplitValues(*PropertyNameData); for(map::iterator iter = PropertyData.begin(); iter != PropertyData.end(); iter++){ if (iter->first == "ALTREP"){ LocationDataAltRep = iter->second; } else if (iter->first == "LANGUAGE"){ LocationDataLanguage = iter->second; } else { if (TokenData == false){ TokenData = true; } else { PropertyTokens += ";"; } PropertyTokens += iter->first; PropertyTokens += "="; PropertyTokens += iter->second; } } if (PropertyTokens.size() > 0){ LocationDataTokens = PropertyTokens; } LocationData = DataReceived.begin()->second; } // Process the data from ORGANIZER. DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "ORGANIZER"); if (DataReceived.begin() != DataReceived.end()){ bool TokenData = false; string PropertyTokens; PropertyNameData = (string*)&DataReceived.begin()->first; PropertyData = SplitValues(*PropertyNameData); for(map::iterator iter = PropertyData.begin(); iter != PropertyData.end(); iter++){ if (iter->first == "CN"){ OrganiserDataCommonName = iter->second; } else if (iter->first == "DIR"){ OrganiserDataDirectoryEntry = iter->second; } else if (iter->first == "SENT-BY"){ OrganiserDataSentByParam = iter->second; } else if (iter->first == "LANGUAGE"){ OrganiserDataLanguage = iter->second; } else { if (TokenData == false){ TokenData = true; } else { PropertyTokens += ";"; } PropertyTokens += iter->first; PropertyTokens += "="; PropertyTokens += iter->second; } } if (PropertyTokens.size() > 0){ OrganiserDataTokens = PropertyTokens; } OrganiserData = DataReceived.begin()->second; } // Process the data from PRIORITY. DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "PRIORITY"); if (DataReceived.begin() != DataReceived.end()){ try { PriorityTokens = DataReceived.begin()->first.substr(9); } catch(const out_of_range &oor){ // Do nothing as there is no data. } try { PriorityData = stoi(DataReceived.begin()->second); } catch(const invalid_argument &oor){ PriorityTokens.clear(); } } // Process the data from SEQUENCE. DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "SEQUENCE"); if (DataReceived.begin() != DataReceived.end()){ try { SequenceTokens = DataReceived.begin()->first.substr(9); } catch(const out_of_range &oor){ // Do nothing as there is no data. } try { SequenceData = stoi(DataReceived.begin()->second); } catch(const invalid_argument &oor){ SequenceTokens.clear(); } } // Process the data from STATUS. DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "STATUS"); if (DataReceived.begin() != DataReceived.end()){ bool TokenData = false; string PropertyTokens; PropertyNameData = (string*)&DataReceived.begin()->first; PropertyData = SplitValues(*PropertyNameData); for(map::iterator iter = PropertyData.begin(); iter != PropertyData.end(); iter++){ if (iter->first == "LANGUAGE"){ RequestStatusLanguage = iter->second; } else { if (TokenData == false){ TokenData = true; } else { PropertyTokens += ";"; } PropertyTokens += iter->first; PropertyTokens += "="; PropertyTokens += iter->second; } } if (PropertyTokens.size() > 0){ RequestStatusTokens = PropertyTokens; } RequestStatusData = DataReceived.begin()->second; } // Process the data from SUMMARY. DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "SUMMARY"); if (DataReceived.begin() != DataReceived.end()){ bool TokenData = false; string PropertyTokens; PropertyNameData = (string*)&DataReceived.begin()->first; PropertyData = SplitValues(*PropertyNameData); for(map::iterator iter = PropertyData.begin(); iter != PropertyData.end(); iter++){ if (iter->first == "ALTREP"){ SummaryDataAltRep = iter->second; } else if (iter->first == "LANGUAGE"){ SummaryDataLanguage = iter->second; } else { if (TokenData == false){ TokenData = true; } else { PropertyTokens += ";"; } PropertyTokens += iter->first; PropertyTokens += "="; PropertyTokens += iter->second; } } if (PropertyTokens.size() > 0){ SummaryDataTokens = PropertyTokens; } SummaryData = DataReceived.begin()->second; } // Process the data from TRANSP. DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "TRANSP"); if (DataReceived.begin() != DataReceived.end()){ try { TimeTransparencyDataTokens = DataReceived.begin()->first.substr(14); } catch(const out_of_range &oor){ // Do nothing as there is no data. } TimeTransparencyData = DataReceived.begin()->second; } }