#include "CalendarFreeBusy.h" using namespace std; CalendarObjectValidResult CalendarFreeBusyObject::ValidObject(){ bool ValidBegin = false; bool ValidEnd = false; bool ValidDateTimeStamp = false; bool ValidUniqueID = false; bool ValidDateTimeStart = false; int SeekCount = 0; string PropertyName; // Look for BEGIN:VFREEBUSY. for (vector::iterator iter = ObjectName.begin(); iter != ObjectName.end(); iter++){ if (ObjectName[SeekCount] == "BEGIN" && ObjectData[SeekCount] == "VFREEBUSY"){ if (ValidBegin == false){ ValidBegin = true; } else { return CALENDAROBJECTVALID_INVALIDFORMAT; } } if (ObjectName[SeekCount] == "END" && ObjectData[SeekCount] == "VFREEBUSY" && 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 END:VFREEBUSY. for (vector::iterator iter = ObjectName.begin(); iter != ObjectName.end(); iter++){ if (ObjectName[SeekCount] == "END" && ObjectData[SeekCount] == "VFREEBUSY"){ if (ValidEnd == false){ ValidEnd = true; } else { return CALENDAROBJECTVALID_INVALIDFORMAT; } } SeekCount++; } // Check if the VEVENT is valid. if (ValidBegin == true && ValidEnd == true && ValidDateTimeStamp == true && ValidUniqueID == true){ return CALENDAROBJECTVALID_OK; } else { return CALENDAROBJECTVALID_INVALIDFORMAT; } } void CalendarFreeBusyObject::ProcessData(){ // Process the data. multimap DataReceived; map PropertyData; string *PropertyNameData = nullptr; int ObjectSeekCount = 0; // 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; } // Process the data from CONTACT. DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "CONTACT"); ObjectSeekCount = 0; for(multimap::iterator iter = DataReceived.begin(); iter != DataReceived.end(); ++iter){ ContactListTokens.push_back(""); ContactListAltRep.push_back(""); ContactListLanguage.push_back(""); ContactList.push_back(""); bool TokenData = false; string PropertyTokens; PropertyNameData = (string*)&iter->first; PropertyData = SplitValues(*PropertyNameData); for(map::iterator dataiter = PropertyData.begin(); dataiter != PropertyData.end(); dataiter++){ if (dataiter->first == "ALTREP"){ ContactListAltRep[ObjectSeekCount] = dataiter->second; } else if (dataiter->first == "LANGUAGE"){ ContactListLanguage[ObjectSeekCount] = dataiter->second; } else { if (TokenData == false){ TokenData = true; } else { PropertyTokens += ";"; } PropertyTokens += dataiter->first; PropertyTokens += "="; PropertyTokens += dataiter->second; } } if (PropertyTokens.size() > 0){ ContactListTokens[ObjectSeekCount] = PropertyTokens; } ContactList[ObjectSeekCount] = iter->second; ObjectSeekCount++; } // 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 DTEND. bool DateTimeEndProcessed = false; DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "DTEND"); 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"){ DateTimeEndDataValue = iter->second; } else if (iter->first == "TZID"){ DateTimeEndDataTimeZoneID = iter->second; } else { if (TokenData == false){ TokenData = true; } else { PropertyTokens += ";"; } PropertyTokens += iter->first; PropertyTokens += "="; PropertyTokens += iter->second; } } if (PropertyTokens.size() > 0){ DateTimeEndDataTokens = PropertyTokens; } DateTimeEndData = DataReceived.begin()->second; DateTimeEndProcessed = true; } }