00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #define DATASVC_SmartDataObjectPtr_CPP 1
00012
00013
00014 #include "GaudiKernel/DataObject.h"
00015 #include "GaudiKernel/IDataProviderSvc.h"
00016 #include "GaudiKernel/IDataDirectory.h"
00017 #include "GaudiKernel/SmartDataObjectPtr.h"
00018
00019 SmartDataObjectPtr::AccessFunction SmartDataObjectPtr::ObjectLoader::access() {
00020 return &SmartDataObjectPtr::retrieve;
00021 }
00022
00023 SmartDataObjectPtr::AccessFunction SmartDataObjectPtr::ObjectFinder::access() {
00024 return &SmartDataObjectPtr::find;
00025 }
00026
00028 SmartDataObjectPtr& SmartDataObjectPtr::operator=(SmartDataObjectPtr& copy) {
00029 m_path = copy.m_path;
00030 m_pObject = copy.m_pObject;
00031 m_pDirectory = copy.m_pDirectory;
00032 m_dataProvider = copy.m_dataProvider;
00033 return *this;
00034 }
00035
00037 StatusCode SmartDataObjectPtr::retrieve(IDataDirectory* pDirectory, const std::string& path, DataObject*& refpObject) {
00038 StatusCode status = StatusCode::FAILURE;
00039 if ( 0 != m_dataProvider && 0 != pDirectory ) {
00040 status = m_dataProvider->retrieveObject(pDirectory, path, refpObject);
00041 }
00042 return status;
00043 }
00044
00046 StatusCode SmartDataObjectPtr::retrieve(const std::string& fullPath, DataObject*& refpObject) {
00047 StatusCode status = StatusCode::FAILURE;
00048 if ( 0 != m_dataProvider ) {
00049 status = m_dataProvider->retrieveObject(fullPath, refpObject);
00050 }
00051 return status;
00052 }
00053
00055 StatusCode SmartDataObjectPtr::find(IDataDirectory* pDirectory, const std::string& path, DataObject*& refpObject) {
00056 StatusCode status = StatusCode::FAILURE;
00057 if ( 0 != m_dataProvider && 0 != pDirectory ) {
00058 status = m_dataProvider->findObject(pDirectory, path, refpObject);
00059 }
00060 return status;
00061 }
00062
00064 StatusCode SmartDataObjectPtr::find(const std::string& fullPath, DataObject*& refpObject) {
00065 StatusCode status = StatusCode::FAILURE;
00066 if ( 0 != m_dataProvider ) {
00067 status = m_dataProvider->findObject(fullPath, refpObject);
00068 }
00069 return status;
00070 }
00071
00072
00074 StatusCode SmartDataObjectPtr::update(IDataDirectory* pDirectory) {
00075 StatusCode status = StatusCode::FAILURE;
00076 if ( 0 != m_dataProvider && 0 != pDirectory ) {
00077 status = m_dataProvider->updateObject(pDirectory);
00078 }
00079 return status;
00080 }
00081
00083 StatusCode SmartDataObjectPtr::update(const std::string& fullPath) {
00084 StatusCode status = StatusCode::FAILURE;
00085 if ( 0 != m_dataProvider ) {
00086 status = m_dataProvider->updateObject(fullPath);
00087 }
00088 return status;
00089 }
00090
00096 DataObject* SmartDataObjectPtr::retrieveObject() {
00097 if ( 0 == m_pObject ) {
00098 if ( 0 == m_pDirectory ) {
00099 m_status = retrieve(m_path, m_pObject);
00100 }
00101 else {
00102 IDataDirectory* pDir = m_pDirectory->find(m_path);
00103 if ( 0 != pDir )
00104 m_status = retrieve(pDir, "", m_pObject);
00105 else
00106 m_status = retrieve(m_pDirectory, m_path, m_pObject);
00107 }
00108 if ( m_status.isSuccess() ) {
00109 m_pDirectory = m_pObject->directory();
00110 m_path = "";
00111 }
00112 }
00113 return m_pObject;
00114 }
00115
00121 DataObject* SmartDataObjectPtr::findObject() {
00122 if ( 0 == m_pObject ) {
00123 if ( 0 == m_pDirectory ) {
00124 m_status = find(m_path, m_pObject);
00125 }
00126 else {
00127 IDataDirectory* pDir = m_pDirectory->find(m_path);
00128 if ( 0 != pDir )
00129 m_status = find(pDir, "", m_pObject);
00130 else
00131 m_status = find(m_pDirectory, m_path, m_pObject);
00132 }
00133 if ( m_status.isSuccess() ) {
00134 m_pDirectory = m_pObject->directory();
00135 m_path = "";
00136 }
00137 }
00138 return m_pObject;
00139 }
00140
00146 DataObject* SmartDataObjectPtr::updateObject() {
00147 if ( 0 == m_pObject ) {
00148 accessData();
00149 }
00150 if ( m_status.isSuccess() ) {
00151 m_status = (0 == m_pDirectory) ? update(m_path) : update(m_pDirectory);
00152 if ( !m_status.isSuccess() ) m_pObject = 0;
00153 }
00154 return m_pObject;
00155 }
00156
00169 bool operator&& (SmartDataObjectPtr& object_1, SmartDataObjectPtr& object_2) {
00170 if ( 0 != object_1.accessData() ) {
00171 if ( 0 != object_2.accessData() ) {
00172 return true;
00173 }
00174 }
00175 return false;
00176 }
00177
00194 bool operator|| (SmartDataObjectPtr& object_1, SmartDataObjectPtr& object_2) {
00195 if ( 0 != object_1.accessData() ) {
00196 return true;
00197 }
00198 if ( 0 != object_2.accessData() ) {
00199 return true;
00200 }
00201 return false;
00202 }
00203