Source: lib/rfsv.h


Annotated List
Files
Globals
Hierarchy
Index
/*-*-c++-*-
 * $Id: rfsv.h,v 1.24 2002/07/14 06:35:33 felfert Exp $
 *
 * This file is part of plptools.
 *
 *  Copyright (C) 1999  Philip Proudman <philip.proudman@btinternet.com>
 *  Copyright (C) 1999-2002 Fritz Elfert <felfert@to.com>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */
#ifndef _RFSV_H_
#define _RFSV_H_

#include <deque>
#include <string>
#include <Enum.h>
#include <plpdirent.h>
#include <bufferstore.h>

typedef std::deque<class PlpDirent> PlpDir;

class ppsocket;
class PlpDrive;

const int RFSV_SENDLEN = 2000;

/**
 * Defines the callback procedure for
 * progress indication of copy operations.
 */
typedef int (*cpCallback_t)(void *, u_int32_t);

class rfsv16;
class rfsv32;

/**
 * A helper class for storing
 * intermediate internal information in rfsv16 and
 * rfsv32 .
 * @internal
 */
class rfsvDirhandle {
    friend class rfsv16;
    friend class rfsv32;

private:
    u_int32_t h;
    bufferStore b;
};

/**
 * Access remote file services of a Psion.
 *
 * rfsv provides an API for accessing file services
 * of a Psion connected via ncpd. This class defines the
 * interface and a small amount of common constants and
 * methods. The majority of implementation is provided
 * by @ref rfsv32 and @ref rfsv16 , which implement the
 * variations of the protocol for EPOC and SIBO respectively.
 * Usually, the class @ref rfsvfactory is used to instantiate
 * the correct variant depending on the remote machine,
 * currently connected.
 */
class rfsv {
public:
    /**
    * The kown modes for seek.
    */
    enum seek_mode {
	PSI_SEEK_SET = 1,
	PSI_SEEK_CUR = 2,
	PSI_SEEK_END = 3
    };

    /**
    * The known modes for file open.
    */
    enum open_flags {
	PSI_O_RDONLY = 0000,
	PSI_O_WRONLY = 0001,
	PSI_O_RDWR   = 0002,
    };

    /**
    * The known modes for file creation.
    */
    enum open_mode {
	PSI_O_CREAT  = 00100,
	PSI_O_EXCL   = 00200,
	PSI_O_TRUNC  = 01000,
	PSI_O_APPEND = 02000,
	PSI_O_SHARE  = 04000,
    };

    /**
    * The known error codes.
    */
    enum errs {
	E_PSI_GEN_NONE	= 0,
	E_PSI_GEN_FAIL = -1,
	E_PSI_GEN_ARG = -2,
	E_PSI_GEN_OS = -3,
	E_PSI_GEN_NSUP = -4,
	E_PSI_GEN_UNDER = -5,
	E_PSI_GEN_OVER = -6,
	E_PSI_GEN_RANGE = -7,
	E_PSI_GEN_DIVIDE = -8,
	E_PSI_GEN_INUSE = -9,
	E_PSI_GEN_NOMEMORY = - 10,
	E_PSI_GEN_NOSEGMENTS = -11,
	E_PSI_GEN_NOSEM = -12,
	E_PSI_GEN_NOPROC = -13,
	E_PSI_GEN_OPEN = -14,
	E_PSI_GEN_NOTOPEN = -15,
	E_PSI_GEN_IMAGE = -16,
	E_PSI_GEN_RECEIVER = -17,
	E_PSI_GEN_DEVICE = -18,
	E_PSI_GEN_FSYS = -19,
	E_PSI_GEN_START = -20,
	E_PSI_GEN_NOFONT = -21,
	E_PSI_GEN_TOOWIDE = -22,
	E_PSI_GEN_TOOMANY = -23,
	E_PSI_FILE_EXIST = -32,
	E_PSI_FILE_NXIST = -33,
	E_PSI_FILE_WRITE = -34,
	E_PSI_FILE_READ = -35,
	E_PSI_FILE_EOF = -36,
	E_PSI_FILE_FULL = -37,
	E_PSI_FILE_NAME = -38,
	E_PSI_FILE_ACCESS = -39,
	E_PSI_FILE_LOCKED = -40,
	E_PSI_FILE_DEVICE = -41,
	E_PSI_FILE_DIR = -42,
	E_PSI_FILE_RECORD = -43,
	E_PSI_FILE_RDONLY = -44,
	E_PSI_FILE_INV = -45,
	E_PSI_FILE_PENDING = -46,
	E_PSI_FILE_VOLUME = -47,
	E_PSI_FILE_CANCEL = -48,
	E_PSI_FILE_ALLOC = -49,
	E_PSI_FILE_DISC = -50,
	E_PSI_FILE_CONNECT = -51,
	E_PSI_FILE_RETRAN = -52,
	E_PSI_FILE_LINE = -53,
	E_PSI_FILE_INACT = -54,
	E_PSI_FILE_PARITY = -55,
	E_PSI_FILE_FRAME = -56,
	E_PSI_FILE_OVERRUN = -57,
	E_PSI_MDM_CONFAIL = -58,
	E_PSI_MDM_BUSY = -59,
	E_PSI_MDM_NOANS = -60,
	E_PSI_MDM_BLACKLIST = -61,
	E_PSI_FILE_NOTREADY = -62,
	E_PSI_FILE_UNKNOWN = -63,
	E_PSI_FILE_DIRFULL = -64,
	E_PSI_FILE_PROTECT = -65,
	E_PSI_FILE_CORRUPT = -66,
	E_PSI_FILE_ABORT = -67,
	E_PSI_FILE_ERASE = -68,
	E_PSI_FILE_INVALID = -69,
	E_PSI_GEN_POWER = -100,
	E_PSI_FILE_TOOBIG = -101,
	E_PSI_GEN_DESCR = -102,
	E_PSI_GEN_LIB = -103,
	E_PSI_FILE_NDISC = -104,
	E_PSI_FILE_DRIVER = -105,
	E_PSI_FILE_COMPLETION = -106,
	E_PSI_GEN_BUSY = -107,
	E_PSI_GEN_TERMINATED = -108,
	E_PSI_GEN_DIED = -109,
	E_PSI_FILE_HANDLE = -110,

	// Special error code for "Operation not permitted in RFSV16"
	E_PSI_NOT_SIBO = -200,
	// Special error code for "internal library error"
	E_PSI_INTERNAL = -201
    };

    /**
    * The known file attributes
    */
    enum file_attribs {
	/** Attributes, valid on both EPOC and SIBO. */
	PSI_A_RDONLY     = 0x0001,
	PSI_A_HIDDEN     = 0x0002,
	PSI_A_SYSTEM     = 0x0004,
	PSI_A_DIR        = 0x0008,
	PSI_A_ARCHIVE    = 0x0010,
	PSI_A_VOLUME     = 0x0020,

	/** Attributes, valid on EPOC only. */
	PSI_A_NORMAL     = 0x0040,
	PSI_A_TEMP       = 0x0080,
	PSI_A_COMPRESSED = 0x0100,

	/** Attributes, valid on SIBO only. */
	PSI_A_READ       = 0x0200,
	PSI_A_EXEC       = 0x0400,
	PSI_A_STREAM     = 0x0800,
	PSI_A_TEXT       = 0x1000,
    };

    virtual ~rfsv();
    void reset();
    void reconnect();

    /**
    * Retrieves the current connection status.
    *
    * @returns The status of the connection.
    */
    Enum<errs> getStatus();

    /**
    * Opens a file.
    *
    * @param attr   The open mode. Use @ref opMode to convert a combination of @ref open_flags
    *               and @ref open_mode to the machine-specific representation.
    * @param name   The name of the file to open.
    * @param handle The handle for usage with @ref fread ,
    *               @ref fwrite , @ref fseek or @ref fclose is returned here.
    *
    * @returns A Psion error code (One of enum @ref #errs ).
    */
    virtual Enum<errs> fopen(const u_int32_t attr, const char * const name, u_int32_t &handle) = 0;

    /**
    * Creates a unique temporary file.
    * The file is opened for reading and writing.
    *
    * @param handle The handle for usage with @ref fread ,
    *               @ref fwrite , @ref fseek or @ref fclose is returned here.
    * @param name   The name of the temporary file is returned here.
    *
    * @returns A Psion error code (One of enum @ref #errs ).
    */
    virtual Enum<errs> mktemp(u_int32_t &handle, std::string &name) = 0;

    /**
    * Creates a named file.
    *
    * @param attr   The open mode. Use @ref opMode to convert a combination of @ref open_flags
    *               and @ref open_mode to the machine-specific representation.
    * @param name   The name of the file to create.
    * @param handle The handle for usage with @ref fread ,
    *               @ref fwrite , @ref fseek or @ref fclose is returned here.
    *
    * @returns A Psion error code (One of enum @ref #errs ).
    */
    virtual Enum<errs> fcreatefile(const u_int32_t attr, const char * const name, u_int32_t &handle) = 0;

    /**
    * Creates an named file, overwriting an existing file.
    *
    * @param attr   The open mode. Use @ref opMode to convert a combination of @ref open_flags
    *               and @ref open_mode to the machine-specific representation.
    * @param name   The name of the file to create.
    * @param handle The handle for usage with @ref fread ,
    *               @ref fwrite , @ref fseek or @ref fclose is returned here.
    *
    * @returns A Psion error code (One of enum @ref #errs ).
    */
    virtual Enum<errs> freplacefile(const u_int32_t attr, const char * const name, u_int32_t &handle) = 0;

    /**
    * Close a file on the Psion whih was previously opened/created by using
    * @ref fopen , @ref fcreatefile , @ref freplacefile or @ref mktemp .
    *
    * @param handle A valid file handle.
    */
    virtual Enum<errs> fclose(const u_int32_t handle) = 0;

    /**
    * Reads a directory on the Psion.
    * The returned STL deque of @ref PlpDirent contains all
    * requested directory entries.
    *
    * @param name The name of the directory
    * @param ret  An STL deque of @ref PlpDirent entries.
    *
    * @returns A Psion error code (One of enum @ref rfsv::errs ).
    */
    virtual Enum<errs> dir(const char * const name, PlpDir &ret) = 0;

    /**
    * Retrieves the modification time of a file on the Psion.
    *
    * @param name Name of the file.
    * @param mtime Modification time is returned here.
    *
    * @returns A Psion error code (One of enum @ref #errs ).
    */
    virtual Enum<errs> fgetmtime(const char * const name, PsiTime &mtime) = 0;

    /**
    * Sets the modification time of a file on the Psion.
    *
    * @param name Name of the file whose modification time should be set.
    * @param mtime The desired modification time.
    *
    * @returns A Psion error code (One of enum @ref #errs ).
    */
    virtual Enum<errs> fsetmtime(const char * const name, const PsiTime mtime) = 0;

    /**
    * Retrieves attributes of a file on the Psion.
    *
    * @param name Name of the file whose attributes ar to be retrieved.
    * @param attr The file's attributes are returned here.
    *
    * @returns A Psion error code (One of enum @ref #errs ).
    */
    virtual Enum<errs> fgetattr(const char * const name, u_int32_t &attr) = 0;

    /**
    * Retrieves attributes, size and modification time of a file on the Psion.
    *
    * @param name The name of the file.
    * @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, PlpDirent &e) =0;

    /**
    * @param name
    *
    * @returns A Psion error code (One of enum @ref #errs ).
    */
    virtual Enum<errs> fsetattr(const char * const name, const u_int32_t seta, const u_int32_t unseta) = 0;

    /**
    * Counts number of entries in a directory.
    *
    * @param name The directory whose entries are to be counted.
    * @param count The number of entries is returned here.
    *
    * @returns A Psion error code (One of enum @ref #errs ).
    */
    virtual Enum<errs> dircount(const char * const name, u_int32_t &count) = 0;

    /**
    * Retrieves available drives on the Psion.
    * @p devbits On return, for every exiting drive, a bit is set in this
    *                variable. The lowest bit represents drive A:.
    *
    * @returns A Psion error code (One of enum @ref #errs ).
    */
    virtual Enum<errs> devlist(u_int32_t &devbits) = 0;

    /**
    * Retrieves details about a drive.
    *
    * @param drive The drive character of the drive to get details from
    *              (e.g: 'C', 'D' etc.).
    *              (0 represents A:, 1 is B: and so on ...)
    * @param dinfo A @ref PlpDrive object which is filled with the drive's
    *              information upon return.
    *
    * @returns A Psion error code (One of enum @ref #errs ).
    */
    virtual Enum<errs> devinfo(const char drive, PlpDrive &dinfo) = 0;

    /**
    * Reads from a file on the Psion.
    *
    * @param handle Handle of the file to read from.
    * @param buffer The area where to store the data read.
    * @param len The number of bytes to read.
    * @param count The number of bytes actually read is returned here.
    *
    * @returns A Psion error code (One of enum @ref #errs ).
    */
    virtual Enum<errs> fread(const u_int32_t handle, unsigned char * const buffer, const u_int32_t len, u_int32_t &count) = 0;

    /**
    * Write to a file on the Psion.
    *
    * @param handle Handle of the file to read from.
    * @param buffer The area to be written.
    * @param len The number of bytes to write.
    * @param count The number of bytes actually written is returned here.
    *
    * @returns A Psion error code (One of enum @ref #errs ).
    */
    virtual Enum<errs> fwrite(const u_int32_t handle, const unsigned char * const buffer, const u_int32_t len, u_int32_t &count) = 0;

    /**
    * Copies a file from the Psion to the local machine.
    *
    * @param from Name of the file on the Psion to be copied.
    * @param to Name of the destination file on the local machine.
    * @param func Pointer to a function which gets called on every read.
    * 	This function can be used to show some progress etc. May be set
    * 	to NULL, where no callback is performed. If the callback function
    * 	returns 0, the operation is aborted and E_PSI_FILE_CANCEL is returned.
    *
    * @returns A Psion error code (One of enum @ref #errs ).
    */
    virtual Enum<errs> copyFromPsion(const char *from, const char *to, void *, cpCallback_t func) = 0;

    /**
    * Copies a file from the Psion to the local machine.
    */
    virtual Enum<rfsv::errs> copyFromPsion(const char *from, int fd, cpCallback_t cb) = 0;

    /**
    * Copies a file from local machine to the Psion.
    *
    * @param from Name of the file on the local machine to be copied.
    * @param to Name of the destination file on the Psion.
    * @param func Pointer to a function which gets called on every read.
    * 	This function can be used to show some progress etc. May be set
    * 	to NULL, where no callback is performed. If the callback function
    * 	returns 0, the operation is aborted and E_PSI_FILE_CANCEL is returned.
    *
    * @returns A Psion error code (One of enum @ref #errs ).
    */
    virtual Enum<errs> copyToPsion(const char * const from, const char * const to, void *, cpCallback_t func) = 0;

    /**
    * Copies a file from the Psion to the Psion.
    * On the EPOC variants, this runs much faster than reading
    * data from the Psion and then writing it back to the Psion, since
    * data transfer is handled locally on the Psion.
    *
    * @param from Name of the file to be copied.
    * @param to Name of the destination file.
    * @param func Pointer to a function which gets called on every read.
    * 	This function can be used to show some progress etc. May be set
    * 	to NULL, where no callback is performed. If the callback function
    * 	returns 0, the operation is aborted and E_PSI_FILE_CANCEL is returned.
    *
    * @returns A Psion error code (One of enum @ref #errs ).
    */
    virtual Enum<errs> copyOnPsion(const char * const from, const char * const to, void *, cpCallback_t func) = 0;

    /**
    * Resizes an open file on the Psion.
    * If the new size is greater than the file's
    * current size, the contents of the added
    * data is undefined. If The new size is smaller,
    * the file is truncated.
    *
    * @param handle Handle of the file to be resized.
    * @param size New size for that file.
    *
    * @returns A Psion error code (One of enum @ref #errs ).
    */
    virtual Enum<errs> fsetsize(const u_int32_t handle, const u_int32_t size) = 0;

    /**
    * Sets the current file position of a file on the Psion.
    *
    * @param handle The file handle.
    * @param offset Position to be seeked to.
    * @param mode The mode for seeking.
    * @param resultpos The final file position after seeking is returned here.
    *
    * @returns A Psion error code (One of enum @ref #errs ).
    */
    virtual Enum<errs> fseek(const u_int32_t handle, const int32_t offset, const u_int32_t mode, u_int32_t &resultpos) = 0;

    /**
    * Creates a directory on the Psion.
    *
    * @param name Name of the directory to be created.
    *
    * @returns A Psion error code (One of enum @ref #errs ).
    */
    virtual Enum<errs> mkdir(const char * const name) = 0;

    /**
    * Removes a directory on the Psion.
    *
    * @param name Name of the directory to be removed.
    *
    * @returns A Psion error code (One of enum @ref #errs ).
    */
    virtual Enum<errs> rmdir(const char * const name) = 0;

    /**
    * Renames a file on the Psion.
    *
    * @param oldname Name of the file to be renamed.
    * @param newname New Name for that file.
    *
    * @returns A Psion error code (One of enum @ref #errs ).
    */
    virtual Enum<errs> rename(const char * const oldname, const char * const newname) = 0;

    /**
    * Removes a file on the Psion.
    *
    * @param name Name of the file to be removed.
    *
    * @returns A Psion error code (One of enum @ref #errs ).
    */
    virtual Enum<errs> remove(const char * const name) = 0;

    /**
    * Open a directory for reading with readdir.
    *
    * @param attr   A combination of PSI_A_.. flags, representing the desired types
    *               of entries to be returned when calling @ref readdir .
    * @param name   The name of the directory
    * @param handle A handle to be used with @ref readdir and @ref closedir .
    *
    * @returns A Psion error code (One of enum @ref #errs ).
    */
    virtual Enum<errs> opendir(const u_int32_t attr, const char * const name, rfsvDirhandle &handle) = 0;

    /**
    * Read directory entries.
    * This method reads entries of a directory, previously
    * opened with @ref opendir .
    *
    * @param handle A handle, obtained by calling @ref opendir .
    * @param entry  The entry information is returned here.
    *
    * @returns A Psion error code (One of enum @ref #errs ).
    */
    virtual Enum<errs> readdir(rfsvDirhandle &handle, PlpDirent &entry) = 0;

    /**
    * Close a directory, previously opened with @ref opendir.
    *
    * @param handle A handle, obtained by calling @ref opendir .
    *
    * @returns A Psion error code (One of enum @ref #errs ).
    */
    virtual Enum<errs> closedir(rfsvDirhandle &handle) = 0;

    /**
    * Set the name of a Psion Volume (Drive).
    *
    * @param drive The drive character of the Volume, whose name should be set.
    * @param name  The new name for that drive.
    *
    * @returns A Psion error code (One of enum @ref #errs ).
    */
    virtual Enum<errs> setVolumeName(const char drive, const char * const name) = 0;

    /**
    * Converts a file attribute @ref rfsv::file_attribs to
    * human readable format, usable for showing them in directory
    * listings. The first 7 characters are common to all
    * machine types:
    * 
    * 	Char Nr. Value
    * 	0        'd' if a directory,                     '-' otherwise.
    * 	1        'r' if file is readable,                '-' otherwise.
    * 	2        'w' if file is writeable,               '-' otherwise.
    * 	3        'h' if file is hidden,                  '-' otherwise.
    * 	4        's' if file is a system file,           '-' otherwise.
    * 	5        'a' if file is modified (archive flag), '-' otherwise.
    * 	6        'v' if file is a volume name,           '-' otherwise.
    * 
* The rest (3 characters) are machine specific: *
    * 	Char Nr. EPOC Value          SIBO Value
    * 	7        'n' if normal,      'x' if executable, '-' otherwise.
    * 	8        't' if temporary,   'b' if a stream,   '-' otherwise.
    * 	8        'c' if compressed,  't' if a textfile, '-' otherwise.
    * 
* * @param attr the generic file attribute. * * @returns Pointer to static textual representation of file attributes. * */ std::string attr2String(const u_int32_t attr); /** * Converts an open-mode (A combination of the PSI_O_ constants.) * from generic representation to the machine-specific representation. * * @param mode The generic open mode. * * @returns The machine specific representation for use with * @ref fopen , @ref fcreatefile and @freplacefile. */ virtual u_int32_t opMode(const u_int32_t mode) = 0; /** * Utility method, converts '/' to '\'. */ static std::string convertSlash(const std::string &name); /** * Retrieve speed of serial link. * * @returns The speed of the serial link in baud or -1 on error. */ int getSpeed(); /** * Retrieves the protocol version. * * @returns Either 3 or 5 representing Series 3 (SIBO) or Series 5 (EPOC) */ virtual int getProtocolVersion() = 0; protected: /** * Retrieves the PLP protocol name. Mainly internal use. * * @returns The connection name always "SYS$RFSV" */ const char *getConnectName(); ppsocket *skt; Enum<errs> status; int32_t serNum; }; #endif /* * Local variables: * c-basic-offset: 4 * End: */

Generated by: felfert@usw-pr-shell1.sourceforge.net on Sat Aug 10 18:46:04 2002, using kdoc 2.0a36.