SHOGUN
v2.0.0
|
00001 /* 00002 * This program is free software; you can redistribute it and/or modify 00003 * it under the terms of the GNU General Public License as published by 00004 * the Free Software Foundation; either version 3 of the License, or 00005 * (at your option) any later version. 00006 * 00007 * Written (W) 1999-2010 Soeren Sonnenburg 00008 * Copyright (C) 1999-2009 Fraunhofer Institute FIRST and Max-Planck-Society 00009 * Copyright (C) 2010 Berlin Institute of Technology 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 }