aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorFritz Elfert <felfert@to.com>2001-02-02 04:49:20 +0000
committerFritz Elfert <felfert@to.com>2001-02-02 04:49:20 +0000
commit9fac7af37460c6a73a7debac1ba82b094a8f066c (patch)
treec6ef3e0ebd088c62348f140289f82482d82db1cf /lib
parent4da48658c8f1dfbf5960bb1768dc6d154c528734 (diff)
downloadplptools-9fac7af37460c6a73a7debac1ba82b094a8f066c.tar.gz
plptools-9fac7af37460c6a73a7debac1ba82b094a8f066c.tar.bz2
plptools-9fac7af37460c6a73a7debac1ba82b094a8f066c.zip
Replaced lot of ugly char * by string.
Fixed bug in plpftp's filename-completion, which was introduced yesterday. Added a class PlpUID for dealing with application-UIDs Added UID->mimetype mapping in kioslave.
Diffstat (limited to 'lib')
-rw-r--r--lib/plpdirent.cc25
-rw-r--r--lib/plpdirent.h26
-rw-r--r--lib/rfsv.cc45
-rw-r--r--lib/rfsv.h15
-rw-r--r--lib/rfsv16.cc140
-rw-r--r--lib/rfsv16.h3
-rw-r--r--lib/rfsv32.cc167
-rw-r--r--lib/rfsv32.h3
8 files changed, 187 insertions, 237 deletions
diff --git a/lib/plpdirent.cc b/lib/plpdirent.cc
index 345eac6..33e1a78 100644
--- a/lib/plpdirent.cc
+++ b/lib/plpdirent.cc
@@ -2,11 +2,25 @@
#include <stream.h>
#include <iomanip>
+PlpUID::PlpUID() {
+ memset(uid, 0, sizeof(uid));
+}
+
+PlpUID::PlpUID(const long u1, const long u2, const long u3) {
+ uid[0] = u1; uid[1] = u2; uid[2] = u3;
+}
+
+long PlpUID::
+operator[](int idx) {
+ assert ((idx > -1) && (idx < 3));
+ return uid[idx];
+}
+
PlpDirent::PlpDirent(const PlpDirent &e) {
size = e.size;
attr = e.attr;
time = e.time;
- memcpy(uid, e.uid, sizeof(uid));
+ UID = e.UID;
name = e.name;
attrstr = e.attrstr;
}
@@ -24,10 +38,15 @@ getAttr() {
long PlpDirent::
getUID(int uididx) {
if ((uididx >= 0) && (uididx < 4))
- return uid[uididx];
+ return UID[uididx];
return 0;
}
+PlpUID &PlpDirent::
+getUID() {
+ return UID;
+}
+
const char *PlpDirent::
getName() {
return name.c_str();
@@ -48,7 +67,7 @@ operator=(const PlpDirent &e) {
size = e.size;
attr = e.attr;
time = e.time;
- memcpy(uid, e.uid, sizeof(uid));
+ UID = e.UID;
name = e.name;
attrstr = e.attrstr;
return *this;
diff --git a/lib/plpdirent.h b/lib/plpdirent.h
index 808af37..d10c76a 100644
--- a/lib/plpdirent.h
+++ b/lib/plpdirent.h
@@ -5,6 +5,23 @@
#include <psitime.h>
#include <rfsv.h>
+class PlpUID
+{
+ friend inline bool operator<(const PlpUID &u1, const PlpUID &u2);
+public:
+ PlpUID();
+ PlpUID(const long u1, const long u2, const long u3);
+
+ long operator[](int idx);
+
+private:
+ long uid[3];
+};
+
+inline bool operator<(const PlpUID &u1, const PlpUID &u2) {
+ return (memcmp(u1.uid, u2.uid, sizeof(u1.uid)) < 0);
+}
+
/**
* A class, representing a directory entry of the Psion.
* Objects of this type are used by @ref rfsv::readdir and
@@ -58,6 +75,13 @@ public:
long getUID(int uididx);
/**
+ * Retrieves the @ref PlpUID object of a directory entry.
+ *
+ * @returns The PlpUID object.
+ */
+ PlpUID &getUID();
+
+ /**
* Retrieve the file name of a directory entry.
*
* @returns The name of the file.
@@ -102,7 +126,7 @@ public:
private:
long size;
long attr;
- long uid[3];
+ PlpUID UID;
PsiTime time;
string attrstr;
string name;
diff --git a/lib/rfsv.cc b/lib/rfsv.cc
index cd13cb3..68635d5 100644
--- a/lib/rfsv.cc
+++ b/lib/rfsv.cc
@@ -116,30 +116,35 @@ Enum<rfsv::errs> rfsv::getStatus(void) {
return status;
}
-// beware this returns static data
-const char * const rfsv::
+string rfsv::
+convertSlash(const string &name)
+{
+ string tmp = "";
+ for (const char *p = name.c_str(); *p; p++)
+ tmp += (*p == '/') ? '\\' : *p;
+ return tmp;
+}
+
+string rfsv::
attr2String(const long attr)
{
- static char buf[11];
- buf[0] = ((attr & PSI_A_DIR) ? 'd' : '-');
- buf[1] = ((attr & PSI_A_READ) ? 'r' : '-');
- buf[2] = ((attr & PSI_A_RDONLY) ? '-' : 'w');
- buf[3] = ((attr & PSI_A_HIDDEN) ? 'h' : '-');
- buf[4] = ((attr & PSI_A_SYSTEM) ? 's' : '-');
- buf[5] = ((attr & PSI_A_ARCHIVE) ? 'a' : '-');
- buf[6] = ((attr & PSI_A_VOLUME) ? 'v' : '-');
+ string tmp = "";
+ tmp += ((attr & PSI_A_DIR) ? 'd' : '-');
+ tmp += ((attr & PSI_A_READ) ? 'r' : '-');
+ tmp += ((attr & PSI_A_RDONLY) ? '-' : 'w');
+ tmp += ((attr & PSI_A_HIDDEN) ? 'h' : '-');
+ tmp += ((attr & PSI_A_SYSTEM) ? 's' : '-');
+ tmp += ((attr & PSI_A_ARCHIVE) ? 'a' : '-');
+ tmp += ((attr & PSI_A_VOLUME) ? 'v' : '-');
// EPOC
- buf[7] = ((attr & PSI_A_NORMAL) ? 'n' : '-');
- buf[8] = ((attr & PSI_A_TEMP) ? 't' : '-');
- buf[9] = ((attr & PSI_A_COMPRESSED) ? 'c' : '-');
-
+ tmp += ((attr & PSI_A_NORMAL) ? 'n' : '-');
+ tmp += ((attr & PSI_A_TEMP) ? 't' : '-');
+ tmp += ((attr & PSI_A_COMPRESSED) ? 'c' : '-');
// SIBO
- buf[7] = ((attr & PSI_A_EXEC) ? 'x' : buf[7]);
- buf[8] = ((attr & PSI_A_STREAM) ? 'b' : buf[8]);
- buf[9] = ((attr & PSI_A_TEXT) ? 't' : buf[9]);
-
- buf[10] = '\0';
- return (char *) (&buf);
+ tmp[7] = ((attr & PSI_A_EXEC) ? 'x' : tmp[7]);
+ tmp[8] = ((attr & PSI_A_STREAM) ? 'b' : tmp[8]);
+ tmp[9] = ((attr & PSI_A_TEXT) ? 't' : tmp[9]);
+ return tmp;
}
diff --git a/lib/rfsv.h b/lib/rfsv.h
index 79fbc68..fff8322 100644
--- a/lib/rfsv.h
+++ b/lib/rfsv.h
@@ -2,6 +2,7 @@
#define _rfsv_h_
#include <deque>
+#include <string>
#include "Enum.h"
#include "plpdirent.h"
#include "bufferstore.h"
@@ -291,13 +292,11 @@ class rfsv {
* Retrieves attributes, size and modification time of a file on the Psion.
*
* @param name The name of the file.
- * @param attr The file's attributes are returned here.
- * @param size The file's size in bytes is returned here.
- * @param time The file's modification time is returned here.
+ * @param e @ref PlpDirent object, filled with the information on return.
*
* @returns A Psion error code (One of enum @ref #errs ).
*/
- virtual Enum<errs> fgeteattr(const char * const name, long &attr, long &size, PsiTime &time) =0;
+ virtual Enum<errs> fgeteattr(const char * const name, PlpDirent &e) =0;
/**
* @param name
@@ -541,7 +540,7 @@ class rfsv {
* @returns Pointer to static textual representation of file attributes.
*
*/
- const char * const attr2String(const long attr);
+ string attr2String(const long attr);
/**
* Converts an open-mode (A combination of the PSI_O_ constants.)
@@ -553,6 +552,12 @@ class rfsv {
* @ref fopen , @ref fcreatefile and @freplacefile.
*/
virtual long opMode(const long mode) = 0;
+
+ /**
+ * Utility method, converts '/' to '\'.
+ */
+ static string convertSlash(const string &name);
+
protected:
/**
* Retrieves the PLP protocol name. Mainly internal use.
diff --git a/lib/rfsv16.cc b/lib/rfsv16.cc
index d42b270..c4798eb 100644
--- a/lib/rfsv16.cc
+++ b/lib/rfsv16.cc
@@ -30,7 +30,7 @@
#include <stream.h>
#include <stdlib.h>
#include <fstream.h>
-#include <iomanip.h>
+#include <iomanip>
#include <time.h>
#include <string>
@@ -50,55 +50,13 @@ rfsv16::rfsv16(ppsocket *_skt)
}
Enum<rfsv::errs> rfsv16::
-convertName(const char* orig, char *retVal)
-{
- int len = strlen(orig);
- char *temp = new char [len+1];
-
- // FIXME: need to return 1 if OOM?
- for (int i=0; i <= len; i++) {
- if (orig[i] == '/')
- temp[i] = '\\';
- else
- temp[i] = orig[i];
- }
-
- if (len == 0 || temp[1] != ':') {
- // We can automatically supply a drive letter
- strcpy(retVal, DDRIVE);
-
- if (len == 0 || temp[0] != '\\') {
- strcat(retVal, DBASEDIR);
- }
- else {
- retVal[strlen(retVal)-1] = 0;
- }
-
- strcat(retVal, temp);
- }
- else {
- strcpy(retVal, temp);
- }
-
- delete [] temp;
- cout << retVal << endl;
- return E_PSI_GEN_NONE;
-}
-
-Enum<rfsv::errs> rfsv16::
fopen(long attr, const char *name, long &handle)
{
bufferStore a;
- char realName[200];
- Enum<rfsv::errs> rv = convertName(name, realName);
- if (rv) return rv;
-
- // FIXME: anything that calls fopen should NOT do the name
- // conversion - it's just done here.
+ string realName = convertSlash(name);
a.addWord(attr & 0xFFFF);
- a.addString(realName);
- a.addByte(0x00); // Needs to be manually Null-Terminated.
+ a.addStringT(realName.c_str());
if (!sendCommand(FOPEN, a))
return E_PSI_FILE_DISC;
@@ -197,11 +155,11 @@ readdir(rfsvDirhandle &dH, PlpDirent &e) {
cerr << "dir: not version 2" << endl;
return E_PSI_GEN_FAIL;
}
- e.attr = attr2std((long)dH.b.getWord(2));
- e.size = dH.b.getDWord(4);
- e.time = PsiTime((time_t)dH.b.getDWord(8));
- e.name = dH.b.getString(16);
- e.uid[0] = e.uid[1] = e.uid[2] = 0;
+ e.attr = attr2std((long)dH.b.getWord(2));
+ e.size = dH.b.getDWord(4);
+ e.time = PsiTime((time_t)dH.b.getDWord(8));
+ e.name = dH.b.getString(16);
+ // e.UID = PlpUID(0,0,0);
e.attrstr = attr2String(e.attr);
dH.b.discardFirstBytes(17 + e.name.length());
@@ -295,11 +253,8 @@ fgetmtime(const char * const name, PsiTime &mtime)
cerr << "rfsv16::fgetmtime" << endl;
// NB: fgetattr, fgeteattr is almost identical...
bufferStore a;
- char realName[200];
- Enum<rfsv::errs> rv = convertName(name, realName);
- if (rv) return rv;
- a.addString(realName);
- a.addByte(0x00); // needs to be null-terminated,
+ string realName = convertSlash(name);
+ a.addStringT(realName.c_str());
// and this needs sending in the length word.
if (!sendCommand(FINFO, a))
return E_PSI_FILE_DISC;
@@ -310,10 +265,6 @@ cerr << "rfsv16::fgetmtime" << endl;
return res;
}
else if (a.getLen() == 16) {
- // struct timeval tv;
- // tv.tv_sec = a.getDWord(8);
- // tv.tv_usec = 0;
- // mtime.setUnixTime(&tv);
mtime.setUnixTime(a.getDWord(8));
return res;
}
@@ -335,11 +286,8 @@ fgetattr(const char * const name, long &attr)
{
// NB: fgetmtime, fgeteattr are almost identical...
bufferStore a;
- char realName[200];
- Enum<rfsv::errs> rv = convertName(name, realName);
- if (rv) return rv;
- a.addString(realName);
- a.addByte(0x00); // needs to be null-terminated,
+ string realName = convertSlash(name);
+ a.addStringT(realName.c_str());
// and this needs sending in the length word.
if (!sendCommand(FINFO, a))
return E_PSI_FILE_DISC;
@@ -358,28 +306,29 @@ fgetattr(const char * const name, long &attr)
}
Enum<rfsv::errs> rfsv16::
-fgeteattr(const char * const name, long &attr, long &size, PsiTime &time)
+fgeteattr(const char * const name, PlpDirent &e)
{
bufferStore a;
- char realName[200];
- Enum<rfsv::errs> rv = convertName(name, realName);
- if (rv) return rv;
- a.addString(realName);
- a.addByte(0x00); // needs to be null-terminated,
- // and this needs sending in the length word.
+ string realName = convertSlash(name);
+ a.addStringT(realName.c_str());
if (!sendCommand(FINFO, a))
return E_PSI_FILE_DISC;
-
Enum<rfsv::errs> res = getResponse(a);
if (res != 0) {
cerr << "fgeteattr: Error " << res << " on file " << name << endl;
return res;
}
else if (a.getLen() == 16) {
- attr = a.getWord(2);
- size = a.getDWord(4);
- time.setUnixTime(a.getDWord(8));
- //time = a.getDWord(8);
+ const char *p = strrchr(realName.c_str(), '\\');
+ if (p)
+ p++;
+ else
+ p = realName.c_str();
+ e.name = p;
+ e.attr = a.getWord(2);
+ e.size = a.getDWord(4);
+ e.time = PsiTime(a.getDWord(8));
+ e.UID = PlpUID(0,0,0);
return res;
}
cerr << "fgeteattr: Unknown response (" << name << ") " << a <<endl;
@@ -903,15 +852,11 @@ fseek(const long handle, const long pos, const long mode, long &resultpos)
Enum<rfsv::errs> rfsv16::
mkdir(const char* dirName)
{
- char realName[200];
- Enum<rfsv::errs> res = convertName(dirName, realName);
- if (res != E_PSI_GEN_NONE) return res;
+ string realName = convertSlash(dirName);
bufferStore a;
- a.addString(realName);
- a.addByte(0x00); // needs to be null-terminated,
- // and this needs sending in the length word.
+ a.addStringT(realName.c_str());
sendCommand(MKDIR, a);
- res = getResponse(a);
+ Enum<rfsv::errs> res = getResponse(a);
if (res == E_PSI_GEN_NONE) {
// Correct response
return res;
@@ -932,21 +877,14 @@ Enum<rfsv::errs> rfsv16::
rename(const char *oldName, const char *newName)
{
cerr << "rfsv16::rename ***" << endl;
- char realOldName[200];
- Enum<rfsv::errs> res = convertName(oldName, realOldName);
- if (res != E_PSI_GEN_NONE) return res;
- char realNewName[200];
- res = convertName(newName, realNewName);
- if (res != E_PSI_GEN_NONE) return res;
+
+ string realOldName = convertSlash(oldName);
+ string realNewName = convertSlash(newName);
bufferStore a;
- a.addString(realOldName);
- a.addByte(0x00); // needs to be null-terminated,
- // and this needs sending in the length word.
- a.addString(realNewName);
- a.addByte(0x00); // needs to be null-terminated,
- // and this needs sending in the length word.
+ a.addStringT(realOldName.c_str());
+ a.addStringT(realNewName.c_str());
sendCommand(RENAME, a);
- res = getResponse(a);
+ Enum<rfsv::errs> res = getResponse(a);
if (res == E_PSI_GEN_NONE) {
// Correct response
return res;
@@ -958,12 +896,10 @@ cerr << "rfsv16::rename ***" << endl;
Enum<rfsv::errs> rfsv16::
remove(const char* psionName)
{
- char realName[200];
- Enum<rfsv::errs> res = convertName(psionName, realName);
- if (res != E_PSI_GEN_NONE) return res;
+ Enum<rfsv::errs> res;
+ string realName = convertSlash(psionName);
bufferStore a;
- a.addString(realName);
- a.addByte(0x00); // needs to be null-terminated,
+ a.addStringT(realName.c_str());
// and this needs sending in the length word.
sendCommand(DELETE, a);
res = getResponse(a);
@@ -1054,5 +990,3 @@ std2attr(const long attr)
return res;
}
-
-
diff --git a/lib/rfsv16.h b/lib/rfsv16.h
index d0eda32..0b3bdab 100644
--- a/lib/rfsv16.h
+++ b/lib/rfsv16.h
@@ -16,7 +16,7 @@ public:
Enum<rfsv::errs> fgetmtime(const char * const, PsiTime &);
Enum<rfsv::errs> fsetmtime(const char * const, const PsiTime);
Enum<rfsv::errs> fgetattr(const char * const, long &);
- Enum<rfsv::errs> fgeteattr(const char * const, long &, long &, PsiTime &);
+ Enum<rfsv::errs> fgeteattr(const char * const, PlpDirent &);
Enum<rfsv::errs> fsetattr(const char * const, const long seta, const long unseta);
Enum<rfsv::errs> dircount(const char * const, long &);
Enum<rfsv::errs> devlist(long &);
@@ -99,7 +99,6 @@ private:
// Miscellaneous
- Enum<rfsv::errs> convertName(const char*, char *);
Enum<rfsv::errs> fopendir(const char * const, long &);
long attr2std(const long);
long std2attr(const long);
diff --git a/lib/rfsv32.cc b/lib/rfsv32.cc
index 8808879..0eb9911 100644
--- a/lib/rfsv32.cc
+++ b/lib/rfsv32.cc
@@ -44,25 +44,14 @@ rfsv32::rfsv32(ppsocket * _skt)
reset();
}
-char *rfsv32::
-convertSlash(const char *name)
-{
- char *n = strdup(name);
- for (char *p = n; *p; p++)
- if (*p == '/')
- *p = '\\';
- return n;
-}
-
Enum<rfsv::errs> rfsv32::
fopen(long attr, const char *name, long &handle)
{
bufferStore a;
- char *n = convertSlash(name);
+ string n = convertSlash(name);
a.addDWord(attr);
- a.addWord(strlen(n));
- a.addString(n);
- free(n);
+ a.addWord(n.size());
+ a.addString(n.c_str());
if (!sendCommand(OPEN_FILE, a))
return E_PSI_FILE_DISC;
Enum<rfsv::errs> res = getResponse(a);
@@ -91,11 +80,10 @@ Enum<rfsv::errs> rfsv32::
fcreatefile(long attr, const char *name, long &handle)
{
bufferStore a;
- char *n = convertSlash(name);
+ string n = convertSlash(name);
a.addDWord(attr);
- a.addWord(strlen(n));
- a.addString(n);
- free(n);
+ a.addWord(n.size());
+ a.addString(n.c_str());
if (!sendCommand(CREATE_FILE, a))
return E_PSI_FILE_DISC;
Enum<rfsv::errs> res = getResponse(a);
@@ -108,11 +96,10 @@ Enum<rfsv::errs> rfsv32::
freplacefile(const long attr, const char * const name, long &handle)
{
bufferStore a;
- char *n = convertSlash(name);
+ string n = convertSlash(name);
a.addDWord(attr);
- a.addWord(strlen(n));
- a.addString(n);
- free(n);
+ a.addWord(n.size());
+ a.addString(n.c_str());
if (!sendCommand(REPLACE_FILE, a))
return E_PSI_FILE_DISC;
Enum<rfsv::errs> res = getResponse(a);
@@ -125,11 +112,10 @@ Enum<rfsv::errs> rfsv32::
fopendir(const long attr, const char * const name, long &handle)
{
bufferStore a;
- char *n = convertSlash(name);
+ string n = convertSlash(name);
a.addDWord(attr | EPOC_ATTR_GETUID);
- a.addWord(strlen(n));
- a.addString(n);
- free(n);
+ a.addWord(n.size());
+ a.addString(n.c_str());
if (!sendCommand(OPEN_DIR, a))
return E_PSI_FILE_DISC;
Enum<rfsv::errs> res = getResponse(a);
@@ -177,11 +163,9 @@ readdir(rfsvDirhandle &dH, PlpDirent &e) {
long shortLen = dH.b.getDWord(0);
long longLen = dH.b.getDWord(32);
- e.attr = attr2std(dH.b.getDWord(4));
- e.size = dH.b.getDWord(8);
- e.uid[0] = dH.b.getDWord(20);
- e.uid[1] = dH.b.getDWord(24);
- e.uid[2] = dH.b.getDWord(28);
+ e.attr = attr2std(dH.b.getDWord(4));
+ e.size = dH.b.getDWord(8);
+ e.UID = PlpUID(dH.b.getDWord(20), dH.b.getDWord(24), dH.b.getDWord(28));
e.time = PsiTime(dH.b.getDWord(16), dH.b.getDWord(12));
e.name = "";
e.attrstr = string(attr2String(e.attr));
@@ -232,16 +216,14 @@ Enum<rfsv::errs> rfsv32::
fgetmtime(const char * const name, PsiTime &mtime)
{
bufferStore a;
- char *n = convertSlash(name);
- a.addWord(strlen(n));
- a.addString(n);
- free(n);
+ string n = convertSlash(name);
+ a.addWord(n.size());
+ a.addString(n.c_str());
if (!sendCommand(MODIFIED, a))
return E_PSI_FILE_DISC;
Enum<rfsv::errs> res = getResponse(a);
if (res != E_PSI_GEN_NONE)
return res;
- //mtime = micro2time(a.getDWord(4), a.getDWord(0));
mtime.setPsiTime(a.getDWord(4), a.getDWord(0));
return res;
}
@@ -250,14 +232,11 @@ Enum<rfsv::errs> rfsv32::
fsetmtime(const char * const name, PsiTime mtime)
{
bufferStore a;
- //unsigned long microLo, microHi;
- char *n = convertSlash(name);
- // time2micro(mtime, microHi, microLo);
+ string n = convertSlash(name);
a.addDWord(mtime.getPsiTimeLo());
a.addDWord(mtime.getPsiTimeHi());
- a.addWord(strlen(n));
- a.addString(n);
- free(n);
+ a.addWord(n.size());
+ a.addString(n.c_str());
if (!sendCommand(SET_MODIFIED, a))
return E_PSI_FILE_DISC;
return getResponse(a);
@@ -267,10 +246,9 @@ Enum<rfsv::errs> rfsv32::
fgetattr(const char * const name, long &attr)
{
bufferStore a;
- char *n = convertSlash(name);
- a.addWord(strlen(n));
- a.addString(n);
- free(n);
+ string n = convertSlash(name);
+ a.addWord(n.size());
+ a.addString(n.c_str());
if (!sendCommand(ATT, a))
return E_PSI_FILE_DISC;
Enum<rfsv::errs> res = getResponse(a);
@@ -281,29 +259,33 @@ fgetattr(const char * const name, long &attr)
}
Enum<rfsv::errs> rfsv32::
-fgeteattr(const char * const name, long &attr, long &size, PsiTime &time)
+fgeteattr(const char * const name, PlpDirent &e)
{
bufferStore a;
- char *n = convertSlash(name);
- a.addWord(strlen(n));
- a.addString(n);
- free(n);
+ string n = convertSlash(name);
+ a.addWord(n.size());
+ a.addString(n.c_str());
+ const char *p = strrchr(n.c_str(), '\\');
+ if (p)
+ p++;
+ else
+ p = n.c_str();
+ e.name = p;
+
if (!sendCommand(REMOTE_ENTRY, a))
return E_PSI_FILE_DISC;
Enum<rfsv::errs> res = getResponse(a);
if (res != E_PSI_GEN_NONE)
return res;
// long shortLen = a.getDWord(0);
- attr = attr2std(a.getDWord(4));
- size = a.getDWord(8);
- //unsigned long modLow = a.getDWord(12);
- //unsigned long modHi = a.getDWord(16);
- // long uid1 = a.getDWord(20);
- // long uid2 = a.getDWord(24);
- // long uid3 = a.getDWord(28);
// long longLen = a.getDWord(32);
- //time = micro2time(modHi, modLow);
- time.setPsiTime(a.getDWord(16), a.getDWord(12));
+
+ e.attr = attr2std(a.getDWord(4));
+ e.size = a.getDWord(8);
+ e.UID = PlpUID(a.getDWord(20), a.getDWord(24), a.getDWord(28));
+ e.time = PsiTime(a.getDWord(16), a.getDWord(12));
+ e.attrstr = string(attr2String(e.attr));
+
return res;
}
@@ -311,12 +293,11 @@ Enum<rfsv::errs> rfsv32::
fsetattr(const char * const name, const long seta, const long unseta)
{
bufferStore a;
- char *n = convertSlash(name);
+ string n = convertSlash(name);
a.addDWord(std2attr(seta));
a.addDWord(std2attr(unseta));
- a.addWord(strlen(n));
- a.addString(n);
- free(n);
+ a.addWord(n.size());
+ a.addString(n.c_str());
if (!sendCommand(SET_ATT, a))
return E_PSI_FILE_DISC;
return getResponse(a);
@@ -557,13 +538,10 @@ copyOnPsion(const char *from, const char *to, void *ptr, cpCallback_t cb)
{
long handle_from;
long handle_to;
- long attr;
- long from_size;
- long to_size;
- PsiTime time;
+ PlpDirent from_e;
Enum<rfsv::errs> res;
- if ((res = fgeteattr(from, attr, from_size, time)) != E_PSI_GEN_NONE)
+ if ((res = fgeteattr(from, from_e)) != E_PSI_GEN_NONE)
return res;
if ((res = fopen(EPOC_OMODE_SHARE_READERS | EPOC_OMODE_BINARY, from, handle_from))
!= E_PSI_GEN_NONE)
@@ -736,16 +714,11 @@ Enum<rfsv::errs> rfsv32::
mkdir(const char *name)
{
bufferStore a;
- char *n = convertSlash(name);
- if (strlen(n) && (n[strlen(n) - 1] != '\\')) {
- a.addWord(strlen(n) + 1);
- a.addString(n);
- a.addByte('\\');
- } else {
- a.addWord(strlen(n));
- a.addString(n);
- }
- free(n);
+ string n = convertSlash(name);
+ if (n.find_last_of('\\') == (n.size() - 1))
+ n += '\\';
+ a.addWord(n.size());
+ a.addString(n.c_str());
if (!sendCommand(MK_DIR_ALL, a))
return E_PSI_FILE_DISC;
return getResponse(a);
@@ -755,16 +728,11 @@ Enum<rfsv::errs> rfsv32::
rmdir(const char *name)
{
bufferStore a;
- char *n = convertSlash(name);
- if (strlen(n) && (n[strlen(n) - 1] != '\\')) {
- a.addWord(strlen(n) + 1);
- a.addString(n);
- a.addByte('\\');
- } else {
- a.addWord(strlen(n));
- a.addString(n);
- }
- free(n);
+ string n = convertSlash(name);
+ if (n.find_last_of('\\') == (n.size() - 1))
+ n += '\\';
+ a.addWord(n.size());
+ a.addString(n.c_str());
if (!sendCommand(RM_DIR, a))
return E_PSI_FILE_DISC;
return getResponse(a);
@@ -774,14 +742,12 @@ Enum<rfsv::errs> rfsv32::
rename(const char *oldname, const char *newname)
{
bufferStore a;
- char *on = convertSlash(oldname);
- char *nn = convertSlash(newname);
- a.addWord(strlen(on));
- a.addString(on);
- a.addWord(strlen(nn));
- a.addString(nn);
- free(on);
- free(nn);
+ string on = convertSlash(oldname);
+ string nn = convertSlash(newname);
+ a.addWord(on.size());
+ a.addString(on.c_str());
+ a.addWord(nn.size());
+ a.addString(nn.c_str());
if (!sendCommand(RENAME, a))
return E_PSI_FILE_DISC;
return getResponse(a);
@@ -791,10 +757,9 @@ Enum<rfsv::errs> rfsv32::
remove(const char *name)
{
bufferStore a;
- char *n = convertSlash(name);
- a.addWord(strlen(n));
- a.addString(n);
- free(n);
+ string n = convertSlash(name);
+ a.addWord(n.size());
+ a.addString(n.c_str());
if (!sendCommand(DELETE, a))
return E_PSI_FILE_DISC;
return getResponse(a);
diff --git a/lib/rfsv32.h b/lib/rfsv32.h
index 2ef584b..4a738da 100644
--- a/lib/rfsv32.h
+++ b/lib/rfsv32.h
@@ -19,7 +19,7 @@ public:
Enum<rfsv::errs> remove(const char * const);
Enum<rfsv::errs> rename(const char * const, const char * const);
Enum<rfsv::errs> mktemp(long &, char * const);
- Enum<rfsv::errs> fgeteattr(const char * const, long &, long &, PsiTime &);
+ Enum<rfsv::errs> fgeteattr(const char * const, PlpDirent &);
Enum<rfsv::errs> fgetattr(const char * const, long &);
Enum<rfsv::errs> fsetattr(const char * const, const long, const long);
Enum<rfsv::errs> fgetmtime(const char * const, PsiTime &);
@@ -159,7 +159,6 @@ private:
// Communication
bool sendCommand(enum commands, bufferStore &);
Enum<rfsv::errs> getResponse(bufferStore &);
- char *convertSlash(const char *);
// time-conversion
// unsigned long micro2time(unsigned long, unsigned long);