180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2006 The Android Open Source Project
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger// TODO: add unittests for all these operations
11363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef SkOSFile_DEFINED
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkOSFile_DEFINED
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkString.h"
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_UNIX) || defined(SK_BUILD_FOR_ANDROID) || defined(SK_BUILD_FOR_IOS)
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    #include <dirent.h>
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
21d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger#include <stddef.h> // ptrdiff_t
22d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustruct SkFILE;
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruenum SkFILE_Flags {
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    kRead_SkFILE_Flag   = 0x01,
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    kWrite_SkFILE_Flag  = 0x02
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
30363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#ifdef _WIN32
31363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerconst static char SkPATH_SEPARATOR = '\\';
32363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#else
33363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerconst static char SkPATH_SEPARATOR = '/';
34363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#endif
35363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkFILE* sk_fopen(const char path[], SkFILE_Flags);
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid    sk_fclose(SkFILE*);
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querusize_t  sk_fgetsize(SkFILE*);
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** Return true if the file could seek back to the beginning
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru*/
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool    sk_frewind(SkFILE*);
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querusize_t  sk_fread(void* buffer, size_t byteCount, SkFILE*);
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querusize_t  sk_fwrite(const void* buffer, size_t byteCount, SkFILE*);
46d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
47d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenbergerchar*   sk_fgets(char* str, int size, SkFILE* f);
48d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid    sk_fflush(SkFILE*);
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerbool    sk_fseek(SkFILE*, size_t);
5258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerbool    sk_fmove(SkFILE*, long);
53d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenbergersize_t  sk_ftell(SkFILE*);
5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger/** Maps a file into memory. Returns the address and length on success, NULL otherwise.
5658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger *  The mapping is read only.
5758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger *  When finished with the mapping, free the returned pointer with sk_fmunmap.
5858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger */
5958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergervoid*   sk_fmmap(SkFILE* f, size_t* length);
6058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
6158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger/** Maps a file descriptor into memory. Returns the address and length on success, NULL otherwise.
6258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger *  The mapping is read only.
6358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger *  When finished with the mapping, free the returned pointer with sk_fmunmap.
6458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger */
6558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergervoid*   sk_fdmmap(int fd, size_t* length);
6658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
6758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger/** Unmaps a file previously mapped by sk_fmmap or sk_fdmmap.
6858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger *  The length parameter must be the same as returned from sk_fmmap.
6958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger */
7058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergervoid    sk_fmunmap(const void* addr, size_t length);
7158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
7258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger/** Returns true if the two point at the exact same filesystem object. */
7358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerbool    sk_fidentical(SkFILE* a, SkFILE* b);
7458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
7558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger/** Returns the underlying file descriptor for the given file.
7658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger *  The return value will be < 0 on failure.
7758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger */
7858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerint     sk_fileno(SkFILE* f);
7958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
80363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger// Returns true if something (file, directory, ???) exists at this path.
81363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerbool    sk_exists(const char *path);
82363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
83363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger// Returns true if a directory exists at this path.
84363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerbool    sk_isdir(const char *path);
85363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
86d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger// Have we reached the end of the file?
87d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenbergerint sk_feof(SkFILE *);
88d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
89d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
90363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger// Create a new directory at this path; returns true if successful.
91363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger// If the directory already existed, this will return true.
92363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger// Description of the error, if any, will be written to stderr.
93363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerbool    sk_mkdir(const char* path);
94363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkOSFile {
9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    class Iter {
9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    public:
9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        Iter();
10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        Iter(const char path[], const char suffix[] = NULL);
10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        ~Iter();
10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        void reset(const char path[], const char suffix[] = NULL);
10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        /** If getDir is true, only returns directories.
10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            Results are undefined if true and false calls are
10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            interleaved on a single iterator.
10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        */
10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        bool next(SkString* name, bool getDir = false);
10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    private:
11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_BUILD_FOR_WIN
11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        HANDLE      fHandle;
11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        uint16_t*   fPath16;
11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#elif defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_UNIX) || defined(SK_BUILD_FOR_ANDROID) || defined(SK_BUILD_FOR_IOS)
11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        DIR*        fDIR;
11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkString    fPath, fSuffix;
11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    };
11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
12180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkUTF16_Str {
12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkUTF16_Str(const char src[]);
12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    ~SkUTF16_Str()
12580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    {
12680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        sk_free(fStr);
12780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const uint16_t* get() const { return fStr; }
12980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
13080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint16_t*   fStr;
13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
13380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
13458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger/**
13558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger *  Functions for modifying SkStrings which represent paths on the filesystem.
13658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger */
13758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerclass SkOSPath {
13858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerpublic:
13958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    /**
14058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     * Assembles rootPath and relativePath into a single path, like this:
14158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     * rootPath/relativePath.
14258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     * It is okay to call with a NULL rootPath and/or relativePath. A path
14358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     * separator will still be inserted.
14458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *
14558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     * Uses SkPATH_SEPARATOR, to work on all platforms.
14658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     */
14758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    static SkString SkPathJoin(const char *rootPath, const char *relativePath);
14858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
14958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    /**
15058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *  Return the name of the file, ignoring the directory structure.
15158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *  Behaves like python's os.path.basename. If the fullPath is
15258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *  /dir/subdir/, an empty string is returned.
15358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *  @param fullPath Full path to the file.
15458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *  @return SkString The basename of the file - anything beyond the
15558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *      final slash, or the full name if there is no slash.
15658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     */
15758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    static SkString SkBasename(const char* fullPath);
15858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger};
15980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
160