OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "mojo/services/view_manager/view_manager_connection.h" | 5 #include "mojo/services/view_manager/view_manager_connection.h" |
6 | 6 |
7 #include "base/stl_util.h" | 7 #include "base/stl_util.h" |
8 #include "mojo/services/view_manager/node.h" | 8 #include "mojo/services/view_manager/node.h" |
9 #include "mojo/services/view_manager/root_node_manager.h" | 9 #include "mojo/services/view_manager/root_node_manager.h" |
10 #include "mojo/services/view_manager/view.h" | 10 #include "mojo/services/view_manager/view.h" |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
59 ViewMap::const_iterator i = view_map_.find(id.view_id); | 59 ViewMap::const_iterator i = view_map_.find(id.view_id); |
60 return i == view_map_.end() ? NULL : i->second; | 60 return i == view_map_.end() ? NULL : i->second; |
61 } | 61 } |
62 return context()->GetView(id); | 62 return context()->GetView(id); |
63 } | 63 } |
64 | 64 |
65 void ViewManagerConnection::NotifyNodeHierarchyChanged( | 65 void ViewManagerConnection::NotifyNodeHierarchyChanged( |
66 const NodeId& node, | 66 const NodeId& node, |
67 const NodeId& new_parent, | 67 const NodeId& new_parent, |
68 const NodeId& old_parent, | 68 const NodeId& old_parent, |
69 int32_t change_id) { | 69 ChangeId change_id) { |
70 client()->OnNodeHierarchyChanged(NodeIdToTransportId(node), | 70 client()->OnNodeHierarchyChanged(NodeIdToTransportId(node), |
71 NodeIdToTransportId(new_parent), | 71 NodeIdToTransportId(new_parent), |
72 NodeIdToTransportId(old_parent), | 72 NodeIdToTransportId(old_parent), |
73 change_id); | 73 change_id); |
74 } | 74 } |
75 | 75 |
76 void ViewManagerConnection::NotifyNodeViewReplaced(const NodeId& node, | 76 void ViewManagerConnection::NotifyNodeViewReplaced(const NodeId& node, |
77 const ViewId& new_view_id, | 77 const ViewId& new_view_id, |
78 const ViewId& old_view_id, | 78 const ViewId& old_view_id, |
79 int32_t change_id) { | 79 ChangeId change_id) { |
80 client()->OnNodeViewReplaced(NodeIdToTransportId(node), | 80 client()->OnNodeViewReplaced(NodeIdToTransportId(node), |
81 ViewIdToTransportId(new_view_id), | 81 ViewIdToTransportId(new_view_id), |
82 ViewIdToTransportId(old_view_id), | 82 ViewIdToTransportId(old_view_id), |
83 change_id); | 83 change_id); |
84 } | 84 } |
85 | 85 |
86 bool ViewManagerConnection::DeleteNodeImpl(ViewManagerConnection* source, | 86 bool ViewManagerConnection::DeleteNodeImpl(ViewManagerConnection* source, |
87 const NodeId& node_id, | 87 const NodeId& node_id, |
88 int32_t change_id) { | 88 ChangeId change_id) { |
89 DCHECK_EQ(node_id.connection_id, id_); | 89 DCHECK_EQ(node_id.connection_id, id_); |
90 Node* node = GetNode(node_id); | 90 Node* node = GetNode(node_id); |
91 if (!node) | 91 if (!node) |
92 return false; | 92 return false; |
93 RootNodeManager::ScopedChange change(source, context(), change_id); | 93 RootNodeManager::ScopedChange change(source, context(), change_id); |
94 if (node->GetParent()) | 94 if (node->GetParent()) |
95 node->GetParent()->Remove(node); | 95 node->GetParent()->Remove(node); |
96 std::vector<Node*> children(node->GetChildren()); | 96 std::vector<Node*> children(node->GetChildren()); |
97 for (size_t i = 0; i < children.size(); ++i) | 97 for (size_t i = 0; i < children.size(); ++i) |
98 node->Remove(children[i]); | 98 node->Remove(children[i]); |
99 DCHECK(node->GetChildren().empty()); | 99 DCHECK(node->GetChildren().empty()); |
100 node_map_.erase(node_id.node_id); | 100 node_map_.erase(node_id.node_id); |
101 delete node; | 101 delete node; |
102 return true; | 102 return true; |
103 } | 103 } |
104 | 104 |
105 bool ViewManagerConnection::DeleteViewImpl(ViewManagerConnection* source, | 105 bool ViewManagerConnection::DeleteViewImpl(ViewManagerConnection* source, |
106 const ViewId& view_id, | 106 const ViewId& view_id, |
107 int32_t change_id) { | 107 ChangeId change_id) { |
108 DCHECK_EQ(view_id.connection_id, id_); | 108 DCHECK_EQ(view_id.connection_id, id_); |
109 View* view = GetView(view_id); | 109 View* view = GetView(view_id); |
110 if (!view) | 110 if (!view) |
111 return false; | 111 return false; |
112 RootNodeManager::ScopedChange change(source, context(), change_id); | 112 RootNodeManager::ScopedChange change(source, context(), change_id); |
113 if (view->node()) | 113 if (view->node()) |
114 view->node()->SetView(NULL); | 114 view->node()->SetView(NULL); |
115 view_map_.erase(view_id.view_id); | 115 view_map_.erase(view_id.view_id); |
116 delete view; | 116 delete view; |
117 return true; | 117 return true; |
118 } | 118 } |
119 | 119 |
120 bool ViewManagerConnection::SetViewImpl(const NodeId& node_id, | 120 bool ViewManagerConnection::SetViewImpl(const NodeId& node_id, |
121 const ViewId& view_id, | 121 const ViewId& view_id, |
122 int32_t change_id) { | 122 ChangeId change_id) { |
123 Node* node = GetNode(node_id); | 123 Node* node = GetNode(node_id); |
124 if (!node) | 124 if (!node) |
125 return false; | 125 return false; |
126 View* view = GetView(view_id); | 126 View* view = GetView(view_id); |
127 if (!view && view_id != ViewId()) | 127 if (!view && view_id != ViewId()) |
128 return false; | 128 return false; |
129 RootNodeManager::ScopedChange change(this, context(), change_id); | 129 RootNodeManager::ScopedChange change(this, context(), change_id); |
130 node->SetView(view); | 130 node->SetView(view); |
131 return true; | 131 return true; |
132 } | 132 } |
133 | 133 |
134 void ViewManagerConnection::CreateNode( | 134 void ViewManagerConnection::CreateNode( |
135 uint16_t node_id, | 135 uint16_t node_id, |
136 const Callback<void(bool)>& callback) { | 136 const Callback<void(bool)>& callback) { |
137 // Negative values are reserved. | 137 // Negative values are reserved. |
138 if (node_map_.find(node_id) != node_map_.end()) { | 138 if (node_map_.find(node_id) != node_map_.end()) { |
139 callback.Run(false); | 139 callback.Run(false); |
140 return; | 140 return; |
141 } | 141 } |
142 node_map_[node_id] = new Node(this, NodeId(id_, node_id)); | 142 node_map_[node_id] = new Node(this, NodeId(id_, node_id)); |
143 callback.Run(true); | 143 callback.Run(true); |
144 } | 144 } |
145 | 145 |
146 void ViewManagerConnection::DeleteNode( | 146 void ViewManagerConnection::DeleteNode( |
147 uint32_t transport_node_id, | 147 uint32_t transport_node_id, |
148 int32_t change_id, | 148 ChangeId change_id, |
149 const mojo::Callback<void(bool)>& callback) { | 149 const mojo::Callback<void(bool)>& callback) { |
150 const NodeId node_id(NodeIdFromTransportId(transport_node_id)); | 150 const NodeId node_id(NodeIdFromTransportId(transport_node_id)); |
151 ViewManagerConnection* connection = context()->GetConnection( | 151 ViewManagerConnection* connection = context()->GetConnection( |
152 node_id.connection_id); | 152 node_id.connection_id); |
153 callback.Run(connection && | 153 callback.Run(connection && |
154 connection->DeleteNodeImpl(this, node_id, change_id)); | 154 connection->DeleteNodeImpl(this, node_id, change_id)); |
155 } | 155 } |
156 | 156 |
157 void ViewManagerConnection::AddNode( | 157 void ViewManagerConnection::AddNode( |
158 uint32_t parent_id, | 158 uint32_t parent_id, |
159 uint32_t child_id, | 159 uint32_t child_id, |
160 int32_t change_id, | 160 ChangeId change_id, |
161 const Callback<void(bool)>& callback) { | 161 const Callback<void(bool)>& callback) { |
162 Node* parent = GetNode(NodeIdFromTransportId(parent_id)); | 162 Node* parent = GetNode(NodeIdFromTransportId(parent_id)); |
163 Node* child = GetNode(NodeIdFromTransportId(child_id)); | 163 Node* child = GetNode(NodeIdFromTransportId(child_id)); |
164 const bool success = parent && child && parent != child; | 164 const bool success = parent && child && parent != child; |
165 if (success) { | 165 if (success) { |
166 RootNodeManager::ScopedChange change(this, context(), change_id); | 166 RootNodeManager::ScopedChange change(this, context(), change_id); |
167 parent->Add(child); | 167 parent->Add(child); |
168 } | 168 } |
169 callback.Run(success); | 169 callback.Run(success); |
170 } | 170 } |
171 | 171 |
172 void ViewManagerConnection::RemoveNodeFromParent( | 172 void ViewManagerConnection::RemoveNodeFromParent( |
173 uint32_t node_id, | 173 uint32_t node_id, |
174 int32_t change_id, | 174 ChangeId change_id, |
175 const Callback<void(bool)>& callback) { | 175 const Callback<void(bool)>& callback) { |
176 Node* node = GetNode(NodeIdFromTransportId(node_id)); | 176 Node* node = GetNode(NodeIdFromTransportId(node_id)); |
177 const bool success = (node && node->GetParent()); | 177 const bool success = (node && node->GetParent()); |
178 if (success) { | 178 if (success) { |
179 RootNodeManager::ScopedChange change(this, context(), change_id); | 179 RootNodeManager::ScopedChange change(this, context(), change_id); |
180 node->GetParent()->Remove(node); | 180 node->GetParent()->Remove(node); |
181 } | 181 } |
182 callback.Run(success); | 182 callback.Run(success); |
183 } | 183 } |
184 | 184 |
185 void ViewManagerConnection::CreateView( | 185 void ViewManagerConnection::CreateView( |
186 uint16_t view_id, | 186 uint16_t view_id, |
187 const mojo::Callback<void(bool)>& callback) { | 187 const mojo::Callback<void(bool)>& callback) { |
188 if (view_map_.count(view_id)) { | 188 if (view_map_.count(view_id)) { |
189 callback.Run(false); | 189 callback.Run(false); |
190 return; | 190 return; |
191 } | 191 } |
192 view_map_[view_id] = new View(ViewId(id_, view_id)); | 192 view_map_[view_id] = new View(ViewId(id_, view_id)); |
193 callback.Run(true); | 193 callback.Run(true); |
194 } | 194 } |
195 | 195 |
196 void ViewManagerConnection::DeleteView( | 196 void ViewManagerConnection::DeleteView( |
197 uint32_t transport_view_id, | 197 uint32_t transport_view_id, |
198 int32_t change_id, | 198 ChangeId change_id, |
199 const mojo::Callback<void(bool)>& callback) { | 199 const mojo::Callback<void(bool)>& callback) { |
200 const ViewId view_id(ViewIdFromTransportId(transport_view_id)); | 200 const ViewId view_id(ViewIdFromTransportId(transport_view_id)); |
201 ViewManagerConnection* connection = context()->GetConnection( | 201 ViewManagerConnection* connection = context()->GetConnection( |
202 view_id.connection_id); | 202 view_id.connection_id); |
203 callback.Run(connection && | 203 callback.Run(connection && |
204 connection->DeleteViewImpl(this, view_id, change_id)); | 204 connection->DeleteViewImpl(this, view_id, change_id)); |
205 } | 205 } |
206 | 206 |
207 void ViewManagerConnection::SetView( | 207 void ViewManagerConnection::SetView( |
208 uint32_t transport_node_id, | 208 uint32_t transport_node_id, |
209 uint32_t transport_view_id, | 209 uint32_t transport_view_id, |
210 int32_t change_id, | 210 ChangeId change_id, |
211 const mojo::Callback<void(bool)>& callback) { | 211 const mojo::Callback<void(bool)>& callback) { |
212 const NodeId node_id(NodeIdFromTransportId(transport_node_id)); | 212 const NodeId node_id(NodeIdFromTransportId(transport_node_id)); |
213 callback.Run(SetViewImpl(node_id, ViewIdFromTransportId(transport_view_id), | 213 callback.Run(SetViewImpl(node_id, ViewIdFromTransportId(transport_view_id), |
214 change_id)); | 214 change_id)); |
215 } | 215 } |
216 | 216 |
217 void ViewManagerConnection::OnNodeHierarchyChanged(const NodeId& node, | 217 void ViewManagerConnection::OnNodeHierarchyChanged(const NodeId& node, |
218 const NodeId& new_parent, | 218 const NodeId& new_parent, |
219 const NodeId& old_parent) { | 219 const NodeId& old_parent) { |
220 context()->NotifyNodeHierarchyChanged(node, new_parent, old_parent); | 220 context()->NotifyNodeHierarchyChanged(node, new_parent, old_parent); |
221 } | 221 } |
222 | 222 |
223 void ViewManagerConnection::OnNodeViewReplaced(const NodeId& node, | 223 void ViewManagerConnection::OnNodeViewReplaced(const NodeId& node, |
224 const ViewId& new_view_id, | 224 const ViewId& new_view_id, |
225 const ViewId& old_view_id) { | 225 const ViewId& old_view_id) { |
226 context()->NotifyNodeViewReplaced(node, new_view_id, old_view_id); | 226 context()->NotifyNodeViewReplaced(node, new_view_id, old_view_id); |
227 } | 227 } |
228 | 228 |
229 } // namespace view_manager | 229 } // namespace view_manager |
230 } // namespace services | 230 } // namespace services |
231 } // namespace mojo | 231 } // namespace mojo |
OLD | NEW |