00001 #ifndef transl_h
00002 #define transl_h
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "refcount.h"
00022 #include "objectset.h"
00023 #include "callback.h"
00024 #include "bufstring.h"
00025 #include "streamconn.h"
00026 #include "ctxtioobj.h"
00027 class IOPar;
00028 class Translator;
00029
00030 #define mDGBKey "dGB"
00031 #define mdTectKey "dTect"
00032
00033 #define mObjSelUnrelated 0
00034 #define mObjSelRelated 1
00035 #define mObjSelMatch 2
00036 mGlobal int defaultSelector(const char*,const char*);
00037
00038
00053 mClass TranslatorGroup
00054 { mRefCountImpl(TranslatorGroup);
00055 public:
00056
00057 TranslatorGroup( const char* clssnm,
00058 const char* usrnm );
00059
00060 const BufferString& clssName() const { return clssname_; }
00061 const BufferString& userName() const { return usrname_; }
00062 virtual Translator* make(const char*,bool usrnm=true) const;
00063 const Translator* getTemplate(const char*,bool usrnm) const;
00064
00065 const ObjectSet<const Translator>& templates() const { return templs_; }
00066
00067 virtual const IOObjContext& ioCtxt() const = 0;
00068 virtual int objSelector(const char*) const = 0;
00070
00071 bool hasConnType(const char*) const;
00072 virtual const char* defExtension() const { return 0; }
00073 IOPar& selHist();
00074 void clearSelHist();
00075
00076 static const ObjectSet<TranslatorGroup>& groups() { return getGroups(); }
00077 static TranslatorGroup& getGroup(const char* nm,bool usr=true);
00078
00079
00080 int add(Translator*);
00081 static TranslatorGroup& addGroup(TranslatorGroup*);
00082
00083 protected:
00084
00085 BufferString clssname_;
00086 BufferString usrname_;
00087 ObjectSet<const Translator> templs_;
00088 IOPar* selhist_;
00089
00090 static ObjectSet<TranslatorGroup>& getGroups();
00091
00092 };
00093
00094
00110 mClass Translator : public CallBacker
00111 {
00112 public:
00113 Translator( const char* nm, const char* unm )
00114 : typname_(nm)
00115 , usrname_(unm)
00116 , group_(0) {}
00117 virtual ~Translator() {}
00118
00119 const BufferString& typeName() const { return typname_; }
00120 const BufferString& userName() const { return usrname_; }
00121 const TranslatorGroup* group() const { return group_; }
00122
00123 virtual Translator* getNew() const = 0;
00124
00125 virtual bool implExists(const IOObj*,int forread) const;
00126 virtual bool implReadOnly(const IOObj*) const;
00127 virtual bool implRemove(const IOObj*) const;
00128 virtual bool implShouldRemove(const IOObj*) const;
00129 virtual bool implRename(const IOObj*,const char*,
00130 const CallBack* cb=0) const;
00131 virtual bool implSetReadOnly(const IOObj*,bool) const;
00132
00133 virtual const char* connType() const;
00134 virtual void usePar(const IOPar&) {}
00135 virtual const char* defExtension() const
00136 { return group_ ? group_->defExtension() : 0; }
00137
00138 void setGroup( TranslatorGroup* g ) { group_ = g; }
00139
00140 virtual bool isReadDefault() const { return true; }
00143
00144 protected:
00145
00146 BufferString typname_;
00147 BufferString usrname_;
00148 TranslatorGroup* group_;
00149
00150 };
00151
00152
00153
00154
00156 #define isTranslatorGroup(clss) \
00157 public: \
00158 static TranslatorGroup& theInst(); \
00159 static int selector(const char*); \
00160 static const IOObjContext& ioContext(); \
00161 virtual const IOObjContext& ioCtxt() const { return ioContext(); } \
00162 virtual int objSelector( const char* s ) const { return selector(s); } \
00163
00164
00166 #define isTranslator(spec,clss) \
00167 public: \
00168 Translator* getNew() const \
00169 { \
00170 Translator* tr = new spec##clss##Translator(typeName().buf(), \
00171 userName().buf()); \
00172 tr->setGroup( group_ ); return tr; \
00173 } \
00174 static spec##clss##Translator* getInstance(); \
00175 static const char* translKey(); \
00176 static int listID() ; \
00177
00178
00179 #define defineTranslatorGroup(clss,usrnm) \
00180 static RefMan<TranslatorGroup> clss##inst = \
00181 &TranslatorGroup::addGroup( new clss##TranslatorGroup(#clss,usrnm) );\
00182 TranslatorGroup& clss##TranslatorGroup::theInst() \
00183 { return *clss##inst; }
00184
00185
00187 #define defineTranslator(spec,clss,usrnm) \
00188 static int spec##clss##listid_ \
00189 = TranslatorGroup::getGroup( #clss , false ).add( \
00190 new spec##clss##Translator( #spec, usrnm ) ); \
00191 int spec##clss##Translator::listID() { return spec##clss##listid_; }\
00192 spec##clss##Translator* spec##clss##Translator::getInstance() \
00193 { return new spec##clss##Translator(#clss,usrnm); } \
00194 const char* spec##clss##Translator::translKey() { return usrnm; }
00195
00196
00197
00200 #define mDefEmptyTranslatorGroupConstructor(clss) \
00201 clss##TranslatorGroup( const char* nm, const char* unm ) \
00202 : TranslatorGroup(nm,unm) {}
00203
00206 #define mDefEmptyTranslatorBaseConstructor(clss) \
00207 clss##Translator( const char* nm, const char* unm ) \
00208 : Translator(nm,unm) {}
00209
00212 #define mDefEmptyTranslatorConstructor(spec,clss) \
00213 spec##clss##Translator( const char* nm, const char* unm ) \
00214 : clss##Translator(nm,unm) {}
00215
00219 #define mDeclEmptyTranslatorBundle(clss,fmt,defext) \
00220 mClass clss##TranslatorGroup : public TranslatorGroup \
00221 { isTranslatorGroup(clss) \
00222 mDefEmptyTranslatorGroupConstructor(clss) \
00223 const char* defExtension() const { return defext; } \
00224 }; \
00225 \
00226 mClass clss##Translator : public Translator \
00227 { public: \
00228 mDefEmptyTranslatorBaseConstructor(clss) \
00229 }; \
00230 \
00231 mClass fmt##clss##Translator : public clss##Translator \
00232 { isTranslator(fmt,clss) \
00233 mDefEmptyTranslatorConstructor(fmt,clss) \
00234 };
00235
00239 #define mDefSimpleTranslatorInstances(clss,usrnm,fmt) \
00240 defineTranslatorGroup(clss,usrnm) \
00241 defineTranslator(fmt,clss,#fmt)
00242
00245 #define mDefSimpleTranslatorSelector(clss,usrnm) \
00246 int clss##TranslatorGroup::selector( const char* s ) \
00247 { return defaultSelector(usrnm,s); }
00248
00252 #define mDefSimpleTranslatorioContextWithExtra(clss,stdtyp,extra) \
00253 const IOObjContext& clss##TranslatorGroup::ioContext() \
00254 { \
00255 static IOObjContext* ctxt = 0; \
00256 if ( !ctxt ) \
00257 { \
00258 ctxt = new IOObjContext( 0 ); \
00259 ctxt->stdseltype = IOObjContext::stdtyp; \
00260 extra; \
00261 } \
00262 ctxt->trgroup = &theInst(); \
00263 return *ctxt; \
00264 }
00265
00268 #define mDefSimpleTranslatorioContext(clss,stdtyp) \
00269 mDefSimpleTranslatorioContextWithExtra(clss,stdtyp,)
00270
00274 #define mDefSimpleTranslators(clss,usrnm,fmt,stdtyp) \
00275 mDefSimpleTranslatorInstances(clss,usrnm,fmt) \
00276 mDefSimpleTranslatorSelector(clss,usrnm) \
00277 mDefSimpleTranslatorioContext(clss,stdtyp)
00278
00282 #define mDefSimpleTranslatorsWithCtioExtra(clss,usrnm,fmt,stdtyp,extra) \
00283 mDefSimpleTranslatorInstances(clss,usrnm,fmt) \
00284 mDefSimpleTranslatorSelector(clss,usrnm) \
00285 mDefSimpleTranslatorioContextWithExtra(clss,stdtyp,extra)
00286
00291 #define mDefSimpleTranslatorsWithSelKey(clss,usrnm,fmt,stdtyp,selky) \
00292 mDefSimpleTranslatorsWithCtioExtra(clss,usrnm,fmt,stdtyp, \
00293 ctxt->selkey = selky)
00294
00295
00296
00297
00298 #define mSelHist(clss) \
00299 clss##TranslatorGroup::theInst().selHist()
00300
00301 #define mTranslCreate(clss,nm) \
00302 (clss##Translator*)clss##TranslatorGroup::theInst().make(nm)
00303
00304 #define mTranslGroupName(clss) \
00305 clss##TranslatorGroup::theInst().userName()
00306
00307 #define mTranslKey(clss) \
00308 clss##Translator::translKey()
00309
00310 #define mMkCtxtIOObj(clss) \
00311 new CtxtIOObj(clss##TranslatorGroup::ioContext())
00312
00313 #define mIOObjContext(clss) \
00314 clss##TranslatorGroup::ioContext()
00315
00316
00317 #endif