From d439bc3807b3f7cea0544899ee5fc8d849bf32df Mon Sep 17 00:00:00 2001 From: Fritz Elfert Date: Wed, 2 Aug 2000 18:26:29 +0000 Subject: Added a wrapper for enums and changed all return-code related stuff as well as some other enums to use that instead of plain enums. This results in stronger type checking, range checking and the ability to write an enum's textual representation. --- Makefile.am | 2 +- configure.in | 2 + lib/Makefile.am | 4 +- lib/rfsv.cc | 230 +++++++++++++++------------------------------ lib/rfsv.h | 81 ++++++++-------- lib/rfsv16.cc | 236 +++++++++++++++++++++++------------------------ lib/rfsv16.h | 51 +++++----- lib/rfsv32.cc | 141 ++++++++++++++-------------- lib/rfsv32.h | 51 +++++----- lib/rpcs.cc | 183 ++++++++++++++++++++---------------- lib/rpcs.h | 282 ++++++++++++++++++++++++++++---------------------------- lib/rpcs16.cc | 14 ++- lib/rpcs16.h | 4 +- lib/rpcs32.cc | 52 +++++------ lib/rpcs32.h | 36 ++++---- plpftp/ftp.cc | 101 ++++++-------------- plpftp/ftp.h | 4 +- 17 files changed, 683 insertions(+), 791 deletions(-) diff --git a/Makefile.am b/Makefile.am index a62e5bf..def9a41 100644 --- a/Makefile.am +++ b/Makefile.am @@ -14,4 +14,4 @@ maintainer-clean-local: install-sh ltconfig ltmain.sh missing mkinstalldirs kdoc: - kdoc -d doc/api -n libplp -P lib/*.h + kdoc -d doc/api -n libplp lib/*.h diff --git a/configure.in b/configure.in index 6d4b5fe..d042094 100644 --- a/configure.in +++ b/configure.in @@ -142,6 +142,8 @@ AC_OUTPUT( ncpd/Makefile plpftp/Makefile plpnfsd/Makefile + doc/Makefile + doc/api/Makefile include/config.h etc/psion ) diff --git a/lib/Makefile.am b/lib/Makefile.am index 33d50b8..404814e 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -5,10 +5,10 @@ lib_LTLIBRARIES = libplp.la libplp_la_LDFLAGS = --debug -version-info 1:1:0 libplp_la_SOURCES = bufferarray.cc bufferstore.cc iowatch.cc ppsocket.cc \ rfsv16.cc rfsv32.cc rfsvfactory.cc log.cc rfsv.cc rpcs32.cc rpcs16.cc \ - rpcs.cc rpcsfactory.cc psitime.cc + rpcs.cc rpcsfactory.cc psitime.cc Enum.cc EXTRA_DIST = bool.h bufferarray.h bufferstore.h iowatch.h ppsocket.h \ rfsv.h rfsv16.h rfsv32.h rfsvfactory.h log.h rpcs32.h rpcs16.h rpcs.h \ - rpcsfactory.h psitime.h + rpcsfactory.h psitime.h Enum.h maintainer-clean-local: rm -f Makefile.in diff --git a/lib/rfsv.cc b/lib/rfsv.cc index 3b9dc6a..0b7fd42 100644 --- a/lib/rfsv.cc +++ b/lib/rfsv.cc @@ -1,158 +1,80 @@ #include "rfsv.h" +#include "Enum.h" -char *rfsv:: -opErr(long status) -{ - enum errs e = (enum errs) status; - switch (e) { - case E_PSI_GEN_NONE: - return "no error"; - case E_PSI_GEN_FAIL: - return "general"; - case E_PSI_GEN_ARG: - return "bad argument"; - case E_PSI_GEN_OS: - return "OS error"; - case E_PSI_GEN_NSUP: - return "not supported"; - case E_PSI_GEN_UNDER: - return "numeric underflow"; - case E_PSI_GEN_OVER: - return "numeric overflow"; - case E_PSI_GEN_RANGE: - return "numeric exception"; - case E_PSI_GEN_INUSE: - return "in use"; - case E_PSI_GEN_NOMEMORY: - return "out of memory"; - case E_PSI_GEN_NOSEGMENTS: - return "out of segments"; - case E_PSI_GEN_NOSEM: - return "out of semaphores"; - case E_PSI_GEN_NOPROC: - return "out of processes"; - case E_PSI_GEN_OPEN: - return "already open"; - case E_PSI_GEN_NOTOPEN: - return "not open"; - case E_PSI_GEN_IMAGE: - return "bad image"; - case E_PSI_GEN_RECEIVER: - return "receiver error"; - case E_PSI_GEN_DEVICE: - return "device error"; - case E_PSI_GEN_FSYS: - return "no filesystem"; - case E_PSI_GEN_START: - return "not ready"; - case E_PSI_GEN_NOFONT: - return "no font"; - case E_PSI_GEN_TOOWIDE: - return "too wide"; - case E_PSI_GEN_TOOMANY: - return "too many"; - case E_PSI_FILE_EXIST: - return "file already exists"; - case E_PSI_FILE_NXIST: - return "no such file"; - case E_PSI_FILE_WRITE: - return "write error"; - case E_PSI_FILE_READ: - return "read error"; - case E_PSI_FILE_EOF: - return "end of file"; - case E_PSI_FILE_FULL: - return "disk/serial read buffer full"; - case E_PSI_FILE_NAME: - return "invalid name"; - case E_PSI_FILE_ACCESS: - return "access denied"; - case E_PSI_FILE_LOCKED: - return "ressource locked"; - case E_PSI_FILE_DEVICE: - return "no such device"; - case E_PSI_FILE_DIR: - return "no such directory"; - case E_PSI_FILE_RECORD: - return "no such record"; - case E_PSI_FILE_RDONLY: - return "file is read-only"; - case E_PSI_FILE_INV: - return "invalid I/O operation"; - case E_PSI_FILE_PENDING: - return "I/O pending (not yet completed)"; - case E_PSI_FILE_VOLUME: - return "invalid volume name"; - case E_PSI_FILE_CANCEL: - return "cancelled"; - case E_PSI_FILE_ALLOC: - return "no memory for control block"; - case E_PSI_FILE_DISC: - return "unit disconnected"; - case E_PSI_FILE_CONNECT: - return "already connected"; - case E_PSI_FILE_RETRAN: - return "retransmission threshold exceeded"; - case E_PSI_FILE_LINE: - return "physical link failure"; - case E_PSI_FILE_INACT: - return "inactivity timer expired"; - case E_PSI_FILE_PARITY: - return "serial parity error"; - case E_PSI_FILE_FRAME: - return "serial framing error"; - case E_PSI_FILE_OVERRUN: - return "serial overrun error"; - case E_PSI_MDM_CONFAIL: - return "modem cannot connect to remote modem"; - case E_PSI_MDM_BUSY: - return "remote modem busy"; - case E_PSI_MDM_NOANS: - return "remote modem did not answer"; - case E_PSI_MDM_BLACKLIST: - return "number blacklisted by the modem"; - case E_PSI_FILE_NOTREADY: - return "drive not ready"; - case E_PSI_FILE_UNKNOWN: - return "unknown media"; - case E_PSI_FILE_DIRFULL: - return "directory full"; - case E_PSI_FILE_PROTECT: - return "write-protected"; - case E_PSI_FILE_CORRUPT: - return "media corrupt"; - case E_PSI_FILE_ABORT: - return "aborted operation"; - case E_PSI_FILE_ERASE: - return "failed to erase flash media"; - case E_PSI_FILE_INVALID: - return "invalid file for DBF system"; - case E_PSI_GEN_POWER: - return "power failure"; - case E_PSI_FILE_TOOBIG: - return "too big"; - case E_PSI_GEN_DESCR: - return "bad descriptor"; - case E_PSI_GEN_LIB: - return "bad entry point"; - case E_PSI_FILE_NDISC: - return "could not diconnect"; - case E_PSI_FILE_DRIVER: - return "bad driver"; - case E_PSI_FILE_COMPLETION: - return "operation not completed"; - case E_PSI_GEN_BUSY: - return "server busy"; - case E_PSI_GEN_TERMINATED: - return "terminated"; - case E_PSI_GEN_DIED: - return "died"; - case E_PSI_FILE_HANDLE: - return "bad handle"; - case E_PSI_NOT_SIBO: - return "invalid operation for RFSV16"; - default: - return "Unknown error"; - } +ENUM_DEFINITION(rfsv::errs, rfsv::E_PSI_GEN_NONE) { + stringRep.add(rfsv::E_PSI_GEN_NONE, "no error"); + stringRep.add(rfsv::E_PSI_GEN_FAIL, "general"); + stringRep.add(rfsv::E_PSI_GEN_ARG, "bad argument"); + stringRep.add(rfsv::E_PSI_GEN_OS, "OS error"); + stringRep.add(rfsv::E_PSI_GEN_NSUP, "not supported"); + stringRep.add(rfsv::E_PSI_GEN_UNDER, "numeric underflow"); + stringRep.add(rfsv::E_PSI_GEN_OVER, "numeric overflow"); + stringRep.add(rfsv::E_PSI_GEN_RANGE, "numeric exception"); + stringRep.add(rfsv::E_PSI_GEN_INUSE, "in use"); + stringRep.add(rfsv::E_PSI_GEN_NOMEMORY, "out of memory"); + stringRep.add(rfsv::E_PSI_GEN_NOSEGMENTS, "out of segments"); + stringRep.add(rfsv::E_PSI_GEN_NOSEM, "out of semaphores"); + stringRep.add(rfsv::E_PSI_GEN_NOPROC, "out of processes"); + stringRep.add(rfsv::E_PSI_GEN_OPEN, "already open"); + stringRep.add(rfsv::E_PSI_GEN_NOTOPEN, "not open"); + stringRep.add(rfsv::E_PSI_GEN_IMAGE, "bad image"); + stringRep.add(rfsv::E_PSI_GEN_RECEIVER, "receiver error"); + stringRep.add(rfsv::E_PSI_GEN_DEVICE, "device error"); + stringRep.add(rfsv::E_PSI_GEN_FSYS, "no filesystem"); + stringRep.add(rfsv::E_PSI_GEN_START, "not ready"); + stringRep.add(rfsv::E_PSI_GEN_NOFONT, "no font"); + stringRep.add(rfsv::E_PSI_GEN_TOOWIDE, "too wide"); + stringRep.add(rfsv::E_PSI_GEN_TOOMANY, "too many"); + stringRep.add(rfsv::E_PSI_FILE_EXIST, "file already exists"); + stringRep.add(rfsv::E_PSI_FILE_NXIST, "no such file"); + stringRep.add(rfsv::E_PSI_FILE_WRITE, "write error"); + stringRep.add(rfsv::E_PSI_FILE_READ, "read error"); + stringRep.add(rfsv::E_PSI_FILE_EOF, "end of file"); + stringRep.add(rfsv::E_PSI_FILE_FULL, "disk/serial read buffer full"); + stringRep.add(rfsv::E_PSI_FILE_NAME, "invalid name"); + stringRep.add(rfsv::E_PSI_FILE_ACCESS, "access denied"); + stringRep.add(rfsv::E_PSI_FILE_LOCKED, "ressource locked"); + stringRep.add(rfsv::E_PSI_FILE_DEVICE, "no such device"); + stringRep.add(rfsv::E_PSI_FILE_DIR, "no such directory"); + stringRep.add(rfsv::E_PSI_FILE_RECORD, "no such record"); + stringRep.add(rfsv::E_PSI_FILE_RDONLY, "file is read-only"); + stringRep.add(rfsv::E_PSI_FILE_INV, "invalid I/O operation"); + stringRep.add(rfsv::E_PSI_FILE_PENDING, "I/O pending (not yet completed)"); + stringRep.add(rfsv::E_PSI_FILE_VOLUME, "invalid volume name"); + stringRep.add(rfsv::E_PSI_FILE_CANCEL, "cancelled"); + stringRep.add(rfsv::E_PSI_FILE_ALLOC, "no memory for control block"); + stringRep.add(rfsv::E_PSI_FILE_DISC, "unit disconnected"); + stringRep.add(rfsv::E_PSI_FILE_CONNECT, "already connected"); + stringRep.add(rfsv::E_PSI_FILE_RETRAN, "retransmission threshold exceeded"); + stringRep.add(rfsv::E_PSI_FILE_LINE, "physical link failure"); + stringRep.add(rfsv::E_PSI_FILE_INACT, "inactivity timer expired"); + stringRep.add(rfsv::E_PSI_FILE_PARITY, "serial parity error"); + stringRep.add(rfsv::E_PSI_FILE_FRAME, "serial framing error"); + stringRep.add(rfsv::E_PSI_FILE_OVERRUN, "serial overrun error"); + stringRep.add(rfsv::E_PSI_MDM_CONFAIL, "modem cannot connect to remote modem"); + stringRep.add(rfsv::E_PSI_MDM_BUSY, "remote modem busy"); + stringRep.add(rfsv::E_PSI_MDM_NOANS, "remote modem did not answer"); + stringRep.add(rfsv::E_PSI_MDM_BLACKLIST, "number blacklisted by the modem"); + stringRep.add(rfsv::E_PSI_FILE_NOTREADY, "drive not ready"); + stringRep.add(rfsv::E_PSI_FILE_UNKNOWN, "unknown media"); + stringRep.add(rfsv::E_PSI_FILE_DIRFULL, "directory full"); + stringRep.add(rfsv::E_PSI_FILE_PROTECT, "write-protected"); + stringRep.add(rfsv::E_PSI_FILE_CORRUPT, "media corrupt"); + stringRep.add(rfsv::E_PSI_FILE_ABORT, "aborted operation"); + stringRep.add(rfsv::E_PSI_FILE_ERASE, "failed to erase flash media"); + stringRep.add(rfsv::E_PSI_FILE_INVALID, "invalid file for DBF system"); + stringRep.add(rfsv::E_PSI_GEN_POWER, "power failure"); + stringRep.add(rfsv::E_PSI_FILE_TOOBIG, "too big"); + stringRep.add(rfsv::E_PSI_GEN_DESCR, "bad descriptor"); + stringRep.add(rfsv::E_PSI_GEN_LIB, "bad entry point"); + stringRep.add(rfsv::E_PSI_FILE_NDISC, "could not diconnect"); + stringRep.add(rfsv::E_PSI_FILE_DRIVER, "bad driver"); + stringRep.add(rfsv::E_PSI_FILE_COMPLETION, "operation not completed"); + stringRep.add(rfsv::E_PSI_GEN_BUSY, "server busy"); + stringRep.add(rfsv::E_PSI_GEN_TERMINATED, "terminated"); + stringRep.add(rfsv::E_PSI_GEN_DIED, "died"); + stringRep.add(rfsv::E_PSI_FILE_HANDLE, "bad handle"); + stringRep.add(rfsv::E_PSI_NOT_SIBO, "invalid operation for RFSV16"); + stringRep.add(rfsv::E_PSI_INTERNAL, "libplp internal error"); } diff --git a/lib/rfsv.h b/lib/rfsv.h index a74fd0c..3aa9f70 100644 --- a/lib/rfsv.h +++ b/lib/rfsv.h @@ -1,6 +1,8 @@ #ifndef _rfsv_h_ #define _rfsv_h_ +#include "Enum.h" + class ppsocket; class bufferStore; class bufferArray; @@ -30,44 +32,6 @@ typedef int (*cpCallback_t)(long); */ class rfsv { public: - virtual ~rfsv() {} - virtual void reset() = 0; - virtual void reconnect() = 0; - virtual long getStatus() = 0; - virtual const char *getConnectName() = 0; - virtual long fopen(long, const char *, long &) = 0; - virtual long mktemp(long *, char *) = 0; - virtual long fcreatefile(long, const char *, long &) = 0; - virtual long freplacefile(long, const char *, long &) = 0; - virtual long fopendir(long, const char *, long &) = 0; - virtual long fclose(long) = 0; - virtual long dir(const char *, bufferArray *) = 0; - virtual long fgetmtime(const char *, long *) = 0; - virtual long fsetmtime(const char *, long) = 0; - virtual long fgetattr(const char *, long *) = 0; - virtual long fgeteattr(const char *, long *, long *, long *) =0; - virtual long fsetattr(const char *, long, long) = 0; - virtual long dircount(const char *, long *) = 0; - virtual long devlist(long *) = 0; - virtual char *devinfo(int, long *, long *, long *, long *) = 0; - virtual char *opAttr(long) = 0; - virtual long opMode(long) = 0; - virtual long fread(long, unsigned char *, long) = 0; - virtual long fwrite(long, unsigned char *, long) = 0; - virtual long copyFromPsion(const char *, const char *, cpCallback_t) = 0; - virtual long copyToPsion(const char *, const char *, cpCallback_t) = 0; - virtual long fsetsize(long, long) = 0; - virtual long fseek(long, long, long) = 0; - virtual long mkdir(const char *) = 0; - virtual long rmdir(const char *) = 0; - virtual long rename(const char *, const char *) = 0; - virtual long remove(const char *) = 0; - - virtual long attr2std(long) = 0; - virtual long std2attr(long) = 0; - - char *opErr(long); - /** * The kown modes for seek. */ @@ -175,7 +139,9 @@ class rfsv { E_PSI_FILE_HANDLE = -110, // Special error code for "Operation not permitted in RFSV16" - E_PSI_NOT_SIBO = -200 + E_PSI_NOT_SIBO = -200, + // Special error code for "internal library error" + E_PSI_INTERNAL = -201 }; /** @@ -207,6 +173,43 @@ class rfsv { PSI_A_STREAM = 0x0800, PSI_A_TEXT = 0x1000 }; + virtual ~rfsv() {} + virtual void reset() = 0; + virtual void reconnect() = 0; + virtual Enum getStatus() = 0; + virtual const char *getConnectName() = 0; + virtual Enum fopen(long, const char *, long &) = 0; + virtual Enum mktemp(long *, char *) = 0; + virtual Enum fcreatefile(long, const char *, long &) = 0; + virtual Enum freplacefile(long, const char *, long &) = 0; + virtual Enum fopendir(long, const char *, long &) = 0; + virtual Enum fclose(long) = 0; + virtual Enum dir(const char *, bufferArray *) = 0; + virtual Enum fgetmtime(const char *, long *) = 0; + virtual Enum fsetmtime(const char *, long) = 0; + virtual Enum fgetattr(const char *, long *) = 0; + virtual Enum fgeteattr(const char *, long *, long *, long *) =0; + virtual Enum fsetattr(const char *, long, long) = 0; + virtual Enum dircount(const char *, long *) = 0; + virtual Enum devlist(long *) = 0; + virtual char *devinfo(int, long *, long *, long *, long *) = 0; + virtual char *opAttr(long) = 0; + virtual long opMode(long) = 0; + virtual long fread(long, unsigned char *, long) = 0; + virtual long fwrite(long, unsigned char *, long) = 0; + virtual Enum copyFromPsion(const char *, const char *, cpCallback_t) = 0; + virtual Enum copyToPsion(const char *, const char *, cpCallback_t) = 0; + virtual Enum fsetsize(long, long) = 0; + virtual long fseek(long, long, long) = 0; + virtual Enum mkdir(const char *) = 0; + virtual Enum rmdir(const char *) = 0; + virtual Enum rename(const char *, const char *) = 0; + virtual Enum remove(const char *) = 0; + + virtual long attr2std(long) = 0; + virtual long std2attr(long) = 0; + + char *opErr(long); }; #endif diff --git a/lib/rfsv16.cc b/lib/rfsv16.cc index de57bdf..bd30039 100644 --- a/lib/rfsv16.cc +++ b/lib/rfsv16.cc @@ -32,7 +32,7 @@ #include #include #include -#include +#include #include "bool.h" #include "rfsv16.h" @@ -84,7 +84,7 @@ reset() } // move to base class? -long rfsv16:: +Enum rfsv16:: getStatus() { return status; @@ -97,7 +97,7 @@ getConnectName() return "SYS$RFSV"; } -int rfsv16:: +Enum rfsv16:: convertName(const char* orig, char *retVal) { int len = strlen(orig); @@ -130,16 +130,16 @@ convertName(const char* orig, char *retVal) delete [] temp; cout << retVal << endl; - return 0; + return E_PSI_GEN_NONE; } -long rfsv16:: +Enum rfsv16:: fopen(long attr, const char *name, long &handle) { bufferStore a; char realName[200]; - int rv = convertName(name, realName); - if (rv) return (long)rv; + Enum rv = convertName(name, realName); + if (rv) return rv; // FIXME: anything that calls fopen should NOT do the name // conversion - it's just done here. @@ -150,16 +150,16 @@ fopen(long attr, const char *name, long &handle) if (!sendCommand(FOPEN, a)) return E_PSI_FILE_DISC; - long res = getResponse(a); + Enum res = getResponse(a); if (res == 0) { handle = (long)a.getWord(0); - return 0; + return E_PSI_GEN_NONE; } return res; } // internal -long rfsv16:: +Enum rfsv16:: mktemp(long *handle, char *tmpname) { bufferStore a; @@ -173,38 +173,38 @@ mktemp(long *handle, char *tmpname) if (!sendCommand(OPENUNIQUE, a)) return E_PSI_FILE_DISC; - long res = getResponse(a); - if (res == 0) { + Enum res = getResponse(a); + if (res == E_PSI_GEN_NONE) { *handle = a.getWord(0); strcpy(tmpname, a.getString(2)); - return 0; + return res; } return res; } // internal and external -long rfsv16:: +Enum rfsv16:: fcreatefile(long attr, const char *name, long &handle) { return fopen(attr | P_FCREATE, name, handle); } // this is internal - not used by plpnfsd, unlike fcreatefile -long rfsv16:: +Enum rfsv16:: freplacefile(long attr, const char *name, long &handle) { return fopen(attr | P_FREPLACE, name, handle); } // internal -long rfsv16:: +Enum rfsv16:: fopendir(long attr, const char *name, long &handle) { cerr << "rfsv16::fopendir ***" << endl; - return 0; + return E_PSI_GEN_NONE; } -long rfsv16:: +Enum rfsv16:: fclose(long fileHandle) { bufferStore a; @@ -214,16 +214,14 @@ fclose(long fileHandle) return getResponse(a); } -long rfsv16:: +Enum rfsv16:: dir(const char *dirName, bufferArray * files) { long fileHandle; - long res; + Enum res = fopen(P_FDIR, dirName, fileHandle); - long status = fopen(P_FDIR, dirName, fileHandle); - if (status != 0) { - return status; - } + if (res != E_PSI_GEN_NONE) + return res; while (1) { bufferStore a; @@ -231,14 +229,15 @@ dir(const char *dirName, bufferArray * files) if (!sendCommand(FDIRREAD, a)) return E_PSI_FILE_DISC; res = getResponse(a); - if (res) + if (res != E_PSI_GEN_NONE) break; a.discardFirstBytes(2); // Don't know what these mean! while (a.getLen() > 16) { int version = a.getWord(0); if (version != 2) { cerr << "dir: not version 2" << endl; - return 1; + fclose(fileHandle); + return E_PSI_GEN_FAIL; } int status = a.getWord(2); long size = a.getDWord(4); @@ -254,8 +253,8 @@ dir(const char *dirName, bufferArray * files) files->append(temp); } } - if ((short int)res == E_PSI_FILE_EOF) - res = 0; + if (res == E_PSI_FILE_EOF) + res = E_PSI_GEN_NONE; fclose(fileHandle); return res; } @@ -293,14 +292,14 @@ opMode(long mode) return ret; } -long rfsv16:: +Enum rfsv16:: fgetmtime(const char *name, long *mtime) { cerr << "rfsv16::fgetmtime" << endl; // NB: fgetattr, fgeteattr is almost identical... bufferStore a; char realName[200]; - int rv = convertName(name, realName); + Enum rv = convertName(name, realName); if (rv) return rv; a.addString(realName); a.addByte(0x00); // needs to be null-terminated, @@ -308,8 +307,8 @@ cerr << "rfsv16::fgetmtime" << endl; if (!sendCommand(FINFO, a)) return E_PSI_FILE_DISC; - long res = getResponse(a); - if (res != 0) { + Enum res = getResponse(a); + if (res != E_PSI_GEN_NONE) { cerr << "fgetmtime: Error " << res << " on file " << name << endl; return res; } @@ -318,10 +317,10 @@ cerr << "rfsv16::fgetmtime" << endl; return res; } cerr << "fgetmtime: Unknown response (" << name << ") " << a < rfsv16:: fsetmtime(const char *name, long mtime) { cerr << "rfsv16::fsetmtime ***" << endl; @@ -330,13 +329,13 @@ cerr << "rfsv16::fsetmtime ***" << endl; return E_PSI_NOT_SIBO; } -long rfsv16:: +Enum rfsv16:: fgetattr(const char *name, long *attr) { // NB: fgetmtime, fgeteattr are almost identical... bufferStore a; char realName[200]; - int rv = convertName(name, realName); + Enum rv = convertName(name, realName); if (rv) return rv; a.addString(realName); a.addByte(0x00); // needs to be null-terminated, @@ -344,7 +343,7 @@ fgetattr(const char *name, long *attr) if (!sendCommand(FINFO, a)) return E_PSI_FILE_DISC; - long res = getResponse(a); + Enum res = getResponse(a); if (res != 0) { cerr << "fgetattr: Error " << res << " on file " << name << endl; return res; @@ -354,15 +353,15 @@ fgetattr(const char *name, long *attr) return res; } cerr << "fgetattr: Unknown response (" << name << ") " << a < rfsv16:: fgeteattr(const char *name, long *attr, long *size, long *time) { bufferStore a; char realName[200]; - int rv = convertName(name, realName); + Enum rv = convertName(name, realName); if (rv) return rv; a.addString(realName); a.addByte(0x00); // needs to be null-terminated, @@ -370,9 +369,9 @@ fgeteattr(const char *name, long *attr, long *size, long *time) if (!sendCommand(FINFO, a)) return E_PSI_FILE_DISC; - long res = getResponse(a); + Enum res = getResponse(a); if (res != 0) { - cerr << "fgeteattr: Error " << a.getWord(0) << " on file " << name << endl; + cerr << "fgeteattr: Error " << res << " on file " << name << endl; return res; } else if (a.getLen() == 16) { @@ -382,10 +381,10 @@ fgeteattr(const char *name, long *attr, long *size, long *time) return res; } cerr << "fgeteattr: Unknown response (" << name << ") " << a < rfsv16:: fsetattr(const char *name, long seta, long unseta) { cerr << "rfsv16::fsetattr" << endl; @@ -412,17 +411,16 @@ cerr << "rfsv16::fsetattr" << endl; return getResponse(a); } -long rfsv16:: +Enum rfsv16:: dircount(const char *name, long *count) { long fileHandle; - long res; + Enum res; *count = 0; - long status = fopen(P_FDIR, name, fileHandle); - if (status != 0) { - return status; - } + res = fopen(P_FDIR, name, fileHandle); + if (res != E_PSI_GEN_NONE) + return res; while (1) { bufferStore a; @@ -430,14 +428,15 @@ dircount(const char *name, long *count) if (!sendCommand(FDIRREAD, a)) return E_PSI_FILE_DISC; res = getResponse(a); - if (res) + if (res != E_PSI_GEN_NONE) break; a.discardFirstBytes(2); // Don't know what these mean! while (a.getLen() > 16) { int version = a.getWord(0); if (version != 2) { cerr << "dir: not version 2" << endl; - return 1; + fclose(fileHandle); + return E_PSI_GEN_FAIL; } // int status = a.getWord(2); // long size = a.getDWord(4); @@ -447,16 +446,16 @@ dircount(const char *name, long *count) (*count)++; } } - if ((short int)res == E_PSI_FILE_EOF) - res = 0; + if (res == E_PSI_FILE_EOF) + res = E_PSI_GEN_NONE; fclose(fileHandle); return res; } -long rfsv16:: +Enum rfsv16:: devlist(long *devbits) { - long res; + Enum res; long fileHandle; *devbits = 0; @@ -473,7 +472,7 @@ devlist(long *devbits) if (!sendCommand(PARSE, a)) return E_PSI_FILE_DISC; res = getResponse(a); - if (res) + if (res != E_PSI_GEN_NONE) return res; // Find the drive to FOPEN @@ -481,10 +480,10 @@ devlist(long *devbits) a.discardFirstBytes(6); // Result, fsys, dev, path, file, file, ending, flag /* This leaves R E M : : M : \ */ name[0] = (char) a.getByte(5); // the M - long status = fopen(P_FDEVICE, name, fileHandle); - if (status != 0) { + res = fopen(P_FDEVICE, name, fileHandle); + if (res != E_PSI_GEN_NONE) return status; - } + while (1) { bufferStore a; a.init(); @@ -497,7 +496,8 @@ devlist(long *devbits) int version = a.getWord(0); if (version != 2) { cerr << "devlist: not version 2" << endl; - return 1; // FIXME + fclose(fileHandle); + return E_PSI_GEN_FAIL; // FIXME } char drive = a.getByte(64); if (drive >= 'A' && drive <= 'Z') { @@ -509,8 +509,8 @@ devlist(long *devbits) << drive << ")" << endl; } } - if ((short int)res == E_PSI_FILE_EOF) - res = 0; + if (res == E_PSI_FILE_EOF) + res = E_PSI_GEN_NONE; fclose(fileHandle); return res; } @@ -521,9 +521,9 @@ devinfo(int devnum, long *vfree, long *vtotal, long *vattr, { bufferStore a; long res; - long fileHandle; + // long fileHandle; - // Again, this is taken from an excahnge between PsiWin and a 3c. + // Again, this is taken from an exchange between PsiWin and a 3c. // For each drive, we PARSE with its drive letter to get a response // (which we ignore), then do a STATUSDEVICE to get the info. @@ -554,12 +554,12 @@ devinfo(int devnum, long *vfree, long *vtotal, long *vattr, return NULL; } int type = a.getWord(2); - int changeable = a.getWord(4); + // int changeable = a.getWord(4); long size = a.getDWord(6); long free = a.getDWord(10); - const char *volume = a.getString(14); - int battery = a.getWord(30); - const char *devicename = a.getString(62); + // const char *volume = a.getString(14); + // int battery = a.getWord(30); + // const char *devicename = a.getString(62); *vfree = free; *vtotal = size; *vattr = type; @@ -594,7 +594,7 @@ sendCommand(enum commands cc, bufferStore & data) } -long rfsv16:: +Enum rfsv16:: getResponse(bufferStore & data) { // getWord(2) is the size field @@ -605,7 +605,7 @@ getResponse(bufferStore & data) "getBufferStore failed." << endl; } else if (data.getWord(0) == 0x2a && data.getWord(2) == data.getLen()-4) { - long ret = (short)data.getWord(4); + Enum ret = (enum errs)data.getWord(4); data.discardFirstBytes(6); return ret; } else { @@ -614,19 +614,10 @@ getResponse(bufferStore & data) data.getLen()-4 << " Result field:" << data.getWord(4) << endl; } - status = E_PSI_FILE_DISC; return status; } -char * rfsv16:: -opErr(long status) -{ -cerr << "rfsv16::opErr 0x" << hex << setfill('0') << setw(4) - << status << " (" << dec << (signed short int)status << ")" << endl; - return rfsv::opErr(status); -} - long rfsv16:: fread(long handle, unsigned char *buf, long len) { @@ -696,69 +687,76 @@ fwrite(long handle, unsigned char *buf, long len) return count; } -long rfsv16:: +Enum rfsv16:: copyFromPsion(const char *from, const char *to, cpCallback_t cb) { long handle; - long res; + Enum res; long len; - if ((res = fopen(P_FSHARE | P_FSTREAM, from, handle)) != 0) + if ((res = fopen(P_FSHARE | P_FSTREAM, from, handle)) != E_PSI_GEN_NONE) return res; ofstream op(to); if (!op) { fclose(handle); - return -1; + return E_PSI_GEN_FAIL; } do { unsigned char buf[RFSV_SENDLEN]; if ((len = fread(handle, buf, sizeof(buf))) > 0) op.write(buf, len); + else + res = (enum rfsv::errs)len; if (cb) { if (!cb(len)) { - len = E_PSI_FILE_CANCEL; + res = E_PSI_FILE_CANCEL; break; } } - } while (len > 0); + } while (res > 0); fclose(handle); op.close(); - return len == E_PSI_FILE_EOF ? 0 : len; + if (res == E_PSI_FILE_EOF) + res = E_PSI_GEN_NONE; + return res; } -long rfsv16:: +Enum rfsv16:: copyToPsion(const char *from, const char *to, cpCallback_t cb) { long handle; - long res; + long len = 0; + Enum res; ifstream ip(from); if (!ip) return E_PSI_FILE_NXIST; res = fcreatefile(P_FSTREAM | P_FUPDATE, to, handle); - if (res != 0) { + if (res != E_PSI_GEN_NONE) { res = freplacefile(P_FSTREAM | P_FUPDATE, to, handle); - if (res != 0) + if (res != E_PSI_GEN_NONE) return res; } unsigned char *buff = new unsigned char[RFSV_SENDLEN]; while (res >= 0 && ip && !ip.eof()) { ip.read(buff, RFSV_SENDLEN); - res = fwrite(handle, buff, ip.gcount()); + len = fwrite(handle, buff, ip.gcount()); + if (len <= 0) + res = (enum rfsv::errs)len; if (cb) - if (!cb(res)) { + if (!cb(len)) { res = E_PSI_FILE_CANCEL; - } - } + } + } - delete[]buff; + delete[]buff; fclose(handle); ip.close(); - return 0; + return E_PSI_GEN_NONE; } -long rfsv16:: +Enum rfsv16:: fsetsize(long handle, long size) { bufferStore a; @@ -865,27 +863,27 @@ fseek(long handle, long pos, long mode) return realpos; } -long rfsv16:: +Enum rfsv16:: mkdir(const char* dirName) { char realName[200]; - int rv = convertName(dirName, realName); - if (rv) return rv; + Enum res = convertName(dirName, realName); + if (res != E_PSI_GEN_NONE) return res; bufferStore a; a.addString(realName); a.addByte(0x00); // needs to be null-terminated, // and this needs sending in the length word. sendCommand(MKDIR, a); - long res = getResponse(a); - if (!res) { + res = getResponse(a); + if (res == E_PSI_GEN_NONE) { // Correct response return res; } cerr << "Unknown response from mkdir "<< res < rfsv16:: rmdir(const char *dirName) { // There doesn't seem to be an RMDIR command, but DELETE works. We @@ -893,16 +891,16 @@ rmdir(const char *dirName) return remove(dirName); } -long rfsv16:: +Enum rfsv16:: rename(const char *oldName, const char *newName) { cerr << "rfsv16::rename ***" << endl; char realOldName[200]; - int rv = convertName(oldName, realOldName); - if (rv) return rv; + Enum res = convertName(oldName, realOldName); + if (res != E_PSI_GEN_NONE) return res; char realNewName[200]; - rv = convertName(newName, realNewName); - if (rv) return rv; + res = convertName(newName, realNewName); + if (res != E_PSI_GEN_NONE) return res; bufferStore a; a.addString(realOldName); a.addByte(0x00); // needs to be null-terminated, @@ -911,33 +909,33 @@ cerr << "rfsv16::rename ***" << endl; a.addByte(0x00); // needs to be null-terminated, // and this needs sending in the length word. sendCommand(RENAME, a); - long res = getResponse(a); - if (!res) { + res = getResponse(a); + if (res == E_PSI_GEN_NONE) { // Correct response return res; } cerr << "Unknown response from rename "<< res < rfsv16:: remove(const char* psionName) { char realName[200]; - int rv = convertName(psionName, realName); - if (rv) return rv; + Enum res = convertName(psionName, realName); + if (res != E_PSI_GEN_NONE) return res; bufferStore a; a.addString(realName); a.addByte(0x00); // needs to be null-terminated, // and this needs sending in the length word. sendCommand(DELETE, a); - long res = getResponse(a); - if (!res) { + res = getResponse(a); + if (res == E_PSI_GEN_NONE) { // Correct response return res; } cerr << "Unknown response from delete "<< res < dir(const char *, bufferArray *); /*long read(const char* psionName, const char* localName); long write(const char* localName, const char* psionName);*/ - long mkdir(const char *); + Enum mkdir(const char *); // these are FS' promotions - long dircount(const char *, long *); - long copyFromPsion(const char *, const char *, cpCallback_t); - long copyToPsion(const char *, const char *, cpCallback_t); - long rmdir(const char *); - long remove(const char *); // MJG: was this del? FE: yes - long rename(const char *, const char *); - long mktemp(long *, char *); - long fgeteattr(const char *, long *, long *, long *); - long fgetattr(const char *, long *); - long fsetattr(const char *, long seta, long unseta); - long fgetmtime(const char *, long *); - long fsetmtime(const char *, long); - long fopendir(long, const char *, long &); - long fopen(long, const char *, long &); - long fcreatefile(long, const char *, long &); - long freplacefile(long, const char *, long &); + Enum dircount(const char *, long *); + Enum copyFromPsion(const char *, const char *, cpCallback_t); + Enum copyToPsion(const char *, const char *, cpCallback_t); + Enum rmdir(const char *); + Enum remove(const char *); // MJG: was this del? FE: yes + Enum rename(const char *, const char *); + Enum mktemp(long *, char *); + Enum fgeteattr(const char *, long *, long *, long *); + Enum fgetattr(const char *, long *); + Enum fsetattr(const char *, long seta, long unseta); + Enum fgetmtime(const char *, long *); + Enum fsetmtime(const char *, long); + Enum fopendir(long, const char *, long &); + Enum fopen(long, const char *, long &); + Enum fcreatefile(long, const char *, long &); + Enum freplacefile(long, const char *, long &); long fseek(long, long, long); long fread(long, unsigned char *, long); long fwrite(long, unsigned char *, long); - long fsetsize(long, long); - long fclose(long); + Enum fsetsize(long, long); + Enum fclose(long); - long devlist(long *); + Enum devlist(long *); char *devinfo(int, long *, long *, long *, long *); - long getStatus(); - char *opErr(long); + Enum getStatus(); char *opAttr(long); long opMode(long); @@ -113,17 +112,17 @@ private: //long fclose(int fileHandle); // Miscellaneous - int convertName(const char*, char *); + Enum convertName(const char*, char *); // Communication bool sendCommand(enum commands, bufferStore &); - long getResponse(bufferStore &); + Enum getResponse(bufferStore &); // Vars ppsocket *skt; // MJG: not sure what these are yet int serNum; - long status; // current connection status + Enum status; // current connection status int tDiff; // don't think this is used anywhere }; diff --git a/lib/rfsv32.cc b/lib/rfsv32.cc index fa4852f..99c7f06 100644 --- a/lib/rfsv32.cc +++ b/lib/rfsv32.cc @@ -36,7 +36,7 @@ #include "ppsocket.h" #include "bufferarray.h" -rfsv32::rfsv32(ppsocket * _skt) : serNum(0) +rfsv32::rfsv32(ppsocket * _skt) : serNum(0), status(rfsv::E_PSI_FILE_DISC) { skt = _skt; reset(); @@ -74,7 +74,7 @@ reset() } } -long rfsv32:: +Enum rfsv32:: getStatus() { return status; @@ -96,7 +96,7 @@ convertSlash(const char *name) return n; } -long rfsv32:: +Enum rfsv32:: fopen(long attr, const char *name, long &handle) { bufferStore a; @@ -107,29 +107,29 @@ fopen(long attr, const char *name, long &handle) free(n); if (!sendCommand(OPEN_FILE, a)) return E_PSI_FILE_DISC; - long res = getResponse(a); - if (!res && a.getLen() == 4) { + Enum res = getResponse(a); + if (res == E_PSI_GEN_NONE && a.getLen() == 4) { handle = a.getDWord(0); - return 0; + return E_PSI_GEN_NONE; } return res; } -long rfsv32:: +Enum rfsv32:: mktemp(long *handle, char *tmpname) { bufferStore a; if (!sendCommand(TEMP_FILE, a)) return E_PSI_FILE_DISC; - long res = getResponse(a); - if (res == 0) { + Enum res = getResponse(a); + if (res == E_PSI_GEN_NONE) { *handle = a.getDWord(0); strcpy(tmpname, a.getString(6)); } return res; } -long rfsv32:: +Enum rfsv32:: fcreatefile(long attr, const char *name, long &handle) { bufferStore a; @@ -140,13 +140,13 @@ fcreatefile(long attr, const char *name, long &handle) free(n); if (!sendCommand(CREATE_FILE, a)) return E_PSI_FILE_DISC; - long res = getResponse(a); - if (!res && a.getLen() == 4) + Enum res = getResponse(a); + if (res == E_PSI_GEN_NONE && a.getLen() == 4) handle = a.getDWord(0); return res; } -long rfsv32:: +Enum rfsv32:: freplacefile(long attr, const char *name, long &handle) { bufferStore a; @@ -157,13 +157,13 @@ freplacefile(long attr, const char *name, long &handle) free(n); if (!sendCommand(REPLACE_FILE, a)) return E_PSI_FILE_DISC; - long res = getResponse(a); - if (!res && a.getLen() == 4) + Enum res = getResponse(a); + if (res == E_PSI_GEN_NONE && a.getLen() == 4) handle = a.getDWord(0); return res; } -long rfsv32:: +Enum rfsv32:: fopendir(long attr, const char *name, long &handle) { bufferStore a; @@ -174,13 +174,13 @@ fopendir(long attr, const char *name, long &handle) free(n); if (!sendCommand(OPEN_DIR, a)) return E_PSI_FILE_DISC; - long res = getResponse(a); + Enum res = getResponse(a); if (!res && a.getLen() == 4) handle = a.getDWord(0); return res; } -long rfsv32:: +Enum rfsv32:: fclose(long handle) { bufferStore a; @@ -245,12 +245,12 @@ time2micro(unsigned long time, unsigned long µHi, unsigned long µLo) microHi = (micro & (unsigned long long)0x0FFFFFFFF); } -long rfsv32:: +Enum rfsv32:: dir(const char *name, bufferArray * files) { long handle; - long res = fopendir(EPOC_ATTR_HIDDEN | EPOC_ATTR_SYSTEM | EPOC_ATTR_DIRECTORY, name, handle); - if (res != 0) + Enum res = fopendir(EPOC_ATTR_HIDDEN | EPOC_ATTR_SYSTEM | EPOC_ATTR_DIRECTORY, name, handle); + if (res != E_PSI_GEN_NONE) return res; while (1) { @@ -259,7 +259,7 @@ dir(const char *name, bufferArray * files) if (!sendCommand(READ_DIR, a)) return E_PSI_FILE_DISC; res = getResponse(a); - if (res) + if (res != E_PSI_GEN_NONE) break; while (a.getLen() > 16) { long shortLen = a.getDWord(0); @@ -292,7 +292,7 @@ dir(const char *name, bufferArray * files) } } if (res == E_PSI_FILE_EOF) - res = 0; + res = E_PSI_GEN_NONE; fclose(handle); return res; } @@ -326,7 +326,7 @@ opMode(long mode) return ret; } -long rfsv32:: +Enum rfsv32:: fgetmtime(const char *name, long *mtime) { bufferStore a; @@ -336,14 +336,14 @@ fgetmtime(const char *name, long *mtime) free(n); if (!sendCommand(MODIFIED, a)) return E_PSI_FILE_DISC; - long res = getResponse(a); - if (res != 0) + Enum res = getResponse(a); + if (res != E_PSI_GEN_NONE) return res; *mtime = micro2time(a.getDWord(4), a.getDWord(0)); - return 0; + return res; } -long rfsv32:: +Enum rfsv32:: fsetmtime(const char *name, long mtime) { bufferStore a; @@ -357,13 +357,10 @@ fsetmtime(const char *name, long mtime) free(n); if (!sendCommand(SET_MODIFIED, a)) return E_PSI_FILE_DISC; - long res = getResponse(a); - if (res != 0) - return res; - return 0; + return getResponse(a); } -long rfsv32:: +Enum rfsv32:: fgetattr(const char *name, long *attr) { bufferStore a; @@ -373,14 +370,14 @@ fgetattr(const char *name, long *attr) free(n); if (!sendCommand(ATT, a)) return E_PSI_FILE_DISC; - long res = getResponse(a); - if (res != 0) + Enum res = getResponse(a); + if (res != E_PSI_GEN_NONE) return res; *attr = a.getDWord(0); - return 0; + return res; } -long rfsv32:: +Enum rfsv32:: fgeteattr(const char *name, long *attr, long *size, long *time) { bufferStore a; @@ -390,8 +387,8 @@ fgeteattr(const char *name, long *attr, long *size, long *time) free(n); if (!sendCommand(REMOTE_ENTRY, a)) return E_PSI_FILE_DISC; - long res = getResponse(a); - if (res != 0) + Enum res = getResponse(a); + if (res != E_PSI_GEN_NONE) return res; // long shortLen = a.getDWord(0); *attr = a.getDWord(4); @@ -403,10 +400,10 @@ fgeteattr(const char *name, long *attr, long *size, long *time) // long uid3 = a.getDWord(28); // long longLen = a.getDWord(32); *time = micro2time(modHi, modLow); - return 0; + return res; } -long rfsv32:: +Enum rfsv32:: fsetattr(const char *name, long seta, long unseta) { bufferStore a; @@ -421,13 +418,13 @@ fsetattr(const char *name, long seta, long unseta) return getResponse(a); } -long rfsv32:: +Enum rfsv32:: dircount(const char *name, long *count) { long handle; - long res = fopendir(EPOC_ATTR_HIDDEN | EPOC_ATTR_SYSTEM | EPOC_ATTR_DIRECTORY, name, handle); + Enum res = fopendir(EPOC_ATTR_HIDDEN | EPOC_ATTR_SYSTEM | EPOC_ATTR_DIRECTORY, name, handle); *count = 0; - if (res != 0) + if (res != E_PSI_GEN_NONE) return res; while (1) { @@ -436,7 +433,7 @@ dircount(const char *name, long *count) if (!sendCommand(READ_DIR, a)) return E_PSI_FILE_DISC; res = getResponse(a); - if (res) + if (res != E_PSI_GEN_NONE) break; while (a.getLen() > 16) { int d = 36 + a.getDWord(32); @@ -451,21 +448,21 @@ dircount(const char *name, long *count) } fclose(handle); if (res == E_PSI_FILE_EOF) - res = 0; + res = E_PSI_GEN_NONE; return res; } -long rfsv32:: +Enum rfsv32:: devlist(long *devbits) { bufferStore a; - long res; + Enum res; if (!sendCommand(GET_DRIVE_LIST, a)) return E_PSI_FILE_DISC; res = getResponse(a); *devbits = 0; - if ((res == 0) && (a.getLen() == 26)) { + if ((res == E_PSI_GEN_NONE) && (a.getLen() == 26)) { for (int i = 25; i >= 0; i--) { *devbits <<= 1; if (a.getByte(i) != 0) @@ -525,7 +522,7 @@ sendCommand(enum commands cc, bufferStore & data) return result; } -long rfsv32:: +Enum rfsv32:: getResponse(bufferStore & data) { if (skt->getBufferStore(data) == 1 && @@ -585,50 +582,52 @@ fwrite(long handle, unsigned char *buf, long len) return total; } -long rfsv32:: +Enum rfsv32:: copyFromPsion(const char *from, const char *to, cpCallback_t cb) { long handle; - long res; + Enum res; long len; - if ((res = fopen(EPOC_OMODE_SHARE_READERS | EPOC_OMODE_BINARY, from, handle)) != 0) + if ((res = fopen(EPOC_OMODE_SHARE_READERS | EPOC_OMODE_BINARY, from, handle)) != E_PSI_GEN_NONE) return res; ofstream op(to); if (!op) { fclose(handle); - return -1; + return E_PSI_GEN_FAIL; } unsigned char *buff = new unsigned char[RFSV_SENDLEN]; do { if ((len = fread(handle, buff, RFSV_SENDLEN)) > 0) op.write(buff, len); + else + res = (enum rfsv::errs)len; if (cb) { if (!cb(len)) { - len = E_PSI_FILE_CANCEL; + res = E_PSI_FILE_CANCEL; break; } } - } while (len > 0); + } while ((len > 0) && (res == E_PSI_GEN_NONE)); delete[]buff; fclose(handle); op.close(); - return len; + return res; } -long rfsv32:: +Enum rfsv32:: copyToPsion(const char *from, const char *to, cpCallback_t cb) { long handle; - long res; + Enum res; ifstream ip(from); if (!ip) return E_PSI_FILE_NXIST; res = fcreatefile(EPOC_OMODE_BINARY | EPOC_OMODE_SHARE_EXCLUSIVE | EPOC_OMODE_READ_WRITE, to, handle); - if (res != 0) { + if (res != E_PSI_GEN_NONE) { res = freplacefile(EPOC_OMODE_BINARY | EPOC_OMODE_SHARE_EXCLUSIVE | EPOC_OMODE_READ_WRITE, to, handle); - if (res != 0) + if (res != E_PSI_GEN_NONE) return res; } unsigned char *buff = new unsigned char[RFSV_SENDLEN]; @@ -649,7 +648,7 @@ copyToPsion(const char *from, const char *to, cpCallback_t cb) return E_PSI_FILE_DISC; } res = getResponse(a); - if (res) { + if (res != E_PSI_GEN_NONE) { fclose(handle); ip.close(); delete[]buff; @@ -667,10 +666,10 @@ copyToPsion(const char *from, const char *to, cpCallback_t cb) fclose(handle); ip.close(); delete[]buff; - return 0; + return E_PSI_GEN_NONE; } -long rfsv32:: +Enum rfsv32:: fsetsize(long handle, long size) { bufferStore a; @@ -789,7 +788,7 @@ fseek(long handle, long pos, long mode) return realpos; } -long rfsv32:: +Enum rfsv32:: mkdir(const char *name) { bufferStore a; @@ -808,7 +807,7 @@ mkdir(const char *name) return getResponse(a); } -long rfsv32:: +Enum rfsv32:: rmdir(const char *name) { bufferStore a; @@ -827,7 +826,7 @@ rmdir(const char *name) return getResponse(a); } -long rfsv32:: +Enum rfsv32:: rename(const char *oldname, const char *newname) { bufferStore a; @@ -844,7 +843,7 @@ rename(const char *oldname, const char *newname) return getResponse(a); } -long rfsv32:: +Enum rfsv32:: remove(const char *name) { bufferStore a; @@ -857,7 +856,7 @@ remove(const char *name) return getResponse(a); } -static long e2psi[] = { +static enum rfsv::errs e2psi[] = { rfsv::E_PSI_FILE_DIRFULL, // -43 rfsv::E_PSI_GEN_POWER, // -42 rfsv::E_PSI_GEN_DIVIDE, // -41 @@ -904,12 +903,12 @@ static long e2psi[] = { rfsv::E_PSI_GEN_NONE // 0 }; -long rfsv32:: +Enum rfsv32:: err2psierr(long status) { if ((status > E_EPOC_NONE) || (status < E_EPOC_DIR_FULL)) { cerr << "FATAL: inavlid error-code" << endl; - return -999; + return E_PSI_INTERNAL; } return e2psi[status - E_EPOC_DIR_FULL]; } diff --git a/lib/rfsv32.h b/lib/rfsv32.h index 2aac5b9..af59af6 100644 --- a/lib/rfsv32.h +++ b/lib/rfsv32.h @@ -14,33 +14,33 @@ class rfsv32 : public rfsv { void reset(); void reconnect(); - long dir(const char *, bufferArray *); - long dircount(const char *, long *); - long copyFromPsion(const char *, const char *, cpCallback_t); - long copyToPsion(const char *, const char *, cpCallback_t); - long mkdir(const char *); - long rmdir(const char *); - long remove(const char *); - long rename(const char *, const char *); - long mktemp(long *, char *); - long fgeteattr(const char *, long *, long *, long *); - long fgetattr(const char *, long *); - long fsetattr(const char *, long, long); - long fgetmtime(const char *, long *); - long fsetmtime(const char *, long); - long fopendir(long, const char *, long &); - long fopen(long, const char *, long &); - long fcreatefile(long, const char *, long &); - long freplacefile(long, const char *, long &); + Enum dir(const char *, bufferArray *); + Enum dircount(const char *, long *); + Enum copyFromPsion(const char *, const char *, cpCallback_t); + Enum copyToPsion(const char *, const char *, cpCallback_t); + Enum mkdir(const char *); + Enum rmdir(const char *); + Enum remove(const char *); + Enum rename(const char *, const char *); + Enum mktemp(long *, char *); + Enum fgeteattr(const char *, long *, long *, long *); + Enum fgetattr(const char *, long *); + Enum fsetattr(const char *, long, long); + Enum fgetmtime(const char *, long *); + Enum fsetmtime(const char *, long); + Enum fopendir(long, const char *, long &); + Enum fopen(long, const char *, long &); + Enum fcreatefile(long, const char *, long &); + Enum freplacefile(long, const char *, long &); long fseek(long, long, long); long fread(long, unsigned char *, long); long fwrite(long, unsigned char *, long); - long fsetsize(long, long); - long fclose(long); + Enum fsetsize(long, long); + Enum fclose(long); - long devlist(long *); + Enum devlist(long *); char *devinfo(int, long *, long *, long *, long *); - long getStatus(); + Enum getStatus(); char *opAttr(long); long opMode(long); @@ -155,11 +155,11 @@ class rfsv32 : public rfsv { }; const char *getConnectName(); - long err2psierr(long); + Enum err2psierr(long); // Communication bool sendCommand(enum commands, bufferStore &); - long getResponse(bufferStore &); + Enum getResponse(bufferStore &); char *convertSlash(const char *); // time-conversion @@ -169,8 +169,7 @@ class rfsv32 : public rfsv { // Vars ppsocket *skt; int serNum; - long status; - int tDiff; + Enum status; }; #endif diff --git a/lib/rpcs.cc b/lib/rpcs.cc index cdbbabd..a4a19ab 100644 --- a/lib/rpcs.cc +++ b/lib/rpcs.cc @@ -30,16 +30,60 @@ #include "bufferstore.h" #include "ppsocket.h" #include "bufferarray.h" +#include "Enum.h" + +ENUM_DEFINITION(rpcs::machs, rpcs::PSI_MACH_UNKNOWN) { + stringRep.add(rpcs::PSI_MACH_UNKNOWN, "Unknown device"); + stringRep.add(rpcs::PSI_MACH_PC, "PC"); + stringRep.add(rpcs::PSI_MACH_MC, "MC"); + stringRep.add(rpcs::PSI_MACH_HC, "HC"); + stringRep.add(rpcs::PSI_MACH_S3, "Series 3"); + stringRep.add(rpcs::PSI_MACH_S3A, "Series 3a, 3c or 3mx"); + stringRep.add(rpcs::PSI_MACH_WORKABOUT, "Workabout"); + stringRep.add(rpcs::PSI_MACH_SIENNA, "Sienna"); + stringRep.add(rpcs::PSI_MACH_S3C, "Series 3c"); + stringRep.add(rpcs::PSI_MACH_S5, "Series 5"); + stringRep.add(rpcs::PSI_MACH_WINC, "WinC"); +} + +ENUM_DEFINITION(rpcs::batterystates, rpcs::PSI_BATT_DEAD) { + stringRep.add(rpcs::PSI_BATT_DEAD, "Empty"); + stringRep.add(rpcs::PSI_BATT_VERYLOW, "Very Low"); + stringRep.add(rpcs::PSI_BATT_LOW, "Low"); + stringRep.add(rpcs::PSI_BATT_GOOD, "Good"); +} -static const char * const langstrings[] = { - "Test", "English", "French", "German", "Spanish", "Italian", "Swedish", - "Danish", "Norwegian", "Finnish", "American", "Swiss French", - "Swiss German", "Portugese", "Turkish", "Icelandic", "Russian", - "Hungarian", "Dutch", "Belgian Flemish", "Australian", - "Belgish French", "Austrian", "New Zealand", - "International French", "Czech", "Slovak", "Polish", "Slovenian", - 0L -}; +ENUM_DEFINITION(rpcs::languages, rpcs::PSI_LANG_TEST) { + stringRep.add(rpcs::PSI_LANG_TEST, "Test"); + stringRep.add(rpcs::PSI_LANG_en_GB, "English"); + stringRep.add(rpcs::PSI_LANG_de_DE, "German"); + stringRep.add(rpcs::PSI_LANG_fr_FR, "French"); + stringRep.add(rpcs::PSI_LANG_es_ES, "Spanish"); + stringRep.add(rpcs::PSI_LANG_it_IT, "Italian"); + stringRep.add(rpcs::PSI_LANG_sv_SE, "Swedish"); + stringRep.add(rpcs::PSI_LANG_da_DK, "Danish"); + stringRep.add(rpcs::PSI_LANG_no_NO, "Norwegian"); + stringRep.add(rpcs::PSI_LANG_fi_FI, "Finnish"); + stringRep.add(rpcs::PSI_LANG_en_US, "American"); + stringRep.add(rpcs::PSI_LANG_fr_CH, "Swiss French"); + stringRep.add(rpcs::PSI_LANG_de_CH, "Swiss German"); + stringRep.add(rpcs::PSI_LANG_pt_PT, "Portugese"); + stringRep.add(rpcs::PSI_LANG_tr_TR, "Turkish"); + stringRep.add(rpcs::PSI_LANG_is_IS, "Icelandic"); + stringRep.add(rpcs::PSI_LANG_ru_RU, "Russian"); + stringRep.add(rpcs::PSI_LANG_hu_HU, "Hungarian"); + stringRep.add(rpcs::PSI_LANG_nl_NL, "Dutch"); + stringRep.add(rpcs::PSI_LANG_nl_BE, "Belgian Flemish"); + stringRep.add(rpcs::PSI_LANG_en_AU, "Australian"); + stringRep.add(rpcs::PSI_LANG_fr_BE, "Belgish French"); + stringRep.add(rpcs::PSI_LANG_de_AT, "Austrian"); + stringRep.add(rpcs::PSI_LANG_en_NZ, "New Zealand"); // FIXME: not shure about ISO code + stringRep.add(rpcs::PSI_LANG_fr_CA, "International French"); // FIXME: not shure about ISO code + stringRep.add(rpcs::PSI_LANG_cs_CZ, "Czech"); + stringRep.add(rpcs::PSI_LANG_sk_SK, "Slovak"); + stringRep.add(rpcs::PSI_LANG_pl_PL, "Polish"); + stringRep.add(rpcs::PSI_LANG_sl_SI, "Slovenian"); +} // // public common API @@ -56,17 +100,17 @@ void rpcs:: reset(void) { bufferStore a; - status = E_PSI_FILE_DISC; + status = rfsv::E_PSI_FILE_DISC; a.addStringT(getConnectName()); if (skt->sendBufferStore(a)) { if (skt->getBufferStore(a) == 1) { if (!strcmp(a.getString(0), "Ok")) - status = E_PSI_GEN_NONE; + status = rfsv::E_PSI_GEN_NONE; } } } -long rpcs:: +Enum rpcs:: getStatus(void) { return status; @@ -84,9 +128,9 @@ getConnectName(void) bool rpcs:: sendCommand(enum commands cc, bufferStore & data) { - if (status == E_PSI_FILE_DISC) { + if (status == rfsv::E_PSI_FILE_DISC) { reconnect(); - if (status == E_PSI_FILE_DISC) + if (status == rfsv::E_PSI_FILE_DISC) return false; } bool result; @@ -98,44 +142,44 @@ sendCommand(enum commands cc, bufferStore & data) reconnect(); result = skt->sendBufferStore(a); if (!result) - status = E_PSI_FILE_DISC; + status = rfsv::E_PSI_FILE_DISC; } return result; } -int rpcs:: +Enum rpcs:: getResponse(bufferStore & data) { if (skt->getBufferStore(data) == 1) { - char ret = data.getByte(0); + Enum ret = (enum rfsv::errs)data.getByte(0); data.discardFirstBytes(1); return ret; } else - status = E_PSI_FILE_DISC; + status = rfsv::E_PSI_FILE_DISC; return status; } // // APIs, identical on SIBO and EPOC // -int rpcs:: +Enum rpcs:: getNCPversion(int &major, int &minor) { - int res; + Enum res; bufferStore a; if (!sendCommand(QUERY_NCP, a)) - return E_PSI_FILE_DISC; - if ((res = getResponse(a))) + return rfsv::E_PSI_FILE_DISC; + if ((res = getResponse(a)) != rfsv::E_PSI_GEN_NONE) return res; if (a.getLen() != 2) - return E_PSI_GEN_FAIL; + return rfsv::E_PSI_GEN_FAIL; major = a.getByte(0); minor = a.getByte(1); return res; } -int rpcs:: +Enum rpcs:: execProgram(const char *program, const char *args) { bufferStore a; @@ -147,87 +191,87 @@ execProgram(const char *program, const char *args) a.addByte(strlen(args)); a.addStringT(args); if (!sendCommand(EXEC_PROG, a)) - return E_PSI_FILE_DISC; + return rfsv::E_PSI_FILE_DISC; return getResponse(a); } -int rpcs:: +Enum rpcs:: stopProgram(const char *program) { bufferStore a; a.addStringT(program); if (!sendCommand(STOP_PROG, a)) - return E_PSI_FILE_DISC; + return rfsv::E_PSI_FILE_DISC; return getResponse(a); } -int rpcs:: +Enum rpcs:: queryProgram(const char *program) { bufferStore a; a.addStringT(program); if (!sendCommand(QUERY_PROG, a)) - return E_PSI_FILE_DISC; + return rfsv::E_PSI_FILE_DISC; return getResponse(a); } -int rpcs:: +Enum rpcs:: formatOpen(const char *drive, int &handle, int &count) { - int res; + Enum res; bufferStore a; a.addStringT(drive); if (!sendCommand(FORMAT_OPEN, a)) - return E_PSI_FILE_DISC; - if ((res = getResponse(a))) + return rfsv::E_PSI_FILE_DISC; + if ((res = getResponse(a)) != rfsv::E_PSI_GEN_NONE) return res; if (a.getLen() != 4) - return E_PSI_GEN_FAIL; + return rfsv::E_PSI_GEN_FAIL; handle = a.getWord(0); count = a.getWord(2); return res; } -int rpcs:: +Enum rpcs:: formatRead(int handle) { bufferStore a; a.addWord(handle); if (!sendCommand(FORMAT_READ, a)) - return E_PSI_FILE_DISC; + return rfsv::E_PSI_FILE_DISC; return getResponse(a); } -int rpcs:: +Enum rpcs:: getUniqueID(const char *device, long &id) { - int res; + Enum res; bufferStore a; a.addStringT(device); if (!sendCommand(GET_UNIQUEID, a)) - return E_PSI_FILE_DISC; - if ((res = getResponse(a))) + return rfsv::E_PSI_FILE_DISC; + if ((res = getResponse(a)) != rfsv::E_PSI_GEN_NONE) return res; if (a.getLen() != 4) - return E_PSI_GEN_FAIL; + return rfsv::E_PSI_GEN_FAIL; id = a.getDWord(0); return res; } -int rpcs:: +Enum rpcs:: getOwnerInfo(bufferArray &owner) { - int res; + Enum res; bufferStore a; if (!sendCommand(GET_OWNERINFO, a)) - return E_PSI_FILE_DISC; - if ((res = getResponse(a))) + return rfsv::E_PSI_FILE_DISC; + if ((res = (enum rfsv::errs)getResponse(a)) != rfsv::E_PSI_GEN_NONE) return res; a.addByte(0); int l = a.getLen(); @@ -251,33 +295,33 @@ getOwnerInfo(bufferArray &owner) return res; } -int rpcs:: -getMachineType(int &type) +Enum rpcs:: +getMachineType(Enum &type) { - int res; + Enum res; bufferStore a; if (!sendCommand(GET_MACHINETYPE, a)) - return E_PSI_FILE_DISC; - if ((res = getResponse(a))) + return rfsv::E_PSI_FILE_DISC; + if ((res = getResponse(a)) != rfsv::E_PSI_GEN_NONE) return res; if (a.getLen() != 2) - return E_PSI_GEN_FAIL; - type = a.getWord(0); + return rfsv::E_PSI_GEN_FAIL; + type = (enum machs)a.getWord(0); return res; } -int rpcs:: +Enum rpcs:: fuser(const char *name, char *buf, int maxlen) { - int res; + Enum res; bufferStore a; char *p; a.addStringT(name); if (!sendCommand(FUSER, a)) - return E_PSI_FILE_DISC; - if ((res = getResponse(a))) + return rfsv::E_PSI_FILE_DISC; + if ((res = getResponse(a)) != rfsv::E_PSI_GEN_NONE) return res; strncpy(buf, a.getString(0), maxlen - 1); while ((p = strchr(buf, 6))) @@ -285,34 +329,11 @@ fuser(const char *name, char *buf, int maxlen) return res; } -int rpcs:: +Enum rpcs:: quitServer(void) { bufferStore a; if (!sendCommand(QUIT_SERVER, a)) - return E_PSI_FILE_DISC; + return rfsv::E_PSI_FILE_DISC; return getResponse(a); } - -const char *rpcs:: -languageString(int code) { - for (int i = 0; i <= code; i++) - if (langstrings[i] == 0L) - return "Unknown"; - return langstrings[code]; -} - -const char *rpcs:: -batteryStatusString(int code) { - switch (code) { - case PSI_BATT_DEAD: - return "Empty"; - case PSI_BATT_VERYLOW: - return "Very low"; - case PSI_BATT_LOW: - return "Low"; - case PSI_BATT_GOOD: - return "Good"; - } - return "Unknown"; -} diff --git a/lib/rpcs.h b/lib/rpcs.h index 3c569bb..18d4d66 100644 --- a/lib/rpcs.h +++ b/lib/rpcs.h @@ -2,56 +2,13 @@ #define _rpcs_h_ #include "psitime.h" +#include "rfsv.h" +#include "Enum.h" class ppsocket; class bufferStore; class bufferArray; -/** - * This struct holds the data returned - * by @ref rpcs::getMachineInfo. - */ -typedef struct machineInfo_t { - unsigned long machineType; - char machineName[17]; - unsigned long long machineUID; - unsigned long countryCode; - char uiLanguage[32]; - - unsigned short romMajor; - unsigned short romMinor; - unsigned short romBuild; - unsigned long romSize; - bool romProgrammable; - - unsigned long ramSize; - unsigned long ramFree; - unsigned long ramMaxFree; - unsigned long ramDiskSize; - - unsigned long registrySize; - unsigned long displayWidth; - unsigned long displayHeight; - - psi_timeval time; - psi_timezone tz; - - psi_timeval mainBatteryInsertionTime; - unsigned long mainBatteryStatus; - psi_timeval mainBatteryUsedTime; - unsigned long mainBatteryCurrent; - unsigned long mainBatteryUsedPower; - unsigned long mainBatteryVoltage; - unsigned long mainBatteryMaxVoltage; - - unsigned long backupBatteryStatus; - unsigned long backupBatteryVoltage; - unsigned long backupBatteryMaxVoltage; - psi_timeval backupBatteryUsedTime; - - bool externalPower; -} machineInfo; - /** * Remote procedure call services via PLP * @@ -67,6 +24,114 @@ typedef struct machineInfo_t { */ class rpcs { public: + /** + * The known machine types. + */ + enum machs { + PSI_MACH_UNKNOWN = 0, + PSI_MACH_PC = 1, + PSI_MACH_MC = 2, + PSI_MACH_HC = 3, + PSI_MACH_S3 = 4, + PSI_MACH_S3A = 5, + PSI_MACH_WORKABOUT = 6, + PSI_MACH_SIENNA = 7, + PSI_MACH_S3C = 8, + PSI_MACH_S5 = 32, + PSI_MACH_WINC = 33, + // TODO: Code for 5mx + }; + + /** + * The known interface languages. + */ + enum languages { + PSI_LANG_TEST = 0, + PSI_LANG_en_GB = 1, + PSI_LANG_fr_FR = 2, + PSI_LANG_de_DE = 3, + PSI_LANG_es_ES = 4, + PSI_LANG_it_IT = 5, + PSI_LANG_sv_SE = 6, + PSI_LANG_da_DK = 7, + PSI_LANG_no_NO = 8, + PSI_LANG_fi_FI = 9, + PSI_LANG_en_US = 10, + PSI_LANG_fr_CH = 11, + PSI_LANG_de_CH = 12, + PSI_LANG_pt_PT = 13, + PSI_LANG_tr_TR = 14, + PSI_LANG_is_IS = 15, + PSI_LANG_ru_RU = 16, + PSI_LANG_hu_HU = 17, + PSI_LANG_nl_NL = 18, + PSI_LANG_nl_BE = 19, + PSI_LANG_en_AU = 20, + PSI_LANG_fr_BE = 21, + PSI_LANG_de_AT = 22, + PSI_LANG_en_NZ = 23, + PSI_LANG_fr_CA = 24, + PSI_LANG_cs_CZ = 25, + PSI_LANG_sk_SK = 26, + PSI_LANG_pl_PL = 27, + PSI_LANG_sl_SI = 28, + }; + + /** + * The known battery states. + */ + enum batterystates { + PSI_BATT_DEAD = 0, + PSI_BATT_VERYLOW = 1, + PSI_BATT_LOW = 2, + PSI_BATT_GOOD = 3, + }; + + /** + * This struct holds the data returned + * by @ref rpcs::getMachineInfo. + */ + typedef struct machineInfo_t { + Enum machineType; + char machineName[17]; + unsigned long long machineUID; + unsigned long countryCode; + Enum uiLanguage; + + unsigned short romMajor; + unsigned short romMinor; + unsigned short romBuild; + unsigned long romSize; + bool romProgrammable; + + unsigned long ramSize; + unsigned long ramFree; + unsigned long ramMaxFree; + unsigned long ramDiskSize; + + unsigned long registrySize; + unsigned long displayWidth; + unsigned long displayHeight; + + psi_timeval time; + psi_timezone tz; + + psi_timeval mainBatteryInsertionTime; + Enum mainBatteryStatus; + psi_timeval mainBatteryUsedTime; + unsigned long mainBatteryCurrent; + unsigned long mainBatteryUsedPower; + unsigned long mainBatteryVoltage; + unsigned long mainBatteryMaxVoltage; + + Enum backupBatteryStatus; + unsigned long backupBatteryVoltage; + unsigned long backupBatteryMaxVoltage; + psi_timeval backupBatteryUsedTime; + + bool externalPower; + } machineInfo; + /** * Provides a virtual destructor. */ @@ -92,7 +157,7 @@ class rpcs { * * @returns The connection status. */ - long getStatus(); + Enum getStatus(); /** * Retrieves the version of the NCP protocol @@ -108,7 +173,7 @@ class rpcs { * * @returns A psion error code. 0 = Ok. */ - int getNCPversion(int &major, int &minor); + Enum getNCPversion(int &major, int &minor); /** * Starts execution of a program on the remote machine. @@ -123,7 +188,7 @@ class rpcs { * * @returns A psion error code. 0 = Ok. */ - int execProgram(const char *program, const char *args); + Enum execProgram(const char *program, const char *args); /** * Requests termination of a program running on the @@ -136,11 +201,11 @@ class rpcs { * * @returns A psion error code. 0 = Ok. */ - int stopProgram(const char *); - int queryProgram(const char *); - int formatOpen(const char *, int &, int &); - int formatRead(int); - int getUniqueID(const char *, long &); + Enum stopProgram(const char *); + Enum queryProgram(const char *); + Enum formatOpen(const char *, int &, int &); + Enum formatRead(int); + Enum getUniqueID(const char *, long &); /** * Retrieve owner information of the remote machine. @@ -153,7 +218,7 @@ class rpcs { * * @returns A psion error code. 0 = Ok. */ - int getOwnerInfo(bufferArray &); + Enum getOwnerInfo(bufferArray &); /** * Retrieves the type of machine on the remote side @@ -167,7 +232,7 @@ class rpcs { * * @returns A psion error code. 0 = Ok. */ - int getMachineType(int &type); + Enum getMachineType(Enum &type); /** * Retrieves the name of a process, having a @@ -182,7 +247,7 @@ class rpcs { * program's name. * @param maxlen The maximum capacity of the buffer. */ - int fuser(const char *name, char *buf, int maxlen); + Enum fuser(const char *name, char *buf, int maxlen); /** * Requests the remote server to terminate. @@ -194,33 +259,10 @@ class rpcs { * * @returns A psion error code. 0 = Ok. */ - int quitServer(void); - - /** - * Maps a language code to a human readable language name. - * - * @param code The language code to map. - * - * @returns The name of the language, represented by code, or - * "Unknown", if the code does not match one of the known - * languages. - */ - const char *languageString(const int code); - - /** - * Maps a battery status code to a human readable description. - * - * @param code The battary status code to map. - * - * @returns A descriptive text for the battery status, or - * "Unknown", if the code does not match a known - * battery status. - */ - const char *batteryStatusString(const int code); - + Enum quitServer(void); // API different on SIBO and EPOC - virtual int queryDrive(const char, bufferArray &) = 0; + virtual Enum queryDrive(const char, bufferArray &) = 0; /** * Retrieves the command line of a running process. * @@ -232,7 +274,7 @@ class rpcs { * * @return Psion error code. 0 = Ok. */ - virtual int getCmdLine(const char *process, bufferStore &ret) = 0; + virtual Enum getCmdLine(const char *process, bufferStore &ret) = 0; // API only existent on EPOC // default-methods for SIBO here. @@ -246,65 +288,19 @@ class rpcs { * @param machineInfo The struct holding all information on return. * @return Psion error code. 0 = Ok. */ - virtual int getMachineInfo(machineInfo &) { return E_PSI_NOT_SIBO;} - virtual int closeHandle(int) { return E_PSI_NOT_SIBO;} - virtual int regOpenIter(void) { return E_PSI_NOT_SIBO;} - virtual int regReadIter(void) { return E_PSI_NOT_SIBO;} - virtual int regWrite(void) { return E_PSI_NOT_SIBO;} - virtual int regRead(void) { return E_PSI_NOT_SIBO;} - virtual int regDelete(void) { return E_PSI_NOT_SIBO;} - virtual int setTime(void) { return E_PSI_NOT_SIBO;} - virtual int configOpen(void) { return E_PSI_NOT_SIBO;} - virtual int configRead(void) { return E_PSI_NOT_SIBO;} - virtual int configWrite(void) { return E_PSI_NOT_SIBO;} - virtual int queryOpen(void) { return E_PSI_NOT_SIBO;} - virtual int queryRead(void) { return E_PSI_NOT_SIBO;} - - enum errs { - E_PSI_GEN_NONE = 0, - E_PSI_GEN_FAIL = -1, - E_PSI_FILE_DISC = -50, - // Special error code for "Operation not permitted in RPCS16" - E_PSI_NOT_SIBO = -200 - }; - - /** - * The known machine types. - */ - enum machs { - PSI_MACH_UNKNOWN = 0, - PSI_MACH_PC = 1, - PSI_MACH_MC = 2, - PSI_MACH_HC = 3, - PSI_MACH_S3 = 4, - PSI_MACH_S3A = 5, - PSI_MACH_WORKABOUT = 6, - PSI_MACH_SIENNA = 7, - PSI_MACH_S3C = 8, - PSI_MACH_S5 = 32, - PSI_MACH_WINC = 33, - // TODO: Code for 5mx - }; - - /** - * The known interface languages. - */ - enum languagecodes { - PSI_LANG_TEST = 0, - PSI_LANG_ENGLISH = 1, - PSI_LANG_FRENCH = 2, - PSI_LANG_GERMAN = 3, - }; - - /** - * The known battery states. - */ - enum batterystates { - PSI_BATT_DEAD = 0, - PSI_BATT_VERYLOW = 1, - PSI_BATT_LOW = 2, - PSI_BATT_GOOD = 3, - }; + virtual Enum getMachineInfo(machineInfo &) { return rfsv::E_PSI_NOT_SIBO;} + virtual Enum closeHandle(int) { return rfsv::E_PSI_NOT_SIBO;} + virtual Enum regOpenIter(void) { return rfsv::E_PSI_NOT_SIBO;} + virtual Enum regReadIter(void) { return rfsv::E_PSI_NOT_SIBO;} + virtual Enum regWrite(void) { return rfsv::E_PSI_NOT_SIBO;} + virtual Enum regRead(void) { return rfsv::E_PSI_NOT_SIBO;} + virtual Enum regDelete(void) { return rfsv::E_PSI_NOT_SIBO;} + virtual Enum setTime(void) { return rfsv::E_PSI_NOT_SIBO;} + virtual Enum configOpen(void) { return rfsv::E_PSI_NOT_SIBO;} + virtual Enum configRead(void) { return rfsv::E_PSI_NOT_SIBO;} + virtual Enum configWrite(void) { return rfsv::E_PSI_NOT_SIBO;} + virtual Enum queryOpen(void) { return rfsv::E_PSI_NOT_SIBO;} + virtual Enum queryRead(void) { return rfsv::E_PSI_NOT_SIBO;} protected: /** @@ -316,7 +312,7 @@ class rpcs { /** * The current status of the connection. */ - long status; + Enum status; /** * The possible commands. @@ -364,7 +360,7 @@ class rpcs { * @returns true on success, false on failure. */ bool sendCommand(enum commands cc, bufferStore &data); - int getResponse(bufferStore &); + Enum getResponse(bufferStore &); const char *getConnectName(); }; diff --git a/lib/rpcs16.cc b/lib/rpcs16.cc index d8d75cf..57963e2 100644 --- a/lib/rpcs16.cc +++ b/lib/rpcs16.cc @@ -40,27 +40,25 @@ rpcs16::~rpcs16() { bufferStore a; a.addStringT("Close"); - if (status == E_PSI_GEN_NONE) + if (status == rfsv::E_PSI_GEN_NONE) skt->sendBufferStore(a); skt->closeSocket(); } -int rpcs16:: +Enum rpcs16:: queryDrive(char drive, bufferArray &ret) { bufferStore a; a.addByte(drive); if (!sendCommand(rpcs::QUERY_DRIVE, a)) - return rpcs::E_PSI_FILE_DISC; - long res = getResponse(a); + return rfsv::E_PSI_FILE_DISC; + Enum res = getResponse(a); cout << dec << "qd: " << res << " " << a.getLen() << " a="<< a << endl; - if (res) - return res; return res; } -int rpcs16:: +Enum rpcs16:: getCmdLine(const char *process, bufferStore &ret) { - return 0; + return rfsv::E_PSI_GEN_NONE; } diff --git a/lib/rpcs16.h b/lib/rpcs16.h index c803fff..efc6b99 100644 --- a/lib/rpcs16.h +++ b/lib/rpcs16.h @@ -11,8 +11,8 @@ class rpcs16 : public rpcs { rpcs16(ppsocket *); ~rpcs16(); - int queryDrive(const char, bufferArray &); - int getCmdLine(const char *, bufferStore &); + Enum queryDrive(const char, bufferArray &); + Enum getCmdLine(const char *, bufferStore &); }; #endif diff --git a/lib/rpcs32.cc b/lib/rpcs32.cc index 22433ee..95dfd6f 100644 --- a/lib/rpcs32.cc +++ b/lib/rpcs32.cc @@ -42,21 +42,21 @@ rpcs32::~rpcs32() { bufferStore a; a.addStringT("Close"); - if (status == E_PSI_GEN_NONE) + if (status == rfsv::E_PSI_GEN_NONE) skt->sendBufferStore(a); skt->closeSocket(); } -int rpcs32:: +Enum rpcs32:: queryDrive(char drive, bufferArray &ret) { bufferStore a; - int res; + Enum res; a.addByte(drive); if (!sendCommand(rpcs::QUERY_DRIVE, a)) - return rpcs::E_PSI_FILE_DISC; - if ((res = getResponse(a))) + return rfsv::E_PSI_FILE_DISC; + if ((res = getResponse(a)) != rfsv::E_PSI_GEN_NONE) return res; int l = a.getLen(); ret.clear(); @@ -89,40 +89,40 @@ queryDrive(char drive, bufferArray &ret) return res; } -int rpcs32:: +Enum rpcs32:: getCmdLine(const char *process, bufferStore &ret) { bufferStore a; - int res; + Enum res; a.addStringT(process); if (!sendCommand(rpcs::GET_CMDLINE, a)) - return rpcs::E_PSI_FILE_DISC; + return rfsv::E_PSI_FILE_DISC; res = getResponse(a); ret = a; return res; } -int rpcs32:: +Enum rpcs32:: getMachineInfo(machineInfo &mi) { bufferStore a; - int res; + Enum res; if (!sendCommand(rpcs::GET_MACHINE_INFO, a)) - return rpcs::E_PSI_FILE_DISC; - if ((res = getResponse(a))) + return rfsv::E_PSI_FILE_DISC; + if ((res = getResponse(a)) != rfsv::E_PSI_GEN_NONE) return res; if (a.getLen() != 256) - return E_PSI_GEN_FAIL; - mi.machineType = a.getDWord(0); + return rfsv::E_PSI_GEN_FAIL; + mi.machineType = (enum rpcs::machs)a.getDWord(0); strncpy(mi.machineName, a.getString(16), 16); mi.machineName[16] = '\0'; mi.machineUID = a.getDWord(44); mi.machineUID <<= 32; mi.machineUID |= a.getDWord(40); mi.countryCode = a.getDWord(56); - strcpy(mi.uiLanguage, languageString(a.getDWord(164))); + mi.uiLanguage = (enum rpcs::languages)a.getDWord(164); mi.romMajor = a.getByte(4); mi.romMinor = a.getByte(5); @@ -149,7 +149,7 @@ getMachineInfo(machineInfo &mi) mi.mainBatteryInsertionTime.tv_low = a.getDWord(72); mi.mainBatteryInsertionTime.tv_high = a.getDWord(76); - mi.mainBatteryStatus = a.getDWord(80); + mi.mainBatteryStatus = (enum rpcs::batterystates)a.getDWord(80); mi.mainBatteryUsedTime.tv_low = a.getDWord(84); mi.mainBatteryUsedTime.tv_high = a.getDWord(88); mi.mainBatteryCurrent = a.getDWord(92); @@ -157,7 +157,7 @@ getMachineInfo(machineInfo &mi) mi.mainBatteryVoltage = a.getDWord(100); mi.mainBatteryMaxVoltage = a.getDWord(104); - mi.backupBatteryStatus = a.getDWord(108); + mi.backupBatteryStatus = (enum rpcs::batterystates)a.getDWord(108); mi.backupBatteryVoltage = a.getDWord(112); mi.backupBatteryMaxVoltage = a.getDWord(116); mi.backupBatteryUsedTime.tv_low = a.getDWord(124); @@ -170,25 +170,25 @@ getMachineInfo(machineInfo &mi) static unsigned long hhh; -int rpcs32:: +Enum rpcs32:: configOpen(void) { bufferStore a; - int res; + Enum res; if (!sendCommand(rpcs::CONFIG_OPEN, a)) - return rpcs::E_PSI_FILE_DISC; + return rfsv::E_PSI_FILE_DISC; res = getResponse(a); cout << "co: r=" << res << " a=" << a << endl; hhh = a.getDWord(0); - return 0; + return rfsv::E_PSI_GEN_NONE; } -int rpcs32:: +Enum rpcs32:: configRead(void) { bufferStore a; - int res; + Enum res; int l; FILE *f; @@ -197,8 +197,8 @@ configRead(void) a.init(); a.addDWord(hhh); if (!sendCommand(rpcs::CONFIG_READ, a)) - return rpcs::E_PSI_FILE_DISC; - if ((res = getResponse(a))) + return rfsv::E_PSI_FILE_DISC; + if ((res = getResponse(a)) != rfsv::E_PSI_GEN_NONE) return res; l = a.getLen(); cout << "cr: " << l << endl; @@ -206,5 +206,5 @@ configRead(void) } while (l > 0); fclose(f); //cout << "cr: r=" << res << " a=" << a << endl; - return 0; + return rfsv::E_PSI_GEN_NONE; } diff --git a/lib/rpcs32.h b/lib/rpcs32.h index 6c333b4..973b142 100644 --- a/lib/rpcs32.h +++ b/lib/rpcs32.h @@ -10,25 +10,25 @@ class rpcs32 : public rpcs { rpcs32(ppsocket *); ~rpcs32(); - int queryDrive(const char, bufferArray &); - int getCmdLine(const char *, bufferStore &); - int getMachineInfo(machineInfo &); - int configOpen(void); - int configRead(void); + Enum queryDrive(const char, bufferArray &); + Enum getCmdLine(const char *, bufferStore &); + Enum getMachineInfo(machineInfo &); + Enum configOpen(void); + Enum configRead(void); #if 0 - int closeHandle(int); - int regOpenIter(void); - int regReadIter(void); - int regWrite(void); - int regRead(void); - int regDelete(void); - int setTime(void); - int configOpen(void); - int configRead(void); - int configWrite(void); - int queryOpen(void); - int queryRead(void); - int quitServer(void); + Enum closeHandle(int); + Enum regOpenIter(void); + Enum regReadIter(void); + Enum regWrite(void); + Enum regRead(void); + Enum regDelete(void); + Enum setTime(void); + Enum configOpen(void); + Enum configRead(void); + Enum configWrite(void); + Enum queryOpen(void); + Enum queryRead(void); + Enum quitServer(void); #endif }; diff --git a/plpftp/ftp.cc b/plpftp/ftp.cc index 2022eb5..60ebfb4 100644 --- a/plpftp/ftp.cc +++ b/plpftp/ftp.cc @@ -45,6 +45,7 @@ #include "rpcs.h" #include "bufferarray.h" #include "bufferstore.h" +#include "Enum.h" #if HAVE_LIBREADLINE extern "C" { @@ -196,7 +197,7 @@ session(rfsv & a, rpcs & r, int xargc, char **xargv) char *argv[10]; char f1[256]; char f2[256]; - long res; + Enum res; bool prompt = true; bool hash = false; cpCallback_t cab = checkAbortNoHash; @@ -211,48 +212,9 @@ session(rfsv & a, rpcs & r, int xargc, char **xargv) if (!once) { bufferArray b; if (!(res = r.getOwnerInfo(b))) { - int machType; + Enum machType; r.getMachineType(machType); - cout << "Connected to "; - switch (machType) { - case rpcs::PSI_MACH_UNKNOWN: - cout << "an unknown Device"; - break; - case rpcs::PSI_MACH_PC: - cout << "a PC"; - break; - case rpcs::PSI_MACH_MC: - cout << "a MC"; - break; - case rpcs::PSI_MACH_HC: - cout << "a HC"; - break; - case rpcs::PSI_MACH_S3: - cout << "a Serie 3"; - break; - case rpcs::PSI_MACH_S3A: - cout << "a Series 3a, 3c or 3mx"; - break; - case rpcs::PSI_MACH_WORKABOUT: - cout << "a Workabout"; - break; - case rpcs::PSI_MACH_SIENNA: - cout << "a Sienna"; - break; - case rpcs::PSI_MACH_S3C: - cout << "a Series 3c"; - break; - case rpcs::PSI_MACH_S5: - cout << "a Series 5"; - break; - case rpcs::PSI_MACH_WINC: - cout << "a WinC"; - break; - default: - cout << "an undefined Device"; - break; - } - cout << ", OwnerInfo:" << endl; + cout << "Connected to a " << machType << ", OwnerInfo:" << endl; while (!b.empty()) cout << " " << b.pop().getString() << endl; cout << endl; @@ -321,14 +283,14 @@ session(rfsv & a, rpcs & r, int xargc, char **xargv) strcpy(f2, psionDir); strcat(f2, argv[2]); if ((res = a.rename(f1, f2)) != 0) - errprint(res, a); + cerr << "Error: " << res << endl; continue; } if (!strcmp(argv[0], "touch") && (argc == 2)) { strcpy(f1, psionDir); strcat(f1, argv[1]); if ((res = a.fsetmtime(f1, time(0))) != 0) - errprint(res, a); + cerr << "Error: " << res << endl; continue; } if (!strcmp(argv[0], "test") && (argc == 2)) { @@ -336,7 +298,7 @@ session(rfsv & a, rpcs & r, int xargc, char **xargv) strcpy(f1, psionDir); strcat(f1, argv[1]); if ((res = a.fgeteattr(f1, &attr, &size, &time)) != 0) - errprint(res, a); + cerr << "Error: " << res << endl; else { // never used to do this char dateBuff[100]; @@ -353,7 +315,7 @@ session(rfsv & a, rpcs & r, int xargc, char **xargv) strcpy(f1, psionDir); strcat(f1, argv[1]); if ((res = a.fgetattr(f1, &attr)) != 0) - errprint(res, a); + cerr << "Error: " << res << endl; else { cout << hex << setw(4) << setfill('0') << attr; cout << " (" << a.opAttr(attr) << ")" << endl; @@ -365,7 +327,7 @@ session(rfsv & a, rpcs & r, int xargc, char **xargv) strcpy(f1, psionDir); strcat(f1, argv[1]); if ((res = a.fgetmtime(f1, &mtime)) != 0) - errprint(res, a); + cerr << "Error: " << res << endl; else { char dateBuff[100]; strftime(dateBuff, sizeof(dateBuff), datefmt, localtime(&mtime)); @@ -410,13 +372,13 @@ session(rfsv & a, rpcs & r, int xargc, char **xargv) p++; } if ((res = a.fsetattr(f1, attr[0], attr[1])) != 0) - errprint(res, a); + cerr << "Error: " << res << endl; continue; } if (!strcmp(argv[0], "dircnt")) { long cnt; if ((res = a.dircount(psionDir, &cnt)) != 0) - errprint(res, a); + cerr << "Error: " << res << endl; else cout << cnt << " Entries" << endl; continue; @@ -443,13 +405,13 @@ session(rfsv & a, rpcs & r, int xargc, char **xargv) devbits >>= 1; } } else - errprint(res, a); + cerr << "Error: " << res << endl; continue; } if (!strcmp(argv[0], "ls") || !strcmp(argv[0], "dir")) { bufferArray files; if ((res = a.dir(psionDir, &files)) != 0) - errprint(res, a); + cerr << "Error: " << res << endl; else while (!files.empty()) { bufferStore s; @@ -515,7 +477,7 @@ session(rfsv & a, rpcs & r, int xargc, char **xargv) strcpy(psionDir, f1); } else { - errprint(res, a); + cerr << "Error: " << res << endl; cerr << "Keeping original directory \"" << psionDir << "\"" << endl; } } @@ -538,7 +500,7 @@ session(rfsv & a, rpcs & r, int xargc, char **xargv) if (hash) cout << endl; continueRunning = 1; - errprint(res, a); + cerr << "Error: " << res << endl; } else { if (hash) cout << endl; @@ -564,7 +526,7 @@ session(rfsv & a, rpcs & r, int xargc, char **xargv) char *pattern = argv[1]; bufferArray files; if ((res = a.dir(psionDir, &files)) != 0) { - errprint(res, a); + cerr << "Error: " << res << endl; continue; } while (!files.empty()) { @@ -602,7 +564,7 @@ session(rfsv & a, rpcs & r, int xargc, char **xargv) if (hash) cout << endl; continueRunning = 1; - errprint(res, a); + cerr << "Error: " << res << endl; break; } else { if (hash) @@ -630,7 +592,7 @@ session(rfsv & a, rpcs & r, int xargc, char **xargv) if (hash) cout << endl; continueRunning = 1; - errprint(res, a); + cerr << "Error: " << res << endl; } else { if (hash) cout << endl; @@ -691,7 +653,7 @@ session(rfsv & a, rpcs & r, int xargc, char **xargv) if (hash) cout << endl; continueRunning = 1; - errprint(res, a); + cerr << "Error: " << res << endl; break; } else { if (hash) @@ -711,21 +673,21 @@ session(rfsv & a, rpcs & r, int xargc, char **xargv) strcpy(f1, psionDir); strcat(f1, argv[1]); if ((res = a.remove(f1)) != 0) - errprint(res, a); + cerr << "Error: " << res << endl; continue; } if (!strcmp(argv[0], "mkdir") && (argc == 2)) { strcpy(f1, psionDir); strcat(f1, argv[1]); if ((res = a.mkdir(f1)) != 0) - errprint(res, a); + cerr << "Error: " << res << endl; continue; } if (!strcmp(argv[0], "rmdir") && (argc == 2)) { strcpy(f1, psionDir); strcat(f1, argv[1]); if ((res = a.rmdir(f1)) != 0) - errprint(res, a); + cerr << "Error: " << res << endl; continue; } if (argv[0][0] == '!') { @@ -777,9 +739,9 @@ session(rfsv & a, rpcs & r, int xargc, char **xargv) continue; } if (!strcmp(argv[0], "machinfo")) { - machineInfo mi; + rpcs::machineInfo mi; if ((res = r.getMachineInfo(mi))) { - errprint(res, a); + cerr << "Error: " << res << endl; continue; } @@ -814,15 +776,13 @@ session(rfsv & a, rpcs & r, int xargc, char **xargv) pt.setPsiTime(&mi.mainBatteryInsertionTime); cout << " Changed at: " << pt << endl; cout << " Used for: " << mi.mainBatteryUsedTime << endl; - cout << " Status: " << - r.batteryStatusString(mi.mainBatteryStatus) << endl; + cout << " Status: " << mi.mainBatteryStatus << endl; cout << " Current: " << mi.mainBatteryCurrent << " mA" << endl; cout << " UsedPower: " << mi.mainBatteryUsedPower << " mAs" << endl; cout << " Voltage: " << mi.mainBatteryVoltage << " mV" << endl; cout << " Max. voltage: " << mi.mainBatteryMaxVoltage << " mV" << endl; cout << "Backup battery:" << endl; - cout << " Status: " << - r.batteryStatusString(mi.backupBatteryStatus) << endl; + cout << " Status: " << mi.backupBatteryStatus << endl; cout << " Voltage: " << mi.backupBatteryVoltage << " mV" << endl; cout << " Max. voltage: " << mi.backupBatteryMaxVoltage << " mV" << endl; cout << " Used for: " << mi.backupBatteryUsedTime << endl; @@ -840,7 +800,7 @@ session(rfsv & a, rpcs & r, int xargc, char **xargv) ip >> cmd >> arg; if ((res = r.execProgram(cmd, arg))) { cerr << "Could not start " << cmd << " " << arg << endl; - errprint(res, a); + cerr << "Error: " << res << endl; } } ip.close(); @@ -922,11 +882,6 @@ session(rfsv & a, rpcs & r, int xargc, char **xargv) return a.getStatus(); } -void ftp:: -errprint(long errcode, rfsv & a) { - cerr << "Error: " << a.opErr(errcode) << endl; -} - #if HAVE_LIBREADLINE static char *all_commands[] = { "pwd", "ren", "touch", "gtime", "test", "gattr", "sattr", "devs", @@ -959,7 +914,7 @@ filename_generator(char *text, int state) delete comp_files; comp_files = new bufferArray(); if ((res = comp_a->dir(psionDir, comp_files)) != 0) { - cerr << "Error: " << comp_a->opErr(res) << endl; + cerr << "Error: " << res << endl; return NULL; } } diff --git a/plpftp/ftp.h b/plpftp/ftp.h index a89fd62..86c3d42 100644 --- a/plpftp/ftp.h +++ b/plpftp/ftp.h @@ -26,8 +26,9 @@ #define _ftp_h_ #include "bool.h" +#include "rfsv.h" +#include "Enum.h" -class rfsv; class rpcs; class bufferStore; class bufferArray; @@ -47,7 +48,6 @@ class ftp { void getUnixDir(bufferArray & files); void resetUnixPwd(); void usage(); - void errprint(long errcode, rfsv & a); void cd(const char *source, const char *cdto, char *dest); // MJG: note, this isn't actually used anywhere -- cgit v1.2.3