Skip to content

Commit baf0a99

Browse files
committed
Hide IPC proxy internal mappings by generalzing the binding call in the IPC and delegating its actual execution to the outer hosting code
1 parent d45de2e commit baf0a99

6 files changed

Lines changed: 51 additions & 33 deletions

File tree

IPC/ARAIPC.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,17 @@ typedef struct ARAIPCMessageSender
193193
//! @}
194194

195195

196+
//! Companion API: opaque encapsulation
197+
//! @{
198+
//! to keep the IPC decoupled from the Companion API in use, the IPC code uses an opaque token to represent a plug-in instance
199+
typedef size_t ARAIPCPlugInInstanceRef;
200+
201+
//! callback that the proxy uses to execute the binding of an opaque Companion API plug-in instance to the given document controller
202+
typedef const ARAPlugInExtensionInstance* (*ARAIPCBindingHandler) (ARAIPCPlugInInstanceRef plugInInstanceRef,
203+
ARADocumentControllerRef controllerRef, ARAPlugInInstanceRoleFlags knownRoles, ARAPlugInInstanceRoleFlags assignedRoles);
204+
//! @}
205+
206+
196207
#if defined(__cplusplus)
197208
} // extern "C"
198209
} // namespace IPC

IPC/ARAIPCEncoding.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -978,6 +978,7 @@ constexpr ARAIPCMessageID _encodeMessageID ()
978978
constexpr ARAIPCMessageID kGetFactoriesCountMessageID { 1 };
979979
constexpr ARAIPCMessageID kGetFactoryMessageID { 2 };
980980
constexpr ARAIPCMessageID kCreateDocumentControllerMessageID { 3 };
981+
constexpr ARAIPCMessageID kBindToDocumentControllerMessageID { 4 };
981982

982983

983984
// caller side: create a message with the specified arguments

IPC/ARAIPCProxyHost.cpp

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -585,6 +585,7 @@ using namespace ProxyHost;
585585

586586
std::vector<const ARAFactory*> _factories {};
587587
ARAIPCMessageSender _plugInCallbacksSender {};
588+
ARAIPCBindingHandler _bindingHandler {};
588589

589590
void ARAIPCProxyHostAddFactory (const ARAFactory* factory)
590591
{
@@ -599,19 +600,14 @@ void ARAIPCProxyHostSetPlugInCallbacksSender (ARAIPCMessageSender plugInCallback
599600
_plugInCallbacksSender = plugInCallbacksSender;
600601
}
601602

602-
ARADocumentControllerRef ARAIPCProxyHostTranslateDocumentControllerRef (ARADocumentControllerRef remoteRef)
603+
void ARAIPCProxyHostSetBindingHandler(ARAIPCBindingHandler handler)
603604
{
604-
return fromRef (remoteRef)->getRef ();
605+
_bindingHandler = handler;
605606
}
606607

607-
ARAPlugInExtensionRef ARAIPCProxyHostCreatePlugInExtension (const ARAPlugInExtensionInstance* instance)
608+
void ARAIPCProxyHostCleanupBinding (const ARA::ARAPlugInExtensionInstance* plugInExtensionInstance)
608609
{
609-
return toRef (new PlugInExtension { instance });
610-
}
611-
612-
void ARAIPCProxyHostDestroyPlugInExtension (ARAPlugInExtensionRef plugInExtensionRef)
613-
{
614-
delete fromRef (plugInExtensionRef);
610+
delete fromRef (plugInExtensionInstance->plugInExtensionRef);
615611
}
616612

617613
void ARAIPCProxyHostCommandHandler (const ARAIPCMessageID messageID, const ARAIPCMessageDecoder* const decoder, ARAIPCMessageEncoder* const replyEncoder)
@@ -677,6 +673,16 @@ void ARAIPCProxyHostCommandHandler (const ARAIPCMessageID messageID, const ARAIP
677673
return encodeReply (replyEncoder, ARADocumentControllerRef { toRef (documentController) });
678674
}
679675
}
676+
else if (messageID == kBindToDocumentControllerMessageID)
677+
{
678+
ARAIPCPlugInInstanceRef plugInInstanceRef;
679+
ARADocumentControllerRef controllerRef;
680+
ARAPlugInInstanceRoleFlags knownRoles;
681+
ARAPlugInInstanceRoleFlags assignedRoles;
682+
decodeArguments (decoder, plugInInstanceRef, controllerRef, knownRoles, assignedRoles);
683+
const auto plugInExtensionInstance { _bindingHandler (plugInInstanceRef, fromRef (controllerRef)->getRef (), knownRoles, assignedRoles) };
684+
return encodeReply (replyEncoder, ARAPlugInExtensionRef { toRef (new PlugInExtension { plugInExtensionInstance })});
685+
}
680686

681687
//ARADocumentControllerInterface
682688
else if (messageID == ARA_IPC_PLUGIN_METHOD_ID (ARADocumentControllerInterface, destroyDocumentController))

IPC/ARAIPCProxyHost.h

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,10 @@
1919
#ifndef ARAIPCProxyHost_h
2020
#define ARAIPCProxyHost_h
2121

22-
2322
#include "ARA_Library/IPC/ARAIPC.h"
2423

25-
#if ARA_ENABLE_IPC
2624

25+
#if ARA_ENABLE_IPC
2726

2827
#if defined(__cplusplus)
2928
namespace ARA {
@@ -38,15 +37,14 @@ void ARAIPCProxyHostAddFactory(const ARAFactory * factory);
3837
//! static configuration: set sender that the proxy host will use to perform callbacks received from the plug-in
3938
void ARAIPCProxyHostSetPlugInCallbacksSender(ARAIPCMessageSender plugInCallbacksSender);
4039

40+
//! static configuration: set the callback to execute the binding of Companion API plug-in instances to ARA document controllers
41+
void ARAIPCProxyHostSetBindingHandler(ARAIPCBindingHandler handler);
42+
4143
//! static dispatcher: the host command handler that controls the proxy host
4244
void ARAIPCProxyHostCommandHandler(const ARAIPCMessageID messageID, const ARAIPCMessageDecoder * decoder, ARAIPCMessageEncoder * replyEncoder);
4345

44-
//! translation needed when establishing the binding to the remote documentController
45-
ARADocumentControllerRef ARAIPCProxyHostTranslateDocumentControllerRef(ARADocumentControllerRef remoteRef);
46-
47-
//! creating and deleting plug-in extension instances associated with the proxy host
48-
ARAPlugInExtensionRef ARAIPCProxyHostCreatePlugInExtension(const ARAPlugInExtensionInstance * instance);
49-
void ARAIPCProxyHostDestroyPlugInExtension(ARAPlugInExtensionRef plugInExtensionRef);
46+
//! trigger proper teardown of proxy plug-in extension when destroying Companion API plug-in instances that have been bound to ARA
47+
void ARAIPCProxyHostCleanupBinding(const ARAPlugInExtensionInstance * plugInExtensionInstance);
5048

5149

5250
#if defined(__cplusplus)
@@ -55,7 +53,6 @@ void ARAIPCProxyHostDestroyPlugInExtension(ARAPlugInExtensionRef plugInExtension
5553
} // namespace ARA
5654
#endif
5755

58-
5956
#endif // ARA_ENABLE_IPC
6057

6158
#endif // ARAIPCProxyHost_h

IPC/ARAIPCProxyPlugIn.cpp

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1304,18 +1304,22 @@ const ARADocumentControllerInstance* ARAIPCProxyPlugInCreateDocumentControllerWi
13041304
return result->getInstance ();
13051305
}
13061306

1307-
ARADocumentControllerRef ARAIPCProxyPlugInTranslateDocumentControllerRef (ARADocumentControllerRef documentControllerRef)
1308-
{
1309-
return static_cast<DocumentController*> (PlugIn::fromRef (documentControllerRef))->getRemoteRef ();
1310-
}
1311-
1312-
const ARAPlugInExtensionInstance* ARAIPCProxyPlugInCreatePlugInExtension (size_t remoteExtensionRef, ARAIPCMessageSender sender, ARADocumentControllerRef documentControllerRef,
1307+
const ARAPlugInExtensionInstance* ARAIPCProxyPlugInBindToDocumentController (ARAIPCPlugInInstanceRef remoteRef, ARAIPCMessageSender sender, ARADocumentControllerRef documentControllerRef,
13131308
ARAPlugInInstanceRoleFlags knownRoles, ARAPlugInInstanceRoleFlags assignedRoles)
13141309
{
1310+
const auto remoteDocumentControllerRef { static_cast<DocumentController*> (PlugIn::fromRef (documentControllerRef))->getRemoteRef () };
1311+
1312+
size_t remoteExtensionRef {};
1313+
RemoteCaller::CustomDecodeFunction customDecode { [&remoteExtensionRef] (const ARAIPCMessageDecoder& decoder) -> void
1314+
{
1315+
decoder.methods->readSize (decoder.ref, 0, &remoteExtensionRef);
1316+
} };
1317+
RemoteCaller { sender }.remoteCallWithReply (customDecode, false, kBindToDocumentControllerMessageID, remoteRef, remoteDocumentControllerRef, knownRoles, assignedRoles);
1318+
13151319
return new PlugInExtension { sender, documentControllerRef, knownRoles, assignedRoles, remoteExtensionRef };
13161320
}
13171321

1318-
void ARAIPCProxyPlugInDestroyPlugInExtension (const ARAPlugInExtensionInstance* plugInExtensionInstance)
1322+
void ARAIPCProxyPlugInCleanupBinding (const ARAPlugInExtensionInstance* plugInExtensionInstance)
13191323
{
13201324
delete static_cast<const PlugInExtension*> (plugInExtensionInstance);
13211325
}

IPC/ARAIPCProxyPlugIn.h

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,13 @@ const ARADocumentControllerInstance * ARAIPCProxyPlugInCreateDocumentControllerW
4848
//! static handler of received messages
4949
void ARAIPCProxyPlugInCallbacksDispatcher(const ARAIPCMessageID messageID, const ARAIPCMessageDecoder * decoder, ARAIPCMessageEncoder * replyEncoder);
5050

51-
//! \todo to perform the binding to the remote plug-in instance, the host needs access to this translation...
52-
ARADocumentControllerRef ARAIPCProxyPlugInTranslateDocumentControllerRef(ARADocumentControllerRef documentControllerRef);
53-
54-
//! create the plug-in extension when performing the binding to the remote plug-in instance
55-
const ARAPlugInExtensionInstance * ARAIPCProxyPlugInCreatePlugInExtension(size_t remoteExtensionRef, ARAIPCMessageSender sender, ARADocumentControllerRef documentControllerRef,
56-
ARAPlugInInstanceRoleFlags knownRoles, ARAPlugInInstanceRoleFlags assignedRoles);
57-
//! destroy the plug-in extension when destroying the remote plug-in instance
58-
void ARAIPCProxyPlugInDestroyPlugInExtension(const ARAPlugInExtensionInstance * plugInExtension);
51+
//! create the proxy plug-in extension when performing the binding to the remote plug-in instance
52+
const ARAPlugInExtensionInstance * ARAIPCProxyPlugInBindToDocumentController(ARAIPCPlugInInstanceRef remoteRef,
53+
ARAIPCMessageSender sender, ARADocumentControllerRef documentControllerRef,
54+
ARAPlugInInstanceRoleFlags knownRoles, ARAPlugInInstanceRoleFlags assignedRoles);
55+
56+
//! trigger proper teardown of proxy plug-in extension upon destroying a remote plug-in instance that has been bound to ARA
57+
void ARAIPCProxyPlugInCleanupBinding(const ARAPlugInExtensionInstance * plugInExtension);
5958

6059

6160
#if defined(__cplusplus)

0 commit comments

Comments
 (0)