1 #include "CalendarObject.h"
2 #include "../../common/file.h"
6 CalendarObjectLoadResult CalendarObject::LoadFile(std::string LoadFilename){
8 // Check if the file exists and return
9 // CALENDAROBJECTLOAD_CANNOTOPEN if not.
11 if (!FileExists(LoadFilename)){
12 return CALENDAROBJECTLOAD_MISSING;
16 string ReceivedStringData = "";
18 FileStream.open(LoadFilename, ifstream::in);
20 if (FileStream.rdstate() & ifstream::failbit){
21 return CALENDAROBJECTLOAD_CANNOTOPEN;
24 if (FileStream.rdstate() & ifstream::badbit){
25 return CALENDAROBJECTLOAD_CANNOTOPEN;
28 // Read the data into a string.
30 char *BufferRead = new char[256];
32 while (!FileStream.eof()){
34 FileStream.getline(BufferRead, 256);
35 ReceivedStringData.append(BufferRead);
36 ReceivedStringData.append("\n");
42 CalendarObjectLoadResult StringProcResult = CALENDAROBJECTLOAD_UNITTESTFAIL;
44 StringProcResult = LoadString(&ReceivedStringData);
46 return StringProcResult;
50 CalendarObjectLoadResult CalendarObject::LoadString(std::string *LoadStringData){
53 bool SkipMode = false;
54 bool ColonFound = false;
56 int StringDataSize = LoadStringData->size();
61 while (SeekCount < StringDataSize){
63 // Check if character is blank or a tab and is the first character
66 if (((*LoadStringData)[SeekCount] == ' ' ||
67 (*LoadStringData)[SeekCount] == '\t')
70 // Character is on a new line and it is a space or
71 // tab. Ignore this character as it is not part
76 } else if (NewLine == true){
78 // Character is on a new line but not a space or
79 // tab so check if the colon has been found
80 // and add the property name and value to
83 if (ColonFound == true){
84 ObjectName.insert(ObjectName.end(), PropertyName);
85 ObjectData.insert(ObjectData.end(), PropertyValue);
91 PropertyValue.clear();
93 BufferChar = (*LoadStringData)[SeekCount];
94 PropertyName += BufferChar;
96 } else if ((*LoadStringData)[SeekCount] == '\n'){
98 // Character is the new line character so mark
99 // the NewLine boolean as true.
103 } else if ((*LoadStringData)[SeekCount] == ':'){
105 // Character is the colon. Set the colon
106 // found boolen to true.
112 // Character is not part of a new line and is not
113 // the new line character itself.
115 BufferChar = (*LoadStringData)[SeekCount];
117 if (ColonFound == false){
118 PropertyName += BufferChar;
120 PropertyValue += BufferChar;
129 // Finish off processing any data that wasn't processed
130 // when the end of the string was reached.
132 if (ColonFound == true &&
133 PropertyName.size() > 0 &&
134 PropertyValue.size() > 0){
136 ObjectName.insert(ObjectName.end(), PropertyName);
137 ObjectData.insert(ObjectData.end(), PropertyValue);
141 // Check that the object contains valid data.
143 CalendarObjectLoadResult StringProcResult = CALENDAROBJECTLOAD_UNITTESTFAIL;
144 CalendarObjectValidResult BaseDataResult = ValidBaseObject();
145 CalendarObjectValidResult EventDataResult = ValidObject();
147 if (BaseDataResult != CALENDAROBJECTVALID_OK ||
148 EventDataResult != CALENDAROBJECTVALID_OK){
150 StringProcResult = CALENDAROBJECTLOAD_INVALIDFORMAT;
154 StringProcResult = CALENDAROBJECTLOAD_OK;
158 return StringProcResult;
162 CalendarObjectValidResult CalendarObject::ValidBaseObject(){
164 bool ValidBegin = false;
165 bool ValidVersion = false;
166 bool ValidEnd = false;
169 // Check that the first line contains BEGIN:VCALENDAR
170 // and it only appears once.
172 for (vector<string>::iterator iter = ObjectName.begin();
173 iter != ObjectName.end(); iter++){
175 if (ObjectName[SeekCount] == "BEGIN" &&
176 ObjectData[SeekCount] == "VCALENDAR"){
178 if (ValidBegin == false){
181 return CALENDAROBJECTVALID_INVALIDFORMAT;
186 if (ObjectName[SeekCount] == "END" &&
187 ObjectData[SeekCount] == "VCALENDAR" &&
188 ValidBegin == false){
190 return CALENDAROBJECTVALID_INVALIDFORMAT;
200 // Check that the last line contains END:VCALENDAR
201 // and it only appears once.
203 for (vector<string>::iterator iter = ObjectName.begin();
204 iter != ObjectName.end(); iter++){
206 if (ObjectName[SeekCount] == "END" &&
207 ObjectData[SeekCount] == "VCALENDAR"){
209 if (ValidEnd == false){
212 return CALENDAROBJECTVALID_INVALIDFORMAT;
223 // Check that the VERSION value contains 2.0 and that
224 // it only appears once.
226 for (vector<string>::iterator iter = ObjectName.begin();
227 iter != ObjectName.end(); iter++){
229 if (ObjectName[SeekCount] == "VERSION" &&
230 ObjectData[SeekCount] == "2.0"){
232 if (ValidVersion == false){
235 return CALENDAROBJECTVALID_INVALIDFORMAT;
244 if (ValidBegin == true &&
246 ValidVersion == true){
248 return CALENDAROBJECTVALID_OK;
252 return CALENDAROBJECTVALID_INVALIDFORMAT;