| 329 | } |
| 330 | |
| 331 | bool OriginAnyParser::readDataSetElement() |
| 332 | { |
| 333 | LOG_PRINT(logfile, "readDataSetElement()\n") |
| 334 | /* get info and values of a DataSet (worksheet column, matrix sheet, ...) |
| 335 | * return true if a DataSet is found, otherwise return false */ |
| 336 | unsigned int dse_header_size = 0, dse_data_size = 0, dse_mask_size = 0; |
| 337 | std::streamoff dsh_start = 0, dsd_start = 0, dsm_start = 0; |
| 338 | string dse_header; |
| 339 | |
| 340 | // get dataset header size |
| 341 | dse_header_size = readObjectSize(); |
| 342 | if (dse_header_size == 0) |
| 343 | return false; |
| 344 | |
| 345 | curpos = file.tellg(); |
| 346 | dsh_start = curpos; |
| 347 | LOG_PRINT(logfile, "Column: header size %d [0x%X], starts at %" PRId64 " [0x%" PRIx64 "], ", |
| 348 | dse_header_size, dse_header_size, curpos, curpos) |
| 349 | dse_header = readObjectAsString(dse_header_size); |
| 350 | |
| 351 | // get known info |
| 352 | string name(25, 0); |
| 353 | name = dse_header.substr(0x58, 25); |
| 354 | |
| 355 | // go to end of dataset header, get data size |
| 356 | file.seekg(dsh_start + dse_header_size + 1, ios_base::beg); |
| 357 | dse_data_size = readObjectSize(); |
| 358 | dsd_start = file.tellg(); |
| 359 | string dse_data = readObjectAsString(dse_data_size); |
| 360 | curpos = file.tellg(); |
| 361 | LOG_PRINT(logfile, |
| 362 | "data size %d [0x%X], from %" PRId64 " [0x%" PRIx64 "] to %" PRId64 " [0x%" PRIx64 |
| 363 | "],", |
| 364 | dse_data_size, dse_data_size, dsd_start, dsd_start, curpos, curpos) |
| 365 | |
| 366 | // get data values |
| 367 | getColumnInfoAndData(dse_header, dse_header_size, dse_data, dse_data_size); |
| 368 | |
| 369 | // go to end of data values, get mask size (often zero) |
| 370 | file.seekg(dsd_start + dse_data_size, ios_base::beg); // dse_data_size can be zero |
| 371 | if (dse_data_size > 0) |
| 372 | file.seekg(1, ios_base::cur); |
| 373 | dse_mask_size = readObjectSize(); |
| 374 | dsm_start = file.tellg(); |
| 375 | if (dse_mask_size > 0) |
| 376 | LOG_PRINT(logfile, "\nmask size %d [0x%X], starts at %" PRId64 " [0x%" PRIx64 "]", |
| 377 | dse_mask_size, dse_mask_size, dsm_start, dsm_start) |
| 378 | string dse_mask = readObjectAsString(dse_mask_size); |
| 379 | |
| 380 | // get mask values |
| 381 | if (dse_mask_size > 0) { |
| 382 | curpos = file.tellg(); |
| 383 | LOG_PRINT(logfile, ", ends at %" PRId64 " [0x%" PRIx64 "]\n", curpos, curpos) |
| 384 | // TODO: extract mask values from dse_mask |
| 385 | // go to end of dataset mask |
| 386 | file.seekg(dsm_start + dse_mask_size + 1, ios_base::beg); |
| 387 | } |
| 388 | curpos = file.tellg(); |