in src/cpp/RiderLink/Source/RiderLink/Private/RiderLink.cpp [47:96]
void FRiderLinkModule::InitProtocol()
{
WireLifetimeDef = MakeUnique<rd::LifetimeDefinition>(ModuleLifetimeDef.lifetime);
rd::Lifetime WireLifetime = WireLifetimeDef->lifetime;
std::shared_ptr<rd::SocketWire::Server> Wire = ProtocolFactory->CreateWire(&Scheduler, WireLifetime);
Protocol = ProtocolFactory->CreateProtocol(&Scheduler, WireLifetime.create_nested(), Wire);
// Exception fired for Server::Base::~Base() when trying to invoke it this way
// WireLifetime->add_action([this]()
// {
// if (!ModuleLifetimeDef.is_terminated())
// {
// Scheduler.queue([this]()
// {
// InitProtocol();
// });
// }
// });
Protocol->wire->connected.view(WireLifetime, [this](rd::Lifetime ConnectionLifetime, bool const& IsConnected)
{
Scheduler.queue([this, ConnectionLifetime, IsConnected]()
{
if (!IsConnected) return;
FRWScopeLock LockOnConnect(ModelLock, SLT_Write);
EditorModel = MakeUnique<JetBrains::EditorPlugin::RdEditorModel>();
EditorModel->connect(ConnectionLifetime, Protocol.Get());
JetBrains::EditorPlugin::UE4Library::serializersOwner.registerSerializersCore(
EditorModel->get_serialization_context().get_serializers()
);
ConnectionLifetime->add_action([&]() mutable
{
Scheduler.queue([&]()mutable
{
FRWScopeLock LockOnDisconnect(ModelLock, SLT_Write);
RdIsModelAlive.set(false);
});
});
RdIsModelAlive.set(true);
FString projectName = GetProjectName();
FString executableName = FPlatformProcess::ExecutableName(false);
uint32_t pid = FPlatformProcess::GetCurrentProcessId();
std::wstring projectNameWstr = TCHAR_TO_WCHAR(GetData(projectName));
std::wstring executableNameWstr = TCHAR_TO_WCHAR(GetData(executableName));
auto connectionInfo = JetBrains::EditorPlugin::ConnectionInfo(projectNameWstr, executableNameWstr, pid);
EditorModel->get_connectionInfo().set(connectionInfo);
});
});
}