plptools
Loading...
Searching...
No Matches
rfsv32.cc
Go to the documentation of this file.
1/*
2 * This file is part of plptools.
3 *
4 * Copyright (C) 1999 Philip Proudman <philip.proudman@btinternet.com>
5 * Copyright (C) 1999-2001 Fritz Elfert <felfert@to.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along
18 * along with this program; if not, see <https://www.gnu.org/licenses/>.
19 *
20 */
21#include "config.h"
22
23#include "rfsv32.h"
24#include "bufferstore.h"
25#include "tcpsocket.h"
26#include "bufferarray.h"
27#include "plpdirent.h"
28
29#include <iostream>
30#include <fstream>
31
32#include <stdlib.h>
33#include <time.h>
34
35#include "ignore-value.h"
36
37using namespace std;
38
40{
41 skt = _skt;
42 serNum = 0;
44 reset();
45}
46
48fopen(uint32_t attr, const char *name, uint32_t &handle)
49{
51 string n = convertSlash(name);
52 a.addDWord(attr);
53 a.addWord(n.size());
54 a.addString(n.c_str());
55 if (!sendCommand(OPEN_FILE, a))
56 return E_PSI_FILE_DISC;
58 if (res == E_PSI_GEN_NONE && a.getLen() == 4) {
59 handle = a.getDWord(0);
60 return E_PSI_GEN_NONE;
61 }
62 return res;
63}
64
66mktemp(uint32_t &handle, string &tmpname)
67{
69 if (!sendCommand(TEMP_FILE, a))
70 return E_PSI_FILE_DISC;
72 if (res == E_PSI_GEN_NONE) {
73 handle = a.getDWord(0);
74 tmpname = a.getString(6);
75 }
76 return res;
77}
78
80fcreatefile(uint32_t attr, const char *name, uint32_t &handle)
81{
83 string n = convertSlash(name);
84 a.addDWord(attr);
85 a.addWord(n.size());
86 a.addString(n.c_str());
88 return E_PSI_FILE_DISC;
90 if (res == E_PSI_GEN_NONE && a.getLen() == 4)
91 handle = a.getDWord(0);
92 return res;
93}
94
96freplacefile(const uint32_t attr, const char * const name, uint32_t &handle)
97{
99 string n = convertSlash(name);
100 a.addDWord(attr);
101 a.addWord(n.size());
102 a.addString(n.c_str());
104 return E_PSI_FILE_DISC;
106 if (res == E_PSI_GEN_NONE && a.getLen() == 4)
107 handle = a.getDWord(0);
108 return res;
109}
110
112fopendir(const uint32_t attr, const char * const name, uint32_t &handle)
113{
115 string n = convertSlash(name);
116 a.addDWord(attr | EPOC_ATTR_GETUID);
117 a.addWord(n.size());
118 a.addString(n.c_str());
119 if (!sendCommand(OPEN_DIR, a))
120 return E_PSI_FILE_DISC;
122 if (!res && a.getLen() == 4)
123 handle = a.getDWord(0);
124 return res;
125}
126
128fclose(uint32_t handle)
129{
131 a.addDWord(handle);
133 return E_PSI_FILE_DISC;
134 return getResponse(a);
135}
136
138opendir(const uint32_t attr, const char *name, rfsvDirhandle &dH) {
139 uint32_t handle;
140 Enum<rfsv::errs> res = fopendir(std2attr(attr), name, handle);
141 dH.h = handle;
142 dH.b.init();
143 return res;
144}
145
148 return fclose(dH.h);
149}
150
154
155 if (dH.b.getLen() < 17) {
156 dH.b.init();
157 dH.b.addDWord(dH.h);
158 if (!sendCommand(READ_DIR, dH.b))
159 return E_PSI_FILE_DISC;
160 res = getResponse(dH.b);
161 }
162 if ((res == E_PSI_GEN_NONE) && (dH.b.getLen() > 16)) {
163 long shortLen = dH.b.getDWord(0);
164 long longLen = dH.b.getDWord(32);
165
166 e.attr = attr2std(dH.b.getDWord(4));
167 e.size = dH.b.getDWord(8);
168 e.UID = PlpUID(dH.b.getDWord(20), dH.b.getDWord(24), dH.b.getDWord(28));
169 e.time = PsiTime(dH.b.getDWord(16), dH.b.getDWord(12));
170 e.name = "";
171 e.attrstr = string(attr2String(e.attr));
172
173 int d = 36;
174 for (int i = 0; i < longLen; i++, d++)
175 e.name += dH.b.getByte(d);
176 while (d % 4)
177 d++;
178 d += shortLen;
179 while (d % 4)
180 d++;
181 dH.b.discardFirstBytes(d);
182 }
183 return res;
184}
185
187dir(const char *name, PlpDir &files)
188{
190 files.clear();
192 while (res == E_PSI_GEN_NONE) {
193 PlpDirent e;
194 res = readdir(h, e);
195 if (res == E_PSI_GEN_NONE)
196 files.push_back(e);
197 }
198 closedir(h);
199 if (res == E_PSI_FILE_EOF)
200 res = E_PSI_GEN_NONE;
201 return res;
202}
203
204uint32_t rfsv32::
205opMode(const uint32_t mode)
206{
207 uint32_t ret = 0;
208
209 ret |= (((mode & 03) == PSI_O_RDONLY) ? 0 : EPOC_OMODE_READ_WRITE);
210 if (!ret)
211 ret |= (mode & PSI_O_EXCL) ? 0 : EPOC_OMODE_SHARE_READERS;
212 if ((!ret) && (mode & PSI_O_SHARE))
214 return ret;
215}
216
218fgetmtime(const char * const name, PsiTime &mtime)
219{
221 string n = convertSlash(name);
222 a.addWord(n.size());
223 a.addString(n.c_str());
224 if (!sendCommand(MODIFIED, a))
225 return E_PSI_FILE_DISC;
227 if (res != E_PSI_GEN_NONE)
228 return res;
229 mtime.setPsiTime(a.getDWord(4), a.getDWord(0));
230 return res;
231}
232
234fsetmtime(const char * const name, PsiTime mtime)
235{
237 string n = convertSlash(name);
238 a.addDWord(mtime.getPsiTimeLo());
239 a.addDWord(mtime.getPsiTimeHi());
240 a.addWord(n.size());
241 a.addString(n.c_str());
243 return E_PSI_FILE_DISC;
244 return getResponse(a);
245}
246
248fgetattr(const char * const name, uint32_t &attr)
249{
251 string n = convertSlash(name);
252 a.addWord(n.size());
253 a.addString(n.c_str());
254 if (!sendCommand(ATT, a))
255 return E_PSI_FILE_DISC;
257 if (res != E_PSI_GEN_NONE)
258 return res;
259 attr = attr2std(a.getDWord(0));
260 return res;
261}
262
264fgeteattr(const char * const name, PlpDirent &e)
265{
267 string n = convertSlash(name);
268 a.addWord(n.size());
269 a.addString(n.c_str());
270 const char *p = strrchr(n.c_str(), '\\');
271 if (p)
272 p++;
273 else
274 p = n.c_str();
275 e.name = p;
276
278 return E_PSI_FILE_DISC;
280 if (res != E_PSI_GEN_NONE)
281 return res;
282 // long shortLen = a.getDWord(0);
283 // long longLen = a.getDWord(32);
284
285 e.attr = attr2std(a.getDWord(4));
286 e.size = a.getDWord(8);
287 e.UID = PlpUID(a.getDWord(20), a.getDWord(24), a.getDWord(28));
288 e.time = PsiTime(a.getDWord(16), a.getDWord(12));
289 e.attrstr = string(attr2String(e.attr));
290
291 return res;
292}
293
295fsetattr(const char * const name, const uint32_t seta, const uint32_t unseta)
296{
298 string n = convertSlash(name);
299 a.addDWord(std2attr(seta));
300 a.addDWord(std2attr(unseta));
301 a.addWord(n.size());
302 a.addString(n.c_str());
303 if (!sendCommand(SET_ATT, a))
304 return E_PSI_FILE_DISC;
305 return getResponse(a);
306}
307
309dircount(const char * const name, uint32_t &count)
310{
311 uint32_t handle;
313 count = 0;
314 if (res != E_PSI_GEN_NONE)
315 return res;
316
317 while (1) {
319 a.addDWord(handle);
320 if (!sendCommand(READ_DIR, a))
321 return E_PSI_FILE_DISC;
322 res = getResponse(a);
323 if (res != E_PSI_GEN_NONE)
324 break;
325 while (a.getLen() > 16) {
326 int d = 36 + a.getDWord(32);
327 while (d % 4)
328 d++;
329 d += a.getDWord(0);
330 while (d % 4)
331 d++;
332 a.discardFirstBytes(d);
333 count++;
334 }
335 }
336 fclose(handle);
337 if (res == E_PSI_FILE_EOF)
338 res = E_PSI_GEN_NONE;
339 return res;
340}
341
343devlist(uint32_t &devbits)
344{
347
349 return E_PSI_FILE_DISC;
350 res = getResponse(a);
351 devbits = 0;
352 if ((res == E_PSI_GEN_NONE) && (a.getLen() == 26)) {
353 for (int i = 25; i >= 0; i--) {
354 devbits <<= 1;
355 if (a.getByte(i) != 0)
356 devbits |= 1;
357 }
358 }
359 return res;
360}
361
363devinfo(const char drive, PlpDrive &dinfo)
364{
367
368 a.addDWord(toupper(drive) - 'A');
369 if (!sendCommand(DRIVE_INFO, a))
370 return E_PSI_FILE_DISC;
371 res = getResponse(a);
372 if (res == E_PSI_GEN_NONE) {
373 dinfo.setMediaType(a.getDWord(0));
374 dinfo.setDriveAttribute(a.getDWord(8));
375 dinfo.setMediaAttribute(a.getDWord(12));
376 dinfo.setUID(a.getDWord(16));
377 dinfo.setSize(a.getDWord(20), a.getDWord(24));
378 dinfo.setSpace(a.getDWord(28), a.getDWord(32));
379 a.addByte(0);
380 dinfo.setName(toupper(drive), a.getString(40));
381 }
382 return res;
383}
384
386sendCommand(enum commands cc, bufferStore & data)
387{
388 if (status == E_PSI_FILE_DISC) {
389 reconnect();
390 if (status == E_PSI_FILE_DISC)
391 return false;
392 }
393 bool result;
395 a.addWord(cc);
396 a.addWord(serNum);
397 if (serNum < 0xffff)
398 serNum++;
399 else
400 serNum = 0;
401 a.addBuff(data);
402 result = skt->sendBufferStore(a);
403 if (!result) {
404 reconnect();
405 result = skt->sendBufferStore(a);
406 if (!result)
408 }
409 return result;
410}
411
414{
415 if (skt->getBufferStore(data) == 1 &&
416 data.getWord(0) == 0x11) {
417 int32_t ret = data.getDWord(4);
418 data.discardFirstBytes(8);
419 return err2psierr(ret);
420 } else
422 return status;
423}
424
426fread(const uint32_t handle, unsigned char * const buf, const uint32_t len, uint32_t &count)
427{
430 count = 0;
431 long l;
432 unsigned char *p = buf;
433
434 do {
435 a.addDWord(handle);
436 a.addDWord(((len - count) > RFSV_SENDLEN)?RFSV_SENDLEN:(len - count));
437 if (!sendCommand(READ_FILE, a))
438 return E_PSI_FILE_DISC;
439 if ((res = getResponse(a)) != E_PSI_GEN_NONE)
440 return res;
441 if ((l = a.getLen()) > 0) {
442 memcpy(p, a.getString(), l);
443 count += l;
444 p += l;
445 }
446 a.init();
447 } while ((count < len) && (l > 0));
448 return res;
449}
450
452fwrite(const uint32_t handle, const unsigned char * const buf, const uint32_t len, uint32_t &count)
453{
455 const unsigned char *p = buf;
456 long l;
457
458 count = 0;
459 do {
460 l = ((len - count) > RFSV_SENDLEN)?RFSV_SENDLEN:(len - count);
461 if (l > 0) {
463 bufferStore tmp(p, l);
464 a.addDWord(handle);
465 a.addBuff(tmp);
466 if (!sendCommand(WRITE_FILE, a))
467 return E_PSI_FILE_DISC;
468 if ((res = getResponse(a)) != E_PSI_GEN_NONE)
469 return res;
470 count += l;
471 p += l;
472 }
473 } while ((count < len) && (l > 0));
474 return res;
475}
476
478copyFromPsion(const char *from, const char *to, void *ptr, cpCallback_t cb)
479{
481 uint32_t handle;
482 uint32_t len;
483 uint32_t total = 0;
484
485 if ((res = fopen(EPOC_OMODE_SHARE_READERS | EPOC_OMODE_BINARY, from, handle)) != E_PSI_GEN_NONE)
486 return res;
487 ofstream op(to);
488 if (!op) {
489 fclose(handle);
490 return E_PSI_GEN_FAIL;
491 }
492 unsigned char *buff = new unsigned char[RFSV_SENDLEN];
493 do {
494 if ((res = fread(handle, buff, RFSV_SENDLEN, len)) == E_PSI_GEN_NONE) {
495 op.write((char *)buff, len);
496 total += len;
497 if (cb && !cb(ptr, total))
498 res = E_PSI_FILE_CANCEL;
499 }
500 } while ((len > 0) && (res == E_PSI_GEN_NONE));
501 delete [] buff;
502 fclose(handle);
503 op.close();
504 return res;
505}
506
508copyFromPsion(const char *from, int fd, cpCallback_t cb)
509{
511 uint32_t handle;
512 uint32_t len;
513 uint32_t total = 0;
514
515 if ((res = fopen(EPOC_OMODE_SHARE_READERS | EPOC_OMODE_BINARY, from, handle)) != E_PSI_GEN_NONE)
516 return res;
517 unsigned char *buff = new unsigned char[RFSV_SENDLEN];
518 do {
519 if ((res = fread(handle, buff, RFSV_SENDLEN, len)) == E_PSI_GEN_NONE) {
520 // FIXME: return UNIX errors from this method.
521 ignore_value(write(fd, buff, len));
522 total += len;
523 if (cb && !cb(NULL, total))
524 res = E_PSI_FILE_CANCEL;
525 }
526 } while ((len > 0) && (res == E_PSI_GEN_NONE));
527 delete [] buff;
528 fclose(handle);
529 return res;
530}
531
533copyToPsion(const char *from, const char *to, void *ptr, cpCallback_t cb)
534{
535 uint32_t handle;
537
538 ifstream ip(from);
539 if (!ip)
540 return E_PSI_FILE_NXIST;
542 if (res != E_PSI_GEN_NONE) {
544 if (res != E_PSI_GEN_NONE)
545 return res;
546 }
547 unsigned char *buff = new unsigned char[RFSV_SENDLEN];
548 uint32_t total = 0;
549 while (ip && !ip.eof() && (res == E_PSI_GEN_NONE)) {
550 uint32_t len;
551 ip.read((char *)buff, RFSV_SENDLEN);
552 if ((res = fwrite(handle, buff, ip.gcount(), len)) == E_PSI_GEN_NONE) {
553 total += len;
554 if (cb && !cb(ptr, total))
555 res = E_PSI_FILE_CANCEL;
556 }
557 }
558 fclose(handle);
559 ip.close();
560 delete[]buff;
561 return res;
562}
563
565copyOnPsion(const char *from, const char *to, void *ptr, cpCallback_t cb)
566{
567 uint32_t handle_from;
568 uint32_t handle_to;
569 PlpDirent from_e;
571
572 if ((res = fgeteattr(from, from_e)) != E_PSI_GEN_NONE)
573 return res;
574 if ((res = fopen(EPOC_OMODE_SHARE_READERS | EPOC_OMODE_BINARY, from, handle_from))
576 return res;
578 if (res != E_PSI_GEN_NONE) {
580 if (res != E_PSI_GEN_NONE) {
581 fclose(handle_from);
582 return res;
583 }
584 }
585
586 uint32_t total = 0;
587 while (res == E_PSI_GEN_NONE) {
588 bufferStore b;
589 b.addDWord(RFSV_SENDLEN * 10);
590 b.addDWord(handle_to);
591 b.addDWord(handle_from);
593 return E_PSI_FILE_DISC;
594 res = getResponse(b);
595 if (res != E_PSI_GEN_NONE)
596 break;
597 if (b.getLen() != 4) {
598 res = E_PSI_GEN_FAIL;
599 break;
600 }
601 uint32_t len = b.getDWord(0);
602 total += len;
603 if (cb && !cb(ptr, total))
604 res = E_PSI_FILE_CANCEL;
605 if (len != (RFSV_SENDLEN * 10))
606 break;
607 }
608 fclose(handle_from);
609 fclose(handle_to);
610 if (res != E_PSI_GEN_NONE)
611 remove(to);
612 return res;
613}
614
616pathtest(const char * const name)
617{
619 uint32_t r;
620 string n = convertSlash(name);
621 a.addWord(n.size());
622 a.addString(n.c_str());
623 if (!sendCommand(PATH_TEST, a))
624 return E_PSI_FILE_DISC;
625 return getResponse(a);
626}
627
629fsetsize(uint32_t handle, uint32_t size)
630{
632 a.addDWord(handle);
633 a.addDWord(size);
634 if (!sendCommand(SET_SIZE, a))
635 return E_PSI_FILE_DISC;
636 return getResponse(a);
637}
638
639/*
640 * Unix-like implementation off fseek with one
641 * exception: If seeking beyond eof, the gap
642 * contains garbage instead of zeroes.
643 */
645fseek(const uint32_t handle, const int32_t pos, const uint32_t mode, uint32_t &resultpos)
646{
649 uint32_t savpos = 0;
650 uint32_t calcpos = 0;
651 int32_t mypos = pos;
652 uint32_t realpos;
653
654/*
655 seek-parameter for psion:
656 dword position
657 dword handle
658 dword mode
659 1 = from start
660 2 = from current pos
661 3 = from end
662 ??no more?? 4 = sense recpos
663 ??no more?? 5 = set recpos
664 ??no more?? 6 = text-rewind
665*/
666
667 if ((mode < PSI_SEEK_SET) || (mode > PSI_SEEK_END))
668 return E_PSI_GEN_ARG;
669
670 if ((mode == PSI_SEEK_CUR) && (mypos >= 0)) {
671 /* get and save current position */
672 a.addDWord(0);
673 a.addDWord(handle);
674 a.addDWord(PSI_SEEK_CUR);
675 if (!sendCommand(SEEK_FILE, a))
676 return E_PSI_FILE_DISC;
677 if ((res = getResponse(a)) != E_PSI_GEN_NONE)
678 return res;
679 savpos = a.getDWord(0);
680 if (mypos == 0) {
681 resultpos = savpos;
682 return res;
683 }
684 a.init();
685 }
686 if ((mode == PSI_SEEK_END) && (mypos >= 0)) {
687 /* get and save end position */
688 a.addDWord(0);
689 a.addDWord(handle);
690 a.addDWord(PSI_SEEK_END);
691 if (!sendCommand(SEEK_FILE, a))
692 return E_PSI_FILE_DISC;
693 if ((res = getResponse(a)) != E_PSI_GEN_NONE)
694 return res;
695 savpos = a.getDWord(0);
696 if (mypos == 0) {
697 resultpos = savpos;
698 return res;
699 }
700 /* Expand file */
701 a.init();
702 a.addDWord(handle);
703 a.addDWord(savpos + mypos);
704 if (!sendCommand(SET_SIZE, a))
705 return E_PSI_FILE_DISC;
706 if ((res = getResponse(a)) != E_PSI_GEN_NONE)
707 return res;
708 mypos = 0;
709 a.init();
710 }
711 /* Now the real seek */
712 a.addDWord(mypos);
713 a.addDWord(handle);
714 a.addDWord(mode);
715 if (!sendCommand(SEEK_FILE, a))
716 return E_PSI_FILE_DISC;
717 if ((res = getResponse(a)) != E_PSI_GEN_NONE)
718 return res;
719 realpos = a.getDWord(0);
720 switch (mode) {
721 case PSI_SEEK_SET:
722 calcpos = mypos;
723 break;
724 case PSI_SEEK_CUR:
725 calcpos = savpos + mypos;
726 break;
727 case PSI_SEEK_END:
728 resultpos = realpos;
729 return res;
730 break;
731 }
732 if (calcpos > realpos) {
733 /* Beyond end of file */
734 a.init();
735 a.addDWord(handle);
736 a.addDWord(calcpos);
737 if (!sendCommand(SET_SIZE, a))
738 return E_PSI_FILE_DISC;
739 if ((res = getResponse(a)) != E_PSI_GEN_NONE)
740 return res;
741 a.addDWord(calcpos);
742 a.addDWord(handle);
743 a.addDWord(PSI_SEEK_SET);
744 if (!sendCommand(SEEK_FILE, a))
745 return E_PSI_FILE_DISC;
746 if ((res = getResponse(a)) != E_PSI_GEN_NONE)
747 return res;
748 realpos = a.getDWord(0);
749 }
750 resultpos = realpos;
751 return res;
752}
753
755mkdir(const char *name)
756{
758 string n = convertSlash(name);
759 if (n.find_last_of('\\') != (n.size() - 1))
760 n += '\\';
761 a.addWord(n.size());
762 a.addString(n.c_str());
763 if (!sendCommand(MK_DIR_ALL, a))
764 return E_PSI_FILE_DISC;
765 return getResponse(a);
766}
767
769rmdir(const char *name)
770{
772 string n = convertSlash(name);
773 if (n.find_last_of('\\') != (n.size() - 1))
774 n += '\\';
775 a.addWord(n.size());
776 a.addString(n.c_str());
777 if (!sendCommand(RM_DIR, a))
778 return E_PSI_FILE_DISC;
779 return getResponse(a);
780}
781
783rename(const char *oldname, const char *newname)
784{
786 string on = convertSlash(oldname);
787 string nn = convertSlash(newname);
788 a.addWord(on.size());
789 a.addString(on.c_str());
790 a.addWord(nn.size());
791 a.addString(nn.c_str());
792 if (!sendCommand(RENAME, a))
793 return E_PSI_FILE_DISC;
794 return getResponse(a);
795}
796
798remove(const char *name)
799{
801 string n = convertSlash(name);
802 a.addWord(n.size());
803 a.addString(n.c_str());
804 if (!sendCommand(DELETE, a))
805 return E_PSI_FILE_DISC;
806 return getResponse(a);
807}
808
810setVolumeName(const char drive , const char * const name)
811{
813 a.addDWord(toupper(drive) - 'A');
814 a.addWord(strlen(name));
815 a.addStringT(name);
817 return E_PSI_FILE_DISC;
818 return getResponse(a);
819}
820
821static enum rfsv::errs e2psi[] = {
866};
867
869err2psierr(int32_t istatus)
870{
871 if ((istatus > E_EPOC_NONE) || (istatus < E_EPOC_DIR_FULL)) {
872 cerr << "FATAL: invalid error-code" << endl;
873 cerr << "status: " << istatus << " " << hex << istatus << endl;
874 return E_PSI_INTERNAL;
875 }
876 return e2psi[istatus - E_EPOC_DIR_FULL];
877}
878
879
880/*
881 * Translate EPOC attributes to standard attributes.
882 */
883uint32_t rfsv32::
884attr2std(const uint32_t attr)
885{
886 long res = 0;
887
888 // Common attributes
889 if (attr & EPOC_ATTR_RONLY)
890 res |= PSI_A_RDONLY;
891 if (attr & EPOC_ATTR_HIDDEN)
892 res |= PSI_A_HIDDEN;
893 if (attr & EPOC_ATTR_SYSTEM)
894 res |= PSI_A_SYSTEM;
895 if (attr & EPOC_ATTR_DIRECTORY)
896 res |= PSI_A_DIR;
897 if (attr & EPOC_ATTR_ARCHIVE)
898 res |= PSI_A_ARCHIVE;
899 if (attr & EPOC_ATTR_VOLUME)
900 res |= PSI_A_VOLUME;
901
902 // EPOC-specific
903 if (attr & EPOC_ATTR_NORMAL)
904 res |= PSI_A_NORMAL;
905 if (attr & EPOC_ATTR_TEMPORARY)
906 res |= PSI_A_TEMP;
907 if (attr & EPOC_ATTR_COMPRESSED)
908 res |= PSI_A_COMPRESSED;
909
910 // Do what we can for SIBO
911 res |= PSI_A_READ;
912
913 return res;
914}
915
916/*
917 * Translate standard attributes to EPOC attributes.
918 */
919uint32_t rfsv32::
920std2attr(const uint32_t attr)
921{
922 long res = 0;
923 // Common attributes
924 if (attr & PSI_A_RDONLY)
925 res |= EPOC_ATTR_RONLY;
926 if (attr & PSI_A_HIDDEN)
927 res |= EPOC_ATTR_HIDDEN;
928 if (attr & PSI_A_SYSTEM)
929 res |= EPOC_ATTR_SYSTEM;
930 if (attr & PSI_A_DIR)
931 res |= EPOC_ATTR_DIRECTORY;
932 if (attr & PSI_A_ARCHIVE)
933 res |= EPOC_ATTR_ARCHIVE;
934 if (attr & PSI_A_VOLUME)
935 res |= EPOC_ATTR_VOLUME;
936
937 // EPOC-specific
938 if (attr & PSI_A_NORMAL)
939 res |= EPOC_ATTR_NORMAL;
940 if (attr & PSI_A_TEMP)
941 res |= EPOC_ATTR_TEMPORARY;
942 if (attr & PSI_A_COMPRESSED)
944
945 return res;
946}
Wrapper class featuring range-checking and string representation of enumerated values.
Definition: Enum.h:136
A class, representing a directory entry of the Psion.
Definition: plpdirent.h:78
std::string attrstr
Definition: plpdirent.h:184
PsiTime time
Definition: plpdirent.h:183
std::string name
Definition: plpdirent.h:185
PlpUID UID
Definition: plpdirent.h:182
uint32_t attr
Definition: plpdirent.h:181
uint32_t size
Definition: plpdirent.h:180
A class representing information about a Disk drive on the psion.
Definition: plpdirent.h:196
void setUID(uint32_t uid)
Definition: plpdirent.cc:147
void setSpace(uint32_t spaceLo, uint32_t spaceHi)
Definition: plpdirent.cc:157
void setSize(uint32_t sizeLo, uint32_t sizeHi)
Definition: plpdirent.cc:152
void setMediaAttribute(uint32_t attr)
Definition: plpdirent.cc:142
void setName(char drive, const char *const volname)
Definition: plpdirent.cc:162
void setMediaType(uint32_t type)
Definition: plpdirent.cc:132
void setDriveAttribute(uint32_t attr)
Definition: plpdirent.cc:137
A class, representing the UIDs of a file on the Psion.
Definition: plpdirent.h:40
Psion time related utility class.
Definition: psitime.h:125
uint32_t getPsiTimeHi(void)
Retrieves the instance's current value in Psion time format, low 32 bits.
Definition: psitime.cc:144
uint32_t getPsiTimeLo(void)
Retrieves the instance's current value in Psion time format, high 32 bits.
Definition: psitime.cc:140
void setPsiTime(psi_timeval *_ptv)
Modifies the value of this instance.
Definition: psitime.cc:108
A class for dealing with sockets.
Definition: tcpsocket.h:38
int getBufferStore(bufferStore &a, bool wait=true)
Receive data into a bufferStore .
Definition: tcpsocket.cc:289
bool sendBufferStore(const bufferStore &a)
Sends data from a bufferStore .
Definition: tcpsocket.cc:325
A generic container for an array of bytes.
Definition: bufferstore.h:37
void discardFirstBytes(int len=0)
Removes bytes from the start of the buffer.
Definition: bufferstore.cc:143
void init()
Initializes the bufferStore.
Definition: bufferstore.cc:77
uint16_t getWord(long pos=0) const
Retrieves the word at index pos.
Definition: bufferstore.cc:102
void addDWord(long dw)
Appends a dword to the content of this instance.
Definition: bufferstore.cc:199
unsigned long getLen() const
Retrieves the length of a bufferStore.
Definition: bufferstore.cc:94
uint32_t getDWord(long pos=0) const
Retrieves the dword at index pos.
Definition: bufferstore.cc:106
unsigned char getByte(long pos=0) const
Retrieves the byte at index pos.
Definition: bufferstore.cc:98
Enum< rfsv::errs > fopendir(const uint32_t, const char *, uint32_t &)
Definition: rfsv32.cc:112
Enum< rfsv::errs > fsetsize(uint32_t, uint32_t)
Resizes an open file on the Psion.
Definition: rfsv32.cc:629
Enum< rfsv::errs > fclose(const uint32_t)
Close a file on the Psion whih was previously opened/created by using fopen , fcreatefile ,...
Definition: rfsv32.cc:128
bool sendCommand(enum commands, bufferStore &)
Definition: rfsv32.cc:386
@ EPOC_ATTR_SYSTEM
Definition: rfsv32.h:85
@ EPOC_ATTR_GETUID
Definition: rfsv32.h:93
@ EPOC_ATTR_RONLY
Definition: rfsv32.h:83
@ EPOC_ATTR_VOLUME
Definition: rfsv32.h:88
@ EPOC_ATTR_DIRECTORY
Definition: rfsv32.h:86
@ EPOC_ATTR_ARCHIVE
Definition: rfsv32.h:87
@ EPOC_ATTR_COMPRESSED
Definition: rfsv32.h:91
@ EPOC_ATTR_NORMAL
Definition: rfsv32.h:89
@ EPOC_ATTR_HIDDEN
Definition: rfsv32.h:84
@ EPOC_ATTR_TEMPORARY
Definition: rfsv32.h:90
Enum< rfsv::errs > readdir(rfsvDirhandle &, PlpDirent &)
Read directory entries.
Definition: rfsv32.cc:152
Enum< rfsv::errs > fopen(const uint32_t, const char *const, uint32_t &)
Opens a file.
Definition: rfsv32.cc:48
@ E_EPOC_NONE
Definition: rfsv32.h:106
@ E_EPOC_DIR_FULL
Definition: rfsv32.h:149
Enum< rfsv::errs > fcreatefile(const uint32_t, const char *const, uint32_t &)
Creates a named file.
Definition: rfsv32.cc:80
Enum< rfsv::errs > opendir(const uint32_t, const char *const, rfsvDirhandle &)
Open a directory for reading with readdir.
Definition: rfsv32.cc:138
Enum< rfsv::errs > rmdir(const char *const)
Removes a directory on the Psion.
Definition: rfsv32.cc:769
commands
Definition: rfsv32.h:152
@ READ_FILE
Definition: rfsv32.h:161
@ SET_SIZE
Definition: rfsv32.h:167
@ DELETE
Definition: rfsv32.h:164
@ SET_MODIFIED
Definition: rfsv32.h:173
@ TEMP_FILE
Definition: rfsv32.h:160
@ SEEK_FILE
Definition: rfsv32.h:163
@ SET_ATT
Definition: rfsv32.h:171
@ READ_DIR
Definition: rfsv32.h:155
@ RM_DIR
Definition: rfsv32.h:170
@ PATH_TEST
Definition: rfsv32.h:180
@ OPEN_FILE
Definition: rfsv32.h:159
@ RENAME
Definition: rfsv32.h:168
@ CREATE_FILE
Definition: rfsv32.h:178
@ CLOSE_HANDLE
Definition: rfsv32.h:153
@ MK_DIR_ALL
Definition: rfsv32.h:169
@ READ_WRITE_FILE
Definition: rfsv32.h:177
@ OPEN_DIR
Definition: rfsv32.h:154
@ REMOTE_ENTRY
Definition: rfsv32.h:165
@ REPLACE_FILE
Definition: rfsv32.h:179
@ DRIVE_INFO
Definition: rfsv32.h:157
@ WRITE_FILE
Definition: rfsv32.h:162
@ SET_VOLUME_LABEL
Definition: rfsv32.h:158
@ GET_DRIVE_LIST
Definition: rfsv32.h:156
@ MODIFIED
Definition: rfsv32.h:174
@ ATT
Definition: rfsv32.h:172
Enum< rfsv::errs > fwrite(const uint32_t, const unsigned char *const, const uint32_t, uint32_t &)
Write to a file on the Psion.
Definition: rfsv32.cc:452
Enum< rfsv::errs > dircount(const char *const, uint32_t &)
Counts number of entries in a directory.
Definition: rfsv32.cc:309
Enum< rfsv::errs > fgeteattr(const char *const, PlpDirent &)
Retrieves attributes, size and modification time of a file on the Psion.
Definition: rfsv32.cc:264
Enum< rfsv::errs > remove(const char *const)
Removes a file on the Psion.
Definition: rfsv32.cc:798
Enum< rfsv::errs > rename(const char *const, const char *const)
Renames a file on the Psion.
Definition: rfsv32.cc:783
uint32_t opMode(const uint32_t)
Converts an open-mode (A combination of the PSI_O_ constants.) from generic representation to the mac...
Definition: rfsv32.cc:205
Enum< rfsv::errs > err2psierr(int32_t)
Definition: rfsv32.cc:869
Enum< rfsv::errs > fseek(const uint32_t, const int32_t, const uint32_t, uint32_t &)
Sets the current file position of a file on the Psion.
Definition: rfsv32.cc:645
Enum< rfsv::errs > fread(const uint32_t, unsigned char *const, const uint32_t, uint32_t &)
Reads from a file on the Psion.
Definition: rfsv32.cc:426
uint32_t std2attr(const uint32_t)
Definition: rfsv32.cc:920
Enum< rfsv::errs > fgetattr(const char *const, uint32_t &)
Retrieves attributes of a file on the Psion.
Definition: rfsv32.cc:248
Enum< rfsv::errs > devinfo(const char, PlpDrive &)
Retrieves details about a drive.
Definition: rfsv32.cc:363
Enum< rfsv::errs > mkdir(const char *const)
Creates a directory on the Psion.
Definition: rfsv32.cc:755
Enum< rfsv::errs > mktemp(uint32_t &, std::string &)
Creates a unique temporary file.
Definition: rfsv32.cc:66
Enum< rfsv::errs > fsetattr(const char *const, const uint32_t, const uint32_t)
Definition: rfsv32.cc:295
Enum< rfsv::errs > copyToPsion(const char *const, const char *const, void *, cpCallback_t)
Copies a file from local machine to the Psion.
Definition: rfsv32.cc:533
Enum< rfsv::errs > copyFromPsion(const char *const, const char *const, void *, cpCallback_t)
Copies a file from the Psion to the local machine.
Definition: rfsv32.cc:478
Enum< rfsv::errs > copyOnPsion(const char *const, const char *const, void *, cpCallback_t)
Copies a file from the Psion to the Psion.
Definition: rfsv32.cc:565
Enum< rfsv::errs > fsetmtime(const char *const, PsiTime const)
Sets the modification time of a file on the Psion.
Definition: rfsv32.cc:234
Enum< rfsv::errs > getResponse(bufferStore &)
Definition: rfsv32.cc:413
Enum< rfsv::errs > pathtest(const char *const)
Checks to see if the directory component of a path or file name exists and is valid.
Definition: rfsv32.cc:616
Enum< rfsv::errs > fgetmtime(const char *const, PsiTime &)
Retrieves the modification time of a file on the Psion.
Definition: rfsv32.cc:218
uint32_t attr2std(const uint32_t)
Definition: rfsv32.cc:884
Enum< rfsv::errs > closedir(rfsvDirhandle &)
Close a directory, previously opened with opendir.
Definition: rfsv32.cc:147
Enum< rfsv::errs > freplacefile(const uint32_t, const char *const, uint32_t &)
Creates an named file, overwriting an existing file.
Definition: rfsv32.cc:96
@ EPOC_OMODE_SHARE_READERS
Definition: rfsv32.h:98
@ EPOC_OMODE_READ_WRITE
Definition: rfsv32.h:102
@ EPOC_OMODE_SHARE_ANY
Definition: rfsv32.h:99
@ EPOC_OMODE_BINARY
Definition: rfsv32.h:100
@ EPOC_OMODE_SHARE_EXCLUSIVE
Definition: rfsv32.h:97
Enum< rfsv::errs > dir(const char *const, PlpDir &)
Reads a directory on the Psion.
Definition: rfsv32.cc:187
Enum< rfsv::errs > devlist(uint32_t &)
Retrieves available drives on the Psion.
Definition: rfsv32.cc:343
Enum< rfsv::errs > setVolumeName(const char, const char *const)
Set the name of a Psion Volume (Drive).
Definition: rfsv32.cc:810
rfsv32(TCPSocket *)
Private constructor.
Definition: rfsv32.cc:39
A helper class for storing intermediate internal information in rfsv16 and rfsv32 .
Definition: rfsv.h:53
bufferStore b
Definition: rfsv.h:59
uint32_t h
Definition: rfsv.h:58
@ PSI_O_EXCL
Definition: rfsv.h:100
@ PSI_O_SHARE
Definition: rfsv.h:103
@ PSI_SEEK_END
Definition: rfsv.h:83
@ PSI_SEEK_CUR
Definition: rfsv.h:82
@ PSI_SEEK_SET
Definition: rfsv.h:81
errs
The known error codes.
Definition: rfsv.h:109
@ E_PSI_GEN_LIB
Definition: rfsv.h:175
@ E_PSI_GEN_NSUP
Definition: rfsv.h:114
@ E_PSI_GEN_NONE
Definition: rfsv.h:110
@ E_PSI_GEN_DIED
Definition: rfsv.h:181
@ E_PSI_FILE_NXIST
Definition: rfsv.h:135
@ E_PSI_GEN_RANGE
Definition: rfsv.h:117
@ E_PSI_FILE_PARITY
Definition: rfsv.h:157
@ E_PSI_FILE_ACCESS
Definition: rfsv.h:141
@ E_PSI_FILE_TOOBIG
Definition: rfsv.h:173
@ E_PSI_FILE_UNKNOWN
Definition: rfsv.h:165
@ E_PSI_GEN_INUSE
Definition: rfsv.h:119
@ E_PSI_FILE_FRAME
Definition: rfsv.h:158
@ E_PSI_FILE_EOF
Definition: rfsv.h:138
@ E_PSI_FILE_LINE
Definition: rfsv.h:155
@ E_PSI_FILE_NAME
Definition: rfsv.h:140
@ E_PSI_FILE_LOCKED
Definition: rfsv.h:142
@ E_PSI_FILE_HANDLE
Definition: rfsv.h:182
@ E_PSI_FILE_CANCEL
Definition: rfsv.h:150
@ E_PSI_FILE_WRITE
Definition: rfsv.h:136
@ E_PSI_FILE_EXIST
Definition: rfsv.h:134
@ E_PSI_GEN_TERMINATED
Definition: rfsv.h:180
@ E_PSI_FILE_DIR
Definition: rfsv.h:144
@ E_PSI_GEN_UNDER
Definition: rfsv.h:115
@ E_PSI_FILE_COMPLETION
Definition: rfsv.h:178
@ E_PSI_GEN_BUSY
Definition: rfsv.h:179
@ E_PSI_FILE_NOTREADY
Definition: rfsv.h:164
@ E_PSI_FILE_OVERRUN
Definition: rfsv.h:159
@ E_PSI_GEN_FSYS
Definition: rfsv.h:129
@ E_PSI_FILE_DRIVER
Definition: rfsv.h:177
@ E_PSI_GEN_DIVIDE
Definition: rfsv.h:118
@ E_PSI_FILE_DIRFULL
Definition: rfsv.h:166
@ E_PSI_FILE_CORRUPT
Definition: rfsv.h:168
@ E_PSI_INTERNAL
Definition: rfsv.h:187
@ E_PSI_GEN_FAIL
Definition: rfsv.h:111
@ E_PSI_FILE_NDISC
Definition: rfsv.h:176
@ E_PSI_GEN_POWER
Definition: rfsv.h:172
@ E_PSI_FILE_FULL
Definition: rfsv.h:139
@ E_PSI_FILE_RETRAN
Definition: rfsv.h:154
@ E_PSI_FILE_CONNECT
Definition: rfsv.h:153
@ E_PSI_GEN_OVER
Definition: rfsv.h:116
@ E_PSI_FILE_DISC
Definition: rfsv.h:152
@ E_PSI_GEN_ARG
Definition: rfsv.h:112
@ E_PSI_GEN_NOMEMORY
Definition: rfsv.h:120
@ E_PSI_FILE_ABORT
Definition: rfsv.h:169
@ E_PSI_GEN_DESCR
Definition: rfsv.h:174
@ PSI_O_RDONLY
Definition: rfsv.h:90
std::string attr2String(const uint32_t attr)
Converts a file attribute rfsv::file_attribs to human readable format, usable for showing them in dir...
Definition: rfsv.cc:150
@ PSI_A_NORMAL
Attributes, valid on EPOC only.
Definition: rfsv.h:203
@ PSI_A_RDONLY
Attributes, valid on both EPOC and SIBO.
Definition: rfsv.h:195
@ PSI_A_COMPRESSED
Definition: rfsv.h:205
@ PSI_A_READ
Attributes, valid on SIBO only.
Definition: rfsv.h:208
@ PSI_A_ARCHIVE
Definition: rfsv.h:199
@ PSI_A_VOLUME
Definition: rfsv.h:200
@ PSI_A_HIDDEN
Definition: rfsv.h:196
@ PSI_A_DIR
Definition: rfsv.h:198
@ PSI_A_TEMP
Definition: rfsv.h:204
@ PSI_A_SYSTEM
Definition: rfsv.h:197
Enum< errs > status
Definition: rfsv.h:646
static std::string convertSlash(const std::string &name)
Utility method, converts '/' to '\'.
Definition: rfsv.cc:141
int32_t serNum
Definition: rfsv.h:647
void reconnect()
Definition: rfsv.cc:117
void reset()
Definition: rfsv.cc:124
TCPSocket * skt
Definition: rfsv.h:645
Definition: doctest.h:522
static rpcs * r
Definition: main.cc:56
static rfsv * a
Definition: main.cc:53
static enum rfsv::errs e2psi[]
Definition: rfsv32.cc:821
int(* cpCallback_t)(void *, uint32_t)
Defines the callback procedure for progress indication of copy operations.
Definition: rfsv.h:42
std::deque< class PlpDirent > PlpDir
Definition: rfsv.h:31
const int RFSV_SENDLEN
Definition: rfsv.h:36