1 2 /* 3 * Copyright 2006 The Android Open Source Project 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10 // TODO: add unittests for all these operations 11 12 #ifndef SkOSFile_DEFINED 13 #define SkOSFile_DEFINED 14 15 #include "SkString.h" 16 17 struct SkFILE; 18 19 enum SkFILE_Flags { 20 kRead_SkFILE_Flag = 0x01, 21 kWrite_SkFILE_Flag = 0x02 22 }; 23 24 #ifdef _WIN32 25 const static char SkPATH_SEPARATOR = '\\'; 26 #else 27 const static char SkPATH_SEPARATOR = '/'; 28 #endif 29 30 SkFILE* sk_fopen(const char path[], SkFILE_Flags); 31 void sk_fclose(SkFILE*); 32 33 size_t sk_fgetsize(SkFILE*); 34 /** Return true if the file could seek back to the beginning 35 */ 36 bool sk_frewind(SkFILE*); 37 38 size_t sk_fread(void* buffer, size_t byteCount, SkFILE*); 39 size_t sk_fwrite(const void* buffer, size_t byteCount, SkFILE*); 40 41 char* sk_fgets(char* str, int size, SkFILE* f); 42 43 void sk_fflush(SkFILE*); 44 45 bool sk_fseek(SkFILE*, size_t); 46 bool sk_fmove(SkFILE*, long); 47 size_t sk_ftell(SkFILE*); 48 49 /** Maps a file into memory. Returns the address and length on success, NULL otherwise. 50 * The mapping is read only. 51 * When finished with the mapping, free the returned pointer with sk_fmunmap. 52 */ 53 void* sk_fmmap(SkFILE* f, size_t* length); 54 55 /** Maps a file descriptor into memory. Returns the address and length on success, NULL otherwise. 56 * The mapping is read only. 57 * When finished with the mapping, free the returned pointer with sk_fmunmap. 58 */ 59 void* sk_fdmmap(int fd, size_t* length); 60 61 /** Unmaps a file previously mapped by sk_fmmap or sk_fdmmap. 62 * The length parameter must be the same as returned from sk_fmmap. 63 */ 64 void sk_fmunmap(const void* addr, size_t length); 65 66 /** Returns true if the two point at the exact same filesystem object. */ 67 bool sk_fidentical(SkFILE* a, SkFILE* b); 68 69 /** Returns the underlying file descriptor for the given file. 70 * The return value will be < 0 on failure. 71 */ 72 int sk_fileno(SkFILE* f); 73 74 /** Returns true if something (file, directory, ???) exists at this path, 75 * and has the specified access flags. 76 */ 77 bool sk_exists(const char *path, SkFILE_Flags = (SkFILE_Flags)0); 78 79 // Returns true if a directory exists at this path. 80 bool sk_isdir(const char *path); 81 82 // Have we reached the end of the file? 83 int sk_feof(SkFILE *); 84 85 86 // Create a new directory at this path; returns true if successful. 87 // If the directory already existed, this will return true. 88 // Description of the error, if any, will be written to stderr. 89 bool sk_mkdir(const char* path); 90 91 class SkOSFile { 92 public: 93 class Iter { 94 public: 95 Iter(); 96 Iter(const char path[], const char suffix[] = NULL); 97 ~Iter(); 98 99 void reset(const char path[], const char suffix[] = NULL); 100 /** If getDir is true, only returns directories. 101 Results are undefined if true and false calls are 102 interleaved on a single iterator. 103 */ 104 bool next(SkString* name, bool getDir = false); 105 106 static const size_t kStorageSize = 40; 107 private: 108 SkAlignedSStorage<kStorageSize> fSelf; 109 }; 110 }; 111 112 /** 113 * Functions for modifying SkStrings which represent paths on the filesystem. 114 */ 115 class SkOSPath { 116 public: 117 /** 118 * Assembles rootPath and relativePath into a single path, like this: 119 * rootPath/relativePath. 120 * It is okay to call with a NULL rootPath and/or relativePath. A path 121 * separator will still be inserted. 122 * 123 * Uses SkPATH_SEPARATOR, to work on all platforms. 124 */ 125 static SkString Join(const char* rootPath, const char* relativePath); 126 127 /** 128 * Return the name of the file, ignoring the directory structure. 129 * Behaves like python's os.path.basename. If the fullPath is 130 * /dir/subdir/, an empty string is returned. 131 * @param fullPath Full path to the file. 132 * @return SkString The basename of the file - anything beyond the 133 * final slash, or the full name if there is no slash. 134 */ 135 static SkString Basename(const char* fullPath); 136 137 /** 138 * Given a qualified file name returns the directory. 139 * Behaves like python's os.path.dirname. If the fullPath is 140 * /dir/subdir/ the return will be /dir/subdir/ 141 * @param fullPath Full path to the file. 142 * @return SkString The dir containing the file - anything preceding the 143 * final slash, or the full name if ending in a slash. 144 */ 145 static SkString Dirname(const char* fullPath); 146 }; 147 148 #endif 149