38 {
39 if (!registry_->is_bound()) {
41 << "Lost connection to fuchsia.ui.pointerinjector.Registry";
42 return false;
43 }
44
45 auto method = request.FindMember("method");
46 if (method == request.MemberEnd() || !method->value.IsString()) {
47 FML_LOG(ERROR) <<
"No method found in platform message.";
48 return false;
49 }
50
52 FML_LOG(ERROR) <<
"Unexpected platform message method, expected "
53 "View.pointerinjector.inject.";
54 return false;
55 }
56
57 auto args_it = request.FindMember("args");
58 if (args_it == request.MemberEnd() || !args_it->value.IsObject()) {
59 FML_LOG(ERROR) <<
"No arguments found in platform message's method";
60 return false;
61 }
62
63 const auto&
args = args_it->value;
64
66 if (!
view_id->value.IsUint64()) {
67 FML_LOG(ERROR) <<
"Argument 'viewId' is not a uint64";
68 return false;
69 }
70
71 auto id =
view_id->value.GetUint64();
72 if (valid_views_.count(id) == 0) {
73
74
75
76
77 Complete(std::move(response), "[0]");
78 return true;
79 }
80
81 auto phase =
args.FindMember(
"phase");
82 if (!phase->value.IsInt()) {
83 FML_LOG(ERROR) <<
"Argument 'phase' is not a int";
84 return false;
85 }
86
87 auto pointer_x =
args.FindMember(
"x");
88 if (!pointer_x->value.IsFloat() && !pointer_x->value.IsInt()) {
89 FML_LOG(ERROR) <<
"Argument 'Pointer.X' is not a float";
90 return false;
91 }
92
93 auto pointer_y =
args.FindMember(
"y");
94 if (!pointer_y->value.IsFloat() && !pointer_y->value.IsInt()) {
95 FML_LOG(ERROR) <<
"Argument 'Pointer.Y' is not a float";
96 return false;
97 }
98
99 auto pointer_id =
args.FindMember(
"pointerId");
100 if (!pointer_id->value.IsUint()) {
101 FML_LOG(ERROR) <<
"Argument 'pointerId' is not a uint32";
102 return false;
103 }
104
105 auto trace_flow_id =
args.FindMember(
"traceFlowId");
106 if (!trace_flow_id->value.IsInt()) {
107 FML_LOG(ERROR) <<
"Argument 'traceFlowId' is not a int";
108 return false;
109 }
110
111 auto width =
args.FindMember(
"logicalWidth");
112 if (!
width->value.IsFloat() && !
width->value.IsInt()) {
113 FML_LOG(ERROR) <<
"Argument 'logicalWidth' is not a float";
114 return false;
115 }
116
117 auto height =
args.FindMember(
"logicalHeight");
118 if (!
height->value.IsFloat() && !
height->value.IsInt()) {
119 FML_LOG(ERROR) <<
"Argument 'logicalHeight' is not a float";
120 return false;
121 }
122
123 auto timestamp =
args.FindMember(
"timestamp");
124 if (!timestamp->value.IsInt() && !timestamp->value.IsUint64()) {
125 FML_LOG(ERROR) <<
"Argument 'timestamp' is not a int";
126 return false;
127 }
128
129 PointerInjectorRequest event = {
130 .x = pointer_x->value.GetFloat(),
131 .y = pointer_y->value.GetFloat(),
132 .pointer_id = pointer_id->value.GetUint(),
134 .trace_flow_id = trace_flow_id->value.GetUint64(),
135 .logical_size = {
width->value.GetFloat(),
height->value.GetFloat()},
136 .timestamp = timestamp->value.GetInt()};
137
138
139 valid_views_.at(id).InjectEvent(std::move(event));
140 Complete(std::move(response), "[0]");
141 return true;
142}
static constexpr auto kPointerInjectorMethodPrefix
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
G_BEGIN_DECLS FlutterViewId view_id
#define FML_LOG(severity)
fuchsia::ui::pointer::EventPhase fup_EventPhase