summaryrefslogtreecommitdiff
path: root/noncore/apps/opie-reader/ebookcodec.h
blob: f6e2daf75416c6b30de20e0127214ad320bd236d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include "CExpander.h"

#include <qfileinfo.h>
#include <qdir.h>

#ifdef USEQPE
#include <qpe/global.h>
#endif

#include "util.h"

#ifndef __STATIC
#include <dlfcn.h>
class ebookcodec : public CExpander_Interface
{
  CExpander *codec;
  void *handle;
  int status;
 public:
  QString about()
    {
      return QString("Plug-in ebook codec interface (c) Tim Wentford\n")+codec->about();
    }
  ebookcodec(const QString& _s) : codec(NULL), handle(NULL), status(0)
    {
		QString codecpath(QTReaderUtil::getPluginPath());
      codecpath += _s;
      if (QFile::exists(codecpath))
	{
	  qDebug("Codec:%s", (const char*)codecpath);
	  handle = dlopen(codecpath, RTLD_LAZY);
	  if (handle == 0)
	    {
	      /*
	      QString wrn(dlerror());
	      QString fmt;
	      while (wrn.length() > 10)
		{
		  fmt += wrn.left(10);
		  fmt += '\n';
		  wrn = wrn.right(wrn.length()-10);
		}
	      fmt += wrn;
	      QMessageBox::warning(NULL, PROGNAME, fmt);
	      */
	      qDebug("Can't find codec:%s", dlerror());
	      status = -10;
	      return;
	    }
	  CExpander* (*newcodec)();
	  newcodec = (CExpander* (*)())dlsym(handle, "newcodec");
	  if (newcodec == NULL)
	    {
	      qDebug("Can't find newcodec");
	      status = -20;
	      return;
	    }
	  codec = (*newcodec)();
	}
      else
	{
	  qDebug("Can't find codec");
	}
      if (codec == NULL)
	{
	  qDebug("Can't do newcodec");
	  status = -30;
	  return;
	}
    }
  virtual ~ebookcodec()
    {
      if (codec != NULL) delete codec;
      if (handle != NULL) dlclose(handle);
    }
  size_t getHome() { return codec->getHome(); }
#ifdef USEQPE
  void suspend() { codec->suspend(); }
  void unsuspend() { codec->unsuspend(); }
  void suspend(FILE*& fin) { codec->suspend(fin); }
  void unsuspend(FILE*& fin) { codec->unsuspend(fin); }
#endif
  unsigned int locate() { return codec->locate(); }
  void locate(unsigned int n) { codec->locate(n); }
  bool hasrandomaccess() { return codec->hasrandomaccess(); }
  void sizes(unsigned long& file, unsigned long& text)
    {
      codec->sizes(file, text);
      //qDebug("Codec sizes:(%u, %u)", file, text);
    }
  CList<Bkmk>* getbkmklist() { return codec->getbkmklist(); }
  void getch(tchar& ch, CStyle& sty, unsigned long& pos) { codec->getch(ch, sty, pos); }
  int getch() { return codec->getch(); }
  linkType hyperlink(unsigned int n, unsigned int noff, QString& wrd, QString& nm) { return codec->hyperlink(n, noff, wrd, nm); }
  MarkupType PreferredMarkup() { return codec->PreferredMarkup(); }
  void saveposn(size_t posn) { codec->saveposn(posn); }
  void writeposn(size_t posn) { codec->writeposn(posn); }
  linkType forward(size_t& loc) { return codec->forward(loc); }
  linkType back(size_t& loc) { return codec->back(loc); }
  bool hasnavigation() { return codec->hasnavigation(); }
  void start2endSection() { codec->start2endSection(); }
  QImage* getPicture(unsigned long tgt) { return codec->getPicture(tgt); }
  void setSaveData(unsigned char*& data, unsigned short& len, unsigned char* src, unsigned short srclen) { return codec->setSaveData(data, len, src, srclen); }
  void putSaveData(unsigned char*& src, unsigned short& srclen) { codec->putSaveData(src, srclen); }
  void setContinuous(bool _b) { codec->setContinuous(_b); }
  void setwidth(int w) { codec->setwidth(w); }
  unsigned long startSection() { return codec->startSection(); }
  unsigned long endSection() { return codec->endSection(); }
  int openfile(const char *src)
    {
      //qDebug("ebook openfile:%s", src);
      return (status != 0) ? status : codec->openfile(src);
    }
  int getwidth() { return codec->getwidth(); }
  QImage* getPicture(const QString& href) { return codec->getPicture(href); }
  bool getFile(const QString& href) { return codec->getFile(href); }
};
#endif