FileSystem.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. #include "FileSystem.h"
  2. #include "utils/stringUtils.h"
  3. #include <string.h>
  4. #include <algorithm>
  5. #include "file.h"
  6. namespace oxygine
  7. {
  8. namespace file
  9. {
  10. bool starts_with(const char* string, const char* prefix)
  11. {
  12. while (*prefix)
  13. {
  14. if (*prefix++ != *string++)
  15. return false;
  16. }
  17. return true;
  18. }
  19. FileSystem::FileSystem(bool readonly): _readonly(readonly)
  20. {
  21. _prefix[0] = 0;
  22. }
  23. FileSystem::~FileSystem()
  24. {
  25. }
  26. void FileSystem::setPrefix(const char* str)
  27. {
  28. strcpy(_prefix, str);
  29. }
  30. #define FUNC(func, _func, readOnlyCheck, startsWithCheck, args) \
  31. for (filesystems::reverse_iterator i = _filesystems.rbegin(); i != _filesystems.rend(); ++i)\
  32. {\
  33. FileSystem *fs = *i;\
  34. if (fs->func args)\
  35. return status_ok;\
  36. }\
  37. if (!starts_with(startsWithCheck, _prefix))\
  38. return status_error;\
  39. if (readOnlyCheck && _readonly)\
  40. return status_error;\
  41. return _func args;
  42. bool FileSystem::isExists(const char* file)
  43. {
  44. FUNC(isExists, _isExists, false, file, (file));
  45. }
  46. FileSystem::status FileSystem::deleteFile(const char* file)
  47. {
  48. FUNC(deleteFile, _deleteFile, true, file, (file));
  49. }
  50. FileSystem::status FileSystem::renameFile(const char* src, const char* dest)
  51. {
  52. FUNC(renameFile, _renameFile, true, src, (src, dest));
  53. }
  54. FileSystem::status FileSystem::makeDirectory(const char* dest)
  55. {
  56. FUNC(makeDirectory, _makeDirectory, true, dest, (dest));
  57. }
  58. FileSystem::status FileSystem::deleteDirectory(const char* dest)
  59. {
  60. FUNC(deleteDirectory, _deleteDirectory, true, dest, (dest));
  61. }
  62. bool FileSystem::isExistsHere(const char* file)
  63. {
  64. char str[512];
  65. path::normalize(file, str);
  66. return _isExists(str);
  67. }
  68. FileSystem::status FileSystem::open(const char* file, const char* mode, error_policy ep, fileHandle*& fh)
  69. {
  70. bool write = mode[0] == 'W' || mode[0] == 'w' || mode[0] == 'A' || mode[0] == 'a';
  71. FUNC(open, _open, write, file, (file, mode, ep, fh));
  72. }
  73. FileSystem::status FileSystem::read(const char* file, file::buffer& bf, error_policy ep)
  74. {
  75. FUNC(read, _read, false, file, (file, bf, ep));
  76. }
  77. void FileSystem::mount(FileSystem* fs)
  78. {
  79. filesystems::iterator i = std::find(_filesystems.begin(), _filesystems.end(), fs);
  80. OX_ASSERT(i == _filesystems.end());
  81. _filesystems.push_back(fs);
  82. }
  83. void FileSystem::unmount(FileSystem* fs)
  84. {
  85. filesystems::iterator i = std::find(_filesystems.begin(), _filesystems.end(), fs);
  86. if (i != _filesystems.end())
  87. {
  88. _filesystems.erase(i);
  89. }
  90. }
  91. /*
  92. FileSystem::status FileSystem::_read(const char* file, file::buffer &bf, error_policy ep)
  93. {
  94. fileHandle* fh = 0;
  95. status s = _open(file, "rb", ep_ignore_error, fh);
  96. if (!fh)
  97. return status_error;
  98. fh->
  99. fh->read()
  100. fh->release();
  101. }
  102. */
  103. bool FileSystem::_isExists(const char* file)
  104. {
  105. fileHandle* fh = 0;
  106. status s = _open(file, "rb", ep_ignore_error, fh);
  107. if (fh)
  108. fh->release();
  109. return s == status_ok;
  110. }
  111. }
  112. }