Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

ZText.h

Go to the documentation of this file.
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

Generated on Sat Nov 5 16:16:59 2005 for OPIE by  doxygen 1.4.2