// KTemplateInfo.cpp: implementation of the KTemplateInfo class. // ////////////////////////////////////////////////////////////////////// #include "../../include/kfile/KTemplateInfo.h" #include "../../include/kfile/KDataObject.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// KTemplateInfo::KTemplateInfo() { m_nMemberCount = 0; } KTemplateInfo::~KTemplateInfo() { m_members.clear(); } KDataObject *KTemplateInfo::CreateMember( int index, KTemplateDataObject *parent ) { assert( (unsigned)index < m_members.size() ); MEMBER &m = m_members[index]; KDataObject *obj = NULL; KDataObject *varCount; switch ( m.classType ) { case KDataObject::CLASSTYPEID_WORD: case KDataObject::CLASSTYPEID_DWORD: case KDataObject::CLASSTYPEID_FLOAT: case KDataObject::CLASSTYPEID_CHAR: case KDataObject::CLASSTYPEID_UCHAR: case KDataObject::CLASSTYPEID_STRING: obj = new KSimpleDataObject( static_cast< KDataObject::CLASSTYPEID >( m.classType ) ); break; case KDataObject::CLASSTYPEID_ARRAY_CHAR: case KDataObject::CLASSTYPEID_ARRAY_UCHAR: case KDataObject::CLASSTYPEID_ARRAY_WORD: case KDataObject::CLASSTYPEID_ARRAY_DWORD: case KDataObject::CLASSTYPEID_ARRAY_FLOAT: case KDataObject::CLASSTYPEID_ARRAY_STRING: obj = new KSimpleDataArrayObject( static_cast< KDataObject::CLASSTYPEID >( m.classType ) ); (reinterpret_cast(obj))->SetArrayInfo( m.arraycount, m.arrayvarname.c_str(), parent ); break; case KDataObject::CLASSTYPEID_TEMPLATE: obj = new KTemplateDataObject( m.uuidType ); break; case KDataObject::CLASSTYPEID_TEMPLATEARRAY: obj = new KTemplateDataArrayObject( m.uuidType ); if ( m.arraycount == -1 ) varCount = parent->GetMemberObject( m.arrayvarname.c_str() ); else varCount = NULL; (reinterpret_cast(obj))->SetArrayInfo( m.arraycount, m.arrayvarname.c_str(), parent ); break; } return obj; } void KTemplateInfo::GenerateSource( KStream &stream ) { generateClassHeader( stream ); generateMemberSource( stream ); generateClassFooter( stream ); generateArrayClassHeader( stream ); generateArrayMemberSource( stream ); generateArrayClassFooter( stream ); } void KTemplateInfo::AddMember( const char *name, const char *classname, const GUID *uuidType, int classType, int nArrayCount, const char *strArrayCountVar ) { MEMBER mem; mem.name = name; if ( uuidType ) { mem.uuidType = *uuidType; mem.classname = classname; } else memset( &mem.uuidType, 0, sizeof(mem.uuidType) ); mem.classType = classType; mem.arraycount = nArrayCount; mem.arrayvarname = strArrayCountVar; m_members.push_back( mem ); m_hashIndexByName.add( name, m_nMemberCount ); m_nMemberCount++; } /* std::string m_gen_classname; // %cn% std::string m_gen_membername; // %mn% std::string m_gen_membertype; // %mt% std::string m_gen_membervartype; // %mv% std::string m_gen_memberclassname; // %mc% */ void KTemplateInfo::replaceGenSrc( std::string &src ) { int npos = static_cast(src.find( "%" )); // find first while ( npos >= 0 && npos < (int)src.size() ) { std::string token = src.substr( npos, 4 ); std::string target; bool found = false; if ( token.compare( "%cn%") == 0 ) target = m_gen_classname, found = true; else if ( token.compare( "%mn%" ) == 0 ) target = m_gen_membername, found = true; else if ( token.compare( "%mt%" ) == 0 ) target = m_gen_membertype, found = true; else if ( token.compare( "%mv%" ) == 0 ) target = m_gen_membervartype, found = true; else if ( token.compare( "%mm%" ) == 0 ) target = m_gen_membervarmethod, found = true; else if ( token.compare( "%mc%" ) == 0 ) target = m_gen_memberclassname, found = true; if ( found ) src.replace( npos, 4, target ); else npos++; npos = static_cast(src.find( "%", npos )); } } void KTemplateInfo::setTypeInfo( int type ) { switch( type ) { case KDataObject::CLASSTYPEID_WORD: m_gen_membervartype = "unsigned short"; m_gen_membervarmethod = "WORD"; m_gen_membertype = "KSimpleDataObject"; break; case KDataObject::CLASSTYPEID_DWORD: m_gen_membervartype = "unsigned long"; m_gen_membervarmethod = "DWORD"; m_gen_membertype = "KSimpleDataObject"; break; case KDataObject::CLASSTYPEID_FLOAT: m_gen_membervartype = "float"; m_gen_membervarmethod = "Float"; m_gen_membertype = "KSimpleDataObject"; break; case KDataObject::CLASSTYPEID_CHAR: m_gen_membervartype = "char"; m_gen_membervarmethod = "Char"; m_gen_membertype = "KSimpleDataObject"; break; case KDataObject::CLASSTYPEID_UCHAR: m_gen_membervartype = "unsigned char"; m_gen_membervarmethod = "UChar"; m_gen_membertype = "KSimpleDataObject"; break; case KDataObject::CLASSTYPEID_STRING: m_gen_membervartype = "char *"; m_gen_membervarmethod = "String"; m_gen_membertype = "KSimpleDataObject"; break; case KDataObject::CLASSTYPEID_ARRAY_CHAR: m_gen_membervartype = "char"; m_gen_membervarmethod = "Char"; m_gen_membertype = "KSimpleDataArrayObject"; break; case KDataObject::CLASSTYPEID_ARRAY_UCHAR: m_gen_membervartype = "unsigned char"; m_gen_membervarmethod = "UChar"; m_gen_membertype = "KSimpleDataArrayObject"; break; case KDataObject::CLASSTYPEID_ARRAY_WORD: m_gen_membervartype = "unsigned short"; m_gen_membervarmethod = "WORD"; m_gen_membertype = "KSimpleDataArrayObject"; break; case KDataObject::CLASSTYPEID_ARRAY_DWORD: m_gen_membervartype = "unsigned long"; m_gen_membervarmethod = "DWORD"; m_gen_membertype = "KSimpleDataArrayObject"; break; case KDataObject::CLASSTYPEID_ARRAY_FLOAT: m_gen_membervartype = "float"; m_gen_membervarmethod = "Float"; m_gen_membertype = "KSimpleDataArrayObject"; break; case KDataObject::CLASSTYPEID_ARRAY_STRING: m_gen_membervartype = "char *"; m_gen_membervarmethod = "String"; m_gen_membertype = "KSimpleDataArrayObject"; break; case KDataObject::CLASSTYPEID_TEMPLATE: m_gen_membervartype = ""; m_gen_membervarmethod = ""; m_gen_membertype = "KTemplateDataObject"; break; case KDataObject::CLASSTYPEID_TEMPLATEARRAY: m_gen_membervartype = ""; m_gen_membervarmethod = ""; m_gen_membertype = "KTemplateDataArrayObject"; break; } } static char *s_strClassHeader0 = "class KFT_%cn%\n{\npublic:\n\tKFT_%cn%()\n\t{\n\t\tm_pObj = NULL;\n"; static char *s_strClassHeader0_m = "\t\tm_pMem_%mn% = NULL;\n"; static char *s_strClassHeader1 = "\tKFT_%cn%( KFiler *filer )\n\t{\n\t\tm_pObj = filer->CreateTemplateObject( \"%cn%\" );\n"; static char *s_strClassHeader1_m = "\t\tm_pMem_%mn% = reinterpret_cast<%mt%*>(m_pObj->GetMemberObject( \"%mn%\" ));\n"; static char *s_strClassHeader2 = "\tKFT_%cn%( KTemplateDataObject *pObj )\n\t{\n\t\tm_pObj = pObj;\n"; static char *s_strClassHeader2_m = "\t\tm_pMem_%mn% = reinterpret_cast<%mt%*>(m_pObj->GetMemberObject( \"%mn%\" ));\n"; static char *s_strClassHeader3 = "\t~KFT_%cn%()\n\t{\n\t}\n"; static char *s_strClassHeader4 = "\tvoid SetDataObject( KTemplateDataObject *pObj )\n\t{\n\t\tm_pObj = pObj;\n"; static char *s_strClassHeader4_m = "\t\tm_pMem_%mn% = reinterpret_cast<%mt%*>(m_pObj->GetMemberObject( \"%mn%\" ));\n"; void KTemplateInfo::generateClassHeader( KStream &stream ) { m_gen_classname = m_strTemplateName; std::string src; src = s_strClassHeader0; replaceGenSrc( src ); stream.Write( src.c_str(), src.size() ); int i; for ( i=0 ; i