![]() |
|
|
Generated: 24 Nov 2008 |
00001 // $Id: HDirectoryCnv.cpp,v 1.8 2006/01/10 20:11:14 hmd Exp $ 00002 #define HBOOKCNV_HDIRECTORYCNV_CPP 00003 00004 00005 // Include files 00006 #include "GaudiKernel/xtoa.h" 00007 #include "GaudiKernel/ClassID.h" 00008 #include "GaudiKernel/SmartIF.h" 00009 #include "GaudiKernel/IRegistry.h" 00010 #include "GaudiKernel/CnvFactory.h" 00011 #include "GaudiKernel/IOpaqueAddress.h" 00012 #include "GaudiKernel/IDataProviderSvc.h" 00013 #include "GaudiKernel/IDataManagerSvc.h" 00014 #include "GaudiKernel/NTuple.h" 00015 00016 #include <stdio.h> 00017 00018 #include "HbookDef.h" 00019 #include "HDirectoryCnv.h" 00020 00021 //------------------------------------------------------------------------------ 00022 // 00023 // Implementation of class : HbookCnv::HDirectoryCnv 00024 // 00025 // Author : Pavel Binko 00026 // 00027 //------------------------------------------------------------------------------ 00028 00029 00030 // Instantiation of a static factory class used by clients to create 00031 // instances of this service 00032 DECLARE_NAMESPACE_CONVERTER_FACTORY(HbookCnv,HDirectoryCnv) 00033 00034 HbookCnv::HDirectoryCnv::HDirectoryCnv(ISvcLocator* svc) 00035 : HConverter(CLID_StatisticsDirectory, svc) { 00036 } 00037 00038 00039 HbookCnv::HDirectoryCnv::HDirectoryCnv(ISvcLocator* svc, const CLID& clid) 00040 : HConverter(clid, svc) { 00041 } 00042 00043 00045 HbookCnv::HDirectoryCnv::~HDirectoryCnv() { 00046 } 00047 00049 const CLID& HbookCnv::HDirectoryCnv::classID() { 00050 return CLID_StatisticsDirectory; 00051 } 00052 00054 StatusCode HbookCnv::HDirectoryCnv::createObj(IOpaqueAddress* /* pAddress */, DataObject*& refpObject) { 00055 refpObject = new NTuple::Directory(); 00056 return StatusCode::SUCCESS; 00057 } 00058 00059 00061 StatusCode HbookCnv::HDirectoryCnv::createRep(DataObject* pObject, IOpaqueAddress*& refpAddress) { 00062 if ( pObject ) { 00063 IRegistry* pRegistry = pObject->registry(); 00064 if ( pRegistry ) { 00065 std::string loc = m_prefix + pRegistry->identifier(); 00066 if ( createDirectory(loc).isSuccess() ) { 00067 setDirectory(loc); 00068 setDiskDirectory(loc); 00069 return createAddress(loc, objType(), pRegistry->name(), refpAddress); 00070 } 00071 } 00072 } 00073 refpAddress = 0; 00074 return StatusCode::FAILURE; 00075 } 00076 00077 00079 StatusCode HbookCnv::HDirectoryCnv::updateRep( IOpaqueAddress* /* pAddress */ , DataObject* pObject) { 00080 if ( pObject ) { 00081 IRegistry* pRegistry = pObject->registry(); 00082 if ( pRegistry ) { 00083 std::string loc = m_prefix + pRegistry->identifier(); 00084 if ( createDirectory(loc).isSuccess() ) { 00085 setDirectory(loc); 00086 return StatusCode::SUCCESS; 00087 } 00088 } 00089 } 00090 return StatusCode::FAILURE; 00091 } 00092 00093 00094 StatusCode HbookCnv::HDirectoryCnv::fillObjRefs(IOpaqueAddress* /* pAddress */, 00095 DataObject* pObject) { 00096 IRegistry* pReg = pObject->registry(); 00097 // Strip of store name to get the top level RZ directory 00098 std::string full = m_prefix + pReg->identifier(); 00099 std::string lloc = full.substr(full.find('/',1),full.length()); 00100 std::string loc = "/" + lloc; 00101 std::string pawc = "//PAWC" + lloc; 00102 long idh = 0; 00103 ::HMDIR(pawc, "S"); 00104 ::HCDIR(loc, " "); 00105 while( 1 ) { 00106 std::string type = " ", title = ""; 00107 long icycle = 99999, ioff = 0; 00108 IOpaqueAddress* pA = 0; 00109 CLID clid = CLID_NULL; 00110 char leaf_name[32]; 00111 ::HLNEXT(idh, type, title, "12ND"); 00112 if ( idh == 0 || title.length() == 0 ) break; 00113 sprintf(leaf_name, "/%ld", idh); 00114 00115 switch ( type[0] ) { 00116 case 'D': 00117 createAddress(full, CLID_StatisticsDirectory, title, pA); 00118 break; 00119 case '1': 00120 title = leaf_name; 00121 createAddress(full, CLID_H1D, idh, pA); 00122 break; 00123 case '2': 00124 title = leaf_name; 00125 createAddress(full, CLID_H2D, idh, pA); 00126 break; 00127 case 'N': 00128 ::HRIN( idh, icycle, ioff); 00129 clid = (1 == ::NTUPLETYPE(idh)) ? CLID_ColumnWiseTuple : CLID_RowWiseTuple; 00130 createAddress(full, clid, idh, pA); 00131 title = leaf_name; 00132 break; 00133 default: 00134 break; 00135 } 00136 if ( 0 != pA ) { 00137 SmartIF<IDataManagerSvc> registrator(dataProvider()); 00138 registrator->registerAddress(pReg, title, pA); 00139 } 00140 } 00141 return StatusCode::SUCCESS; 00142 }