| 437 | } |
| 438 | |
| 439 | void DisplayDriverServer::Session::handleReadOpenParameters( const boost::system::error_code& error ) |
| 440 | { |
| 441 | if (error) |
| 442 | { |
| 443 | msg( Msg::Error, "DisplayDriverServer::Session::handleReadOpenParameters", error.message().c_str() ); |
| 444 | m_socket.close(); |
| 445 | return; |
| 446 | } |
| 447 | |
| 448 | StringDataPtr displayDriverType; |
| 449 | Box2iDataPtr displayWindow, dataWindow; |
| 450 | StringVectorDataPtr channelNames; |
| 451 | CompoundDataPtr parameters; |
| 452 | bool scanLineOrder = false; |
| 453 | bool acceptsRepeatedData = false; |
| 454 | |
| 455 | // handle imageOpen parameters. |
| 456 | try |
| 457 | { |
| 458 | MemoryIndexedIOPtr io = new MemoryIndexedIO( m_buffer, IndexedIO::rootPath, IndexedIO::Exclusive | IndexedIO::Read ); |
| 459 | displayWindow = boost::static_pointer_cast<Box2iData>( Object::load( io, "displayWindow" ) ); |
| 460 | dataWindow = boost::static_pointer_cast<Box2iData>( Object::load( io, "dataWindow" ) ); |
| 461 | channelNames = boost::static_pointer_cast<StringVectorData>( Object::load( io, "channelNames" ) ); |
| 462 | parameters = boost::static_pointer_cast<CompoundData>( Object::load( io, "parameters" ) ); |
| 463 | |
| 464 | const StringData *displayType = parameters->member<StringData>( "remoteDisplayType", true /* throw if missing */ ); |
| 465 | |
| 466 | // create a displayDriver using the factory function. |
| 467 | if ( !parameters->member<IntData>( "displayDriverServer:mergeId", false ) ) |
| 468 | { |
| 469 | m_displayDriver = DisplayDriver::create( displayType->readable(), displayWindow->readable(), dataWindow->readable(), channelNames->readable(), parameters ); |
| 470 | } |
| 471 | else |
| 472 | { |
| 473 | m_mergeId = parameters->member<IntData>( "displayDriverServer:mergeId", false /* throw if missing */ )->readable(); |
| 474 | |
| 475 | // Check if merge ID in map, if not then create display driver and session count pair with merge ID. |
| 476 | auto &m = m_mergeMap[m_mergeId.value()]; |
| 477 | if ( !m.mergeDriver ) |
| 478 | { |
| 479 | const IntData *sessionClientsData = parameters->member<IntData>( "displayDriverServer:mergeClients", true /* throw if missing */ ); |
| 480 | m.mergeDriver= DisplayDriver::create( |
| 481 | displayType->readable(), |
| 482 | displayWindow->readable(), |
| 483 | displayWindow->readable(), // For merge we want dataWindow = displayWindow |
| 484 | channelNames->readable(), |
| 485 | parameters |
| 486 | ); |
| 487 | m.mergeCount = sessionClientsData->readable(); |
| 488 | } |
| 489 | // Merge ID is now in map, so load the display driver. |
| 490 | m_displayDriver = m.mergeDriver; |
| 491 | } |
| 492 | scanLineOrder = m_displayDriver->scanLineOrderOnly(); |
| 493 | acceptsRepeatedData = m_displayDriver->acceptsRepeatedData(); |
| 494 | } |
| 495 | catch( std::exception &e ) |
| 496 | { |
nothing calls this directly
no test coverage detected