OSBasics.cpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. /*
  2. * OSBasics.cpp
  3. * PolyStudio
  4. *
  5. * Created by Ivan Safrin on 8/4/08.
  6. * Copyright 2008 __MyCompanyName__. All rights reserved.
  7. *
  8. */
  9. #include "OSBasics.h"
  10. #ifdef _WINDOWS
  11. void wtoc(char* Dest, const WCHAR* Source)
  12. {
  13. int i = 0;
  14. while(Source[i] != '\0') {
  15. Dest[i] = (char)Source[i];
  16. ++i;
  17. }
  18. }
  19. void ctow(WCHAR* Dest, const char* Source)
  20. {
  21. int i = 0;
  22. while(Source[i] != '\0') {
  23. Dest[i] = (WCHAR)Source[i];
  24. ++i;
  25. }
  26. }
  27. #endif
  28. OSFileEntry::OSFileEntry(String path, String name, int type) {
  29. this->basePath = path;
  30. this->fullPath = path + "/" + name;
  31. this->name = name;
  32. this->type = type;
  33. size_t found;
  34. found=this->name.rfind(".");
  35. if (found!=string::npos) {
  36. extension = this->name.substr(found+1);
  37. nameWithoutExtension = this->name.substr(0, found);
  38. } else {
  39. extension = "";
  40. nameWithoutExtension = name;
  41. }
  42. }
  43. void OSFILE::debugDump() {
  44. long tellval = OSBasics::tell(this);
  45. OSBasics::seek(this, 0, SEEK_SET);
  46. char buffer;
  47. while(OSBasics::read(&buffer, 1, 1, this)) {
  48. printf("%c", buffer);
  49. }
  50. OSBasics::seek(this, tellval, SEEK_SET);
  51. }
  52. OSFILE *OSBasics::open(String filename, String opts) {
  53. OSFILE *retFile = NULL;
  54. if(PHYSFS_exists(filename.c_str())) {
  55. if(!PHYSFS_isDirectory(filename.c_str())) {
  56. retFile = new OSFILE;
  57. retFile->fileType = OSFILE::TYPE_ARCHIVE_FILE;
  58. if(opts.find("a") !=string::npos) {
  59. retFile->physFSFile = PHYSFS_openAppend(filename.c_str());
  60. if(!retFile->physFSFile){
  61. printf("Error opening file from archive (%s)\n", filename.c_str());
  62. return NULL;
  63. }
  64. } else if(opts.find("w") !=string::npos) {
  65. retFile->physFSFile = PHYSFS_openWrite(filename.c_str());
  66. if(!retFile->physFSFile){
  67. printf("Error opening file from archive (%s)\n", filename.c_str());
  68. return NULL;
  69. }
  70. } else {
  71. retFile->physFSFile = PHYSFS_openRead(filename.c_str());
  72. if(!retFile->physFSFile){
  73. printf("Error opening file from archive (%s)\n", filename.c_str());
  74. return NULL;
  75. }
  76. }
  77. return retFile;
  78. }
  79. } else {
  80. // Logger::log("File doesn't exist in archive\n");
  81. }
  82. FILE *file = fopen(filename.c_str(), opts.c_str());
  83. if(file) {
  84. retFile = new OSFILE;
  85. retFile->fileType = OSFILE::TYPE_FILE;
  86. retFile->file = file;
  87. return retFile;
  88. }
  89. return NULL;
  90. }
  91. int OSBasics::close(OSFILE *file) {
  92. switch(file->fileType) {
  93. case OSFILE::TYPE_FILE:
  94. return fclose(file->file);
  95. break;
  96. case OSFILE::TYPE_ARCHIVE_FILE:
  97. return PHYSFS_close(file->physFSFile);
  98. break;
  99. }
  100. return 0;
  101. }
  102. long OSBasics::tell(OSFILE * stream) {
  103. switch(stream->fileType) {
  104. case OSFILE::TYPE_FILE:
  105. return ftell(stream->file);
  106. break;
  107. case OSFILE::TYPE_ARCHIVE_FILE:
  108. return PHYSFS_tell(stream->physFSFile);
  109. break;
  110. }
  111. return 0;
  112. }
  113. size_t OSBasics::read( void * ptr, size_t size, size_t count, OSFILE * stream ) {
  114. switch(stream->fileType) {
  115. case OSFILE::TYPE_FILE:
  116. return fread(ptr, size, count, stream->file);
  117. break;
  118. case OSFILE::TYPE_ARCHIVE_FILE:
  119. return PHYSFS_read(stream->physFSFile, ptr, size, count);
  120. break;
  121. }
  122. return 0;
  123. }
  124. size_t OSBasics::write( const void * ptr, size_t size, size_t count, OSFILE * stream ) {
  125. switch(stream->fileType) {
  126. case OSFILE::TYPE_FILE:
  127. fwrite(ptr, size, count, stream->file);
  128. break;
  129. case OSFILE::TYPE_ARCHIVE_FILE:
  130. PHYSFS_write(stream->physFSFile, ptr, size, count);
  131. break;
  132. }
  133. return 0;
  134. }
  135. int OSBasics::seek(OSFILE * stream, long int offset, int origin ) {
  136. switch(stream->fileType) {
  137. case OSFILE::TYPE_FILE:
  138. return fseek(stream->file, offset, origin);
  139. break;
  140. case OSFILE::TYPE_ARCHIVE_FILE:
  141. switch(origin) {
  142. case SEEK_SET:
  143. return PHYSFS_seek(stream->physFSFile, offset);
  144. break;
  145. case SEEK_CUR: {
  146. PHYSFS_sint64 curoffset = PHYSFS_tell(stream->physFSFile);
  147. return PHYSFS_seek(stream->physFSFile, curoffset+offset);
  148. }
  149. break;
  150. case SEEK_END: {
  151. PHYSFS_sint64 fileLength = PHYSFS_fileLength(stream->physFSFile);
  152. return PHYSFS_seek(stream->physFSFile, fileLength-offset);
  153. }
  154. break;
  155. }
  156. break;
  157. }
  158. return 0;
  159. }
  160. vector<OSFileEntry> OSBasics::parsePhysFSFolder(String pathString, bool showHidden) {
  161. vector<OSFileEntry> returnVector;
  162. char **rc = PHYSFS_enumerateFiles(pathString.c_str());
  163. char **i;
  164. String fullPath;
  165. String fname;
  166. for (i = rc; *i != NULL; i++) {
  167. fname = string(*i);
  168. fullPath = pathString + "/" + fname;
  169. printf("parsing in %s\n", *i);
  170. if((fname.c_str()[0] != '.' || (fname.c_str()[0] == '.' && showHidden)) && fname != "..") {
  171. if(PHYSFS_isDirectory(fullPath.c_str())) {
  172. returnVector.push_back(OSFileEntry(pathString, fname, OSFileEntry::TYPE_FOLDER));
  173. } else {
  174. returnVector.push_back(OSFileEntry(pathString, fname, OSFileEntry::TYPE_FILE));
  175. }
  176. }
  177. }
  178. PHYSFS_freeList(rc);
  179. return returnVector;
  180. }
  181. vector<OSFileEntry> OSBasics::parseFolder(String pathString, bool showHidden) {
  182. vector<OSFileEntry> returnVector;
  183. if(pathString.size() < 128) {
  184. if(PHYSFS_exists(pathString.c_str())) {
  185. if(PHYSFS_isDirectory(pathString.c_str())) {
  186. return parsePhysFSFolder(pathString, showHidden);
  187. }
  188. }
  189. }
  190. #ifdef _WINDOWS
  191. WIN32_FIND_DATA findFileData;
  192. WCHAR curDir[4096];
  193. GetCurrentDirectory(4096, curDir);
  194. WCHAR tmp[4096];
  195. memset(tmp, 0, sizeof(WCHAR)*4096);
  196. ctow(tmp, pathString.c_str());
  197. SetCurrentDirectory(tmp);
  198. HANDLE hFind = FindFirstFile((LPCWSTR)"*", &findFileData);
  199. if(hFind == INVALID_HANDLE_VALUE) {
  200. SetCurrentDirectory(curDir);
  201. return returnVector;
  202. }
  203. char fileName[260];
  204. do {
  205. memset(fileName, 0, 260);
  206. wtoc(fileName, findFileData.cFileName);
  207. String fname = string(fileName);
  208. if((fname.c_str()[0] != '.' || (fname.c_str()[0] == '.' && showHidden)) && fname != "..") {
  209. if( findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) {
  210. returnVector.push_back(OSFileEntry(pathString, fname, OSFileEntry::TYPE_FOLDER));
  211. } else {
  212. returnVector.push_back(OSFileEntry(pathString, fname, OSFileEntry::TYPE_FILE));
  213. }
  214. }
  215. } while(FindNextFile(hFind, &findFileData));
  216. FindClose(hFind);
  217. SetCurrentDirectory(curDir);
  218. #else
  219. DIR *d;
  220. struct dirent *dir;
  221. d = opendir(pathString.c_str());
  222. if(d) {
  223. while ((dir = readdir(d)) != NULL) {
  224. if(dir->d_name[0] != '.' || (dir->d_name[0] == '.' && showHidden)) {
  225. if(dir->d_type == DT_DIR) {
  226. returnVector.push_back(OSFileEntry(pathString, dir->d_name, OSFileEntry::TYPE_FOLDER));
  227. } else {
  228. returnVector.push_back(OSFileEntry(pathString, dir->d_name, OSFileEntry::TYPE_FILE));
  229. }
  230. }
  231. }
  232. closedir(d);
  233. }
  234. #endif
  235. return returnVector;
  236. }
  237. void OSBasics::createFolder(String pathString) {
  238. #ifdef _WINDOWS
  239. #else
  240. mkdir(pathString.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
  241. #endif
  242. }
  243. bool OSBasics::isFolder(String pathString) {
  244. bool retVal = false;
  245. #ifdef _WINDOWS
  246. #else
  247. DIR *d;
  248. d = opendir(pathString.c_str());
  249. if(d) {
  250. retVal = true;
  251. closedir(d);
  252. }
  253. #endif
  254. return retVal;
  255. }