void setValue( const PropertyAccessor & pa, const Variant & data ) { Key key; if (!createKey( pa, key )) { pa.setValue( data ); return; } std::unique_ptr< ReflectedPropertyCommandArgument > args( new ReflectedPropertyCommandArgument ); args->setContextId( key.first ); args->setPath( key.second.c_str() ); args->setValue( data ); // Access is only on the main thread assert( std::this_thread::get_id() == commandManager_.ownerThreadId() ); const auto commandId = getClassIdentifier< SetReflectedPropertyCommand >(); const auto pArgsDefinition = pa.getDefinitionManager()->getDefinition< ReflectedPropertyCommandArgument >(); ObjectHandle commandArgs( std::move( args ), pArgsDefinition ); auto command = commandManager_.queueCommand( commandId, commandArgs ); // Queuing may cause it to execute straight away // Based on the thread affinity of SetReflectedPropertyCommand if (!command->isComplete()) { commands_.emplace( std::pair< Key, CommandInstancePtr >( key, command ) ); } }
bool createKey( const PropertyAccessor & pa, Key & o_Key ) { const auto & obj = pa.getRootObject(); if (obj == nullptr) { return false; } if (!obj.getId( o_Key.first )) { auto om = pa.getDefinitionManager()->getObjectManager(); assert( !om->getObject( obj.data() ).isValid() ); if (!om->getUnmanagedObjectId( obj.data(), o_Key.first )) { o_Key.first = om->registerUnmanagedObject( obj ); } } o_Key.second = pa.getFullPath(); return true; }
Variant invoke( const PropertyAccessor & pa, const ReflectedMethodParameters & parameters ) { Key key; if (!createKey( pa, key )) { return pa.invoke( parameters ); } std::unique_ptr<ReflectedMethodCommandParameters> commandParameters( new ReflectedMethodCommandParameters() ); commandParameters->setId( key.first ); commandParameters->setPath( key.second.c_str() ); commandParameters->setParameters( parameters ); const auto itr = commands_.emplace( std::pair< Key, CommandInstancePtr >( key, commandManager_.queueCommand( getClassIdentifier<InvokeReflectedMethodCommand>(), ObjectHandle( std::move( commandParameters ), pa.getDefinitionManager()->getDefinition<ReflectedMethodCommandParameters>() ) ) ) ); commandManager_.waitForInstance( itr->second ); ObjectHandle returnValueObject = itr->second.get()->getReturnValue(); commands_.erase( itr ); Variant* returnValuePointer = returnValueObject.getBase<Variant>(); assert( returnValuePointer != nullptr ); return *returnValuePointer; }