00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include <rtt/Logger.hpp>
00028 #include <rtt/Property.hpp>
00029 #include <rtt/PropertyIntrospection.hpp>
00030 #include <rtt/os/Mutex.hpp>
00031 #include "TcpReporting.hpp"
00032 #include "socketmarshaller.hpp"
00033 #include "datasender.hpp"
00034
00035 using RTT::Logger;
00036
00037 namespace RTT
00038 {
00039 SocketMarshaller::SocketMarshaller(OCL::TcpReporting* reporter)
00040 : _reporter(reporter)
00041 {
00042 }
00043
00044 SocketMarshaller::~SocketMarshaller()
00045 {
00046 closeAllConnections();
00047 }
00048
00049 void SocketMarshaller::addConnection(OCL::TCP::Socket* os)
00050 {
00051 lock.lock();
00052 OCL::TCP::Datasender* conn = new OCL::TCP::Datasender(this, os);
00053 _connections.push_front( conn );
00054 conn->NonPeriodicActivity::start();
00055 lock.unlock();
00056 }
00057
00058 void SocketMarshaller::closeAllConnections()
00059 {
00060
00061 while( !_connections.empty() )
00062 {
00063 removeConnection( _connections.front() );
00064 }
00065 }
00066
00067 void SocketMarshaller::flush()
00068 {}
00069
00070 void SocketMarshaller::removeConnection(OCL::TCP::Datasender* sender)
00071 {
00072 lock.lock();
00073 _connections.remove( sender );
00074 sender->breakLoop();
00075 delete sender;
00076 lock.unlock();
00077 }
00078
00079 OCL::TcpReporting* SocketMarshaller::getReporter() const
00080 {
00081 return _reporter;
00082 }
00083
00084 void SocketMarshaller::serialize(RTT::PropertyBase*)
00085 {
00086
00087 Logger::log() << Logger::Error << "Unexpected call to SocketMarshaller::serialize" <<
00088 Logger::endl;
00089 }
00090
00091 void SocketMarshaller::serialize(const PropertyBag &v)
00092 {
00093 lock.lock();
00094
00095 for( std::list<OCL::TCP::Datasender*>::iterator it = _connections.begin();
00096 it != _connections.end(); )
00097 {
00098 if( (*it)->isValid() )
00099 {
00100 (*it)->serialize(v);
00101 it++;
00102 } else {
00103 OCL::TCP::Datasender* torm = *it;
00104 it++;
00105 removeConnection( torm );
00106 }
00107 }
00108 lock.unlock();
00109 }
00110
00111 void SocketMarshaller::shutdown()
00112 {
00113 closeAllConnections();
00114 }
00115 }