00001 /* 00002 * This file contains class that helps you load working unit from DLL. 00003 * 00004 * Author: 00005 * Tomas Mrkvicka 00006 * xmrkvi03@stud.fit.vutbr.cz 00007 * 00008 */ 00009 00010 #include "pipeline/UnitLoader.h" 00011 00012 //////////////////////////////////////////////////////////////////////////////// 00013 //////////////////////////////////////////////////////////////////////////////// 00014 //////////////////////////////////////////////////////////////////////////////// 00015 // TUnitLoader 00016 00017 /** Konstruktor. 00018 */ 00019 TUnitLoader::TUnitLoader(void) 00020 { 00021 m_unit = NULL; 00022 m_library = NULL; 00023 } 00024 //OK 2007-08-25 18:22:54 B04-315B\Tom 00025 00026 /** Destruktor. 00027 * 00028 * Zavre otevrenou knihovnu (pokud existuje). 00029 * 00030 * Pred volanim destruktoru musi byt jednotka z dane DLL knihovny znicena. 00031 */ 00032 TUnitLoader::~TUnitLoader(void) 00033 { 00034 if ( m_library ) 00035 { 00036 //zavreme knihovnu 00037 FreeLibrary( m_library ); 00038 m_library = NULL; 00039 } 00040 } 00041 //OK 2007-08-25 18:22:57 B04-315B\Tom 00042 00043 /** Ziska jednotku ze zadane knihovny. 00044 * 00045 * Metoda muze vratit ukazatel na drive vracenou jednotku, pokud uz byla nekdy 00046 * nejaka jednotka uvnitr objektu vytvorena. 00047 * 00048 * Pri chybe vraci metoda NULL. 00049 * 00050 * \param dllName [in] jmeno souboru s knihovnou 00051 * \param dispatcher [in] ukazatel na platny dispatcher pouzity v aplikaci 00052 */ 00053 TUnitInterface* TUnitLoader::GetUnit_BASIC(const char * dllName , TDispatcherInterface * dispatcher) 00054 { 00055 // pokud jiz existuje nejaka jednotka pak ji vratime 00056 if ( m_unit ) 00057 { 00058 return m_unit; 00059 } 00060 else 00061 { 00062 //musime jednotku nacist 00063 m_library = LoadLibrary( dllName ); 00064 if ( ! m_library ) 00065 { 00066 return NULL; 00067 } 00068 00069 //overime typ jednotky 00070 PTR_DLLTYPE type_ptr = (PTR_DLLTYPE) GetProcAddress( m_library, "GetType" ); 00071 if ( ! type_ptr ) 00072 { 00073 FreeLibrary( m_library ); 00074 m_library = NULL; 00075 00076 return NULL; 00077 } 00078 00079 //ziskame typ a overime 00080 EnumDLLType dllType = (*type_ptr)(); 00081 if ( dllType != ENUM_DLLTYPE_BASIC ) 00082 { 00083 FreeLibrary( m_library ); 00084 m_library = NULL; 00085 00086 return NULL; 00087 } 00088 00089 //ziskame objekt z knihovny 00090 PTR_UNITGET_BASIC fce_ptr = (PTR_UNITGET_BASIC)GetProcAddress( m_library, "CreateUnit" ); 00091 if ( ! fce_ptr ) 00092 { 00093 FreeLibrary( m_library ); 00094 m_library = NULL; 00095 00096 return NULL; 00097 } 00098 00099 //vytvorime objekt 00100 m_unit = (*fce_ptr)( dispatcher ); 00101 00102 if ( ! m_unit ) 00103 { 00104 FreeLibrary( m_library ); 00105 m_library = NULL; 00106 } 00107 00108 return m_unit; 00109 } 00110 } 00111 //OK 2007-08-25 18:23:20 B04-315B\Tom 00112 00113 /** Ziska jednotku ze zadane knihovny. 00114 * 00115 * Metoda muze vratit ukazatel na drive vracenou jednotku, pokud uz byla nekdy 00116 * nejaka jednotka uvnitr objektu vytvorena. 00117 * 00118 * Pri chybe vraci metoda NULL. 00119 * 00120 * \param dllName [in] jmeno souboru s knihovnou 00121 * \param dispatcher [in] ukazatel na platny dispatcher pouzity v aplikaci 00122 * \param str [in] retezec predany jednotce jako druhy parametr 00123 */ 00124 TUnitInterface* TUnitLoader::GetUnit_STRING( 00125 const char * dllName , 00126 TDispatcherInterface * dispatcher, 00127 const char * str 00128 ) 00129 { 00130 // pokud jiz existuje nejaka jednotka pak ji vratime 00131 if ( m_unit ) 00132 { 00133 return m_unit; 00134 } 00135 else 00136 { 00137 //musime jednotku nacist 00138 m_library = LoadLibrary( dllName ); 00139 if ( ! m_library ) 00140 { 00141 return NULL; 00142 } 00143 00144 //overime typ jednotky 00145 PTR_DLLTYPE type_ptr = (PTR_DLLTYPE) GetProcAddress( m_library, "GetType" ); 00146 if ( ! type_ptr ) 00147 { 00148 FreeLibrary( m_library ); 00149 m_library = NULL; 00150 00151 return NULL; 00152 } 00153 00154 //ziskame typ a overime 00155 EnumDLLType dllType = (*type_ptr)(); 00156 if ( dllType != ENUM_DLLTYPE_STRING ) 00157 { 00158 FreeLibrary( m_library ); 00159 m_library = NULL; 00160 00161 return NULL; 00162 } 00163 00164 //ziskame objekt z knihovny 00165 PTR_UNITGET_STRING fce_ptr = (PTR_UNITGET_STRING)GetProcAddress( m_library, "CreateUnit" ); 00166 if ( ! fce_ptr ) 00167 { 00168 FreeLibrary( m_library ); 00169 m_library = NULL; 00170 00171 return NULL; 00172 } 00173 00174 //vytvorime objekt 00175 m_unit = (*fce_ptr)( dispatcher, str ); 00176 00177 if ( ! m_unit ) 00178 { 00179 FreeLibrary( m_library ); 00180 m_library = NULL; 00181 } 00182 00183 return m_unit; 00184 } 00185 } 00186 //OK 2007-08-25 18:23:23 B04-315B\Tom 00187 00188 // TUnitLoader 00189 //////////////////////////////////////////////////////////////////////////////// 00190 //////////////////////////////////////////////////////////////////////////////// 00191 ////////////////////////////////////////////////////////////////////////////////