17 #define STR_KEY_FILETYPE "filetype"
18 #define STR_FILETYPE_00 \
19 "_SHOGUN_SERIALIZABLE_JSON_FILE_V_00_"
21 using namespace shogun;
23 CSerializableJsonFile::CSerializableJsonFile()
26 CSerializableJsonFile::CSerializableJsonFile(
const char* fname,
char rw)
29 CSerializableFile::init(NULL, rw, fname);
33 CSerializableJsonFile::~CSerializableJsonFile()
39 CSerializableJsonFile::new_reader(
char* dest_version,
size_t n)
44 if ((buf = json_object_object_get(
45 m_stack_stream.back(), STR_KEY_FILETYPE)) == NULL
47 || (ftype = json_object_get_string(buf)) == NULL)
50 strncpy(dest_version, ftype, n);
52 if (strcmp(STR_FILETYPE_00, dest_version) == 0)
53 return new SerializableJsonReader00(
this);
59 CSerializableJsonFile::push_object(json_object* o)
60 { m_stack_stream.push_back(o); json_object_get(o); }
63 CSerializableJsonFile::pop_object()
64 { json_object_put(m_stack_stream.back()); m_stack_stream.pop_back(); }
67 CSerializableJsonFile::get_object_any(
68 json_object** dest, json_object* src,
const char* key)
70 *dest = json_object_object_get(src, key);
72 return !is_error(*dest);
76 CSerializableJsonFile::get_object(json_object** dest, json_object* src,
77 const char* key, json_type t)
79 *dest = json_object_object_get(src, key);
81 return *dest != NULL && !is_error(*dest)
82 && json_object_is_type(*dest, t);
86 CSerializableJsonFile::init(
const char* fname)
88 if (m_filename == NULL || *m_filename ==
'\0') {
89 SG_WARNING(
"Filename not given for opening file!\n");
96 buf = json_object_from_file((
char*) fname);
98 SG_WARNING(
"Could not open file `%s' for reading!\n",
105 push_object(json_object_new_object());
107 buf = json_object_new_string(STR_FILETYPE_00);
108 json_object_object_add(m_stack_stream.back(),
109 STR_KEY_FILETYPE, buf);
112 SG_WARNING(
"Could not open file `%s', unknown mode!\n",
119 CSerializableJsonFile::close()
121 while (m_stack_stream.get_num_elements() > 1)
124 if (m_stack_stream.get_num_elements() == 1) {
127 json_object_to_file(m_filename, m_stack_stream.back())
129 SG_WARNING(
"Could not close file `%s' for writing!\n",
138 CSerializableJsonFile::is_opened()
140 return m_stack_stream.get_num_elements() > 0;
144 CSerializableJsonFile::write_scalar_wrapped(
149 push_object(json_object_new_boolean(*(
bool*) param));
152 push_object(json_object_new_int((
int) *(
char*) param));
155 push_object(json_object_new_int((
int) *(int8_t*) param));
158 push_object(json_object_new_int((
int) *(uint8_t*) param));
161 push_object(json_object_new_int((
int) *(int16_t*) param));
164 push_object(json_object_new_int((
int) *(uint16_t*) param));
167 push_object(json_object_new_int((
int) *(int32_t*) param));
170 push_object(json_object_new_int((
int) *(uint32_t*) param));
173 push_object(json_object_new_int((
int) *(int64_t*) param));
176 push_object(json_object_new_int((
int) *(uint64_t*) param));
179 push_object(json_object_new_double(
183 push_object(json_object_new_double(
187 push_object(json_object_new_double(
191 SG_ERROR(
"write_scalar_wrapped(): Implementation error during"
192 " writing JsonFile!");
196 if (is_error(m_stack_stream.back()))
return false;
202 CSerializableJsonFile::write_cont_begin_wrapped(
205 push_object(json_object_new_array());
208 json_object_array_add(m_stack_stream.back(),
209 json_object_new_array());
215 CSerializableJsonFile::write_cont_end_wrapped(
222 CSerializableJsonFile::write_string_begin_wrapped(
225 push_object(json_object_new_array());
231 CSerializableJsonFile::write_string_end_wrapped(
238 CSerializableJsonFile::write_stringentry_begin_wrapped(
245 CSerializableJsonFile::write_stringentry_end_wrapped(
248 json_object* array = m_stack_stream.get_element(
249 m_stack_stream.get_num_elements() - 2);
251 if (is_error(json_object_array_put_idx(
252 array, y, m_stack_stream.back())))
return false;
259 CSerializableJsonFile::write_sparse_begin_wrapped(
263 push_object(json_object_new_object());
265 json_object* buf = json_object_new_int(vec_index);
266 if (is_error(buf))
return false;
267 json_object_object_add(m_stack_stream.back(),
268 STR_KEY_SPARSE_VECINDEX, buf);
270 buf = json_object_new_array();
271 if (is_error(buf))
return false;
272 json_object_object_add(m_stack_stream.back(),
273 STR_KEY_SPARSE_FEATURES, buf);
280 CSerializableJsonFile::write_sparse_end_wrapped(
289 CSerializableJsonFile::write_sparseentry_begin_wrapped(
293 json_object* buf = json_object_new_object();
294 if (is_error(json_object_array_put_idx(m_stack_stream.back(), y,
298 buf = json_object_new_int(feat_index);
299 if (is_error(buf))
return false;
300 json_object_object_add(m_stack_stream.back(),
301 STR_KEY_SPARSE_FEATINDEX, buf);
307 CSerializableJsonFile::write_sparseentry_end_wrapped(
311 json_object* o = m_stack_stream.get_element(
312 m_stack_stream.get_num_elements() - 2);
314 json_object_object_add(o, STR_KEY_SPARSE_ENTRY,
315 m_stack_stream.back());
317 pop_object(); pop_object();
322 CSerializableJsonFile::write_item_begin_wrapped(
329 CSerializableJsonFile::write_item_end_wrapped(
332 json_object* array = m_stack_stream.get_element(
333 m_stack_stream.get_num_elements() - 2);
336 array = json_object_array_get_idx(array, x);
338 json_object_array_put_idx(array, y, m_stack_stream.back());
345 CSerializableJsonFile::write_sgserializable_begin_wrapped(
346 const TSGDataType* type,
const char* sgserializable_name,
347 EPrimitiveType
generic)
349 if (*sgserializable_name ==
'\0') {
350 push_object(NULL);
return true;
353 push_object(json_object_new_object());
356 buf = json_object_new_string(sgserializable_name);
357 if (is_error(buf))
return false;
358 json_object_object_add(m_stack_stream.back(),
359 STR_KEY_INSTANCE_NAME, buf);
364 buf = json_object_new_string(buf_str);
365 if (is_error(buf))
return false;
366 json_object_object_add(m_stack_stream.back(),
367 STR_KEY_GENERIC_NAME, buf);
370 buf = json_object_new_object();
371 if (is_error(buf))
return false;
372 json_object_object_add(m_stack_stream.back(), STR_KEY_INSTANCE,
380 CSerializableJsonFile::write_sgserializable_end_wrapped(
381 const TSGDataType* type,
const char* sgserializable_name,
382 EPrimitiveType
generic)
384 if (*sgserializable_name ==
'\0')
return true;
391 CSerializableJsonFile::write_type_begin_wrapped(
392 const TSGDataType* type,
const char* name,
const char* prefix)
394 json_object* buf = json_object_new_object();
395 if (is_error(buf))
return false;
397 json_object_object_add(m_stack_stream.back(), name, buf);
402 buf = json_object_new_string(str_buf);
403 if (is_error(buf))
return false;
404 json_object_object_add(m_stack_stream.back(), STR_KEY_TYPE, buf);
410 CSerializableJsonFile::write_type_end_wrapped(
411 const TSGDataType* type,
const char* name,
const char* prefix)
413 json_object_object_add(
414 m_stack_stream.get_element(
415 m_stack_stream.get_num_elements() - 2), STR_KEY_DATA,
416 m_stack_stream.back());