00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include <shogun/io/SerializableFile.h>
00013
00014 using namespace shogun;
00015
00016 CSerializableFile::CSerializableFile()
00017 :CSGObject()
00018 {
00019 init(NULL, 0, "(file)");
00020 }
00021
00022 CSerializableFile::CSerializableFile(FILE* fstream, char rw)
00023 :CSGObject()
00024 {
00025 init(fstream, rw, "(file)");
00026 }
00027
00028 CSerializableFile::CSerializableFile(const char* fname, char rw)
00029 :CSGObject()
00030 {
00031 char mode[3] = {rw, 'b', '\0'};
00032
00033 init(NULL, rw, fname);
00034
00035 if (m_filename == NULL || *m_filename == '\0') {
00036 SG_WARNING("Filename not given for opening file!\n");
00037 close(); return;
00038 }
00039
00040 if (rw != 'r' && rw != 'w') {
00041 SG_WARNING("Unknown mode '%c'!\n", mode[0]);
00042 close(); return;
00043 }
00044
00045 m_fstream = fopen(m_filename, mode);
00046 if (!is_opened()) {
00047 SG_WARNING("Error opening file '%s'\n", m_filename);
00048 close(); return;
00049 }
00050 }
00051
00052 CSerializableFile::~CSerializableFile()
00053 {
00054 close();
00055 SG_FREE(m_filename);
00056 delete m_reader;
00057 m_task = 0;
00058 }
00059
00060 void
00061 CSerializableFile::init(FILE* fstream, char task, const char* filename)
00062 {
00063 m_fstream = fstream;
00064 m_task = task;
00065 m_filename = strdup(filename);
00066 m_reader = NULL;
00067 }
00068
00069 void
00070 CSerializableFile::close()
00071 {
00072 if (is_opened()) { fclose(m_fstream); m_fstream = NULL; }
00073 }
00074
00075 bool
00076 CSerializableFile::is_opened()
00077 {
00078 return m_fstream != NULL;
00079 }
00080
00081 bool
00082 CSerializableFile::is_task_warn(char rw, const char* name,
00083 const char* prefix)
00084 {
00085 if (m_task == 'r' && m_reader == NULL) {
00086 string_t dest_version;
00087 strncpy(dest_version, "(unkown)", STRING_LEN);
00088 m_reader = new_reader(dest_version, STRING_LEN);
00089 if (m_reader == NULL) {
00090 SG_WARNING("`%s' has file-version `%s', which is not "
00091 "supported!\n", m_filename, dest_version);
00092 close(); return false;
00093 }
00094 }
00095
00096 if (rw == 'w' && (m_task != 'w' || !is_opened())) {
00097 SG_WARNING("`%s' not opened (for writing) during writing "
00098 "`%s%s'!\n", m_filename, prefix, name);
00099 return false;
00100 }
00101 if (rw == 'r' && (m_task != 'r' || !is_opened())) {
00102 SG_WARNING("`%s' not opened (for reading) during reading "
00103 "`%s%s'!\n", m_filename, prefix, name);
00104 return false;
00105 }
00106
00107 return true;
00108 }
00109
00110 bool
00111 CSerializableFile::false_warn(const char* prefix, const char* name)
00112 {
00113 if (m_task == 'w')
00114 SG_WARNING("Could not write `%s%s' to `%s'!\n", prefix,
00115 name, m_filename);
00116 if (m_task == 'r')
00117 SG_WARNING("Could not read `%s%s' from `%s'!\n", prefix,
00118 name, m_filename);
00119 if (m_task != 'w' && m_task != 'r')
00120 SG_WARNING("Could not read/write `%s%s' from `%s'!\n",
00121 prefix, name, m_filename);
00122
00123 return false;
00124 }
00125
00126 bool
00127 CSerializableFile::write_scalar(
00128 const TSGDataType* type, const char* name, const char* prefix,
00129 const void* param)
00130 {
00131 if (!is_task_warn('w', name, prefix)) return false;
00132
00133 if (!write_scalar_wrapped(type, param))
00134 return false_warn(prefix, name);
00135
00136 return true;
00137 }
00138
00139 bool
00140 CSerializableFile::read_scalar(
00141 const TSGDataType* type, const char* name, const char* prefix,
00142 void* param)
00143 {
00144 if (!is_task_warn('r', name, prefix)) return false;
00145
00146 if (!m_reader->read_scalar_wrapped(type, param))
00147 return false_warn(prefix, name);
00148
00149 return true;
00150 }
00151
00152 bool
00153 CSerializableFile::write_cont_begin(
00154 const TSGDataType* type, const char* name, const char* prefix,
00155 index_t len_real_y, index_t len_real_x)
00156 {
00157 if (!is_task_warn('w', name, prefix)) return false;
00158
00159 if (!write_cont_begin_wrapped(type, len_real_y, len_real_x))
00160 return false_warn(prefix, name);
00161
00162 return true;
00163 }
00164
00165 bool
00166 CSerializableFile::read_cont_begin(
00167 const TSGDataType* type, const char* name, const char* prefix,
00168 index_t* len_read_y, index_t* len_read_x)
00169 {
00170 if (!is_task_warn('r', name, prefix)) return false;
00171
00172 if (!m_reader->read_cont_begin_wrapped(type, len_read_y,
00173 len_read_x))
00174 return false_warn(prefix, name);
00175
00176 return true;
00177 }
00178
00179 bool
00180 CSerializableFile::write_cont_end(
00181 const TSGDataType* type, const char* name, const char* prefix,
00182 index_t len_real_y, index_t len_real_x)
00183 {
00184 if (!is_task_warn('w', name, prefix)) return false;
00185
00186 if (!write_cont_end_wrapped(type, len_real_y, len_real_x))
00187 return false_warn(prefix, name);
00188
00189 return true;
00190 }
00191
00192 bool
00193 CSerializableFile::read_cont_end(
00194 const TSGDataType* type, const char* name, const char* prefix,
00195 index_t len_read_y, index_t len_read_x)
00196 {
00197 if (!is_task_warn('r', name, prefix)) return false;
00198
00199 if (!m_reader->read_cont_end_wrapped(type, len_read_y, len_read_x))
00200 return false_warn(prefix, name);
00201
00202 return true;
00203 }
00204
00205 bool
00206 CSerializableFile::write_string_begin(
00207 const TSGDataType* type, const char* name, const char* prefix,
00208 index_t length)
00209 {
00210 if (!is_task_warn('w', name, prefix)) return false;
00211
00212 if (!write_string_begin_wrapped(type, length))
00213 return false_warn(prefix, name);
00214
00215 return true;
00216 }
00217
00218 bool
00219 CSerializableFile::read_string_begin(
00220 const TSGDataType* type, const char* name, const char* prefix,
00221 index_t* length)
00222 {
00223 if (!is_task_warn('r', name, prefix)) return false;
00224
00225 if (!m_reader->read_string_begin_wrapped(type, length))
00226 return false_warn(prefix, name);
00227
00228 return true;
00229 }
00230
00231 bool
00232 CSerializableFile::write_string_end(
00233 const TSGDataType* type, const char* name, const char* prefix,
00234 index_t length)
00235 {
00236 if (!is_task_warn('w', name, prefix)) return false;
00237
00238 if (!write_string_end_wrapped(type, length))
00239 return false_warn(prefix, name);
00240
00241 return true;
00242 }
00243
00244 bool
00245 CSerializableFile::read_string_end(
00246 const TSGDataType* type, const char* name, const char* prefix,
00247 index_t length)
00248 {
00249 if (!is_task_warn('r', name, prefix)) return false;
00250
00251 if (!m_reader->read_string_end_wrapped(type, length))
00252 return false_warn(prefix, name);
00253
00254 return true;
00255 }
00256
00257 bool
00258 CSerializableFile::write_stringentry_begin(
00259 const TSGDataType* type, const char* name, const char* prefix,
00260 index_t y)
00261 {
00262 if (!is_task_warn('w', name, prefix)) return false;
00263
00264 if (!write_stringentry_begin_wrapped(type, y))
00265 return false_warn(prefix, name);
00266
00267 return true;
00268 }
00269
00270 bool
00271 CSerializableFile::read_stringentry_begin(
00272 const TSGDataType* type, const char* name, const char* prefix,
00273 index_t y)
00274 {
00275 if (!is_task_warn('r', name, prefix)) return false;
00276
00277 if (!m_reader->read_stringentry_begin_wrapped(type, y))
00278 return false_warn(prefix, name);
00279
00280 return true;
00281 }
00282
00283 bool
00284 CSerializableFile::write_stringentry_end(
00285 const TSGDataType* type, const char* name, const char* prefix,
00286 index_t y)
00287 {
00288 if (!is_task_warn('w', name, prefix)) return false;
00289
00290 if (!write_stringentry_end_wrapped(type, y))
00291 return false_warn(prefix, name);
00292
00293 return true;
00294 }
00295
00296 bool
00297 CSerializableFile::read_stringentry_end(
00298 const TSGDataType* type, const char* name, const char* prefix,
00299 index_t y)
00300 {
00301 if (!is_task_warn('r', name, prefix)) return false;
00302
00303 if (!m_reader->read_stringentry_end_wrapped(type, y))
00304 return false_warn(prefix, name);
00305
00306 return true;
00307 }
00308
00309 bool
00310 CSerializableFile::write_sparse_begin(
00311 const TSGDataType* type, const char* name, const char* prefix,
00312 index_t length)
00313 {
00314 if (!is_task_warn('w', name, prefix)) return false;
00315
00316 if (!write_sparse_begin_wrapped(type, length))
00317 return false_warn(prefix, name);
00318
00319 return true;
00320 }
00321
00322 bool
00323 CSerializableFile::read_sparse_begin(
00324 const TSGDataType* type, const char* name, const char* prefix,
00325 index_t* length)
00326 {
00327 if (!is_task_warn('r', name, prefix)) return false;
00328
00329 if (!m_reader->read_sparse_begin_wrapped(type, length))
00330 return false_warn(prefix, name);
00331
00332 return true;
00333 }
00334
00335 bool
00336 CSerializableFile::write_sparse_end(
00337 const TSGDataType* type, const char* name, const char* prefix,
00338 index_t length)
00339 {
00340 if (!is_task_warn('w', name, prefix)) return false;
00341
00342 if (!write_sparse_end_wrapped(type, length))
00343 return false_warn(prefix, name);
00344
00345 return true;
00346 }
00347
00348 bool
00349 CSerializableFile::read_sparse_end(
00350 const TSGDataType* type, const char* name, const char* prefix,
00351 index_t length)
00352 {
00353 if (!is_task_warn('r', name, prefix)) return false;
00354
00355 if (!m_reader->read_sparse_end_wrapped(type, length))
00356 return false_warn(prefix, name);
00357
00358 return true;
00359 }
00360
00361 bool
00362 CSerializableFile::write_sparseentry_begin(
00363 const TSGDataType* type, const char* name, const char* prefix,
00364 const SGSparseVectorEntry<char>* first_entry, index_t feat_index,
00365 index_t y)
00366 {
00367 if (!is_task_warn('w', name, prefix)) return false;
00368
00369 if (!write_sparseentry_begin_wrapped(type, first_entry,
00370 feat_index, y))
00371 return false_warn(prefix, name);
00372
00373 return true;
00374 }
00375
00376 bool
00377 CSerializableFile::read_sparseentry_begin(
00378 const TSGDataType* type, const char* name, const char* prefix,
00379 SGSparseVectorEntry<char>* first_entry, index_t* feat_index, index_t y)
00380 {
00381 if (!is_task_warn('r', name, prefix)) return false;
00382
00383 if (!m_reader->read_sparseentry_begin_wrapped(type, first_entry,
00384 feat_index, y))
00385 return false_warn(prefix, name);
00386
00387 return true;
00388 }
00389
00390 bool
00391 CSerializableFile::write_sparseentry_end(
00392 const TSGDataType* type, const char* name, const char* prefix,
00393 const SGSparseVectorEntry<char>* first_entry, index_t feat_index,
00394 index_t y)
00395 {
00396 if (!is_task_warn('w', name, prefix)) return false;
00397
00398 if (!write_sparseentry_end_wrapped(type, first_entry, feat_index,
00399 y))
00400 return false_warn(prefix, name);
00401
00402 return true;
00403 }
00404
00405 bool
00406 CSerializableFile::read_sparseentry_end(
00407 const TSGDataType* type, const char* name, const char* prefix,
00408 SGSparseVectorEntry<char>* first_entry, index_t* feat_index,
00409 index_t y)
00410 {
00411 if (!is_task_warn('r', name, prefix)) return false;
00412
00413 if (!m_reader->read_sparseentry_end_wrapped(type, first_entry,
00414 feat_index, y))
00415 return false_warn(prefix, name);
00416
00417 return true;
00418 }
00419
00420 bool
00421 CSerializableFile::write_item_begin(
00422 const TSGDataType* type, const char* name, const char* prefix,
00423 index_t y, index_t x)
00424 {
00425 if (!is_task_warn('w', name, prefix)) return false;
00426
00427 if (!write_item_begin_wrapped(type, y, x))
00428 return false_warn(prefix, name);
00429
00430 return true;
00431 }
00432
00433 bool
00434 CSerializableFile::read_item_begin(
00435 const TSGDataType* type, const char* name, const char* prefix,
00436 index_t y, index_t x)
00437 {
00438 if (!is_task_warn('r', name, prefix)) return false;
00439
00440 if (!m_reader->read_item_begin_wrapped(type, y, x))
00441 return false_warn(prefix, name);
00442
00443 return true;
00444 }
00445
00446 bool
00447 CSerializableFile::write_item_end(
00448 const TSGDataType* type, const char* name, const char* prefix,
00449 index_t y, index_t x)
00450 {
00451 if (!is_task_warn('w', name, prefix)) return false;
00452
00453 if (!write_item_end_wrapped(type, y, x))
00454 return false_warn(prefix, name);
00455
00456 return true;
00457 }
00458
00459 bool
00460 CSerializableFile::read_item_end(
00461 const TSGDataType* type, const char* name, const char* prefix,
00462 index_t y, index_t x)
00463 {
00464 if (!is_task_warn('r', name, prefix)) return false;
00465
00466 if (!m_reader->read_item_end_wrapped(type, y, x))
00467 return false_warn(prefix, name);
00468
00469 return true;
00470 }
00471
00472 bool
00473 CSerializableFile::write_sgserializable_begin(
00474 const TSGDataType* type, const char* name, const char* prefix,
00475 const char* sgserializable_name, EPrimitiveType generic)
00476 {
00477 if (!is_task_warn('w', name, prefix)) return false;
00478
00479 if (!write_sgserializable_begin_wrapped(type, sgserializable_name,
00480 generic))
00481 return false_warn(prefix, name);
00482
00483 return true;
00484 }
00485
00486 bool
00487 CSerializableFile::read_sgserializable_begin(
00488 const TSGDataType* type, const char* name, const char* prefix,
00489 char* sgserializable_name, EPrimitiveType* generic)
00490 {
00491 if (!is_task_warn('r', name, prefix)) return false;
00492
00493 if (!m_reader->read_sgserializable_begin_wrapped(
00494 type, sgserializable_name, generic))
00495 return false_warn(prefix, name);
00496
00497 return true;
00498 }
00499
00500 bool
00501 CSerializableFile::write_sgserializable_end(
00502 const TSGDataType* type, const char* name, const char* prefix,
00503 const char* sgserializable_name, EPrimitiveType generic)
00504 {
00505 if (!is_task_warn('w', name, prefix)) return false;
00506
00507 if (!write_sgserializable_end_wrapped(type, sgserializable_name,
00508 generic))
00509 return false_warn(prefix, name);
00510
00511 return true;
00512 }
00513
00514 bool
00515 CSerializableFile::read_sgserializable_end(
00516 const TSGDataType* type, const char* name, const char* prefix,
00517 const char* sgserializable_name, EPrimitiveType generic)
00518 {
00519 if (!is_task_warn('r', name, prefix)) return false;
00520
00521 if (!m_reader->read_sgserializable_end_wrapped(
00522 type, sgserializable_name, generic))
00523 return false_warn(prefix, name);
00524
00525 return true;
00526 }
00527
00528 bool
00529 CSerializableFile::write_type_begin(
00530 const TSGDataType* type, const char* name, const char* prefix)
00531 {
00532 if (!is_task_warn('w', name, prefix)) return false;
00533
00534 if (!write_type_begin_wrapped(type, name, prefix))
00535 return false_warn(prefix, name);
00536
00537 return true;
00538 }
00539
00540 bool
00541 CSerializableFile::read_type_begin(
00542 const TSGDataType* type, const char* name, const char* prefix)
00543 {
00544 if (!is_task_warn('r', name, prefix)) return false;
00545
00546 if (!m_reader->read_type_begin_wrapped(type, name, prefix))
00547 return false_warn(prefix, name);
00548
00549 return true;
00550 }
00551
00552 bool
00553 CSerializableFile::write_type_end(
00554 const TSGDataType* type, const char* name, const char* prefix)
00555 {
00556 if (!is_task_warn('w', name, prefix)) return false;
00557
00558 if (!write_type_end_wrapped(type, name, prefix))
00559 return false_warn(prefix, name);
00560
00561 return true;
00562 }
00563
00564 bool
00565 CSerializableFile::read_type_end(
00566 const TSGDataType* type, const char* name, const char* prefix)
00567 {
00568 if (!is_task_warn('r', name, prefix)) return false;
00569
00570 if (!m_reader->read_type_end_wrapped(type, name, prefix))
00571 return false_warn(prefix, name);
00572
00573 return true;
00574 }