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