00001 #ifndef __Bkmks_h
00002 #define __Bkmks_h
00003
00004 #include "config.h"
00005 #include "Filedata.h"
00006 #include <stdio.h>
00007
00008 template<class T>
00009 class CList;
00010
00011 class Bkmk
00012 {
00013 friend class BkmkFile;
00014 unsigned char* m_name;
00015 unsigned short m_namelen;
00016 unsigned char* m_anno;
00017 unsigned short m_annolen;
00018 unsigned int m_position;
00019 unsigned int m_position2;
00020 unsigned char m_red,m_green,m_blue, m_level;
00021 void init(const void*, unsigned short, const void*, unsigned short, unsigned int);
00022 public:
00023 Bkmk() : m_name(NULL), m_namelen(0), m_anno(NULL), m_annolen(0), m_position(0) {};
00024 Bkmk(const unsigned char* _nm, unsigned short _nmlen, const unsigned char* _anno, unsigned short _annolen, unsigned int _p);
00025 Bkmk(const tchar* _nm, const unsigned char* _anno, unsigned short _annolen, unsigned int _p);
00026 Bkmk(const tchar* _nm, const tchar* _anno, unsigned int _p);
00027 Bkmk(const tchar* _nm, const tchar* _anno, unsigned int _p, unsigned int _p2);
00028 Bkmk(const Bkmk& rhs) : m_name(NULL), m_anno(NULL)
00029 {
00030 *this = rhs;
00031 }
00032 ~Bkmk();
00033 unsigned int value() const { return m_position; }
00034 void value(unsigned int _v) { m_position = _v; }
00035 unsigned int value2() const { return m_position2; }
00036 void value2(unsigned int _v) { m_position2 = _v; }
00037 unsigned char red() { return m_red; }
00038 unsigned char green() { return m_green; }
00039 unsigned char blue() { return m_blue; }
00040 void red(unsigned char _v) { m_red = _v; }
00041 void green(unsigned char _v) { m_green = _v; }
00042 void blue(unsigned char _v) { m_blue = _v; }
00043 unsigned char level() { return m_level; }
00044 void level(unsigned char _v) { m_level = _v; }
00045 tchar *name() const { return (tchar*)m_name; }
00046 tchar *anno() const { return (tchar*)m_anno; }
00047 bool operator<(const Bkmk& rhs) { return (m_position < rhs.m_position); }
00048 Bkmk& operator=(const Bkmk& rhs);
00049 bool operator==(const Bkmk& rhs);
00050 void setAnno(tchar* t);
00051 void setAnno(unsigned char* t, unsigned short len);
00052 unsigned char* filedata()
00053 {
00054 CFiledata fd(anno());
00055 return m_anno+fd.length();
00056 }
00057 unsigned short filedatalen()
00058 {
00059 CFiledata fd(anno());
00060 return m_annolen - fd.length();
00061 }
00062 };
00063
00064 class BkmkFile
00065 {
00066 FILE* f;
00067 bool wt;
00068 bool isUpgraded, m_extras;
00069 static const unsigned long magic;
00070 private:
00071 static Bkmk* read07(BkmkFile*, FILE*);
00072 static Bkmk* read06(BkmkFile*, FILE*);
00073 static Bkmk* read05(BkmkFile*, FILE*);
00074 static Bkmk* read03(BkmkFile*, FILE*);
00075 CList<Bkmk>* readall00(Bkmk*(*fn)(BkmkFile*, FILE*));
00076 void write(const Bkmk& b);
00077 public:
00078 bool upgraded() { return isUpgraded; }
00079 BkmkFile(const char *fnm, bool w, bool _x);
00080 ~BkmkFile();
00081 void write(CList<Bkmk>& bl);
00082 CList<Bkmk>* readall();
00083 };
00084 #endif