diff options
Diffstat (limited to 'lib/rfsv32.cc')
| -rw-r--r-- | lib/rfsv32.cc | 99 | 
1 files changed, 24 insertions, 75 deletions
| diff --git a/lib/rfsv32.cc b/lib/rfsv32.cc index 5a23c08..8808879 100644 --- a/lib/rfsv32.cc +++ b/lib/rfsv32.cc @@ -25,16 +25,16 @@  #include <stream.h>  #include <stdlib.h> -#include <fstream.h> -#include <iomanip.h> +#include <fstream> +#include <iomanip>  #include <time.h> -#include <string.h> +#include <string> -#include "bool.h"  #include "rfsv32.h"  #include "bufferstore.h"  #include "ppsocket.h"  #include "bufferarray.h" +#include "plpdirent.h"  rfsv32::rfsv32(ppsocket * _skt)  { @@ -126,7 +126,7 @@ fopendir(const long attr, const char * const name, long &handle)  {  	bufferStore a;  	char *n = convertSlash(name); -	a.addDWord(attr); +	a.addDWord(attr | EPOC_ATTR_GETUID);  	a.addWord(strlen(n));  	a.addString(n);  	free(n); @@ -163,7 +163,7 @@ closedir(rfsvDirhandle &dH) {  }  Enum<rfsv::errs> rfsv32:: -readdir(rfsvDirhandle &dH, bufferStore &s) { +readdir(rfsvDirhandle &dH, PlpDirent &e) {  	Enum<rfsv::errs> res = E_PSI_GEN_NONE;  	if (dH.b.getLen() < 17) { @@ -174,23 +174,21 @@ readdir(rfsvDirhandle &dH, bufferStore &s) {  		res = getResponse(dH.b);  	}   	if ((res == E_PSI_GEN_NONE) && (dH.b.getLen() > 16)) { -		long shortLen = dH.b.getDWord(0); -		long attributes = attr2std(dH.b.getDWord(4)); -		long size = dH.b.getDWord(8); -		// long uid1 = dH.b.getDWord(20); -		// long uid2 = dH.b.getDWord(24); -		// long uid3 = dH.b.getDWord(28); -		long longLen = dH.b.getDWord(32); -		PsiTime *date = new PsiTime(dH.b.getDWord(16), dH.b.getDWord(12)); - -		s.init(); -		s.addDWord((unsigned long)date); -		s.addDWord(size); -		s.addDWord(attributes); +		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.time    = PsiTime(dH.b.getDWord(16), dH.b.getDWord(12)); +		e.name    = ""; +		e.attrstr = string(attr2String(e.attr)); +  		int d = 36;  		for (int i = 0; i < longLen; i++, d++) -			s.addByte(dH.b.getByte(d)); -		s.addByte(0); +			e.name += dH.b.getByte(d);  		while (d % 4)  			d++;  		d += shortLen; @@ -202,70 +200,21 @@ readdir(rfsvDirhandle &dH, bufferStore &s) {  }  Enum<rfsv::errs> rfsv32:: -dir(const char *name, bufferArray &files) +dir(const char *name, PlpDir &files)  {  	rfsvDirhandle h; +	files.clear();  	Enum<rfsv::errs> res = opendir(PSI_A_HIDDEN | PSI_A_SYSTEM | PSI_A_DIR, name, h);  	while (res == E_PSI_GEN_NONE) { -		bufferStore b; -		res = readdir(h, b); +		PlpDirent e; +		res = readdir(h, e);  		if (res == E_PSI_GEN_NONE) -			files += b; +			files.push_back(e);  	}  	closedir(h);  	if (res == E_PSI_FILE_EOF)  		res = E_PSI_GEN_NONE;  	return res; -#if 0 -	long handle; -	Enum<rfsv::errs> res = fopendir(EPOC_ATTR_HIDDEN | EPOC_ATTR_SYSTEM | EPOC_ATTR_DIRECTORY, name, handle); -	if (res != E_PSI_GEN_NONE) -		return res; - -	while (1) { -		bufferStore a; -		a.addDWord(handle); -		if (!sendCommand(READ_DIR, a)) -			return E_PSI_FILE_DISC; -		res = getResponse(a); -		if (res != E_PSI_GEN_NONE) -			break; -		while (a.getLen() > 16) { -			long shortLen = a.getDWord(0); -			long attributes = attr2std(a.getDWord(4)); -			long 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); - -			//long date = micro2time(modHi, modLow); -			PsiTime *date = new PsiTime(a.getDWord(16), a.getDWord(12)); - -			bufferStore s; -			s.addDWord((unsigned long)date); -			s.addDWord(size); -			s.addDWord(attributes); -			int d = 36; -			for (int i = 0; i < longLen; i++, d++) -				s.addByte(a.getByte(d)); -			s.addByte(0); -			while (d % 4) -				d++; -			files += s; -			d += shortLen; -			while (d % 4) -				d++; -			a.discardFirstBytes(d); -		} -	} -	if (res == E_PSI_FILE_EOF) -		res = E_PSI_GEN_NONE; -	fclose(handle); -	return res; -#endif  }  long rfsv32:: | 
