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