1 // CalendarTimezone-Save.cpp - CalendarTimezone class save functions
3 // (c) 2016-2017 Xestia Software Development.
5 // This file is part of Xestia Calendar.
7 // Xestia Calendar is free software: you can redistribute it and/or modify
8 // it under the terms of the GNU General Public License as published by the
9 // Free Software Foundation, version 3 of the license.
11 // Xestia Calendar is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License along
17 // with Xestia Calendar. If not, see <http://www.gnu.org/licenses/>
19 #include "CalendarTimezone.h"
23 void CalendarTimezoneObject::SaveObjectData(string *SaveData){
26 string DataLineProcessed = "";
28 *SaveData += "BEGIN:VTIMEZONE\n";
32 if (TimeZoneData.size() > 0){
34 if (TimeZoneDataTokens.size() > 0){
37 DataLine += TimeZoneDataTokens;
46 DataLine += TimeZoneData;
49 DataLineProcessed = OutputText(&DataLine);
51 *SaveData += DataLineProcessed;
54 DataLineProcessed.clear();
58 // Process the LAST-MODIFIED value.
60 if (LastModifiedData.size() > 0){
62 if (LastModifiedTokens.size() > 0){
64 DataLine += "LAST-MODIFIED;";
65 DataLine += LastModifiedTokens;
69 DataLine += "LAST-MODIFIED";
74 DataLine += LastModifiedData;
77 DataLineProcessed = OutputText(&DataLine);
79 *SaveData += DataLineProcessed;
82 DataLineProcessed.clear();
86 // Process the TZURL value.
88 if (TimeZoneURLData.size() > 0){
90 if (TimeZoneURLTokens.size() > 0){
93 DataLine += TimeZoneURLTokens;
102 DataLine += TimeZoneURLData;
105 DataLineProcessed = OutputText(&DataLine);
107 *SaveData += DataLineProcessed;
110 DataLineProcessed.clear();
114 // Process Standard timezones.
116 if (TimezoneStandardCollection.size() > 0){
118 for (int TimezoneStandardSeek = 0; TimezoneStandardSeek < TimezoneStandardCollection.size();
119 TimezoneStandardSeek++){
121 *SaveData += "BEGIN:STANDARD\n";
123 // Process the DTSTART value.
125 if (TimezoneStandardCollection[TimezoneStandardSeek].DateTimeStartData.size() > 0){
127 if (TimezoneStandardCollection[TimezoneStandardSeek].DateTimeStartTokens.size() > 0){
129 DataLine += "DTSTART;";
130 DataLine += TimezoneStandardCollection[TimezoneStandardSeek].DateTimeStartTokens;
134 DataLine += "DTSTART";
139 DataLine += TimezoneStandardCollection[TimezoneStandardSeek].DateTimeStartData;
142 DataLineProcessed = OutputText(&DataLine);
144 *SaveData += DataLineProcessed;
147 DataLineProcessed.clear();
151 // Process the TZOFFSETFROM value.
153 if (TimezoneStandardCollection[TimezoneStandardSeek].TimeZoneOffsetFromData.size() > 0){
155 if (TimezoneStandardCollection[TimezoneStandardSeek].TimeZoneOffsetFromTokens.size() > 0){
157 DataLine += "TZOFFSETFROM;";
158 DataLine += TimezoneStandardCollection[TimezoneStandardSeek].TimeZoneOffsetFromTokens;
162 DataLine += "TZOFFSETFROM";
167 DataLine += TimezoneStandardCollection[TimezoneStandardSeek].TimeZoneOffsetFromData;
170 DataLineProcessed = OutputText(&DataLine);
172 *SaveData += DataLineProcessed;
175 DataLineProcessed.clear();
179 // Process the TZOFFSETTO value.
181 if (TimezoneStandardCollection[TimezoneStandardSeek].TimeZoneOffsetToData.size() > 0){
183 if (TimezoneStandardCollection[TimezoneStandardSeek].TimeZoneOffsetToTokens.size() > 0){
185 DataLine += "TZOFFSETTO;";
186 DataLine += TimezoneStandardCollection[TimezoneStandardSeek].TimeZoneOffsetToTokens;
190 DataLine += "TZOFFSETTO";
195 DataLine += TimezoneStandardCollection[TimezoneStandardSeek].TimeZoneOffsetToData;
198 DataLineProcessed = OutputText(&DataLine);
200 *SaveData += DataLineProcessed;
203 DataLineProcessed.clear();
207 // Process the RRULE value.
209 if (TimezoneStandardCollection[TimezoneStandardSeek].RecurranceRuleData.size() > 0){
211 if (TimezoneStandardCollection[TimezoneStandardSeek].RecurranceRuleDataTokens.size() > 0){
213 DataLine += "RRULE;";
214 DataLine += TimezoneStandardCollection[TimezoneStandardSeek].RecurranceRuleDataTokens;
223 DataLine += TimezoneStandardCollection[TimezoneStandardSeek].RecurranceRuleData;
226 DataLineProcessed = OutputText(&DataLine);
228 *SaveData += DataLineProcessed;
231 DataLineProcessed.clear();
235 // Process the COMMENT value.
237 if (TimezoneStandardCollection[TimezoneStandardSeek].CommentList.size() > 0){
239 for (int CommentListSeek = 0; CommentListSeek < TimezoneStandardCollection[TimezoneStandardSeek].CommentList.size();
242 DataLine += "COMMENT";
244 if (TimezoneStandardCollection[TimezoneStandardSeek].CommentListAltRep[CommentListSeek].size() > 0){
246 DataLine += ";ALTREP=\"";
247 DataLine += TimezoneStandardCollection[TimezoneStandardSeek].CommentListAltRep[CommentListSeek];
252 if (TimezoneStandardCollection[TimezoneStandardSeek].CommentListLanguage[CommentListSeek].size() > 0){
254 DataLine += ";LANGUAGE=";
255 DataLine += TimezoneStandardCollection[TimezoneStandardSeek].CommentListLanguage[CommentListSeek];
259 if (TimezoneStandardCollection[TimezoneStandardSeek].CommentListTokens[CommentListSeek].size() > 0){
262 DataLine += TimezoneStandardCollection[TimezoneStandardSeek].CommentListTokens[CommentListSeek];
267 DataLine += TimezoneStandardCollection[TimezoneStandardSeek].CommentList[CommentListSeek];
270 DataLineProcessed = OutputText(&DataLine);
272 *SaveData += DataLineProcessed;
275 DataLineProcessed.clear();
281 // Process the RDATE value.
283 if (TimezoneStandardCollection[TimezoneStandardSeek].RecurranceDateData.size() > 0){
285 for (int RecurranceDataSeek = 0; RecurranceDataSeek < TimezoneStandardCollection[TimezoneStandardSeek].RecurranceDateData.size();
286 RecurranceDataSeek++){
290 if (TimezoneStandardCollection[TimezoneStandardSeek].RecurranceDateDataValue[RecurranceDataSeek].size() > 0){
292 DataLine += ";VALUE=";
293 DataLine += TimezoneStandardCollection[TimezoneStandardSeek].RecurranceDateDataValue[RecurranceDataSeek];
297 if (TimezoneStandardCollection[TimezoneStandardSeek].RecurranceDateDataTimeZoneParam[RecurranceDataSeek].size() > 0){
299 DataLine += ";TZID=";
300 DataLine += TimezoneStandardCollection[TimezoneStandardSeek].RecurranceDateDataTimeZoneParam[RecurranceDataSeek];
304 if (TimezoneStandardCollection[TimezoneStandardSeek].RecurranceDateDataTokens[RecurranceDataSeek].size() > 0){
307 DataLine += TimezoneStandardCollection[TimezoneStandardSeek].RecurranceDateDataTokens[RecurranceDataSeek];
312 DataLine += TimezoneStandardCollection[TimezoneStandardSeek].RecurranceDateData[RecurranceDataSeek];
315 DataLineProcessed = OutputText(&DataLine);
317 *SaveData += DataLineProcessed;
320 DataLineProcessed.clear();
326 // Process the TZNAME value.
328 if (TimezoneStandardCollection[TimezoneStandardSeek].TimeZoneNameData.size() > 0){
330 for (int TimezoneNameSeek = 0; TimezoneNameSeek < TimezoneStandardCollection[TimezoneStandardSeek].TimeZoneNameData.size();
333 DataLine += "TZNAME";
335 if (TimezoneStandardCollection[TimezoneStandardSeek].TimeZoneNameLanguage[TimezoneNameSeek].size() > 0){
337 DataLine += ";LANGUAGE=";
338 DataLine += TimezoneStandardCollection[TimezoneStandardSeek].TimeZoneNameLanguage[TimezoneNameSeek];
342 if (TimezoneStandardCollection[TimezoneStandardSeek].TimeZoneNameTokens[TimezoneNameSeek].size() > 0){
345 DataLine += TimezoneStandardCollection[TimezoneStandardSeek].TimeZoneNameTokens[TimezoneNameSeek];
350 DataLine += TimezoneStandardCollection[TimezoneStandardSeek].TimeZoneNameData[TimezoneNameSeek];
353 DataLineProcessed = OutputText(&DataLine);
355 *SaveData += DataLineProcessed;
358 DataLineProcessed.clear();
364 // Process data from X-*
366 if (TimezoneStandardCollection[TimezoneStandardSeek].XTokensData.size() > 0){
368 for (int TimezoneXTokenSeek = 0; TimezoneXTokenSeek < TimezoneStandardCollection[TimezoneStandardSeek].XTokensData.size();
369 TimezoneXTokenSeek++){
371 DataLine += TimezoneStandardCollection[TimezoneStandardSeek].XTokensDataTokens[TimezoneXTokenSeek];
373 DataLine += TimezoneStandardCollection[TimezoneStandardSeek].XTokensData[TimezoneXTokenSeek];
376 DataLineProcessed = OutputText(&DataLine);
378 *SaveData += DataLineProcessed;
381 DataLineProcessed.clear();
387 *SaveData += "END:STANDARD\n";
393 // Process Daylight timezones.
395 if (TimezoneDaylightCollection.size() > 0){
397 for (int TimezoneDaylightSeek = 0; TimezoneDaylightSeek < TimezoneDaylightCollection.size();
398 TimezoneDaylightSeek++){
400 *SaveData += "BEGIN:DAYLIGHT\n";
402 // Process the DTSTART value.
404 if (TimezoneDaylightCollection[TimezoneDaylightSeek].DateTimeStartData.size() > 0){
406 if (TimezoneStandardCollection[TimezoneDaylightSeek].DateTimeStartTokens.size() > 0){
408 DataLine += "DTSTART;";
409 DataLine += TimezoneDaylightCollection[TimezoneDaylightSeek].DateTimeStartTokens;
413 DataLine += "DTSTART";
418 DataLine += TimezoneDaylightCollection[TimezoneDaylightSeek].DateTimeStartData;
421 DataLineProcessed = OutputText(&DataLine);
423 *SaveData += DataLineProcessed;
426 DataLineProcessed.clear();
430 // Process the TZOFFSETFROM value.
432 if (TimezoneDaylightCollection[TimezoneDaylightSeek].TimeZoneOffsetFromData.size() > 0){
434 if (TimezoneDaylightCollection[TimezoneDaylightSeek].TimeZoneOffsetFromTokens.size() > 0){
436 DataLine += "TZOFFSETFROM;";
437 DataLine += TimezoneDaylightCollection[TimezoneDaylightSeek].TimeZoneOffsetFromTokens;
441 DataLine += "TZOFFSETFROM";
446 DataLine += TimezoneDaylightCollection[TimezoneDaylightSeek].TimeZoneOffsetFromData;
449 DataLineProcessed = OutputText(&DataLine);
451 *SaveData += DataLineProcessed;
454 DataLineProcessed.clear();
458 // Process the TZOFFSETTO value.
460 if (TimezoneDaylightCollection[TimezoneDaylightSeek].TimeZoneOffsetToData.size() > 0){
462 if (TimezoneDaylightCollection[TimezoneDaylightSeek].TimeZoneOffsetToTokens.size() > 0){
464 DataLine += "TZOFFSETTO;";
465 DataLine += TimezoneDaylightCollection[TimezoneDaylightSeek].TimeZoneOffsetToTokens;
469 DataLine += "TZOFFSETTO";
474 DataLine += TimezoneDaylightCollection[TimezoneDaylightSeek].TimeZoneOffsetToData;
477 DataLineProcessed = OutputText(&DataLine);
479 *SaveData += DataLineProcessed;
482 DataLineProcessed.clear();
486 // Process the RRULE value.
488 if (TimezoneDaylightCollection[TimezoneDaylightSeek].RecurranceRuleData.size() > 0){
490 if (TimezoneDaylightCollection[TimezoneDaylightSeek].RecurranceRuleDataTokens.size() > 0){
492 DataLine += "RRULE;";
493 DataLine += TimezoneDaylightCollection[TimezoneDaylightSeek].RecurranceRuleDataTokens;
502 DataLine += TimezoneDaylightCollection[TimezoneDaylightSeek].RecurranceRuleData;
505 DataLineProcessed = OutputText(&DataLine);
507 *SaveData += DataLineProcessed;
510 DataLineProcessed.clear();
514 // Process the COMMENT value.
516 if (TimezoneDaylightCollection[TimezoneDaylightSeek].CommentList.size() > 0){
518 for (int CommentListSeek = 0; CommentListSeek < TimezoneDaylightCollection[TimezoneDaylightSeek].CommentList.size();
521 DataLine += "COMMENT";
523 if (TimezoneDaylightCollection[TimezoneDaylightSeek].CommentListAltRep[CommentListSeek].size() > 0){
525 DataLine += ";ALTREP=\"";
526 DataLine += TimezoneDaylightCollection[TimezoneDaylightSeek].CommentListAltRep[CommentListSeek];
531 if (TimezoneDaylightCollection[TimezoneDaylightSeek].CommentListLanguage[CommentListSeek].size() > 0){
533 DataLine += ";LANGUAGE=";
534 DataLine += TimezoneDaylightCollection[TimezoneDaylightSeek].CommentListLanguage[CommentListSeek];
538 if (TimezoneDaylightCollection[TimezoneDaylightSeek].CommentListTokens[CommentListSeek].size() > 0){
541 DataLine += TimezoneDaylightCollection[TimezoneDaylightSeek].CommentListTokens[CommentListSeek];
546 DataLine += TimezoneDaylightCollection[TimezoneDaylightSeek].CommentList[CommentListSeek];
549 DataLineProcessed = OutputText(&DataLine);
551 *SaveData += DataLineProcessed;
554 DataLineProcessed.clear();
560 // Process the RDATE value.
562 if (TimezoneDaylightCollection[TimezoneDaylightSeek].RecurranceDateData.size() > 0){
564 for (int RecurranceDataSeek = 0; RecurranceDataSeek < TimezoneDaylightCollection[TimezoneDaylightSeek].RecurranceDateData.size();
565 RecurranceDataSeek++){
569 if (TimezoneDaylightCollection[TimezoneDaylightSeek].RecurranceDateDataValue[RecurranceDataSeek].size() > 0){
571 DataLine += ";VALUE=";
572 DataLine += TimezoneDaylightCollection[TimezoneDaylightSeek].RecurranceDateDataValue[RecurranceDataSeek];
576 if (TimezoneDaylightCollection[TimezoneDaylightSeek].RecurranceDateDataTimeZoneParam[RecurranceDataSeek].size() > 0){
578 DataLine += ";TZID=";
579 DataLine += TimezoneDaylightCollection[TimezoneDaylightSeek].RecurranceDateDataTimeZoneParam[RecurranceDataSeek];
583 if (TimezoneDaylightCollection[TimezoneDaylightSeek].RecurranceDateDataTokens[RecurranceDataSeek].size() > 0){
586 DataLine += TimezoneDaylightCollection[TimezoneDaylightSeek].RecurranceDateDataTokens[RecurranceDataSeek];
591 DataLine += TimezoneDaylightCollection[TimezoneDaylightSeek].RecurranceDateData[RecurranceDataSeek];
594 DataLineProcessed = OutputText(&DataLine);
596 *SaveData += DataLineProcessed;
599 DataLineProcessed.clear();
605 // Process the TZNAME value.
607 if (TimezoneDaylightCollection[TimezoneDaylightSeek].TimeZoneNameData.size() > 0){
609 for (int TimezoneNameSeek = 0; TimezoneNameSeek < TimezoneDaylightCollection[TimezoneDaylightSeek].TimeZoneNameData.size();
612 DataLine += "TZNAME";
614 if (TimezoneDaylightCollection[TimezoneDaylightSeek].TimeZoneNameLanguage[TimezoneNameSeek].size() > 0){
616 DataLine += ";LANGUAGE=";
617 DataLine += TimezoneDaylightCollection[TimezoneDaylightSeek].TimeZoneNameLanguage[TimezoneNameSeek];
621 if (TimezoneDaylightCollection[TimezoneDaylightSeek].TimeZoneNameTokens[TimezoneNameSeek].size() > 0){
624 DataLine += TimezoneDaylightCollection[TimezoneDaylightSeek].TimeZoneNameTokens[TimezoneNameSeek];
629 DataLine += TimezoneDaylightCollection[TimezoneDaylightSeek].TimeZoneNameData[TimezoneNameSeek];
632 DataLineProcessed = OutputText(&DataLine);
634 *SaveData += DataLineProcessed;
637 DataLineProcessed.clear();
643 // Process data from X-*
645 if (TimezoneDaylightCollection[TimezoneDaylightSeek].XTokensData.size() > 0){
647 for (int TimezoneXTokenSeek = 0; TimezoneXTokenSeek < TimezoneDaylightCollection[TimezoneDaylightSeek].XTokensData.size();
648 TimezoneXTokenSeek++){
650 DataLine += TimezoneDaylightCollection[TimezoneDaylightSeek].XTokensDataTokens[TimezoneXTokenSeek];
652 DataLine += TimezoneDaylightCollection[TimezoneDaylightSeek].XTokensData[TimezoneXTokenSeek];
655 DataLineProcessed = OutputText(&DataLine);
657 *SaveData += DataLineProcessed;
660 DataLineProcessed.clear();
666 *SaveData += "END:DAYLIGHT\n";
672 *SaveData += "END:VTIMEZONE\n";