1 // Copyright 2019 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "device/vr/windows_mixed_reality/wrappers/wmr_input_source.h"
6 
7 #include <windows.ui.input.spatial.h>
8 #include <wrl.h>
9 
10 #include <cstdint>
11 
12 #include "base/logging.h"
13 #include "device/vr/windows_mixed_reality/wrappers/wmr_pointer_source_pose.h"
14 
15 using SourceHandedness =
16     ABI::Windows::UI::Input::Spatial::SpatialInteractionSourceHandedness;
17 using SourceKind =
18     ABI::Windows::UI::Input::Spatial::SpatialInteractionSourceKind;
19 
20 using ABI::Windows::UI::Input::Spatial::ISpatialInteractionController;
21 using ABI::Windows::UI::Input::Spatial::ISpatialInteractionSource;
22 using Microsoft::WRL::ComPtr;
23 
24 namespace device {
25 
WMRControllerImpl(ComPtr<ISpatialInteractionController> controller)26 WMRControllerImpl::WMRControllerImpl(
27     ComPtr<ISpatialInteractionController> controller)
28     : controller_(controller) {
29   DCHECK(controller_);
30 }
31 
32 WMRControllerImpl::~WMRControllerImpl() = default;
33 
ProductId()34 uint16_t WMRControllerImpl::ProductId() {
35   uint16_t id = 0;
36   HRESULT hr = controller_->get_ProductId(&id);
37   DCHECK(SUCCEEDED(hr));
38   return id;
39 }
40 
VendorId()41 uint16_t WMRControllerImpl::VendorId() {
42   uint16_t id = 0;
43   HRESULT hr = controller_->get_VendorId(&id);
44   DCHECK(SUCCEEDED(hr));
45   return id;
46 }
47 
48 ABI::Windows::UI::Input::Spatial::ISpatialInteractionSource*
GetRawPtr() const49 WMRInputSource::GetRawPtr() const {
50   // This should only ever be used by the real implementation, so by default
51   // make sure it's not called.
52   NOTREACHED();
53   return nullptr;
54 }
55 
WMRInputSourceImpl(ComPtr<ISpatialInteractionSource> source)56 WMRInputSourceImpl::WMRInputSourceImpl(ComPtr<ISpatialInteractionSource> source)
57     : source_(source) {
58   DCHECK(source_);
59   source_.As(&source2_);
60   source_.As(&source3_);
61 }
62 
63 WMRInputSourceImpl::~WMRInputSourceImpl() = default;
64 
65 WMRInputSourceImpl::WMRInputSourceImpl(const WMRInputSourceImpl& other) =
66     default;
67 
Id() const68 uint32_t WMRInputSourceImpl::Id() const {
69   uint32_t val;
70   HRESULT hr = source_->get_Id(&val);
71   DCHECK(SUCCEEDED(hr));
72   return val;
73 }
74 
Kind() const75 SourceKind WMRInputSourceImpl::Kind() const {
76   SourceKind val;
77   HRESULT hr = source_->get_Kind(&val);
78   DCHECK(SUCCEEDED(hr));
79   return val;
80 }
81 
IsPointingSupported() const82 bool WMRInputSourceImpl::IsPointingSupported() const {
83   if (!source2_)
84     return false;
85   boolean val;
86   HRESULT hr = source2_->get_IsPointingSupported(&val);
87   DCHECK(SUCCEEDED(hr));
88   return val;
89 }
90 
Controller() const91 std::unique_ptr<WMRController> WMRInputSourceImpl::Controller() const {
92   if (!source2_)
93     return nullptr;
94   ComPtr<ISpatialInteractionController> controller;
95   HRESULT hr = source2_->get_Controller(&controller);
96   if (SUCCEEDED(hr))
97     return std::make_unique<WMRControllerImpl>(controller);
98 
99   return nullptr;
100 }
101 
Handedness() const102 SourceHandedness WMRInputSourceImpl::Handedness() const {
103   if (!source3_)
104     return SourceHandedness::SpatialInteractionSourceHandedness_Unspecified;
105   SourceHandedness val;
106   HRESULT hr = source3_->get_Handedness(&val);
107   DCHECK(SUCCEEDED(hr));
108   return val;
109 }
110 
GetRawPtr() const111 ISpatialInteractionSource* WMRInputSourceImpl::GetRawPtr() const {
112   return source_.Get();
113 }
114 }  // namespace device
115