diff options
Diffstat (limited to 'LibOVR/Src/Service/Service_NetSessionCommon.cpp')
-rw-r--r-- | LibOVR/Src/Service/Service_NetSessionCommon.cpp | 343 |
1 files changed, 343 insertions, 0 deletions
diff --git a/LibOVR/Src/Service/Service_NetSessionCommon.cpp b/LibOVR/Src/Service/Service_NetSessionCommon.cpp new file mode 100644 index 0000000..ba2c773 --- /dev/null +++ b/LibOVR/Src/Service/Service_NetSessionCommon.cpp @@ -0,0 +1,343 @@ +/************************************************************************************ + +Filename : Service_NetSessionCommon.cpp +Content : Server for service interface +Created : June 12, 2014 +Authors : Kevin Jenkins, Chris Taylor + +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. + +************************************************************************************/ + +#include "Service_NetSessionCommon.h" +#include "../OVR_Stereo.h" + +namespace OVR { namespace Service { + + +//// NetSessionCommon + +NetSessionCommon::NetSessionCommon() : + Terminated(false) +{ + pSession = new Net::Session; + OVR_ASSERT(pSession != NULL); + + pRPC = new Net::Plugins::RPC1; + OVR_ASSERT(pRPC != NULL); + + pSession->AddSessionListener(pRPC); +} + +NetSessionCommon::~NetSessionCommon() +{ + if (pSession) + { + delete pSession; + pSession = NULL; + } + if (pRPC) + { + delete pRPC; + pRPC = NULL; + } + + Terminated = true; + + OVR_ASSERT(IsFinished()); +} + +void NetSessionCommon::onSystemDestroy() +{ + Terminated = true; + + Join(); + + Release(); +} + +void NetSessionCommon::onThreadDestroy() +{ + Terminated = true; + if (pSession) + { + pSession->Shutdown(); + } +} + +void NetSessionCommon::SerializeHMDInfo(Net::BitStream *bitStream, HMDInfo* hmdInfo) +{ + bitStream->Write(hmdInfo->ProductName); + bitStream->Write(hmdInfo->Manufacturer); + + int32_t w = hmdInfo->Version; + bitStream->Write(w); + + w = hmdInfo->HmdType; + bitStream->Write(w); + + w = hmdInfo->ResolutionInPixels.w; + bitStream->Write(w); + + w = hmdInfo->ResolutionInPixels.h; + bitStream->Write(w); + + w = hmdInfo->ShimInfo.DeviceNumber; + bitStream->Write(w); + + w = hmdInfo->ShimInfo.NativeWidth; + bitStream->Write(w); + + w = hmdInfo->ShimInfo.NativeHeight; + bitStream->Write(w); + + w = hmdInfo->ShimInfo.Rotation; + bitStream->Write(w); + + bitStream->Write(hmdInfo->ScreenSizeInMeters.w); + bitStream->Write(hmdInfo->ScreenSizeInMeters.h); + bitStream->Write(hmdInfo->ScreenGapSizeInMeters); + bitStream->Write(hmdInfo->CenterFromTopInMeters); + bitStream->Write(hmdInfo->LensSeparationInMeters); + + w = hmdInfo->DesktopX; + bitStream->Write(w); + + w = hmdInfo->DesktopY; + bitStream->Write(w); + + w = hmdInfo->Shutter.Type; + bitStream->Write(w); + + bitStream->Write(hmdInfo->Shutter.VsyncToNextVsync); + bitStream->Write(hmdInfo->Shutter.VsyncToFirstScanline); + bitStream->Write(hmdInfo->Shutter.FirstScanlineToLastScanline); + bitStream->Write(hmdInfo->Shutter.PixelSettleTime); + bitStream->Write(hmdInfo->Shutter.PixelPersistence); + bitStream->Write(hmdInfo->DisplayDeviceName); + + w = hmdInfo->DisplayId; + bitStream->Write(w); + + bitStream->Write(hmdInfo->PrintedSerial); + + uint8_t b = hmdInfo->InCompatibilityMode ? 1 : 0; + bitStream->Write(b); + + w = hmdInfo->VendorId; + bitStream->Write(w); + + w = hmdInfo->ProductId; + bitStream->Write(w); + + bitStream->Write(hmdInfo->CameraFrustumFarZInMeters); + bitStream->Write(hmdInfo->CameraFrustumHFovInRadians); + bitStream->Write(hmdInfo->CameraFrustumNearZInMeters); + bitStream->Write(hmdInfo->CameraFrustumVFovInRadians); + + w = hmdInfo->FirmwareMajor; + bitStream->Write(w); + + w = hmdInfo->FirmwareMinor; + bitStream->Write(w); + + bitStream->Write(hmdInfo->PelOffsetR.x); + bitStream->Write(hmdInfo->PelOffsetR.y); + bitStream->Write(hmdInfo->PelOffsetB.x); + bitStream->Write(hmdInfo->PelOffsetB.y); + + // Important please read before modifying! + // ---------------------------------------------------- + // Please add new serialized data to the end, here. + // Otherwise we will break backwards compatibility + // and e.g. 0.4.4 runtime will not work with 0.4.3 SDK. + + // Please also update the DeserializeHMDInfo() function + // below also and make sure that the members you added + // are initialized properly in the HMDInfo constructor. + + // Note that whenever new fields are added here you + // should also update the minor version of the RPC + // protocol in OVR_Session.h so that clients fail at + // a version check instead of when this data is + // found to be truncated from the server. +} + +bool NetSessionCommon::DeserializeHMDInfo(Net::BitStream *bitStream, HMDInfo* hmdInfo) +{ + bitStream->Read(hmdInfo->ProductName); + bitStream->Read(hmdInfo->Manufacturer); + + int32_t w = 0; + if (!bitStream->Read(w)) + { + // This indicates that no HMD could be found + return false; + } + hmdInfo->Version = w; + + bitStream->Read(w); + hmdInfo->HmdType = (HmdTypeEnum)w; + + bitStream->Read(w); + hmdInfo->ResolutionInPixels.w = w; + + bitStream->Read(w); + hmdInfo->ResolutionInPixels.h = w; + + bitStream->Read(w); + hmdInfo->ShimInfo.DeviceNumber = w; + + bitStream->Read(w); + hmdInfo->ShimInfo.NativeWidth = w; + + bitStream->Read(w); + hmdInfo->ShimInfo.NativeHeight = w; + + bitStream->Read(w); + hmdInfo->ShimInfo.Rotation = w; + + bitStream->Read(hmdInfo->ScreenSizeInMeters.w); + bitStream->Read(hmdInfo->ScreenSizeInMeters.h); + bitStream->Read(hmdInfo->ScreenGapSizeInMeters); + bitStream->Read(hmdInfo->CenterFromTopInMeters); + bitStream->Read(hmdInfo->LensSeparationInMeters); + + bitStream->Read(w); + hmdInfo->DesktopX = w; + + bitStream->Read(w); + hmdInfo->DesktopY = w; + + bitStream->Read(w); + hmdInfo->Shutter.Type = (HmdShutterTypeEnum)w; + + bitStream->Read(hmdInfo->Shutter.VsyncToNextVsync); + bitStream->Read(hmdInfo->Shutter.VsyncToFirstScanline); + bitStream->Read(hmdInfo->Shutter.FirstScanlineToLastScanline); + bitStream->Read(hmdInfo->Shutter.PixelSettleTime); + bitStream->Read(hmdInfo->Shutter.PixelPersistence); + bitStream->Read(hmdInfo->DisplayDeviceName); + + bitStream->Read(w); + hmdInfo->DisplayId = w; + + bitStream->Read(hmdInfo->PrintedSerial); + + uint8_t b = 0; + bitStream->Read(b); + hmdInfo->InCompatibilityMode = (b != 0); + + bitStream->Read(w); + hmdInfo->VendorId = w; + + bitStream->Read(w); + hmdInfo->ProductId = w; + + bitStream->Read(hmdInfo->CameraFrustumFarZInMeters); + bitStream->Read(hmdInfo->CameraFrustumHFovInRadians); + bitStream->Read(hmdInfo->CameraFrustumNearZInMeters); + bitStream->Read(hmdInfo->CameraFrustumVFovInRadians); + + bitStream->Read(w); + hmdInfo->FirmwareMajor = w; + + if (!bitStream->Read(w)) + { + OVR_ASSERT(false); + return false; + } + hmdInfo->FirmwareMinor = w; + + bitStream->Read(hmdInfo->PelOffsetR.x); + bitStream->Read(hmdInfo->PelOffsetR.y); + bitStream->Read(hmdInfo->PelOffsetB.x); + if (!bitStream->Read(hmdInfo->PelOffsetB.y)) + { + OVR_ASSERT(false); + return false; + } + + // Important please read before modifying! + // ---------------------------------------------------- + // Please add new serialized data to the end, here. + // Otherwise we will break backwards compatibility + // and e.g. 0.4.4 runtime will not work with 0.4.3 SDK. + + // Be sure to check that the very last one read properly + // since HMD Info truncation should be caught here. + + return true; +} + +// Prefix key names with this to pass through to server +static const char* BypassPrefix = "server:"; + +static const char* KeyNames[][NetSessionCommon::ENumTypes] = { + /* EGetStringValue */ { "CameraSerial", "CameraUUID", 0 }, + /* EGetBoolValue */ { "ReleaseDK2Sensors", "ReleaseLegacySensors", 0 }, + /* EGetIntValue */ { 0 }, + /* EGetNumberValue */{ "CenterPupilDepth", "LoggingMask", 0 }, + /* EGetNumberValues */{ "NeckModelVector3f", 0 }, + /* ESetStringValue */ { 0 }, + /* ESetBoolValue */ { "ReleaseDK2Sensors", "ReleaseLegacySensors", 0 }, + /* ESetIntValue */ { 0 }, + /* ESetNumberValue */{ "CenterPupilDepth", "LoggingMask", 0 }, + /* ESetNumberValues */{ "NeckModelVector3f", 0 }, +}; + +bool IsInStringArray(const char* a[], const char* key) +{ + for (int i = 0; a[i]; ++i) + { + if (OVR_strcmp(a[i], key) == 0) + return true; + } + + return false; +} + +const char *NetSessionCommon::FilterKeyPrefix(const char* key) +{ + // If key starts with BypassPrefix, + if (strstr(key, BypassPrefix) == key) + { + key += strlen(BypassPrefix); + } + + return key; +} + +bool NetSessionCommon::IsServiceProperty(EGetterSetters e, const char* key) +{ + if ((e >= 0 && e < ENumTypes) && IsInStringArray(KeyNames[e], key)) + { + return true; + } + + // If key starts with BypassPrefix, + if (strstr(key, BypassPrefix) == key) + { + return true; + } + + return false; +} + + +}} // namespace OVR::Service |