00001 #ifndef __Text_h
00002 #define __Text_h
00003 #include <stdio.h>
00004 #include <zlib.h>
00005 #include <sys/stat.h>
00006 #ifdef USEQPE
00007 #include <qpe/global.h>
00008 #endif
00009
00010 #include "CExpander.h"
00011
00012 class Text: public CExpander {
00013 gzFile file;
00014 unsigned long fsize;
00015 public:
00016 void suspend()
00017 {
00018 #ifdef USEQPE
00019 if (!bSuspended)
00020 {
00021 bSuspended = true;
00022 suspos = gztell(file);
00023 gzclose(file);
00024 file = NULL;
00025 sustime = time(NULL);
00026 }
00027 #endif
00028 }
00029 void unsuspend()
00030 {
00031 #ifdef USEQPE
00032 if (bSuspended)
00033 {
00034 bSuspended = false;
00035 if (sustime != ((time_t)-1))
00036 {
00037 int delay = time(NULL) - sustime;
00038 if (delay < 10)
00039 {
00040 Global::statusMessage("Stalling");
00041 sleep(10-delay);
00042 }
00043 }
00044 file = gzopen(fname, "rb");
00045 for (int i = 0; file == NULL && i < 5; i++)
00046 {
00047 Global::statusMessage("Stalling");
00048 sleep(5);
00049 file = gzopen(fname, "rb");
00050 }
00051 if (file == NULL)
00052 {
00053 QMessageBox::warning(NULL, PROGNAME, "Couldn't reopen file");
00054 exit(0);
00055 }
00056 suspos = gzseek(file, suspos, SEEK_SET);
00057 }
00058 #endif
00059 }
00060 Text() : file(NULL) {};
00061 virtual ~Text()
00062 {
00063 if (file != NULL)
00064 {
00065 #ifdef USEQPE
00066 unsuspend();
00067 #endif
00068 gzclose(file);
00069 }
00070 }
00071 int OpenFile(const char *src)
00072 {
00073 if (file != NULL) gzclose(file);
00074 struct stat _stat;
00075 stat(src,&_stat);
00076 fsize = _stat.st_size;
00077 return ((file = gzopen(src,"rb")) == NULL);
00078 }
00079 int getch()
00080 {
00081 #ifdef USEQPE
00082 unsuspend();
00083 #endif
00084 return gzgetc(file);
00085 }
00086 unsigned int locate()
00087 {
00088 #ifdef USEQPE
00089 unsuspend();
00090 #endif
00091 return gztell(file);
00092 }
00093 void locate(unsigned int n)
00094 {
00095 #ifdef USEQPE
00096 unsuspend();
00097 #endif
00098 gzseek(file,n,SEEK_SET);
00099 }
00100 bool hasrandomaccess() { return true; }
00101 void sizes(unsigned long& _file, unsigned long& _text)
00102 {
00103 _text = _file = fsize;
00104 FILE* f = fopen(fname, "rb");
00105 if (f != NULL)
00106 {
00107 unsigned char mn[2];
00108 fread(mn, 1, 2, f);
00109 if ((mn[0] == 31) && (mn[1] == 139))
00110 {
00111 int tmp = sizeof(_text);
00112 fseek(f,-tmp,SEEK_END);
00113 fread(&_text, sizeof(_text), 1, f);
00114 }
00115 fclose(f);
00116 }
00117 }
00118 MarkupType PreferredMarkup()
00119 {
00120 return cTEXT;
00121 }
00122 QString about() { return QString("Text/gzipped text codec (c) Tim Wentford"); }
00123 };
00124 #endif