|
1 |
| -/**** |
2 |
| - * Sming Framework Project - Open Source framework for high efficiency native ESP8266 development. |
3 |
| - * Created 2015 by Skurydin Alexey |
4 |
| - * http://github.com/anakod/Sming |
5 |
| - * All files of the Sming Core are provided under the LGPL v3 license. |
6 |
| - ****/ |
7 |
| - |
| 1 | +/* |
| 2 | + FileSystem.cpp - SPIFS implementation for esp8266 |
| 3 | +
|
| 4 | + Copyright (c) 2015 Hristo Gochkov. All rights reserved. |
| 5 | + This file is part of the esp8266 core for Arduino environment. |
| 6 | + |
| 7 | + This library is free software; you can redistribute it and/or |
| 8 | + modify it under the terms of the GNU Lesser General Public |
| 9 | + License as published by the Free Software Foundation; either |
| 10 | + version 2.1 of the License, or (at your option) any later version. |
| 11 | +
|
| 12 | + This library is distributed in the hope that it will be useful, |
| 13 | + but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 14 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 15 | + Lesser General Public License for more details. |
| 16 | +
|
| 17 | + You should have received a copy of the GNU Lesser General Public |
| 18 | + License along with this library; if not, write to the Free Software |
| 19 | + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
| 20 | +*/ |
8 | 21 | #include "FileSystem.h"
|
9 |
| -#include "WString.h" |
| 22 | +#include "Arduino.h" |
| 23 | + |
| 24 | +boolean FSClass::mount(){ |
| 25 | + if(_mounted) return true; |
| 26 | + _mounted = spiffs_mount(); |
| 27 | + return _mounted; |
| 28 | +} |
| 29 | + |
| 30 | +void FSClass::unmount(){ |
| 31 | + if(!_mounted) return; |
| 32 | + spiffs_unmount(); |
| 33 | + _mounted = false; |
| 34 | +} |
| 35 | + |
| 36 | +boolean FSClass::format(){ |
| 37 | + return spiffs_format(); |
| 38 | +} |
| 39 | + |
| 40 | +boolean FSClass::exists(const char *filename){ |
| 41 | + spiffs_stat stat = {0}; |
| 42 | + if (SPIFFS_stat(&_filesystemStorageHandle, filename, &stat) < 0) return false; |
| 43 | + return stat.name[0] != '\0'; |
| 44 | +} |
10 | 45 |
|
11 |
| -file_t fileOpen(const String name, FileOpenFlags flags) |
12 |
| -{ |
| 46 | +boolean FSClass::create(const char *filepath){ |
| 47 | + return SPIFFS_creat(&_filesystemStorageHandle, filepath, 0) == 0; |
| 48 | +} |
| 49 | + |
| 50 | +boolean FSClass::remove(const char *filepath){ |
| 51 | + return SPIFFS_remove(&_filesystemStorageHandle, filepath) == 0; |
| 52 | +} |
| 53 | + |
| 54 | +boolean FSClass::rename(const char *filename, const char *newname){ |
| 55 | + return SPIFFS_rename(&_filesystemStorageHandle, filename, newname) == 0; |
| 56 | +} |
| 57 | + |
| 58 | +FSFile FSClass::open(const char *filename, uint8_t mode){ |
13 | 59 | int repeats = 0;
|
14 | 60 | bool notExist;
|
15 |
| - bool canRecreate = (flags & eFO_CreateIfNotExist) == eFO_CreateIfNotExist; |
| 61 | + bool canRecreate = (mode & SPIFFS_CREAT) == SPIFFS_CREAT; |
16 | 62 | int res;
|
17 | 63 |
|
18 |
| - do |
19 |
| - { |
20 |
| - notExist = false; |
21 |
| - res = SPIFFS_open(&_filesystemStorageHandle, name.c_str(), (spiffs_flags)flags, 0); |
22 |
| - int code = SPIFFS_errno(&_filesystemStorageHandle); |
23 |
| - if (res < 0) |
24 |
| - { |
25 |
| - debugf("open errno %d\n", code); |
26 |
| - notExist = (code == SPIFFS_ERR_NOT_FOUND || code == SPIFFS_ERR_DELETED || code == SPIFFS_ERR_FILE_DELETED || code == SPIFFS_ERR_IS_FREE); |
27 |
| - //debugf("recreate? %d %d %d", notExist, canRecreate, (repeats < 3)); |
28 |
| - if (notExist && canRecreate) |
29 |
| - fileDelete(name); // fix for deleted files |
30 |
| - } |
| 64 | + do{ |
| 65 | + notExist = false; |
| 66 | + res = SPIFFS_open(&_filesystemStorageHandle, filename, (spiffs_flags)mode, 0); |
| 67 | + int code = SPIFFS_errno(&_filesystemStorageHandle); |
| 68 | + if (res < 0){ |
| 69 | + debugf("open errno %d\n", code); |
| 70 | + notExist = (code == SPIFFS_ERR_NOT_FOUND || code == SPIFFS_ERR_DELETED || code == SPIFFS_ERR_FILE_DELETED || code == SPIFFS_ERR_IS_FREE); |
| 71 | + if (notExist && canRecreate) |
| 72 | + remove(filename); // fix for deleted files |
| 73 | + } |
31 | 74 | } while (notExist && canRecreate && repeats++ < 3);
|
32 |
| - |
33 |
| - return res; |
| 75 | + |
| 76 | + if(res){ |
| 77 | + return FSFile(res); |
| 78 | + } |
| 79 | + return FSFile(); |
34 | 80 | }
|
35 | 81 |
|
36 |
| -void fileClose(file_t file) |
37 |
| -{ |
38 |
| - SPIFFS_close(&_filesystemStorageHandle, file); |
| 82 | +FSClass FS; |
| 83 | + |
| 84 | +FSFile::FSFile(){ |
| 85 | + _file = 0; |
| 86 | + _stats = {0}; |
39 | 87 | }
|
40 | 88 |
|
41 |
| -size_t fileWrite(file_t file, const void* data, size_t size) |
42 |
| -{ |
43 |
| - int res = SPIFFS_write(&_filesystemStorageHandle, file, (void *)data, size); |
44 |
| - if (res < 0) |
45 |
| - { |
46 |
| - debugf("write errno %d\n", SPIFFS_errno(&_filesystemStorageHandle)); |
47 |
| - return res; |
| 89 | +FSFile::FSFile(file_t f){ |
| 90 | + _file = f; |
| 91 | + if(SPIFFS_fstat(&_filesystemStorageHandle, _file, &_stats) != 0){ |
| 92 | + debugf("mount errno %d\n", SPIFFS_errno(&_filesystemStorageHandle)); |
48 | 93 | }
|
49 |
| - return res; |
50 | 94 | }
|
51 | 95 |
|
52 |
| -size_t fileRead(file_t file, void* data, size_t size) |
53 |
| -{ |
54 |
| - int res = SPIFFS_read(&_filesystemStorageHandle, file, data, size); |
55 |
| - if (res < 0) |
56 |
| - { |
57 |
| - debugf("read errno %d\n", SPIFFS_errno(&_filesystemStorageHandle)); |
58 |
| - return res; |
59 |
| - } |
60 |
| - return res; |
| 96 | +void FSFile::close(){ |
| 97 | + if (! _file) return; |
| 98 | + SPIFFS_close(&_filesystemStorageHandle, _file); |
| 99 | + _file = 0; |
61 | 100 | }
|
62 | 101 |
|
63 |
| -int fileSeek(file_t file, int offset, SeekOriginFlags origin) |
64 |
| -{ |
65 |
| - return SPIFFS_lseek(&_filesystemStorageHandle, file, offset, origin); |
| 102 | +uint32_t FSFile::size(){ |
| 103 | + if(! _file) return 0; |
| 104 | + uint32_t pos = SPIFFS_tell(&_filesystemStorageHandle, _file); |
| 105 | + SPIFFS_lseek(&_filesystemStorageHandle, _file, 0, SPIFFS_SEEK_END); |
| 106 | + uint32_t size = SPIFFS_tell(&_filesystemStorageHandle, _file); |
| 107 | + SPIFFS_lseek(&_filesystemStorageHandle, _file, pos, SPIFFS_SEEK_SET); |
| 108 | + return size; |
66 | 109 | }
|
67 | 110 |
|
68 |
| -bool fileIsEOF(file_t file) |
69 |
| -{ |
70 |
| - return SPIFFS_eof(&_filesystemStorageHandle, file); |
| 111 | +uint32_t FSFile::seek(uint32_t pos){ |
| 112 | + if (! _file) return 0; |
| 113 | + return SPIFFS_lseek(&_filesystemStorageHandle, _file, pos, SPIFFS_SEEK_SET); |
71 | 114 | }
|
72 | 115 |
|
73 |
| -int32_t fileTell(file_t file) |
74 |
| -{ |
75 |
| - return SPIFFS_tell(&_filesystemStorageHandle, file); |
| 116 | +uint32_t FSFile::position(){ |
| 117 | + if (! _file) return 0; |
| 118 | + return SPIFFS_tell(&_filesystemStorageHandle, _file); |
76 | 119 | }
|
77 | 120 |
|
78 |
| -int fileFlush(file_t file) |
79 |
| -{ |
80 |
| - return SPIFFS_fflush(&_filesystemStorageHandle, file); |
| 121 | +boolean FSFile::eof(){ |
| 122 | + if (! _file) return 0; |
| 123 | + return SPIFFS_eof(&_filesystemStorageHandle, _file); |
81 | 124 | }
|
82 | 125 |
|
83 |
| -int fileStats(const String name, spiffs_stat *stat) |
84 |
| -{ |
85 |
| - return SPIFFS_stat(&_filesystemStorageHandle, name.c_str(), stat); |
| 126 | +boolean FSFile::isDirectory(void){ |
| 127 | + return false; |
86 | 128 | }
|
87 | 129 |
|
88 |
| -int fileStats(file_t file, spiffs_stat *stat) |
89 |
| -{ |
90 |
| - return SPIFFS_fstat(&_filesystemStorageHandle, file, stat); |
| 130 | +int FSFile::read(void *buf, uint16_t nbyte){ |
| 131 | + if (! _file) return -1; |
| 132 | + return SPIFFS_read(&_filesystemStorageHandle, _file, buf, nbyte); |
91 | 133 | }
|
92 | 134 |
|
93 |
| -void fileDelete(const String name) |
94 |
| -{ |
95 |
| - SPIFFS_remove(&_filesystemStorageHandle, name.c_str()); |
| 135 | +int FSFile::read(){ |
| 136 | + if (! _file) return -1; |
| 137 | + int val; |
| 138 | + if(SPIFFS_read(&_filesystemStorageHandle, _file, &val, 1) != 1) return -1; |
| 139 | + return val; |
96 | 140 | }
|
97 | 141 |
|
98 |
| -void fileDelete(file_t file) |
99 |
| -{ |
100 |
| - SPIFFS_fremove(&_filesystemStorageHandle, file); |
| 142 | +int FSFile::peek() { |
| 143 | + if (! _file) return 0; |
| 144 | + int c = read(); |
| 145 | + SPIFFS_lseek(&_filesystemStorageHandle, _file, -1, SPIFFS_SEEK_CUR); |
| 146 | + return c; |
101 | 147 | }
|
102 | 148 |
|
103 |
| -bool fileExist(const String name) |
104 |
| -{ |
105 |
| - spiffs_stat stat = {0}; |
106 |
| - if (fileStats(name.c_str(), &stat) < 0) return false; |
107 |
| - return stat.name[0] != '\0'; |
| 149 | +int FSFile::available() { |
| 150 | + if (! _file) return 0; |
| 151 | + uint32_t pos = SPIFFS_tell(&_filesystemStorageHandle, _file); |
| 152 | + SPIFFS_lseek(&_filesystemStorageHandle, _file, 0, SPIFFS_SEEK_END); |
| 153 | + uint32_t size = SPIFFS_tell(&_filesystemStorageHandle, _file); |
| 154 | + SPIFFS_lseek(&_filesystemStorageHandle, _file, pos, SPIFFS_SEEK_SET); |
| 155 | + return size - pos; |
| 156 | +} |
| 157 | + |
| 158 | +size_t FSFile::write(const uint8_t *buf, size_t size){ |
| 159 | + if (! _file) return 0; |
| 160 | + return SPIFFS_write(&_filesystemStorageHandle, _file, (uint8_t *)buf, size); |
| 161 | +} |
| 162 | + |
| 163 | +size_t FSFile::write(uint8_t val) { |
| 164 | + if (! _file) return 0; |
| 165 | + return write(&val, 1); |
108 | 166 | }
|
109 | 167 |
|
| 168 | +void FSFile::flush(){ |
| 169 | + if (! _file) return; |
| 170 | + SPIFFS_fflush(&_filesystemStorageHandle, _file); |
| 171 | +} |
110 | 172 |
|
111 |
| -int fileLastError(file_t fd) |
112 |
| -{ |
| 173 | +uint32_t FSFile::remove(){ |
| 174 | + if (! _file) return 0; |
| 175 | + return SPIFFS_fremove(&_filesystemStorageHandle, _file); |
| 176 | + _file = 0; |
| 177 | +} |
| 178 | + |
| 179 | +int FSFile::lastError(){ |
113 | 180 | return SPIFFS_errno(&_filesystemStorageHandle);
|
114 | 181 | }
|
115 | 182 |
|
116 |
| -void fileClearLastError(file_t fd) |
117 |
| -{ |
| 183 | +void FSFile::clearError(){ |
118 | 184 | _filesystemStorageHandle.errno = SPIFFS_OK;
|
119 | 185 | }
|
120 | 186 |
|
121 |
| -void fileSetContent(const String fileName, const char *content) |
122 |
| -{ |
123 |
| - file_t file = fileOpen(fileName.c_str(), eFO_CreateNewAlways | eFO_WriteOnly); |
124 |
| - fileWrite(file, content, os_strlen(content)); |
125 |
| - fileClose(file); |
126 |
| -} |
127 |
| - |
128 |
| -uint32_t fileGetSize(const String fileName) |
129 |
| -{ |
130 |
| - file_t file = fileOpen(fileName.c_str(), eFO_ReadOnly); |
131 |
| - // Get size |
132 |
| - fileSeek(file, 0, eSO_FileEnd); |
133 |
| - int size = fileTell(file); |
134 |
| - fileClose(file); |
135 |
| - return size; |
136 |
| -} |
137 |
| - |
138 |
| -String fileGetContent(const String fileName) |
139 |
| -{ |
140 |
| - file_t file = fileOpen(fileName.c_str(), eFO_ReadOnly); |
141 |
| - // Get size |
142 |
| - fileSeek(file, 0, eSO_FileEnd); |
143 |
| - int size = fileTell(file); |
144 |
| - if (size <= 0) |
145 |
| - { |
146 |
| - fileClose(file); |
147 |
| - return ""; |
148 |
| - } |
149 |
| - fileSeek(file, 0, eSO_FileStart); |
150 |
| - char* buffer = new char[size + 1]; |
151 |
| - buffer[size] = 0; |
152 |
| - fileRead(file, buffer, size); |
153 |
| - fileClose(file); |
154 |
| - String res = buffer; |
155 |
| - delete[] buffer; |
156 |
| - return res; |
157 |
| -} |
158 |
| - |
159 |
| -int fileGetContent(const String fileName, char* buffer, int bufSize) |
160 |
| -{ |
161 |
| - if (buffer == NULL || bufSize == 0) return 0; |
162 |
| - *buffer = 0; |
163 |
| - |
164 |
| - file_t file = fileOpen(fileName.c_str(), eFO_ReadOnly); |
165 |
| - // Get size |
166 |
| - fileSeek(file, 0, eSO_FileEnd); |
167 |
| - int size = fileTell(file); |
168 |
| - if (size <= 0 || bufSize <= size) |
169 |
| - { |
170 |
| - fileClose(file); |
171 |
| - return 0; |
172 |
| - } |
173 |
| - buffer[size] = 0; |
174 |
| - fileSeek(file, 0, eSO_FileStart); |
175 |
| - fileRead(file, buffer, size); |
176 |
| - fileClose(file); |
177 |
| - return size; |
| 187 | +char * FSFile::name(){ |
| 188 | + return 0; |
| 189 | +} |
| 190 | + |
| 191 | + |
| 192 | + |
| 193 | + |
| 194 | + |
| 195 | + |
| 196 | +/* |
| 197 | +spiffs_DIR *dirOpen(spiffs_DIR *d){ |
| 198 | + return SPIFFS_opendir(&_filesystemStorageHandle, 0, d); |
| 199 | +} |
| 200 | +
|
| 201 | +int dirClose(spiffs_DIR *d){ |
| 202 | + return SPIFFS_closedir(d); |
| 203 | +} |
| 204 | +
|
| 205 | +file_t dirOpenFile(spiffs_dirent* entry, uint8_t flags){ |
| 206 | + return SPIFFS_open_by_dirent(&_filesystemStorageHandle, entry, (spiffs_flags)flags, 0); |
178 | 207 | }
|
| 208 | +*/ |
0 commit comments