diff options
Diffstat (limited to 'Src/Wasabi/api/filereader/local')
-rw-r--r-- | Src/Wasabi/api/filereader/local/fileread.cpp | 132 | ||||
-rw-r--r-- | Src/Wasabi/api/filereader/local/fileread.h | 23 |
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 |