#ifndef __DCL_TEXT_TEMPLATE_H__ #define __DCL_TEXT_TEMPLATE_H__ 20060104 #ifndef __DCL_STRING_H__ #include <dcl/core/String.h> #endif #ifndef __DCL_OBJECT_H__ #include <dcl/core/Object.h> #endif #ifndef __DCL_EXCEPTION_H__ #include <dcl/core/Exception.h> #endif #ifndef __DCL_STREAM_H__ #include <dcl/core/Stream.h> #endif #ifndef __DCL_COLLECTION_VECTOR_H__ #include <dcl/core/CollectionVector.h> /* struct DCLCAPI StrStrAssoc { String key; String value; StrStrAssoc() {} StrStrAssoc(const String& key, const String& value) { this->key = key; this->value = value; } }; */ #endif #ifndef __DCL_SQL_H__ #include <dcl/core/SQL.h> // class SQLFields #endif // sub block // <!-- BEGIN name --> // <!-- END name --> __DCL_BEGIN_NAMESPACE class DCLCAPI TextTemplate : public Object { DECLARE_CLASSINFO(TextTemplate) public: TextTemplate(); TextTemplate(const TextTemplate& src); TextTemplate(const String& strFileName) __DCL_THROWS1(IOException*); virtual ~TextTemplate(); TextTemplate& operator = (const TextTemplate& src); // main ==> strFileName void open(const String& strFileName) __DCL_THROWS1(IOException*); // strName ==> strFileName, insert sub template void open(const String& strName, const String& strFileName) __DCL_THROWS1(IOException*); void clear(); void reset(); void erase(const char* pszMacro); // RETURN : assigned count int assign(const char* pszMacro, const String& strValue); int assign(const char* pszMacro, const TextTemplate& t); int assign(const char* pszMacro); int assign(const StrStrAssocVector& vStrToStr); int assign(_CONST SQLFields& fields, const String& strFieldIsNull); int append(const char* pszMacro, const String& strValue); int append(const char* pszMacro, const TextTemplate& t); int append(const char* pszMacro); int append(const StrStrAssocVector& vStrToStr); int append(_CONST SQLFields& fields, const String& strFieldIsNull); #ifdef __DCL_DEBUG void showNullMacro(bool bShow, bool bWithSubTemplate); #endif void printTo(OutputStream& out) const __DCL_THROWS1(IOException*); // REF sub Template Object, strName이 없으면 새로운 객체 리턴 TextTemplate& operator [] (const String& strName); // strName이 있으면 객체의 주소, 없으면 NULL TextTemplate* atP(const String& strName) const; bool exists(const String& strName, bool bSubTemplate = true) const; protected: // override members virtual String onSQLFieldValue(_CONST SQLField& field, const String& strFieldIsNull); protected: void* m_pTextList; void* m_pSubTemplateMap; #ifdef __DCL_DEBUG bool m_bShowNullMacro; #endif // sub 템플릿을 분할할하고 parseHelper를 호출하여 // 분할된 블럭에서 sub 템플릿을 구성한다. // char* psz : parse는 regex를 사용한다. regexec는 NULL 종료 // 문자열을 사용하기 때문에 parse 중간에 데이터를 NULL 종결 문자열로 // 만들어서 처리한다. void parseHelper(const char* psz); void parse(char* psz); int append(const char* pszMacro, const String& strValue, bool bClearExists); int append(const char* pszMacro, const TextTemplate& t, bool bClearExists); int append(const StrStrAssocVector& vStrToStr, bool bClearExists); int append(_CONST SQLFields& fields, const String& strFieldIsNull, bool bClearExists); }; DCLCAPI inline OutputStream& operator << (OutputStream& out, TextTemplate& t) { t.printTo(out); return out; } inline int TextTemplate::assign(const char* pszMacro, const String& strValue) { return append(pszMacro, strValue, true); } inline int TextTemplate::assign(const char* pszMacro, const TextTemplate& t) { return append(pszMacro, t, true); } inline int TextTemplate::assign(const char* pszMacro) { return append(pszMacro, (*this)[pszMacro], true); } inline int TextTemplate::assign(const StrStrAssocVector& vStrToStr) { return append(vStrToStr, true); } inline int TextTemplate::assign(_CONST SQLFields& fields, const String& strFieldIsNull) { return append(fields, strFieldIsNull, true); } inline int TextTemplate::append(const char* pszMacro, const String& strValue) { return append(pszMacro, strValue, false); } inline int TextTemplate::append(const char* pszMacro, const TextTemplate& t) { return append(pszMacro, t, false); } inline int TextTemplate::append(const char* pszMacro) { return append(pszMacro, (*this)[pszMacro], false); } inline int TextTemplate::append(const StrStrAssocVector& vStrToStr) { return append(vStrToStr, false); } inline int TextTemplate::append(_CONST SQLFields& fields, const String& strFieldIsNull) { return append(fields, strFieldIsNull, false); } __DCL_END_NAMESPACE #endif // __DCL_TEXT_TEMPLATE_H__