aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/api/filereader/svc_filereadI.h
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Wasabi/api/filereader/svc_filereadI.h')
-rw-r--r--Src/Wasabi/api/filereader/svc_filereadI.h100
1 files changed, 100 insertions, 0 deletions
diff --git a/Src/Wasabi/api/filereader/svc_filereadI.h b/Src/Wasabi/api/filereader/svc_filereadI.h
new file mode 100644
index 00000000..27d4768b
--- /dev/null
+++ b/Src/Wasabi/api/filereader/svc_filereadI.h
@@ -0,0 +1,100 @@
+#ifndef __WASABI_SVC_FILEREADI_H
+#define __WASABI_SVC_FILEREADI_H
+
+#include <api/service/svcs/svc_fileread.h>
+#include <api/filereader/api_readercallback.h>
+// derive from this one
+class NOVTABLE svc_fileReaderI : public svc_fileReader
+{
+public:
+ virtual int isMine(const wchar_t *filename, int mode = SvcFileReader::READ) { return -1; }
+ virtual int open(const wchar_t *filename, int mode = SvcFileReader::READ) = 0; // return 1 on success
+ virtual size_t read(int8_t *buffer, size_t length) = 0; // return number of bytes read (if < length then eof)
+ virtual size_t write(const int8_t *buffer, size_t length) = 0; // return number of bytes written
+ virtual void close() = 0; //must be safe to call even when not open
+
+ virtual int canSetEOF() { return 0; }
+ virtual int setEOF(uint64_t newlen) { return -1; }
+
+ virtual void abort() { } // tells the reader to abort its current prebuffering/reader
+
+ virtual int getLength() { return -1; } // return -1 on unknown/infinite
+ virtual int getPos() = 0;
+
+ virtual int canSeek() { return 0; }
+ virtual int seek(uint64_t position) { return 0; }
+ virtual uint64_t bytesAvailable(uint64_t requested) { return requested; }
+
+ virtual int hasHeaders() { return 0; }
+ virtual const char *getHeader(const char *header) { return (const char *)NULL; }
+
+ virtual int exists(const wchar_t *filename) { return 0; } // return 1 if true, 0 if not, -1 if unknown
+
+ virtual int remove(const wchar_t *filename) { return 0; } // return 1 on success, 0 on error
+
+ virtual int removeUndoable(const wchar_t *filename) { return -1; }
+
+ virtual int move(const wchar_t *filename, const wchar_t *destfilename) { return 0; } // return 1 on success, 0 on error
+
+ virtual void setMetaDataCallback(api_readercallback *cb) { }
+
+ virtual int canPrefetch() { return 1; } // return 1 if your reader should prefetch infos about the file in pledit
+ // (HTTP reader will return 0 here for instance)
+
+protected:
+ RECVS_DISPATCH;
+};
+
+
+// derive from this one
+class NOVTABLE MetaDataReaderCallbackI : public api_readercallback {
+public:
+ virtual void metaDataReader_onData(const char *data, int size)=0;
+
+protected:
+#undef CBCLASS
+#define CBCLASS MetaDataReaderCallbackI
+START_DISPATCH_INLINE;
+ VCB(METADATAREADERONDATA, metaDataReader_onData);
+END_DISPATCH;
+#undef CBCLASS
+};
+
+#include <api/service/svcs/svc_redir.h>
+#include <bfc/std_file.h> // for WA_MAX_PATH but this needs to be in a better place
+
+#define MAX_FILEREADER_REDIRECT 256
+
+// note: this class handles both redirection and calling open()
+class FileReaderEnum : public SvcEnumT<svc_fileReader> {
+public:
+ FileReaderEnum(const wchar_t *filename, int mode=SvcFileReader::READ, int allow_redirect=FALSE) :
+ fn(filename), m(mode)
+ {
+ if (allow_redirect) {
+ for (int done = 0, c = 0; !done && c < MAX_FILEREADER_REDIRECT; done = 1, c++) {
+ RedirectEnum re(fn);
+ svc_redirect *svc;
+ while ((svc = re.getNext(FALSE)) != NULL) {
+ wchar_t buf[WA_MAX_PATH]=L"";
+ if (svc->redirect(fn, L"Filename", buf, WA_MAX_PATH)) {
+ fn = buf;
+ done = 0;
+ }
+ re.getLastFactory()->releaseInterface(svc);
+ }
+ }
+ }
+ }
+ virtual int testService(svc_fileReader *svc) {
+ if (!svc->isMine(fn)) return 0;
+ return !!svc->open(fn, m);
+ }
+
+private:
+ const wchar_t *fn;
+ int m;
+};
+
+
+#endif \ No newline at end of file