• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2006 The Android Open Source Project
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 
9 // TODO: add unittests for all these operations
10 
11 #ifndef SkOSFile_DEFINED
12 #define SkOSFile_DEFINED
13 
14 #include <stdio.h>
15 
16 #include "include/core/SkString.h"
17 #include "include/private/SkTemplates.h"
18 
19 enum SkFILE_Flags {
20     kRead_SkFILE_Flag    = 0x01,
21     kWrite_SkFILE_Flag   = 0x02,
22     kAppend_SkFILE_Flag  = 0x04
23 };
24 
25 FILE* sk_fopen(const char path[], SkFILE_Flags);
26 void    sk_fclose(FILE*);
27 
28 size_t  sk_fgetsize(FILE*);
29 
30 size_t  sk_fwrite(const void* buffer, size_t byteCount, FILE*);
31 
32 void    sk_fflush(FILE*);
33 void    sk_fsync(FILE*);
34 
35 size_t  sk_ftell(FILE*);
36 
37 /** Maps a file into memory. Returns the address and length on success, NULL otherwise.
38  *  The mapping is read only.
39  *  When finished with the mapping, free the returned pointer with sk_fmunmap.
40  */
41 void*   sk_fmmap(FILE* f, size_t* length);
42 
43 /** Maps a file descriptor into memory. Returns the address and length on success, NULL otherwise.
44  *  The mapping is read only.
45  *  When finished with the mapping, free the returned pointer with sk_fmunmap.
46  */
47 void*   sk_fdmmap(int fd, size_t* length);
48 
49 /** Unmaps a file previously mapped by sk_fmmap or sk_fdmmap.
50  *  The length parameter must be the same as returned from sk_fmmap.
51  */
52 void    sk_fmunmap(const void* addr, size_t length);
53 
54 /** Returns true if the two point at the exact same filesystem object. */
55 bool    sk_fidentical(FILE* a, FILE* b);
56 
57 /** Returns the underlying file descriptor for the given file.
58  *  The return value will be < 0 on failure.
59  */
60 int     sk_fileno(FILE* f);
61 
62 /** Returns true if something (file, directory, ???) exists at this path,
63  *  and has the specified access flags.
64  */
65 bool    sk_exists(const char *path, SkFILE_Flags = (SkFILE_Flags)0);
66 
67 // Returns true if a directory exists at this path.
68 bool    sk_isdir(const char *path);
69 
70 // Like pread, but may affect the file position marker.
71 // Returns the number of bytes read or SIZE_MAX if failed.
72 size_t sk_qread(FILE*, void* buffer, size_t count, size_t offset);
73 
74 
75 // Create a new directory at this path; returns true if successful.
76 // If the directory already existed, this will return true.
77 // Description of the error, if any, will be written to stderr.
78 bool    sk_mkdir(const char* path);
79 
80 class SkOSFile {
81 public:
82     class Iter {
83     public:
84         // SPI for module use.
85         SK_SPI Iter();
86         SK_SPI Iter(const char path[], const char suffix[] = nullptr);
87         SK_SPI ~Iter();
88 
89         SK_SPI void reset(const char path[], const char suffix[] = nullptr);
90         /** If getDir is true, only returns directories.
91             Results are undefined if true and false calls are
92             interleaved on a single iterator.
93         */
94         SK_SPI bool next(SkString* name, bool getDir = false);
95 
96         static const size_t kStorageSize = 40;
97     private:
98         alignas(void*) alignas(double) char fSelf[kStorageSize];
99     };
100 };
101 
102 #endif
103