4 * Copyright (c) 2012 - 2013 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
22 #include "calendar_vcalendar.h"
24 #include "cal_internal.h"
25 #include "cal_typedef.h"
26 #include "cal_record.h"
31 #include "cal_vcalendar.h"
32 #include "cal_vcalendar_make.h"
33 #include "cal_vcalendar_parse.h"
35 #define ICALENAR_BUFFER_MAX (1024*1024)
37 API int calendar_vcalendar_make_from_records(calendar_list_h list, char **vcalendar_stream)
43 retvm_if(list == NULL, CALENDAR_ERROR_INVALID_PARAMETER,
44 "Invalid argument: calendar_list_h is NULL");
45 retvm_if(vcalendar_stream == NULL, CALENDAR_ERROR_INVALID_PARAMETER,
46 "Invalid argument: vcalendar_stream is NULL");
48 b = _cal_vcalendar_make_new();
49 retvm_if(!b, CALENDAR_ERROR_OUT_OF_MEMORY,
50 "_cal_vcalendar_make_new() Failed");
52 ret = _cal_vcalendar_make_vcalendar(b, list);
55 _cal_vcalendar_make_free(&b);
59 ical = _cal_vcalendar_make_get_data(b);
60 _cal_vcalendar_make_free(&b);
63 ERR("Failed to get ical data");
64 return CALENDAR_ERROR_OUT_OF_MEMORY;
69 return CALENDAR_ERROR_NO_DATA;
72 *vcalendar_stream = ical;
74 return CALENDAR_ERROR_NONE;
81 API int calendar_vcalendar_parse_to_calendar(const char* vcalendar_stream, calendar_list_h *out_list)
86 calendar_list_h list = NULL;
88 retvm_if(vcalendar_stream == NULL, CALENDAR_ERROR_INVALID_PARAMETER,
89 "Invalid argument: vcalendar_stream is NULL");
90 retvm_if(out_list == NULL, CALENDAR_ERROR_INVALID_PARAMETER,
91 "Invalid argument: calendar_list_h * is NULL");
93 stream = strdup(vcalendar_stream);
96 cursor = _cal_vcalendar_parse_remove_space(cursor);
98 ERR("_cal_vcalendar_parse_remove_space() failed");
100 return CALENDAR_ERROR_OUT_OF_MEMORY;
102 _cal_vcalendar_parse_unfolding(cursor);
104 cursor = _cal_vcalendar_parse_read_line(cursor, &prop, &cont);
105 if (cursor == NULL) {
106 ERR("_cal_vcalendar_parse_read_line() failed");
110 return CALENDAR_ERROR_OUT_OF_MEMORY;
113 if (strncmp(prop, "BEGIN", strlen("BEGIN")) ||
114 strncmp(cont + 1, "VCALENDAR", strlen("VCALENDAR"))) {
115 ERR("Failed to find BEGIN:VCALDENDAR [%s][%s]", prop, cont);
123 _cal_vcalendar_parse_vcalendar(&list, cursor);
127 return CALENDAR_ERROR_NO_DATA;
130 calendar_list_first(list);
134 return CALENDAR_ERROR_NONE;
137 API int calendar_vcalendar_parse_to_calendar_foreach(const char *vcalendar_file_path, calendar_vcalendar_parse_cb callback, void *user_data)
140 int ret = CALENDAR_ERROR_NONE;
145 retvm_if(vcalendar_file_path == NULL, CALENDAR_ERROR_INVALID_PARAMETER,
146 "Invalid argument: vcalendar_file_path is NULL");
147 retvm_if(callback == NULL, CALENDAR_ERROR_INVALID_PARAMETER,
148 "Invalid argument: callback is NULL");
150 file = fopen(vcalendar_file_path, "r");
152 retvm_if(file == NULL, CALENDAR_ERROR_INVALID_PARAMETER,
153 "Invalid argument: no file");
156 buf_size = ICALENAR_BUFFER_MAX;
157 stream = malloc(ICALENAR_BUFFER_MAX);
159 while (fgets(buf, sizeof(buf), file))
161 if (len + sizeof(buf) < buf_size)
163 len += snprintf(stream + len, strlen(buf) +1, "%s", buf);
169 new_stream = realloc(stream, buf_size);
175 if (stream) free(stream);
177 ERR("out of memory");
178 return CALENDAR_ERROR_OUT_OF_MEMORY;
180 len += snprintf(stream + len, strlen(buf) +1, "%s", buf);
183 if (!strncmp(buf, "END:VCALENDAR", strlen("END:VCALENDAR")))
185 DBG("end vcalendar");
186 calendar_list_h list = NULL;
187 int count = 0, i = 0;
189 if (calendar_vcalendar_parse_to_calendar(stream, &list) != CALENDAR_ERROR_NONE)
191 ERR("calendar_vcalendar_parse_to_calendar fail");
192 if (stream) free(stream);
194 return CALENDAR_ERROR_INVALID_PARAMETER;
197 ret = calendar_list_get_count(list, &count);
198 if (ret != CALENDAR_ERROR_NONE || count < 1)
200 ERR("calendar_list_get_count() failed");
201 calendar_list_destroy(list, true);
202 if (stream) free(stream);
207 DBG("vcalendar has count(%d)", count);
208 calendar_list_first(list);
209 for(i = 0; i < count; i++)
211 calendar_record_h record = NULL;
212 if (calendar_list_get_current_record_p(list,&record) != CALENDAR_ERROR_NONE)
214 ERR("calendar_list_get_count fail");
215 calendar_list_destroy(list, true);
216 if (stream) free(stream);
218 return CALENDAR_ERROR_INVALID_PARAMETER;
220 if (!callback(record, user_data))
222 ERR("callback is false");
223 calendar_list_destroy(list, true);
224 if (stream) free(stream);
226 return CALENDAR_ERROR_INVALID_PARAMETER;
228 calendar_list_next(list);
231 calendar_list_destroy(list, true);
235 if (stream) free(stream);
238 return CALENDAR_ERROR_NONE;