00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef SWMODULE_H
00025 #define SWMODULE_H
00026
00027 #include <swdisp.h>
00028 #include <listkey.h>
00029 #include <swconfig.h>
00030
00031 #include <swcacher.h>
00032 #include <swsearchable.h>
00033 #ifndef _WIN32_WCE
00034 #include <iostream>
00035 #endif
00036
00037 #include <list>
00038
00039 #include <defs.h>
00040
00041 SWORD_NAMESPACE_START
00042
00043 class SWOptionFilter;
00044 class SWFilter;
00045
00046 #define SEARCHFLAG_MATCHWHOLEENTRY 4096
00047
00048 #define SWMODULE_OPERATORS \
00049 operator const char *() { return renderText(); } \
00050 operator SWKey &() { return *getKey(); } \
00051 operator SWKey *() { return getKey(); } \
00052 SWModule &operator <<(const char *inbuf) { setEntry(inbuf); return *this; } \
00053 SWModule &operator <<(const SWKey *sourceKey) { linkEntry(sourceKey); return *this; } \
00054 SWModule &operator -=(int steps) { decrement(steps); return *this; } \
00055 SWModule &operator +=(int steps) { increment(steps); return *this; } \
00056 SWModule &operator ++(int) { return *this += 1; } \
00057 SWModule &operator --(int) { return *this -= 1; } \
00058 SWModule &operator =(SW_POSITION p) { setPosition(p); return *this; }
00059
00060
00061 typedef std::list < SWFilter * >FilterList;
00062 typedef std::list < SWOptionFilter * >OptionFilterList;
00063 typedef std::map < SWBuf, SWBuf, std::less < SWBuf > > AttributeValue;
00064 typedef std::map < SWBuf, AttributeValue, std::less < SWBuf > > AttributeList;
00065 typedef std::map < SWBuf, AttributeList, std::less < SWBuf > > AttributeTypeList;
00066
00067 #define SWTextDirection char
00068 #define SWTextEncoding char
00069 #define SWTextMarkup char
00070
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090 class SWDLLEXPORT SWModule : public SWCacher, public SWSearchable {
00091
00092 class StdOutDisplay : public SWDisplay {
00093 char display(SWModule &imodule)
00094 {
00095 #ifndef _WIN32_WCE
00096 std::cout << (const char *)imodule;
00097 #endif
00098 return 0;
00099 }
00100 };
00101
00102 protected:
00103
00104 ConfigEntMap ownConfig;
00105 ConfigEntMap *config;
00106 mutable AttributeTypeList entryAttributes;
00107 mutable bool procEntAttr;
00108
00109 mutable char error;
00110 bool skipConsecutiveLinks;
00111
00113 SWKey *key;
00114
00115 ListKey listKey;
00116 char *modname;
00117 char *moddesc;
00118 char *modtype;
00119 char *modlang;
00120
00121 char direction;
00122 char markup;
00123 char encoding;
00124
00126 SWDisplay *disp;
00127
00128 static StdOutDisplay rawdisp;
00129 mutable SWBuf entryBuf;
00130
00132 FilterList *stripFilters;
00133
00135 FilterList *rawFilters;
00136
00138 FilterList *renderFilters;
00139
00141 OptionFilterList *optionFilters;
00142
00144 FilterList *encodingFilters;
00145
00146 mutable int entrySize;
00147 mutable long entryIndex;
00148
00149 static void prepText(SWBuf &buf);
00150
00151
00152 public:
00153
00158 bool terminateSearch;
00159
00171 SWModule(const char *imodname = 0, const char *imoddesc = 0, SWDisplay * idisp = 0, const char *imodtype = 0, SWTextEncoding encoding = ENC_UNKNOWN, SWTextDirection dir = DIRECTION_LTR, SWTextMarkup markup = FMT_UNKNOWN, const char *modlang = 0);
00172
00175 virtual ~SWModule();
00176
00181 virtual char popError();
00182 SWDEPRECATED virtual char Error() { return popError(); }
00183
00187 virtual bool isUnicode() const { return (encoding == (char)ENC_UTF8); }
00188
00189
00190
00191
00192 virtual void setConfig(ConfigEntMap *config);
00193 virtual const ConfigEntMap &getConfig() const { return *config; }
00194 virtual const char *getConfigEntry(const char *key) const;
00195
00199 virtual int getEntrySize() const { return entrySize; }
00200
00207 virtual char setKey(const SWKey *ikey);
00208
00214 char setKey(const SWKey &ikey) { return setKey(&ikey); }
00218 SWDEPRECATED char SetKey(const SWKey *ikey) { return setKey(ikey); }
00222 SWDEPRECATED char SetKey(const SWKey &ikey) { return setKey(ikey); }
00226 SWDEPRECATED char Key(const SWKey & ikey) { return setKey(ikey); }
00227
00231 virtual SWKey *getKey() const;
00235 SWDEPRECATED SWKey &Key() const { return *getKey(); }
00236
00243 SWDEPRECATED const char *KeyText(const char *ikeytext = 0) { if (ikeytext) setKey(ikeytext); return *getKey(); }
00244
00250 virtual const char *getKeyText() const {
00251 return *getKey();
00252 }
00253
00254
00255 virtual long getIndex() const { return entryIndex; }
00256 virtual void setIndex(long iindex) { entryIndex = iindex; }
00257
00258 SWDEPRECATED long Index() const { return getIndex(); }
00259
00260 SWDEPRECATED long Index(long iindex) { setIndex(iindex); return getIndex(); }
00261
00266 virtual char display();
00267 SWDEPRECATED char Display() { return display(); }
00268
00273 virtual SWDisplay *getDisplay() const;
00274
00279 virtual void setDisplay(SWDisplay * idisp);
00280
00284 SWDEPRECATED SWDisplay *Disp(SWDisplay * idisp = 0) { if (idisp) setDisplay(idisp); return getDisplay(); }
00285
00290 const char *getName() const;
00291 SWDEPRECATED const char *Name() const { return getName(); }
00292
00298 SWDEPRECATED const char *Name(const char *imodname) { stdstr(&modname, imodname); return getName(); }
00299
00304 const char *getDescription() const;
00305 SWDEPRECATED const char *Description() const { return getDescription(); }
00306
00312 SWDEPRECATED const char *Description(const char *imoddesc) { stdstr(&moddesc, imoddesc); return getDescription(); }
00313
00318 const char *getType() const;
00319 SWDEPRECATED const char *Type() const { return getType(); }
00320
00326 SWDEPRECATED const char *Type(const char *imodtype) { setType(imodtype); return getType(); }
00327 void setType(const char *imodtype) { stdstr(&modtype, imodtype); }
00328
00334 virtual char getDirection() const;
00335 SWDEPRECATED char Direction(signed char newdir = -1) { char retVal = getDirection(); if (newdir != -1) return direction = newdir; return retVal; }
00336
00342 char getEncoding() const { return encoding; }
00343 SWDEPRECATED char Encoding(signed char enc = -1) { char retVal = getEncoding(); if (enc != -1) encoding = enc; return retVal; }
00344
00350 char getMarkup() const { return markup; }
00351 SWDEPRECATED char Markup(signed char imarkup = -1) { char retVal = getMarkup(); if (imarkup != -1) markup = imarkup; return retVal; }
00352
00358 const char *getLanguage() const { return modlang; }
00359 SWDEPRECATED const char *Lang(char *imodlang = 0) { if (imodlang != 0) stdstr(&modlang, imodlang); return getLanguage(); }
00360
00361
00362
00363
00382 virtual ListKey &search(const char *istr, int searchType = 0, int flags = 0,
00383 SWKey * scope = 0,
00384 bool * justCheckIfSupported = 0,
00385 void (*percent) (char, void *) = &nullPercent,
00386 void *percentUserData = 0);
00387
00388
00389 SWDEPRECATED ListKey &Search(const char *istr, int searchType = 0, int flags = 0, SWKey * scope = 0, bool * justCheckIfSupported = 0, void (*percent) (char, void *) = &nullPercent, void *percentUserData = 0) { return search(istr, searchType, flags, scope, justCheckIfSupported, percent, percentUserData); }
00390
00391
00399 virtual SWKey *createKey() const;
00400 SWDEPRECATED SWKey *CreateKey() const { return createKey(); }
00401
00406 virtual SWBuf &getRawEntryBuf() const = 0;
00407
00408 const char *getRawEntry() const { return getRawEntryBuf().c_str(); }
00409
00410
00414 virtual bool isWritable() const { return false; }
00415
00420 static signed char createModule(const char *path);
00421
00424 virtual void setEntry(const char *inbuf, long len= -1);
00425
00429 virtual void linkEntry(const SWKey *sourceKey);
00430
00433 virtual void deleteEntry() {}
00434
00435
00436
00440 virtual void decrement(int steps = 1);
00441
00445 virtual void increment(int steps = 1);
00446
00450 virtual void setPosition(SW_POSITION pos);
00451
00457 virtual void filterBuffer(OptionFilterList *filters, SWBuf &buf, const SWKey *key) const;
00458
00464 virtual void filterBuffer(FilterList *filters, SWBuf &buf, const SWKey *key) const;
00465
00472 virtual SWModule &addRenderFilter(SWFilter *newFilter) {
00473 renderFilters->push_back(newFilter);
00474 return *this;
00475 }
00476 SWDEPRECATED SWModule &AddRenderFilter(SWFilter *newFilter) { return addRenderFilter(newFilter); }
00477
00482 virtual const FilterList &getRenderFilters() const {
00483 return *renderFilters;
00484 }
00485
00490 virtual SWModule &removeRenderFilter(SWFilter *oldFilter) {
00491 renderFilters->remove(oldFilter);
00492 return *this;
00493 }
00494 SWDEPRECATED SWModule &RemoveRenderFilter(SWFilter *oldFilter) { return removeRenderFilter(oldFilter); }
00495
00501 virtual SWModule &replaceRenderFilter(SWFilter *oldFilter, SWFilter *newFilter) {
00502 FilterList::iterator iter;
00503 for (iter = renderFilters->begin(); iter != renderFilters->end(); iter++) {
00504 if (*iter == oldFilter)
00505 *iter = newFilter;
00506 }
00507 return *this;
00508 }
00509 SWDEPRECATED SWModule &ReplaceRenderFilter(SWFilter *oldFilter, SWFilter *newFilter) { return replaceRenderFilter(oldFilter, newFilter); }
00510
00515 virtual void renderFilter(SWBuf &buf, const SWKey *key) const {
00516 filterBuffer(renderFilters, buf, key);
00517 }
00518
00526 virtual SWModule &addEncodingFilter(SWFilter *newFilter) {
00527 encodingFilters->push_back(newFilter);
00528 return *this;
00529 }
00530 SWDEPRECATED SWModule &AddEncodingFilter(SWFilter *newFilter) { return addEncodingFilter(newFilter); }
00531
00536 virtual SWModule &removeEncodingFilter(SWFilter *oldFilter) {
00537 encodingFilters->remove(oldFilter);
00538 return *this;
00539 }
00540 SWDEPRECATED SWModule &RemoveEncodingFilter(SWFilter *oldFilter) { return removeEncodingFilter(oldFilter); }
00541
00547 virtual SWModule &replaceEncodingFilter(SWFilter *oldFilter, SWFilter *newFilter) {
00548 FilterList::iterator iter;
00549 for (iter = encodingFilters->begin(); iter != encodingFilters->end(); iter++) {
00550 if (*iter == oldFilter)
00551 *iter = newFilter;
00552 }
00553 return *this;
00554 }
00555 SWDEPRECATED SWModule &ReplaceEncodingFilter(SWFilter *oldFilter, SWFilter *newFilter) { return replaceEncodingFilter(oldFilter, newFilter); }
00556
00561 virtual void encodingFilter(SWBuf &buf, const SWKey *key) const {
00562 filterBuffer(encodingFilters, buf, key);
00563 }
00564
00571 virtual SWModule &addStripFilter(SWFilter *newFilter) {
00572 stripFilters->push_back(newFilter);
00573 return *this;
00574 }
00575 SWDEPRECATED SWModule &AddStripFilter(SWFilter *newFilter) { return addStripFilter(newFilter); }
00576
00581 virtual SWModule &addRawFilter(SWFilter *newfilter) {
00582 rawFilters->push_back(newfilter);
00583 return *this;
00584 }
00585 SWDEPRECATED SWModule &AddRawFilter(SWFilter *newFilter) { return addRawFilter(newFilter); }
00586
00591 virtual void stripFilter(SWBuf &buf, const SWKey *key) const {
00592 filterBuffer(stripFilters, buf, key);
00593 }
00594
00595
00600 virtual void rawFilter(SWBuf &buf, const SWKey *key) const {
00601 filterBuffer(rawFilters, buf, key);
00602 }
00603
00611 virtual SWModule &addOptionFilter(SWOptionFilter *newFilter) {
00612 optionFilters->push_back(newFilter);
00613 return *this;
00614 }
00615 SWDEPRECATED SWModule &AddOptionFilter(SWOptionFilter *newFilter) { return addOptionFilter(newFilter); }
00616
00621 virtual void optionFilter(SWBuf &buf, const SWKey *key) const {
00622 filterBuffer(optionFilters, buf, key);
00623 }
00624
00633 virtual const char *stripText(const char *buf = 0, int len = -1);
00634 SWDEPRECATED const char *StripText(const char *buf = 0, int len = -1) { return stripText(buf, len); }
00635
00644 virtual const char *renderText(const char *buf = 0, int len = -1, bool render = true);
00645 SWDEPRECATED const char *RenderText(const char *buf = 0, int len = -1, bool render = true) { return renderText(buf, len, render); }
00646
00651 virtual const char *getRenderHeader() const;
00652
00657 virtual const char *stripText(const SWKey *tmpKey);
00658
00663 virtual const char *renderText(const SWKey *tmpKey);
00664
00669 virtual void setSkipConsecutiveLinks(bool val) { skipConsecutiveLinks = val; }
00670
00674 virtual bool isSkipConsecutiveLinks() { return skipConsecutiveLinks; }
00675 SWDEPRECATED bool getSkipConsecutiveLinks() { return isSkipConsecutiveLinks(); }
00676
00677 virtual bool isLinked(const SWKey *, const SWKey *) const { return false; }
00678 virtual bool hasEntry(const SWKey *) const { return false; }
00679
00686 virtual AttributeTypeList &getEntryAttributes() const { return entryAttributes; }
00687
00693 virtual void setProcessEntryAttributes(bool val) const { procEntAttr = val; }
00694 SWDEPRECATED void processEntryAttributes(bool val) const { setProcessEntryAttributes(val); }
00695
00698 virtual bool isProcessEntryAttributes() const { return procEntAttr; }
00699
00700
00701
00702 virtual signed char createSearchFramework(
00703 void (*percent) (char, void *) = &nullPercent,
00704 void *percentUserData = 0);
00705 virtual void deleteSearchFramework();
00706 virtual bool hasSearchFramework();
00707
00708
00709 SWMODULE_OPERATORS
00710
00711 };
00712
00713 SWORD_NAMESPACE_END
00714 #endif