diff options
author | Sven Gothel <[email protected]> | 2015-03-21 23:01:12 +0100 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2015-03-21 23:01:12 +0100 |
commit | 0c5c4be020c2d55540058a49b2a879f46d5a1e13 (patch) | |
tree | 00f84c2ca18cc233b826014094b9cad0769a3ea5 /LibOVR/Src/Net/OVR_RPC1.h | |
parent | cbbd775b6c754927632c333ff01424a0d2048c7c (diff) | |
parent | e490c3c7f7bb5461cfa78a214827aa534fb43a3e (diff) |
Merge branch 'vanilla_0.4.4' and resolve conflicts
TODO: Validate for removed patches due to relocation
Resolved Conflicts:
LibOVR/Src/Kernel/OVR_ThreadsWinAPI.cpp
LibOVR/Src/OVR_Linux_HMDDevice.cpp
LibOVR/Src/OVR_OSX_HMDDevice.cpp
LibOVR/Src/OVR_Profile.cpp
LibOVR/Src/OVR_Sensor2Impl.cpp
LibOVR/Src/OVR_SensorFusion.cpp
LibOVR/Src/OVR_SensorImpl.cpp
LibOVR/Src/OVR_Win32_DeviceStatus.cpp
LibOVR/Src/OVR_Win32_HIDDevice.cpp
LibOVR/Src/OVR_Win32_HIDDevice.h
LibOVR/Src/OVR_Win32_HMDDevice.cpp
Diffstat (limited to 'LibOVR/Src/Net/OVR_RPC1.h')
-rw-r--r-- | LibOVR/Src/Net/OVR_RPC1.h | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/LibOVR/Src/Net/OVR_RPC1.h b/LibOVR/Src/Net/OVR_RPC1.h new file mode 100644 index 0000000..6104ccf --- /dev/null +++ b/LibOVR/Src/Net/OVR_RPC1.h @@ -0,0 +1,105 @@ +/************************************************************************************ + +PublicHeader: n/a +Filename : OVR_RPC1.h +Content : A network plugin that provides remote procedure call functionality. +Created : June 10, 2014 +Authors : Kevin Jenkins + +Copyright : Copyright 2014 Oculus VR, LLC All Rights reserved. + +Licensed under the Oculus VR Rift SDK License Version 3.2 (the "License"); +you may not use the Oculus VR Rift SDK except in compliance with the License, +which is provided at the time of installation or download, or which +otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at + +http://www.oculusvr.com/licenses/LICENSE-3.2 + +Unless required by applicable law or agreed to in writing, the Oculus VR SDK +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +************************************************************************************/ + +#ifndef OVR_Net_RPC_h +#define OVR_Net_RPC_h + +#include "OVR_NetworkPlugin.h" +#include "../Kernel/OVR_Hash.h" +#include "../Kernel/OVR_String.h" +#include "OVR_BitStream.h" +#include "../Kernel/OVR_Threads.h" +#include "../Kernel/OVR_Delegates.h" +#include "../Kernel//OVR_Observer.h" + +namespace OVR { namespace Net { namespace Plugins { + + +typedef Delegate3<void, BitStream*, BitStream*, ReceivePayload*> RPCDelegate; +typedef Delegate2<void, BitStream*, ReceivePayload*> RPCSlot; +// typedef void ( *Slot ) ( OVR::Net::BitStream *userData, OVR::Net::ReceivePayload *pPayload ); + +/// NetworkPlugin that maps strings to function pointers. Can invoke the functions using blocking calls with return values, or signal/slots. Networked parameters serialized with BitStream +class RPC1 : public NetworkPlugin, public NewOverrideBase +{ +public: + RPC1(); + virtual ~RPC1(); + + /// Register a slot, which is a function pointer to one or more implementations that supports this function signature + /// When a signal occurs, all slots with the same identifier are called. + /// \param[in] sharedIdentifier A string to identify the slot. Recommended to be the same as the name of the function. + /// \param[in] functionPtr Pointer to the function. + /// \param[in] callPriority Slots are called by order of the highest callPriority first. For slots with the same priority, they are called in the order they are registered + void RegisterSlot(OVR::String sharedIdentifier, OVR::Observer<RPCSlot> *rpcSlotObserver); + + /// \brief Same as \a RegisterFunction, but is called with CallBlocking() instead of Call() and returns a value to the caller + bool RegisterBlockingFunction(OVR::String uniqueID, RPCDelegate blockingFunction); + + /// \brief Same as UnregisterFunction, except for a blocking function + void UnregisterBlockingFunction(OVR::String uniqueID); + + // \brief Same as call, but don't return until the remote system replies. + /// Broadcasting parameter does not exist, this can only call one remote system + /// \note This function does not return until the remote system responds, disconnects, or was never connected to begin with + /// \param[in] Identifier originally passed to RegisterBlockingFunction() on the remote system(s) + /// \param[in] bitStream bitStream encoded data to send to the function callback + /// \param[in] pConnection connection to send on + /// \param[out] returnData Written to by the function registered with RegisterBlockingFunction. + /// \return true if successfully called. False on disconnect, function not registered, or not connected to begin with + bool CallBlocking( OVR::String uniqueID, OVR::Net::BitStream * bitStream, Ptr<Connection> pConnection, OVR::Net::BitStream *returnData = NULL ); + + /// Calls zero or more functions identified by sharedIdentifier registered with RegisterSlot() + /// \param[in] sharedIdentifier parameter of the same name passed to RegisterSlot() on the remote system + /// \param[in] bitStream bitStream encoded data to send to the function callback + /// \param[in] pConnection connection to send on + bool Signal(OVR::String sharedIdentifier, OVR::Net::BitStream * bitStream, Ptr<Connection> pConnection); + void BroadcastSignal(OVR::String sharedIdentifier, OVR::Net::BitStream * bitStream); + + +protected: + virtual void OnReceive(ReceivePayload *pPayload, ListenerReceiveResult *lrrOut); + + virtual void OnDisconnected(Connection* conn); + virtual void OnConnected(Connection* conn); + + Hash< String, RPCDelegate, String::HashFunctor > registeredBlockingFunctions; + ObserverHash< RPCSlot > slotHash; + + // Synchronization for RPC caller + Lock singleRPCLock; + Mutex callBlockingMutex; + WaitCondition callBlockingWait; + + Net::BitStream* blockingReturnValue; + Ptr<Connection> blockingOnThisConnection; +}; + + +}}} // OVR::Net::Plugins + +#endif // OVR_Net_RPC_h |