aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/api/filereader/local
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Wasabi/api/filereader/local')
-rw-r--r--Src/Wasabi/api/filereader/local/fileread.cpp132
-rw-r--r--Src/Wasabi/api/filereader/local/fileread.h23
2 files changed, 155 insertions, 0 deletions
diff --git a/Src/Wasabi/api/filereader/local/fileread.cpp b/Src/Wasabi/api/filereader/local/fileread.cpp
new file mode 100644
index 00000000..f1107f47
--- /dev/null
+++ b/Src/Wasabi/api/filereader/local/fileread.cpp
@@ -0,0 +1,132 @@
+#include <precomp.h>
+#include "fileread.h"
+#include <api/service/svc_enum.h>
+
+void *FileReaders::open(const wchar_t *filename, const wchar_t *mode) {
+ int m=0;
+
+ const wchar_t *p=mode;
+ wchar_t c;
+ while(c=*(p++))
+ {
+ switch(c)
+ {
+ case 'r': m=SvcFileReader::READ; break;
+ case 'w': m=SvcFileReader::WRITE; break;
+ case 'a': m=SvcFileReader::APPEND; break;
+ case '+': m|=SvcFileReader::PLUS; break;
+ case 'b': m|=SvcFileReader::BINARY; break;
+ case 't': m|=SvcFileReader::TEXT; break;
+ }
+ }
+
+ return FileReaderEnum(filename, m).getFirst();
+}
+
+void FileReaders::close(void *handle)
+{
+ svc_fileReader *fr=(svc_fileReader *)handle;
+ fr->close();
+ SvcEnum::release(fr);
+}
+
+size_t FileReaders::read(void *buffer, size_t size, void *handle)
+{
+ svc_fileReader *fr=(svc_fileReader *)handle;
+ return fr->read((int8_t *)buffer,size);
+}
+
+size_t FileReaders::write(const void *buffer, size_t size, void *handle)
+{
+ svc_fileReader *fr=(svc_fileReader *)handle;
+ return fr->write((int8_t *)buffer,size);
+}
+
+int FileReaders::seek(int64_t offset, int origin, void *handle)
+{
+ svc_fileReader *fr=(svc_fileReader *)handle;
+ if(!fr->canSeek()) return -1;
+ if(origin==SEEK_SET) return fr->seek(offset);
+ if(origin==SEEK_CUR) return fr->seek(fr->getPos()+offset);
+ return fr->seek(fr->getLength()-offset);
+}
+
+uint64_t FileReaders::tell(void *handle)
+{
+ svc_fileReader *fr=(svc_fileReader *)handle;
+ return fr->getPos();
+}
+
+uint64_t FileReaders::getFileSize(void *handle)
+{
+ svc_fileReader *fr=(svc_fileReader *)handle;
+ return fr->getLength();
+}
+
+int FileReaders::exists(const wchar_t *filename) {
+ // Note that we do not do a system lock on the service since we can just
+ // release it directly via the factory
+ waService *s;
+ for(int i=0;s=WASABI_API_SVC->service_enumService(WaSvc::FILEREADER,i);i++) {
+ svc_fileReader *fr=(svc_fileReader *)s->getInterface(FALSE);
+ if(fr->isMine(filename) == 1 || fr->open(filename)) {
+ int ret=fr->exists(filename);
+ fr->close();
+ s->releaseInterface(fr); fr = NULL;
+ return ret;
+ }
+ s->releaseInterface(fr); fr = NULL;
+ }
+ return 0;
+}
+
+int FileReaders::remove(const wchar_t *filename) {
+ // Note that we do not do a system lock on the service since we can just
+ // release it directly via the factory
+ waService *s;
+ for(int i=0;s=WASABI_API_SVC->service_enumService(WaSvc::FILEREADER,i);i++) {
+ svc_fileReader *fr=(svc_fileReader *)s->getInterface(FALSE);
+ if (fr->isMine(filename) == 1 || fr->open(filename)) {
+ fr->close();
+ int ret = fr->remove(filename);
+ s->releaseInterface(fr); fr = NULL;
+ return ret;
+ }
+ s->releaseInterface(fr); fr = NULL;
+ }
+ return 0;
+}
+
+int FileReaders::removeUndoable(const wchar_t *filename) {
+ // Note that we do not do a system lock on the service since we can just
+ // release it directly via the factory
+ waService *s;
+ for(int i=0;s=WASABI_API_SVC->service_enumService(WaSvc::FILEREADER,i);i++) {
+ svc_fileReader *fr=(svc_fileReader *)s->getInterface(FALSE);
+ if(fr->isMine(filename) == 1 || fr->open(filename)) {
+ fr->close();
+ int ret = fr->removeUndoable(filename);
+ s->releaseInterface(fr); fr = NULL;
+ return ret;
+ }
+ s->releaseInterface(fr); fr = NULL;
+ }
+ return 0;
+}
+
+int FileReaders::move(const wchar_t *filename, const wchar_t *destfilename) {
+ // Note that we do not do a system lock on the service since we can just
+ // release it directly via the factory
+ waService *s;
+ for(int i=0;s=WASABI_API_SVC->service_enumService(WaSvc::FILEREADER,i);i++) {
+ svc_fileReader *fr=(svc_fileReader *)s->getInterface(FALSE);
+ if(fr->isMine(filename) == 1 || fr->open(filename)) {
+ fr->close();
+ int ret = fr->move(filename,destfilename);
+ s->releaseInterface(fr); fr = NULL;
+ return ret;
+ }
+ s->releaseInterface(fr); fr = NULL;
+ }
+ return 0;
+}
diff --git a/Src/Wasabi/api/filereader/local/fileread.h b/Src/Wasabi/api/filereader/local/fileread.h
new file mode 100644
index 00000000..14c22f46
--- /dev/null
+++ b/Src/Wasabi/api/filereader/local/fileread.h
@@ -0,0 +1,23 @@
+#ifndef _FILEREADERS_H
+#define _FILEREADERS_H
+
+#include <api/filereader/svc_filereadI.h>
+#include <api/service/servicei.h>
+
+class FileReaders
+{
+public:
+ static void *open(const wchar_t *filename, const wchar_t *mode);
+ static void close(void *handle);
+ static size_t read(void *buffer, size_t size, void *handle);
+ static size_t write(const void *buffer, size_t size, void *handle);
+ static int seek(int64_t offset, int origin, void *handle);
+ static uint64_t tell(void *handle);
+ static uint64_t getFileSize(void *handle);
+ static int exists(const wchar_t *filename);
+ static int remove(const wchar_t *filename);
+ static int removeUndoable(const wchar_t *filename);
+ static int move(const wchar_t *filename, const wchar_t *destfilename);
+};
+
+#endif//_FILEREADERS_H