00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "torc/generic/om/DumpRestoreConfig.hpp"
00017
00018 #ifndef HAVE_CONFIG_H
00019 #include "torc/generic/config.h"
00020 #endif
00021
00022
00023 #ifdef GENOM_SERIALIZATION
00024 #include <boost/archive/binary_iarchive.hpp>
00025 #include <boost/archive/binary_oarchive.hpp>
00026 #include <boost/serialization/base_object.hpp>
00027 #include <boost/serialization/export.hpp>
00028 #endif //GENOM_SERIALIZATION
00029
00030 #include "torc/generic/om/ConnectionHandler.hpp"
00031 #include "torc/generic/om/Net.hpp"
00032 #include "torc/generic/om/ScalarPortReference.hpp"
00033 #include "torc/generic/om/PortBundleReference.hpp"
00034
00035 #ifdef GENOM_SERIALIZATION
00036 BOOST_CLASS_EXPORT( torc::generic::ScalarPortReference )
00037 #endif //GENOM_SERIALIZATION
00038
00039 namespace torc {
00040
00041 namespace generic {
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 ScalarPortReferenceSharedPtr
00052 ScalarPortReference::Factory::newScalarPortReferencePtr( const InstanceSharedPtr &inInstancePtr,
00053 const PortSharedPtr &inPortPtr,
00054 const PortBundleReferenceSharedPtr &inParentCollection ) throw(Error) {
00055 try
00056 {
00057 ScalarPortReferenceSharedPtr newScalarPortReference;
00058 create( newScalarPortReference );
00059 newScalarPortReference->bindToMasterPort( inPortPtr );
00060 if( inParentCollection )
00061 {
00062 inParentCollection->addChild( newScalarPortReference );
00063 }
00064 else
00065 {
00066 inInstancePtr->addPortReference( newScalarPortReference );
00067 }
00068 return newScalarPortReference;
00069 }
00070 catch( Error &e )
00071 {
00072 e.setCurrentLocation(
00073 __FUNCTION__, __FILE__, __LINE__ );
00074 throw;
00075 }
00076 }
00077
00078 void
00079 ScalarPortReference::accept(BaseVisitor & inoutVisitor) throw(Error) {
00080 try
00081 {
00082 runVisitor( *this, inoutVisitor );
00083 }
00084 catch( Error &e )
00085 {
00086 e.setCurrentLocation(
00087 __FUNCTION__, __FILE__, __LINE__ );
00088 throw;
00089 }
00090 }
00091
00092 Connectable::Connection
00093 ScalarPortReference::connect(
00094 const NetSharedPtr &inNet) throw(Error) {
00095 if( !inNet )
00096 {
00097 Error e( eMessageIdErrorPointerToItemDoesNotExist,
00098 __FUNCTION__, __FILE__, __LINE__ );
00099 e.saveContextData("Pointer to the Net object does not exist", inNet);
00100 throw e;
00101 }
00102 if( inNet->getSize() != getSize() )
00103 {
00104 Error e( eMessageIdErrorItemSizeMismatch,
00105 __FUNCTION__, __FILE__, __LINE__ );
00106 e.saveContextData("Net Size", inNet->getSize());
00107 e.saveContextData("Scalar port reference Size", getSize() );
00108 throw e;
00109 }
00110 Connectable::Connection newConnection;
00111 try
00112 {
00113 ConnectionHandler handler( inNet );
00114 handler.connectPortRefToNet( getSharedThis() );
00115 newConnection = Connectable::connect( inNet );
00116 }
00117 catch( Error &e )
00118 {
00119 e.setCurrentLocation(
00120 __FUNCTION__, __FILE__, __LINE__ );
00121 throw;
00122 }
00123 return newConnection;
00124 }
00125
00126 void
00127 ScalarPortReference::disconnect(
00128 const Connection & inConnection) throw(Error) {
00129 NetSharedPtr connNet = *inConnection;
00130 if( !connNet )
00131 {
00132 Error e( eMessageIdErrorConnectionInvalid,
00133 __FUNCTION__, __FILE__, __LINE__ );
00134 e.saveContextData("Net is invalid", connNet);
00135 throw e;
00136 }
00137 try
00138 {
00139 ConnectionHandler handler( connNet );
00140 handler.disconnectPortRefFromNet( getSharedThis() );
00141 Connectable::disconnect( inConnection );
00142 }
00143 catch( Error &e )
00144 {
00145 e.setCurrentLocation(
00146 __FUNCTION__, __FILE__, __LINE__ );
00147 throw;
00148 }
00149 return;
00150 }
00151
00152 ScalarPortReference::ScalarPortReference()
00153 :PortReference(),
00154 Scalar<PortReference>() {
00155 }
00156
00157 ScalarPortReference::~ScalarPortReference() throw() {
00158 }
00159
00160 #ifdef GENOM_SERIALIZATION
00161 template<class Archive> void
00162 ScalarPortReference::serialize( Archive &ar, unsigned int ) {
00163 ar & boost::serialization::base_object< PortReference >( *this );
00164 ar & boost::serialization::base_object<
00165 Scalar<PortReference> >(*this);
00166 }
00167
00168
00169 template void
00170 ScalarPortReference::serialize<boost::archive::binary_iarchive>(
00171 boost::archive::binary_iarchive & ar, const unsigned int);
00172
00173 template void
00174 ScalarPortReference::serialize<boost::archive::binary_oarchive>(
00175 boost::archive::binary_oarchive & ar, const unsigned int);
00176
00177 #endif //GENOM_SERIALIZATION
00178
00179 }
00180
00181 }