nuclear@0: /************************************************************************************ nuclear@0: nuclear@0: Filename : Service_NetSessionCommon.cpp nuclear@0: Content : Server for service interface nuclear@0: Created : June 12, 2014 nuclear@0: Authors : Kevin Jenkins, Chris Taylor nuclear@0: nuclear@0: Copyright : Copyright 2014 Oculus VR, LLC All Rights reserved. nuclear@0: nuclear@0: Licensed under the Oculus VR Rift SDK License Version 3.2 (the "License"); nuclear@0: you may not use the Oculus VR Rift SDK except in compliance with the License, nuclear@0: which is provided at the time of installation or download, or which nuclear@0: otherwise accompanies this software in either electronic or hard copy form. nuclear@0: nuclear@0: You may obtain a copy of the License at nuclear@0: nuclear@0: http://www.oculusvr.com/licenses/LICENSE-3.2 nuclear@0: nuclear@0: Unless required by applicable law or agreed to in writing, the Oculus VR SDK nuclear@0: distributed under the License is distributed on an "AS IS" BASIS, nuclear@0: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. nuclear@0: See the License for the specific language governing permissions and nuclear@0: limitations under the License. nuclear@0: nuclear@0: ************************************************************************************/ nuclear@0: nuclear@0: #include "Service_NetSessionCommon.h" nuclear@0: #include "../OVR_Stereo.h" nuclear@0: nuclear@0: namespace OVR { namespace Service { nuclear@0: nuclear@0: nuclear@0: //// NetSessionCommon nuclear@0: nuclear@0: NetSessionCommon::NetSessionCommon() : nuclear@0: Terminated(false) nuclear@0: { nuclear@0: pSession = new Net::Session; nuclear@0: OVR_ASSERT(pSession != NULL); nuclear@0: nuclear@0: pRPC = new Net::Plugins::RPC1; nuclear@0: OVR_ASSERT(pRPC != NULL); nuclear@0: nuclear@0: pSession->AddSessionListener(pRPC); nuclear@0: } nuclear@0: nuclear@0: NetSessionCommon::~NetSessionCommon() nuclear@0: { nuclear@0: if (pSession) nuclear@0: { nuclear@0: delete pSession; nuclear@0: pSession = NULL; nuclear@0: } nuclear@0: if (pRPC) nuclear@0: { nuclear@0: delete pRPC; nuclear@0: pRPC = NULL; nuclear@0: } nuclear@0: nuclear@0: Terminated = true; nuclear@0: nuclear@0: OVR_ASSERT(IsFinished()); nuclear@0: } nuclear@0: nuclear@0: void NetSessionCommon::onSystemDestroy() nuclear@0: { nuclear@0: Terminated = true; nuclear@0: nuclear@0: Join(); nuclear@0: nuclear@0: Release(); nuclear@0: } nuclear@0: nuclear@0: void NetSessionCommon::onThreadDestroy() nuclear@0: { nuclear@0: Terminated = true; nuclear@0: if (pSession) nuclear@0: { nuclear@0: pSession->Shutdown(); nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: void NetSessionCommon::SerializeHMDInfo(Net::BitStream *bitStream, HMDInfo* hmdInfo) nuclear@0: { nuclear@0: bitStream->Write(hmdInfo->ProductName); nuclear@0: bitStream->Write(hmdInfo->Manufacturer); nuclear@0: nuclear@0: int32_t w = hmdInfo->Version; nuclear@0: bitStream->Write(w); nuclear@0: nuclear@0: w = hmdInfo->HmdType; nuclear@0: bitStream->Write(w); nuclear@0: nuclear@0: w = hmdInfo->ResolutionInPixels.w; nuclear@0: bitStream->Write(w); nuclear@0: nuclear@0: w = hmdInfo->ResolutionInPixels.h; nuclear@0: bitStream->Write(w); nuclear@0: nuclear@0: w = hmdInfo->ShimInfo.DeviceNumber; nuclear@0: bitStream->Write(w); nuclear@0: nuclear@0: w = hmdInfo->ShimInfo.NativeWidth; nuclear@0: bitStream->Write(w); nuclear@0: nuclear@0: w = hmdInfo->ShimInfo.NativeHeight; nuclear@0: bitStream->Write(w); nuclear@0: nuclear@0: w = hmdInfo->ShimInfo.Rotation; nuclear@0: bitStream->Write(w); nuclear@0: nuclear@0: bitStream->Write(hmdInfo->ScreenSizeInMeters.w); nuclear@0: bitStream->Write(hmdInfo->ScreenSizeInMeters.h); nuclear@0: bitStream->Write(hmdInfo->ScreenGapSizeInMeters); nuclear@0: bitStream->Write(hmdInfo->CenterFromTopInMeters); nuclear@0: bitStream->Write(hmdInfo->LensSeparationInMeters); nuclear@0: nuclear@0: w = hmdInfo->DesktopX; nuclear@0: bitStream->Write(w); nuclear@0: nuclear@0: w = hmdInfo->DesktopY; nuclear@0: bitStream->Write(w); nuclear@0: nuclear@0: w = hmdInfo->Shutter.Type; nuclear@0: bitStream->Write(w); nuclear@0: nuclear@0: bitStream->Write(hmdInfo->Shutter.VsyncToNextVsync); nuclear@0: bitStream->Write(hmdInfo->Shutter.VsyncToFirstScanline); nuclear@0: bitStream->Write(hmdInfo->Shutter.FirstScanlineToLastScanline); nuclear@0: bitStream->Write(hmdInfo->Shutter.PixelSettleTime); nuclear@0: bitStream->Write(hmdInfo->Shutter.PixelPersistence); nuclear@0: bitStream->Write(hmdInfo->DisplayDeviceName); nuclear@0: nuclear@0: w = hmdInfo->DisplayId; nuclear@0: bitStream->Write(w); nuclear@0: nuclear@0: bitStream->Write(hmdInfo->PrintedSerial); nuclear@0: nuclear@0: uint8_t b = hmdInfo->InCompatibilityMode ? 1 : 0; nuclear@0: bitStream->Write(b); nuclear@0: nuclear@0: w = hmdInfo->VendorId; nuclear@0: bitStream->Write(w); nuclear@0: nuclear@0: w = hmdInfo->ProductId; nuclear@0: bitStream->Write(w); nuclear@0: nuclear@0: bitStream->Write(hmdInfo->CameraFrustumFarZInMeters); nuclear@0: bitStream->Write(hmdInfo->CameraFrustumHFovInRadians); nuclear@0: bitStream->Write(hmdInfo->CameraFrustumNearZInMeters); nuclear@0: bitStream->Write(hmdInfo->CameraFrustumVFovInRadians); nuclear@0: nuclear@0: w = hmdInfo->FirmwareMajor; nuclear@0: bitStream->Write(w); nuclear@0: nuclear@0: w = hmdInfo->FirmwareMinor; nuclear@0: bitStream->Write(w); nuclear@0: nuclear@0: bitStream->Write(hmdInfo->PelOffsetR.x); nuclear@0: bitStream->Write(hmdInfo->PelOffsetR.y); nuclear@0: bitStream->Write(hmdInfo->PelOffsetB.x); nuclear@0: bitStream->Write(hmdInfo->PelOffsetB.y); nuclear@0: nuclear@0: // Important please read before modifying! nuclear@0: // ---------------------------------------------------- nuclear@0: // Please add new serialized data to the end, here. nuclear@0: // Otherwise we will break backwards compatibility nuclear@0: // and e.g. 0.4.4 runtime will not work with 0.4.3 SDK. nuclear@0: nuclear@0: // Please also update the DeserializeHMDInfo() function nuclear@0: // below also and make sure that the members you added nuclear@0: // are initialized properly in the HMDInfo constructor. nuclear@0: nuclear@0: // Note that whenever new fields are added here you nuclear@0: // should also update the minor version of the RPC nuclear@0: // protocol in OVR_Session.h so that clients fail at nuclear@0: // a version check instead of when this data is nuclear@0: // found to be truncated from the server. nuclear@0: } nuclear@0: nuclear@0: bool NetSessionCommon::DeserializeHMDInfo(Net::BitStream *bitStream, HMDInfo* hmdInfo) nuclear@0: { nuclear@0: bitStream->Read(hmdInfo->ProductName); nuclear@0: bitStream->Read(hmdInfo->Manufacturer); nuclear@0: nuclear@0: int32_t w = 0; nuclear@0: if (!bitStream->Read(w)) nuclear@0: { nuclear@0: // This indicates that no HMD could be found nuclear@0: return false; nuclear@0: } nuclear@0: hmdInfo->Version = w; nuclear@0: nuclear@0: bitStream->Read(w); nuclear@0: hmdInfo->HmdType = (HmdTypeEnum)w; nuclear@0: nuclear@0: bitStream->Read(w); nuclear@0: hmdInfo->ResolutionInPixels.w = w; nuclear@0: nuclear@0: bitStream->Read(w); nuclear@0: hmdInfo->ResolutionInPixels.h = w; nuclear@0: nuclear@0: bitStream->Read(w); nuclear@0: hmdInfo->ShimInfo.DeviceNumber = w; nuclear@0: nuclear@0: bitStream->Read(w); nuclear@0: hmdInfo->ShimInfo.NativeWidth = w; nuclear@0: nuclear@0: bitStream->Read(w); nuclear@0: hmdInfo->ShimInfo.NativeHeight = w; nuclear@0: nuclear@0: bitStream->Read(w); nuclear@0: hmdInfo->ShimInfo.Rotation = w; nuclear@0: nuclear@0: bitStream->Read(hmdInfo->ScreenSizeInMeters.w); nuclear@0: bitStream->Read(hmdInfo->ScreenSizeInMeters.h); nuclear@0: bitStream->Read(hmdInfo->ScreenGapSizeInMeters); nuclear@0: bitStream->Read(hmdInfo->CenterFromTopInMeters); nuclear@0: bitStream->Read(hmdInfo->LensSeparationInMeters); nuclear@0: nuclear@0: bitStream->Read(w); nuclear@0: hmdInfo->DesktopX = w; nuclear@0: nuclear@0: bitStream->Read(w); nuclear@0: hmdInfo->DesktopY = w; nuclear@0: nuclear@0: bitStream->Read(w); nuclear@0: hmdInfo->Shutter.Type = (HmdShutterTypeEnum)w; nuclear@0: nuclear@0: bitStream->Read(hmdInfo->Shutter.VsyncToNextVsync); nuclear@0: bitStream->Read(hmdInfo->Shutter.VsyncToFirstScanline); nuclear@0: bitStream->Read(hmdInfo->Shutter.FirstScanlineToLastScanline); nuclear@0: bitStream->Read(hmdInfo->Shutter.PixelSettleTime); nuclear@0: bitStream->Read(hmdInfo->Shutter.PixelPersistence); nuclear@0: bitStream->Read(hmdInfo->DisplayDeviceName); nuclear@0: nuclear@0: bitStream->Read(w); nuclear@0: hmdInfo->DisplayId = w; nuclear@0: nuclear@0: bitStream->Read(hmdInfo->PrintedSerial); nuclear@0: nuclear@0: uint8_t b = 0; nuclear@0: bitStream->Read(b); nuclear@0: hmdInfo->InCompatibilityMode = (b != 0); nuclear@0: nuclear@0: bitStream->Read(w); nuclear@0: hmdInfo->VendorId = w; nuclear@0: nuclear@0: bitStream->Read(w); nuclear@0: hmdInfo->ProductId = w; nuclear@0: nuclear@0: bitStream->Read(hmdInfo->CameraFrustumFarZInMeters); nuclear@0: bitStream->Read(hmdInfo->CameraFrustumHFovInRadians); nuclear@0: bitStream->Read(hmdInfo->CameraFrustumNearZInMeters); nuclear@0: bitStream->Read(hmdInfo->CameraFrustumVFovInRadians); nuclear@0: nuclear@0: bitStream->Read(w); nuclear@0: hmdInfo->FirmwareMajor = w; nuclear@0: nuclear@0: if (!bitStream->Read(w)) nuclear@0: { nuclear@0: OVR_ASSERT(false); nuclear@0: return false; nuclear@0: } nuclear@0: hmdInfo->FirmwareMinor = w; nuclear@0: nuclear@0: bitStream->Read(hmdInfo->PelOffsetR.x); nuclear@0: bitStream->Read(hmdInfo->PelOffsetR.y); nuclear@0: bitStream->Read(hmdInfo->PelOffsetB.x); nuclear@0: if (!bitStream->Read(hmdInfo->PelOffsetB.y)) nuclear@0: { nuclear@0: OVR_ASSERT(false); nuclear@0: return false; nuclear@0: } nuclear@0: nuclear@0: // Important please read before modifying! nuclear@0: // ---------------------------------------------------- nuclear@0: // Please add new serialized data to the end, here. nuclear@0: // Otherwise we will break backwards compatibility nuclear@0: // and e.g. 0.4.4 runtime will not work with 0.4.3 SDK. nuclear@0: nuclear@0: // Be sure to check that the very last one read properly nuclear@0: // since HMD Info truncation should be caught here. nuclear@0: nuclear@0: return true; nuclear@0: } nuclear@0: nuclear@0: // Prefix key names with this to pass through to server nuclear@0: static const char* BypassPrefix = "server:"; nuclear@0: nuclear@0: static const char* KeyNames[][NetSessionCommon::ENumTypes] = { nuclear@0: /* EGetStringValue */ { "CameraSerial", "CameraUUID", 0 }, nuclear@0: /* EGetBoolValue */ { "ReleaseDK2Sensors", "ReleaseLegacySensors", 0 }, nuclear@0: /* EGetIntValue */ { 0 }, nuclear@0: /* EGetNumberValue */{ "CenterPupilDepth", "LoggingMask", 0 }, nuclear@0: /* EGetNumberValues */{ "NeckModelVector3f", 0 }, nuclear@0: /* ESetStringValue */ { 0 }, nuclear@0: /* ESetBoolValue */ { "ReleaseDK2Sensors", "ReleaseLegacySensors", 0 }, nuclear@0: /* ESetIntValue */ { 0 }, nuclear@0: /* ESetNumberValue */{ "CenterPupilDepth", "LoggingMask", 0 }, nuclear@0: /* ESetNumberValues */{ "NeckModelVector3f", 0 }, nuclear@0: }; nuclear@0: nuclear@0: bool IsInStringArray(const char* a[], const char* key) nuclear@0: { nuclear@0: for (int i = 0; a[i]; ++i) nuclear@0: { nuclear@0: if (OVR_strcmp(a[i], key) == 0) nuclear@0: return true; nuclear@0: } nuclear@0: nuclear@0: return false; nuclear@0: } nuclear@0: nuclear@0: const char *NetSessionCommon::FilterKeyPrefix(const char* key) nuclear@0: { nuclear@0: // If key starts with BypassPrefix, nuclear@0: if (strstr(key, BypassPrefix) == key) nuclear@0: { nuclear@0: key += strlen(BypassPrefix); nuclear@0: } nuclear@0: nuclear@0: return key; nuclear@0: } nuclear@0: nuclear@0: bool NetSessionCommon::IsServiceProperty(EGetterSetters e, const char* key) nuclear@0: { nuclear@0: if ((e >= 0 && e < ENumTypes) && IsInStringArray(KeyNames[e], key)) nuclear@0: { nuclear@0: return true; nuclear@0: } nuclear@0: nuclear@0: // If key starts with BypassPrefix, nuclear@0: if (strstr(key, BypassPrefix) == key) nuclear@0: { nuclear@0: return true; nuclear@0: } nuclear@0: nuclear@0: return false; nuclear@0: } nuclear@0: nuclear@0: nuclear@0: }} // namespace OVR::Service