summaryrefslogtreecommitdiff
path: root/include/filemgr.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/filemgr.h')
-rw-r--r--include/filemgr.h190
1 files changed, 190 insertions, 0 deletions
diff --git a/include/filemgr.h b/include/filemgr.h
new file mode 100644
index 0000000..86b8334
--- /dev/null
+++ b/include/filemgr.h
@@ -0,0 +1,190 @@
+/******************************************************************************
+* filemgr.h - definition of class FileMgr used for pooling file handles
+*
+* $Id: filemgr.h 2108 2007-10-13 20:35:02Z scribe $
+*
+* Copyright 1998 CrossWire Bible Society (http://www.crosswire.org)
+* CrossWire Bible Society
+* P. O. Box 2528
+* Tempe, AZ 85280-2528
+*
+* 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 version 2.
+*
+* 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.
+*
+*/
+
+#ifndef FILEMGR_H
+#define FILEMGR_H
+
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <defs.h>
+#include <swcacher.h>
+#include <swbuf.h>
+
+SWORD_NAMESPACE_START
+
+class SWDLLEXPORT FileMgr;
+
+struct SWDLLEXPORT DirEntry {
+public:
+ SWBuf name;
+ unsigned long size;
+ bool isDirectory;
+};
+/**
+* This class represents one file. It works with the FileMgr object.
+*/
+class SWDLLEXPORT FileDesc {
+
+ friend class FileMgr;
+
+ long offset;
+ int fd; // -77 closed;
+ FileMgr *parent;
+ FileDesc *next;
+
+ FileDesc(FileMgr * parent, const char *path, int mode, int perms, bool tryDowngrade);
+ virtual ~FileDesc();
+
+public:
+ /** @return File handle.
+ */
+ int getFd();
+
+ long seek(long offset, int whence);
+ long read(void *buf, long count);
+ long write(const void *buf, long count);
+
+ /** Path to file.
+ */
+ char *path;
+ /** File access mode.
+ */
+ int mode;
+ /** File permissions.
+ */
+ int perms;
+ /**
+ */
+ bool tryDowngrade;
+};
+
+/**
+* This class ist used make file access operations easier.
+* It keeps a list of all open files internally and closes them
+* when the destructor is called.
+*/
+class SWDLLEXPORT FileMgr : public SWCacher {
+
+ friend class FileDesc;
+ friend class __staticsystemFileMgr;
+
+ FileDesc *files;
+ int sysOpen(FileDesc * file);
+protected:
+ static FileMgr *systemFileMgr;
+public:
+ static int CREAT;
+ static int APPEND;
+ static int TRUNC;
+ static int RDONLY;
+ static int RDWR;
+ static int WRONLY;
+ static int IREAD;
+ static int IWRITE;
+
+ /** Maximum number of open files set in the constructor.
+ * determines the max number of real system files that
+ * filemgr will open. Adjust for tuning.
+ */
+ int maxFiles;
+
+ static FileMgr *getSystemFileMgr();
+ static void setSystemFileMgr(FileMgr *newFileMgr);
+
+ /** Constructor.
+ * @param maxFiles The number of files that this FileMgr may open in parallel, if necessary.
+ */
+ FileMgr(int maxFiles = 35);
+
+ /**
+ * Destructor. Clean things up. Will close all files opened by this FileMgr object.
+ */
+ ~FileMgr();
+
+ /** Open a file and return a FileDesc for it.
+ * The file itself will only be opened when FileDesc::getFd() is called.
+ * @param path Filename.
+ * @param mode File access mode.
+ * @param tryDowngrade
+ * @return FileDesc object for the requested file.
+ */
+ FileDesc *open(const char *path, int mode, bool tryDowngrade);
+
+ /** Open a file and return a FileDesc for it.
+ * The file itself will only be opened when FileDesc::getFd() is called.
+ * @param path Filename.
+ * @param mode File access mode.
+ * @param perms Permissions.
+ * @param tryDowngrade
+ * @return FileDesc object for the requested file.
+ */
+ FileDesc *open(const char *path, int mode, int perms = IREAD | IWRITE, bool tryDowngrade = false);
+
+ /** Close a given file and delete its FileDesc object.
+ * Will only close the file if it was created by this FileMgr object.
+ * @param file The file to close.
+ */
+ void close(FileDesc * file);
+
+ /** Cacher methods overridden
+ */
+ virtual void flush();
+ virtual long resourceConsumption();
+
+ /** Checks for the existence of a file.
+ * @param ipath Path to file.
+ * @param ifileName Name of file to check for.
+ */
+ static signed char existsFile(const char *ipath, const char *ifileName = 0);
+
+ /** Checks for the existence of a directory.
+ * @param ipath Path to directory.
+ * @param idirName Name of directory to check for.
+ */
+ static signed char existsDir(const char *ipath, const char *idirName = 0);
+
+ /** Truncate a file at its current position
+ * leaving byte at current possition intact deleting everything afterward.
+ * @param file The file to operate on.
+ */
+ signed char trunc(FileDesc *file);
+
+ static char isDirectory(const char *path);
+ static int createParent(const char *pName);
+ static int createPathAndFile(const char *fName);
+
+ /** attempts to open a file readonly
+ * @param fName filename to open
+ * @return fd; < 0 = error
+ */
+ static int openFileReadOnly(const char *fName);
+ static int copyFile(const char *srcFile, const char *destFile);
+ static int copyDir(const char *srcDir, const char *destDir);
+ static int removeDir(const char *targetDir);
+ static int removeFile(const char *fName);
+ static char getLine(FileDesc *fDesc, SWBuf &line);
+
+};
+
+
+SWORD_NAMESPACE_END
+#endif