MacDirectory.mm
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:3k
源码类别:

OpenGL

开发平台:

Visual C++

  1. //
  2. // MacDirectory.mm
  3. // celestia
  4. //
  5. // Created by Da Woon Jung on Sun Apr 24 2004.
  6. // Copyright (c) 2005 Chris Laurel. All rights reserved.
  7. //
  8. // This program is free software; you can redistribute it and/or
  9. // modify it under the terms of the GNU General Public License
  10. // as published by the Free Software Foundation; either version 2
  11. // of the License, or (at your option) any later version.
  12. #include <dirent.h>
  13. #import "directory.h"
  14. #import "NSString_ObjCPlusPlus.h"
  15. class MacDirectory : public Directory
  16. {
  17. public:
  18.     MacDirectory(NSString *dirName);
  19.     virtual ~MacDirectory();
  20.     
  21.     bool nextFile(std::string &);
  22.     bool enumFiles(EnumFilesHandler &handler, bool deep);
  23.     enum {
  24.         DirGood = 0,
  25.         DirBad = 1
  26.     };
  27.     
  28. private:
  29.     char *_dirstring;
  30.     int _status;
  31.     DIR *_dir;
  32. };
  33. MacDirectory::MacDirectory(NSString *dirName) :
  34. _status(DirGood), _dir(NULL)
  35. {
  36.     NSString *fullPath = [dirName stringByStandardizingPath];
  37.     const char *fullPathStr = [fullPath UTF8String];
  38.     unsigned dirNameLen = CFStringGetMaximumSizeForEncoding([fullPath length], kCFStringEncodingUTF8);
  39.     if (dirNameLen > 0)
  40.     {
  41.         _dirstring = (char *)calloc(dirNameLen+sizeof(char), 1);
  42.         strncpy(_dirstring, fullPathStr, dirNameLen/sizeof(char));
  43.     }
  44.     else
  45.         _dirstring = NULL;
  46. }
  47. MacDirectory::~MacDirectory()
  48. {
  49.     if (_dir != NULL)
  50.     {
  51.         closedir(_dir);
  52.         _dir = NULL;
  53.     }
  54.     if (_dirstring)
  55.         free(_dirstring);
  56. }
  57. bool MacDirectory::nextFile(std::string &filename)
  58. {
  59.     if (_status != DirGood)
  60.         return false;
  61.     
  62.     if (_dir == NULL)
  63.     {
  64.         _dir = opendir(_dirstring);
  65.         if (_dir == NULL)
  66.         {
  67.             _status = DirBad;
  68.             return false;
  69.         }
  70.     }
  71.     
  72.     struct dirent *ent = readdir(_dir);
  73.     if (ent == NULL)
  74.     {
  75.         _status = DirBad;
  76.         return false;
  77.     }
  78.     else
  79.     {
  80.         filename = ent->d_name;
  81.         return true;
  82.     }
  83. }
  84. bool MacDirectory::enumFiles(EnumFilesHandler &handler, bool deep)
  85. {
  86.     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  87.     bool result = Directory::enumFiles(handler, deep);
  88.     [pool release];
  89.     return result;
  90. }
  91. std::string WordExp(const std::string &filename)
  92. {
  93.     NSString *expandedPath = [[NSString stringWithStdString: filename] stringByStandardizingPath];
  94.     return [expandedPath stdString];
  95. }
  96. Directory* OpenDirectory(const std::string &dirname)
  97. {
  98.     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  99.     Directory *result = new MacDirectory([NSString stringWithStdString: dirname]);
  100.     [pool release];
  101.     return result;
  102. }
  103. bool IsDirectory(const std::string &filename)
  104. {
  105.     BOOL isDir = NO;
  106.     return [[NSFileManager defaultManager] fileExistsAtPath:[NSString stringWithStdString: filename] isDirectory:&isDir] && isDir;
  107. }