File.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /*
  2. * Copyright (C) 2022 The V-Gears Team
  3. *
  4. * This file is part of V-Gears
  5. *
  6. * V-Gears is free software: you can redistribute it and/or modify it under
  7. * terms of the GNU General Public License as published by the Free Software
  8. * Foundation, version 3.0 (GPLv3) of the License.
  9. *
  10. * V-Gears is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. */
  15. #include <cassert>
  16. #include <string.h>
  17. #include "common/File.h"
  18. #include "common/FileSystem.h"
  19. #include "core/Logger.h"
  20. File::File(const Ogre::String& file):
  21. file_name_(file),
  22. buffer_(nullptr),
  23. buffer_size_(0),
  24. offset_(0)
  25. {
  26. LOG_TRIVIAL("Loading file: " + file_name_ + "\n");
  27. buffer_size_ = FileSystem::GetFileSize(file_name_);
  28. buffer_ = static_cast<u8*>(malloc(sizeof(u8) * buffer_size_));
  29. if (!FileSystem::ReadFile(file_name_, buffer_, 0, buffer_size_))
  30. LOG_TRIVIAL("Warning: " + file_name_ + " not found!\n");
  31. }
  32. File::File(const File* file, u32 offset, u32 length):
  33. buffer_(nullptr), buffer_size_(length), offset_(offset)
  34. {
  35. assert(file != nullptr);
  36. file_name_ = file->GetFileName();
  37. buffer_ = static_cast<u8*>(malloc(sizeof(u8) * buffer_size_));
  38. file->GetFileBuffer(buffer_, offset_, buffer_size_);
  39. }
  40. File::File(const u8* buffer, u32 offset, u32 length):
  41. file_name_("BUFFER"), buffer_(nullptr), buffer_size_(length), offset_(offset)
  42. {
  43. assert(buffer != nullptr);
  44. buffer_ = static_cast<u8*>(malloc(sizeof(u8) * buffer_size_));
  45. memcpy(buffer_, buffer + offset, buffer_size_);
  46. }
  47. File::File(const File* file){
  48. assert(file != nullptr);
  49. buffer_size_ = file->GetFileSize();
  50. file_name_ = file->GetFileName();
  51. buffer_ = static_cast<u8*>(malloc(sizeof(u8) * buffer_size_));
  52. file->GetFileBuffer(buffer_, 0, buffer_size_);
  53. }
  54. File::~File(){/*free(buffer_);*/}
  55. void File::WriteFile(const Ogre::String& file) const{
  56. FileSystem::WriteNewFile(file, buffer_, buffer_size_);
  57. }
  58. const Ogre::String& File::GetFileName() const{return file_name_;}
  59. u32 File::GetFileSize() const{return buffer_size_;}
  60. void File::GetFileBuffer(u8* buffer, const u32 &start, const u32 &length) const{
  61. memcpy(buffer, buffer_ + start, length);
  62. }
  63. u8 File::GetU8(u32 offset) const{return *(buffer_ + offset);}
  64. u16 File::GetU16LE(u32 offset) const{
  65. return (buffer_ + offset)[0] | ((buffer_ + offset)[1] << 8);
  66. }
  67. u32 File::GetU32LE(u32 offset) const{
  68. return
  69. (buffer_ + offset)[0]
  70. | ((buffer_ + offset)[1] << 8)
  71. | ((buffer_ + offset)[2] << 16)
  72. | ((buffer_ + offset)[3] << 24);
  73. }
  74. u8 File::readU8(){
  75. u8 data(GetU8(offset_));
  76. offset_ += 1;
  77. return data;
  78. }
  79. u16 File::readU16LE(){
  80. u16 data(GetU16LE(offset_));
  81. offset_ += 2;
  82. return data;
  83. }
  84. u32 File::readU32LE(){
  85. u32 data(GetU32LE(offset_));
  86. offset_ += 4;
  87. return data;
  88. }
  89. u32 File::GetCurrentOffset(){return offset_;}
  90. void File::SetOffset(u32 offset){
  91. if (offset < buffer_size_) offset_ = offset;
  92. else offset_ = buffer_size_ - 1;
  93. }