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(
262 push_object(json_object_new_object());
264 json_object* buf = json_object_new_array();
265 if (is_error(buf))
return false;
266 json_object_object_add(m_stack_stream.back(),
267 STR_KEY_SPARSE_FEATURES, buf);
274 CSerializableJsonFile::write_sparse_end_wrapped(
282 CSerializableJsonFile::write_sparseentry_begin_wrapped(
286 json_object* buf = json_object_new_object();
287 if (is_error(json_object_array_put_idx(m_stack_stream.back(), y,
291 buf = json_object_new_int(feat_index);
292 if (is_error(buf))
return false;
293 json_object_object_add(m_stack_stream.back(),
294 STR_KEY_SPARSE_FEATINDEX, buf);
300 CSerializableJsonFile::write_sparseentry_end_wrapped(
304 json_object* o = m_stack_stream.get_element(
305 m_stack_stream.get_num_elements() - 2);
307 json_object_object_add(o, STR_KEY_SPARSE_ENTRY,
308 m_stack_stream.back());
310 pop_object(); pop_object();
315 CSerializableJsonFile::write_item_begin_wrapped(
322 CSerializableJsonFile::write_item_end_wrapped(
325 json_object* array = m_stack_stream.get_element(
326 m_stack_stream.get_num_elements() - 2);
329 array = json_object_array_get_idx(array, x);
331 json_object_array_put_idx(array, y, m_stack_stream.back());
338 CSerializableJsonFile::write_sgserializable_begin_wrapped(
339 const TSGDataType* type,
const char* sgserializable_name,
340 EPrimitiveType
generic)
342 if (*sgserializable_name ==
'\0') {
343 push_object(NULL);
return true;
346 push_object(json_object_new_object());
349 buf = json_object_new_string(sgserializable_name);
350 if (is_error(buf))
return false;
351 json_object_object_add(m_stack_stream.back(),
352 STR_KEY_INSTANCE_NAME, buf);
357 buf = json_object_new_string(buf_str);
358 if (is_error(buf))
return false;
359 json_object_object_add(m_stack_stream.back(),
360 STR_KEY_GENERIC_NAME, buf);
363 buf = json_object_new_object();
364 if (is_error(buf))
return false;
365 json_object_object_add(m_stack_stream.back(), STR_KEY_INSTANCE,
373 CSerializableJsonFile::write_sgserializable_end_wrapped(
374 const TSGDataType* type,
const char* sgserializable_name,
375 EPrimitiveType
generic)
377 if (*sgserializable_name ==
'\0')
return true;
384 CSerializableJsonFile::write_type_begin_wrapped(
385 const TSGDataType* type,
const char* name,
const char* prefix)
387 json_object* buf = json_object_new_object();
388 if (is_error(buf))
return false;
390 json_object_object_add(m_stack_stream.back(), name, buf);
395 buf = json_object_new_string(str_buf);
396 if (is_error(buf))
return false;
397 json_object_object_add(m_stack_stream.back(), STR_KEY_TYPE, buf);
403 CSerializableJsonFile::write_type_end_wrapped(
404 const TSGDataType* type,
const char* name,
const char* prefix)
406 json_object_object_add(
407 m_stack_stream.get_element(
408 m_stack_stream.get_num_elements() - 2), STR_KEY_DATA,
409 m_stack_stream.back());