/src/IO_ZipArchiver/ZipArchiver.cpp

http://github.com/Akranar/daguerreo · C++ · 57 lines · 48 code · 9 blank · 0 comment · 3 complexity · 7affb8cffbc57dddb3023e835923559e MD5 · raw file

  1. #include "ZipArchiver.h"
  2. #include "ZipExplorer.h"
  3. #include <Core_Exception.h>
  4. #include <fstream>
  5. void ZipArchiver::BuildDirectory(const char * filename)
  6. {
  7. ZipExplorer zip_explorer;
  8. zip_explorer.Open(filename);
  9. zip_filename = filename;
  10. zip_explorer.SeekToFirstFile();
  11. char filename_buffer[1000];
  12. do
  13. {
  14. ZipFileInfo current_file;
  15. current_file.location_in_zip =
  16. zip_explorer.CurrentReadDataParamsOnly(
  17. current_file.size_compressed,
  18. current_file.size_uncompressed,
  19. current_file.compression_method);
  20. zip_explorer.CurrentReadFilenameOnly(filename_buffer, 1000);
  21. zip_directory.insert(std::make_pair(filename_buffer, current_file));
  22. } while (zip_explorer.NextFile());
  23. zip_explorer.Close();
  24. }
  25. unsigned int ZipArchiver::ReadFileData(const char * filename, void * dest, unsigned int dest_length)
  26. {
  27. std::map<std::string, ZipFileInfo>::iterator search_result = zip_directory.find(filename);
  28. CONDITIONAL_EXCEPTION(search_result == zip_directory.end(), "File not found in Zip File Directory");
  29. unsigned int data_location = search_result->second.location_in_zip;
  30. unsigned int compressed_size = search_result->second.size_compressed;
  31. unsigned int data_to_read = std::min<int>(dest_length, compressed_size);
  32. std::fstream stream(zip_filename.c_str(), std::ios_base::binary | std::ios_base::in);
  33. CONDITIONAL_EXCEPTION(stream.bad(), "Zip archive file could not be opened");
  34. stream.seekg(data_location);
  35. stream.read((char *) dest, data_to_read);
  36. stream.close();
  37. return data_to_read;
  38. }
  39. const ZipFileInfo & ZipArchiver::GetFileInfo(const char * filename) const
  40. {
  41. std::map<std::string, ZipFileInfo>::const_iterator search_result = zip_directory.find(filename);
  42. CONDITIONAL_EXCEPTION(search_result == zip_directory.end(), "File not found in Zip File Directory");
  43. return search_result->second;
  44. }
  45. const char * ZipArchiver::GetArchiveFilename() const
  46. {
  47. return zip_filename.c_str();
  48. }