| 86 | const DisplayDriver::DisplayDriverDescription<ClientDisplayDriver> ClientDisplayDriver::g_description; |
| 87 | |
| 88 | ClientDisplayDriver::ClientDisplayDriver( const Imath::Box2i &displayWindow, const Imath::Box2i &dataWindow, const std::vector<std::string> &channelNames, IECore::ConstCompoundDataPtr parameters ) : |
| 89 | DisplayDriver( displayWindow, dataWindow, channelNames, parameters ), |
| 90 | m_data( new PrivateData() ) |
| 91 | { |
| 92 | // expects three custom StringData parameters : displayHost, displayPort and displayType |
| 93 | const StringData *displayHostData = parameters->member<StringData>( "displayHost", true /* throw if missing */ ); |
| 94 | const StringData *displayPortData = parameters->member<StringData>( "displayPort", true /* throw if missing */ ); |
| 95 | |
| 96 | m_data->m_host = displayHostData->readable(); |
| 97 | m_data->m_port = displayPortData->readable(); |
| 98 | |
| 99 | tcp::resolver resolver(m_data->m_service); |
| 100 | tcp::resolver::query query(m_data->m_host, m_data->m_port); |
| 101 | |
| 102 | boost::system::error_code error; |
| 103 | tcp::resolver::iterator iterator = resolver.resolve( query, error ); |
| 104 | if( !error ) |
| 105 | { |
| 106 | error = boost::asio::error::host_not_found; |
| 107 | while( error && iterator != tcp::resolver::iterator() ) |
| 108 | { |
| 109 | m_data->m_socket.close(); |
| 110 | m_data->m_socket.connect( *iterator++, error ); |
| 111 | } |
| 112 | } |
| 113 | if( error ) |
| 114 | { |
| 115 | throw Exception( std::string( "Could not connect to remote display driver server : " ) + error.message() ); |
| 116 | } |
| 117 | |
| 118 | MemoryIndexedIOPtr io; |
| 119 | ConstCharVectorDataPtr buf; |
| 120 | Box2iDataPtr displayWindowData = new Box2iData( displayWindow ); |
| 121 | Box2iDataPtr dataWindowData = new Box2iData( dataWindow ); |
| 122 | StringVectorDataPtr channelNamesData = new StringVectorData( channelNames ); |
| 123 | |
| 124 | IECore::CompoundDataPtr tmpParameters = parameters->copy(); |
| 125 | #ifndef _MSC_VER |
| 126 | tmpParameters->writable()[ "clientPID" ] = new IntData( getpid() ); |
| 127 | #else |
| 128 | tmpParameters->writable()[ "clientPID" ] = new IntData( _getpid() ); |
| 129 | #endif |
| 130 | |
| 131 | // build the data block |
| 132 | io = new MemoryIndexedIO( ConstCharVectorDataPtr(), IndexedIO::rootPath, IndexedIO::Exclusive | IndexedIO::Write ); |
| 133 | displayWindowData->Object::save( io, "displayWindow" ); |
| 134 | dataWindowData->Object::save( io, "dataWindow" ); |
| 135 | channelNamesData->Object::save( io, "channelNames" ); |
| 136 | tmpParameters->Object::save( io, "parameters" ); |
| 137 | buf = io->buffer(); |
| 138 | |
| 139 | size_t dataSize = buf->readable().size(); |
| 140 | |
| 141 | sendHeader( DisplayDriverServerHeader::imageOpen, dataSize ); |
| 142 | |
| 143 | boost::asio::write( m_data->m_socket, boost::asio::buffer( &(buf->readable()[0]), dataSize ) ); |
| 144 | |
| 145 | if ( receiveHeader( DisplayDriverServerHeader::imageOpen ) != sizeof(m_data->m_scanLineOrderOnly) ) |