zeroeq::Event serializeJSON( const uint128_t& type, const std::string& json ) { const std::string& schema = getSchema( type ); if( schema.empty( )) ZEROEQTHROW( std::runtime_error( "JSON schema for event not registered" )); zeroeq::Event event( type ); flatbuffers::Parser& parser = event.getParser(); if( !parser.Parse( schema.c_str( )) || !parser.Parse( json.c_str( ))) ZEROEQTHROW( std::runtime_error( parser.error_ )); return event; }
std::string deserializeJSON( const zeroeq::Event& event ) { const std::string& schema = getSchema( event.getType( )); if( schema.empty( )) ZEROEQTHROW( std::runtime_error( "JSON schema for event not registered" )); flatbuffers::Parser parser; if( !parser.Parse( schema.c_str( ))) ZEROEQTHROW( std::runtime_error( parser.error_ )); std::string json; flatbuffers::GeneratorOptions opts; opts.base64_byte_array = true; opts.strict_json = true; GenerateText( parser, event.getData(), opts, &json ); return json; }
Impl( const URI& uri_, const std::string& session ) : detail::Sender( uri_, 0, ZMQ_PUB ) , _service( PUBLISHER_SERVICE ) , _session( session == DEFAULT_SESSION ? getDefaultSession() : session ) { if( session.empty( )) ZEROEQTHROW( std::runtime_error( "Empty session is not allowed for publisher" )); const std::string& zmqURI = buildZmqURI( uri ); if( zmq_bind( socket, zmqURI.c_str( )) == -1 ) { zmq_close( socket ); socket = 0; ZEROEQTHROW( std::runtime_error( std::string( "Cannot bind publisher socket '" ) + zmqURI + "': " + zmq_strerror( zmq_errno( )))); } initURI(); if( session != NULL_SESSION ) _initService(); }
void _initService() { if( !servus::Servus::isAvailable( )) { ZEROEQTHROW( std::runtime_error( "No zeroconf implementation available" )); return; } _service.set( KEY_INSTANCE, detail::Sender::getUUID().getString( )); _service.set( KEY_USER, getUserName( )); _service.set( KEY_APPLICATION, _getApplicationName( )); if( !_session.empty( )) _service.set( KEY_SESSION, _session ); const servus::Servus::Result& result = _service.announce( uri.getPort(), getAddress( )); if( !result ) { ZEROEQTHROW( std::runtime_error( "Zeroconf announce failed: " + result.getString( ))); } }