aboutsummaryrefslogtreecommitdiff
path: root/libraries/SD/File.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/SD/File.cpp')
-rw-r--r--libraries/SD/File.cpp150
1 files changed, 150 insertions, 0 deletions
diff --git a/libraries/SD/File.cpp b/libraries/SD/File.cpp
new file mode 100644
index 0000000..88d9e9a
--- /dev/null
+++ b/libraries/SD/File.cpp
@@ -0,0 +1,150 @@
+/*
+
+ SD - a slightly more friendly wrapper for sdfatlib
+
+ This library aims to expose a subset of SD card functionality
+ in the form of a higher level "wrapper" object.
+
+ License: GNU General Public License V3
+ (Because sdfatlib is licensed with this.)
+
+ (C) Copyright 2010 SparkFun Electronics
+
+ */
+
+#include <SD.h>
+
+/* for debugging file open/close leaks
+ uint8_t nfilecount=0;
+*/
+
+File::File(SdFile f, const char *n) {
+ // oh man you are kidding me, new() doesnt exist? Ok we do it by hand!
+ _file = (SdFile *)malloc(sizeof(SdFile));
+ if (_file) {
+ memcpy(_file, &f, sizeof(SdFile));
+
+ strncpy(_name, n, 12);
+ _name[12] = 0;
+
+ /* for debugging file open/close leaks
+ nfilecount++;
+ Serial.print("Created \"");
+ Serial.print(n);
+ Serial.print("\": ");
+ Serial.println(nfilecount, DEC);
+ */
+ }
+}
+
+File::File(void) {
+ _file = 0;
+ _name[0] = 0;
+ //Serial.print("Created empty file object");
+}
+
+File::~File(void) {
+ // Serial.print("Deleted file object");
+}
+
+// returns a pointer to the file name
+char *File::name(void) {
+ return _name;
+}
+
+// a directory is a special type of file
+boolean File::isDirectory(void) {
+ return (_file && _file->isDir());
+}
+
+
+size_t File::write(uint8_t val) {
+ return write(&val, 1);
+}
+
+size_t File::write(const uint8_t *buf, size_t size) {
+ size_t t;
+ if (!_file) {
+ setWriteError();
+ return 0;
+ }
+ _file->clearWriteError();
+ t = _file->write(buf, size);
+ if (_file->getWriteError()) {
+ setWriteError();
+ return 0;
+ }
+ return t;
+}
+
+int File::peek() {
+ if (! _file)
+ return 0;
+
+ int c = _file->read();
+ if (c != -1) _file->seekCur(-1);
+ return c;
+}
+
+int File::read() {
+ if (_file)
+ return _file->read();
+ return -1;
+}
+
+// buffered read for more efficient, high speed reading
+int File::read(void *buf, uint16_t nbyte) {
+ if (_file)
+ return _file->read(buf, nbyte);
+ return 0;
+}
+
+int File::available() {
+ if (! _file) return 0;
+
+ uint32_t n = size() - position();
+
+ return n > 0X7FFF ? 0X7FFF : n;
+}
+
+void File::flush() {
+ if (_file)
+ _file->sync();
+}
+
+boolean File::seek(uint32_t pos) {
+ if (! _file) return false;
+
+ return _file->seekSet(pos);
+}
+
+uint32_t File::position() {
+ if (! _file) return -1;
+ return _file->curPosition();
+}
+
+uint32_t File::size() {
+ if (! _file) return 0;
+ return _file->fileSize();
+}
+
+void File::close() {
+ if (_file) {
+ _file->close();
+ free(_file);
+ _file = 0;
+
+ /* for debugging file open/close leaks
+ nfilecount--;
+ Serial.print("Deleted ");
+ Serial.println(nfilecount, DEC);
+ */
+ }
+}
+
+File::operator bool() {
+ if (_file)
+ return _file->isOpen();
+ return false;
+}
+