X-Git-Url: http://Server1/repobrowser/?a=blobdiff_plain;f=source%2Fobjects%2Fcalendarobject%2FCalendarObject.cpp;h=5a15e1d593c58c1530c75a28e521b2f9a1d1bbde;hb=cba151c4b833a26c63984769f921bab5e755decd;hp=d3c6f14cf7385939b91f79b2d51e7887a47ce5fe;hpb=e9da688490068209f433022a0d7b0c182ab7569e;p=xestiacalendar%2F.git diff --git a/source/objects/calendarobject/CalendarObject.cpp b/source/objects/calendarobject/CalendarObject.cpp index d3c6f14..5a15e1d 100644 --- a/source/objects/calendarobject/CalendarObject.cpp +++ b/source/objects/calendarobject/CalendarObject.cpp @@ -1,3 +1,21 @@ +// CalendarObject.cpp - CalendarObject class functions +// +// (c) 2016-2017 Xestia Software Development. +// +// This file is part of Xestia Calendar. +// +// Xestia Calendar is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by the +// Free Software Foundation, version 3 of the license. +// +// Xestia Calendar is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with Xestia Calendar. If not, see + #include "CalendarObject.h" #include "../../common/file.h" @@ -52,6 +70,7 @@ CalendarObjectLoadResult CalendarObject::LoadString(std::string *LoadStringData) bool NewLine = false; bool SkipMode = false; bool ColonFound = false; + bool QuoteMode = false; char BufferChar = 0; int StringDataSize = LoadStringData->size(); int SeekCount = 0; @@ -73,6 +92,22 @@ CalendarObjectLoadResult CalendarObject::LoadString(std::string *LoadStringData) NewLine = false; + } else if ((*LoadStringData)[SeekCount] == '\"'){ + + if (QuoteMode == false){ + QuoteMode = true; + } else { + QuoteMode = false; + } + + BufferChar = (*LoadStringData)[SeekCount]; + + if (ColonFound == false){ + PropertyName += BufferChar; + } else { + PropertyValue += BufferChar; + } + } else if (NewLine == true){ // Character is on a new line but not a space or @@ -81,8 +116,8 @@ CalendarObjectLoadResult CalendarObject::LoadString(std::string *LoadStringData) // the lists. if (ColonFound == true){ - ObjectName.insert(ObjectName.end(), PropertyName); - ObjectData.insert(ObjectData.end(), PropertyValue); + ObjectName.push_back(PropertyName); + ObjectData.push_back(PropertyValue); } ColonFound = false; @@ -100,12 +135,19 @@ CalendarObjectLoadResult CalendarObject::LoadString(std::string *LoadStringData) NewLine = true; - } else if ((*LoadStringData)[SeekCount] == ':'){ + } else if ((*LoadStringData)[SeekCount] == ':' && + QuoteMode == false){ // Character is the colon. Set the colon // found boolen to true. - ColonFound = true; + BufferChar = (*LoadStringData)[SeekCount]; + + if (ColonFound == true){ + PropertyValue += BufferChar; + } else { + ColonFound = true; + } } else { @@ -133,8 +175,8 @@ CalendarObjectLoadResult CalendarObject::LoadString(std::string *LoadStringData) PropertyName.size() > 0 && PropertyValue.size() > 0){ - ObjectName.insert(ObjectName.end(), PropertyName); - ObjectData.insert(ObjectData.end(), PropertyValue); + ObjectName.push_back(PropertyName); + ObjectData.push_back(PropertyValue); } @@ -165,9 +207,13 @@ CalendarObjectLoadResult CalendarObject::LoadString(std::string *LoadStringData) CalendarObjectValidResult CalendarObject::ValidBaseObject(){ bool ValidBegin = false; + bool ValidAlarmBegin = false; bool ValidVersion = false; bool ValidEnd = false; int SeekCount = 0; + vector DeleteLines; + vector AlarmObjectName; + vector AlarmObjectData; // Check that the first line contains BEGIN:VCALENDAR // and it only appears once. @@ -192,6 +238,58 @@ CalendarObjectValidResult CalendarObject::ValidBaseObject(){ return CALENDAROBJECTVALID_INVALIDFORMAT; + } else if (ObjectName[SeekCount] == "END" && + ObjectData[SeekCount] == "VALARM" && + ValidAlarmBegin == false){ + + return CALENDAROBJECTVALID_INVALIDFORMAT; + + } else if (ObjectName[SeekCount] == "END" && + ObjectData[SeekCount] == "VCALENDAR" && + ValidAlarmBegin == true){ + + return CALENDAROBJECTVALID_INVALIDFORMAT; + + } + + // Look for any VALARM sections. + + if (ValidAlarmBegin == true){ + + AlarmObjectName.push_back(ObjectName[SeekCount]); + AlarmObjectData.push_back(ObjectData[SeekCount]); + DeleteLines.push_back(SeekCount); + + } + + if (ObjectName[SeekCount] == "END" && + ObjectData[SeekCount] == "VALARM" && + ValidAlarmBegin == true){ + + EventAlarmName.push_back(AlarmObjectName); + EventAlarmData.push_back(AlarmObjectData); + + AlarmObjectName.clear(); + AlarmObjectData.clear(); + + ValidAlarmBegin = false; + + } + + if (ObjectName[SeekCount] == "BEGIN" && + ObjectData[SeekCount] == "VALARM" && + ValidBegin == true){ + + if (ValidAlarmBegin == false){ + ValidAlarmBegin = true; + } else { + return CALENDAROBJECTVALID_INVALIDFORMAT; + } + + AlarmObjectName.push_back(ObjectName[SeekCount]); + AlarmObjectData.push_back(ObjectData[SeekCount]); + DeleteLines.push_back(SeekCount); + } SeekCount++; @@ -244,10 +342,22 @@ CalendarObjectValidResult CalendarObject::ValidBaseObject(){ } + // Remove lines that aren't needed as they have + // been moved to the EventAlarm section. + + for (vector::reverse_iterator deliter = DeleteLines.rbegin(); + deliter != DeleteLines.rend(); deliter++){ + + ObjectName.erase(ObjectName.begin()+(*deliter)); + ObjectData.erase(ObjectData.begin()+(*deliter)); + + } + if (ValidBegin == true && ValidEnd == true && - ValidVersion == true){ - + ValidVersion == true && + ValidAlarmBegin == false){ + return CALENDAROBJECTVALID_OK; } else { @@ -282,7 +392,7 @@ void CalendarObject::ProcessBaseData(){ } - // Get the method (CALSCALE). + // Get the calendar scale (CALSCALE). DataReceived = ProcessTextVectors(&ObjectName, &ObjectData, false, "CALSCALE");