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#if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_UNIX) || defined(SK_BUILD_FOR_ANDROID) || defined(SK_BUILD_FOR_IOS)
18    #include <dirent.h>
19#endif
20
21#include <stddef.h> // ptrdiff_t
22
23struct SkFILE;
24
25enum SkFILE_Flags {
26    kRead_SkFILE_Flag   = 0x01,
27    kWrite_SkFILE_Flag  = 0x02
28};
29
30#ifdef _WIN32
31const static char SkPATH_SEPARATOR = '\\';
32#else
33const static char SkPATH_SEPARATOR = '/';
34#endif
35
36SkFILE* sk_fopen(const char path[], SkFILE_Flags);
37void    sk_fclose(SkFILE*);
38
39size_t  sk_fgetsize(SkFILE*);
40/** Return true if the file could seek back to the beginning
41*/
42bool    sk_frewind(SkFILE*);
43
44size_t  sk_fread(void* buffer, size_t byteCount, SkFILE*);
45size_t  sk_fwrite(const void* buffer, size_t byteCount, SkFILE*);
46
47char*   sk_fgets(char* str, int size, SkFILE* f);
48
49void    sk_fflush(SkFILE*);
50
51int     sk_fseek(SkFILE*, size_t, int);
52size_t  sk_ftell(SkFILE*);
53
54// Returns true if something (file, directory, ???) exists at this path.
55bool    sk_exists(const char *path);
56
57// Returns true if a directory exists at this path.
58bool    sk_isdir(const char *path);
59
60// Have we reached the end of the file?
61int sk_feof(SkFILE *);
62
63
64// Create a new directory at this path; returns true if successful.
65// If the directory already existed, this will return true.
66// Description of the error, if any, will be written to stderr.
67bool    sk_mkdir(const char* path);
68
69class SkOSFile {
70public:
71    class Iter {
72    public:
73        Iter();
74        Iter(const char path[], const char suffix[] = NULL);
75        ~Iter();
76
77        void reset(const char path[], const char suffix[] = NULL);
78        /** If getDir is true, only returns directories.
79            Results are undefined if true and false calls are
80            interleaved on a single iterator.
81        */
82        bool next(SkString* name, bool getDir = false);
83
84    private:
85#ifdef SK_BUILD_FOR_WIN
86        HANDLE      fHandle;
87        uint16_t*   fPath16;
88#elif defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_UNIX) || defined(SK_BUILD_FOR_ANDROID) || defined(SK_BUILD_FOR_IOS)
89        DIR*        fDIR;
90        SkString    fPath, fSuffix;
91#endif
92    };
93};
94
95class SkUTF16_Str {
96public:
97    SkUTF16_Str(const char src[]);
98    ~SkUTF16_Str()
99    {
100        sk_free(fStr);
101    }
102    const uint16_t* get() const { return fStr; }
103
104private:
105    uint16_t*   fStr;
106};
107
108#endif
109