| 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/public/cpp/bindings/allocation_scope.h" | 8 #include "mojo/public/cpp/bindings/allocation_scope.h" |
| 9 #include "mojo/services/view_manager/node.h" | 9 #include "mojo/services/view_manager/node.h" |
| 10 #include "mojo/services/view_manager/root_node_manager.h" | 10 #include "mojo/services/view_manager/root_node_manager.h" |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 89 } | 89 } |
| 90 | 90 |
| 91 Node* ViewManagerConnection::GetNode(const NodeId& id) { | 91 Node* ViewManagerConnection::GetNode(const NodeId& id) { |
| 92 if (id_ == id.connection_id) { | 92 if (id_ == id.connection_id) { |
| 93 NodeMap::iterator i = node_map_.find(id.node_id); | 93 NodeMap::iterator i = node_map_.find(id.node_id); |
| 94 return i == node_map_.end() ? NULL : i->second; | 94 return i == node_map_.end() ? NULL : i->second; |
| 95 } | 95 } |
| 96 return context()->GetNode(id); | 96 return context()->GetNode(id); |
| 97 } | 97 } |
| 98 | 98 |
| 99 View* ViewManagerConnection::GetView(const ViewId& id) { | 99 service::View* ViewManagerConnection::GetView(const ViewId& id) { |
| 100 if (id_ == id.connection_id) { | 100 if (id_ == id.connection_id) { |
| 101 ViewMap::const_iterator i = view_map_.find(id.view_id); | 101 ViewMap::const_iterator i = view_map_.find(id.view_id); |
| 102 return i == view_map_.end() ? NULL : i->second; | 102 return i == view_map_.end() ? NULL : i->second; |
| 103 } | 103 } |
| 104 return context()->GetView(id); | 104 return context()->GetView(id); |
| 105 } | 105 } |
| 106 | 106 |
| 107 void ViewManagerConnection::NotifyNodeHierarchyChanged( | 107 void ViewManagerConnection::NotifyNodeHierarchyChanged( |
| 108 const NodeId& node, | 108 const NodeId& node, |
| 109 const NodeId& new_parent, | 109 const NodeId& new_parent, |
| (...skipping 19 matching lines...) Expand all Loading... |
| 129 } | 129 } |
| 130 | 130 |
| 131 void ViewManagerConnection::NotifyNodeDeleted( | 131 void ViewManagerConnection::NotifyNodeDeleted( |
| 132 const NodeId& node, | 132 const NodeId& node, |
| 133 TransportChangeId server_change_id, | 133 TransportChangeId server_change_id, |
| 134 TransportChangeId client_change_id) { | 134 TransportChangeId client_change_id) { |
| 135 client()->OnNodeDeleted(NodeIdToTransportId(node), server_change_id, | 135 client()->OnNodeDeleted(NodeIdToTransportId(node), server_change_id, |
| 136 client_change_id); | 136 client_change_id); |
| 137 } | 137 } |
| 138 | 138 |
| 139 void ViewManagerConnection::NotifyViewDeleted( |
| 140 const ViewId& view, |
| 141 TransportChangeId server_change_id, |
| 142 TransportChangeId client_change_id) { |
| 143 client()->OnViewDeleted(ViewIdToTransportId(view), server_change_id, |
| 144 client_change_id); |
| 145 } |
| 146 |
| 139 bool ViewManagerConnection::DeleteNodeImpl(ViewManagerConnection* source, | 147 bool ViewManagerConnection::DeleteNodeImpl(ViewManagerConnection* source, |
| 140 const NodeId& node_id, | 148 const NodeId& node_id, |
| 141 TransportChangeId change_id) { | 149 TransportChangeId change_id) { |
| 142 DCHECK_EQ(node_id.connection_id, id_); | 150 DCHECK_EQ(node_id.connection_id, id_); |
| 143 Node* node = GetNode(node_id); | 151 Node* node = GetNode(node_id); |
| 144 if (!node) | 152 if (!node) |
| 145 return false; | 153 return false; |
| 146 RootNodeManager::ScopedChange change( | 154 RootNodeManager::ScopedChange change( |
| 147 source, context(), change_id, | 155 source, context(), change_id, |
| 148 RootNodeManager::CHANGE_TYPE_ADVANCE_SERVER_CHANGE_ID); | 156 RootNodeManager::CHANGE_TYPE_ADVANCE_SERVER_CHANGE_ID); |
| 149 if (node->GetParent()) | 157 if (node->GetParent()) |
| 150 node->GetParent()->Remove(node); | 158 node->GetParent()->Remove(node); |
| 151 std::vector<Node*> children(node->GetChildren()); | 159 std::vector<Node*> children(node->GetChildren()); |
| 152 for (size_t i = 0; i < children.size(); ++i) | 160 for (size_t i = 0; i < children.size(); ++i) |
| 153 node->Remove(children[i]); | 161 node->Remove(children[i]); |
| 154 DCHECK(node->GetChildren().empty()); | 162 DCHECK(node->GetChildren().empty()); |
| 155 node_map_.erase(node_id.node_id); | 163 node_map_.erase(node_id.node_id); |
| 156 delete node; | 164 delete node; |
| 157 node = NULL; | 165 node = NULL; |
| 158 context()->NotifyNodeDeleted(node_id); | 166 context()->NotifyNodeDeleted(node_id); |
| 159 return true; | 167 return true; |
| 160 } | 168 } |
| 161 | 169 |
| 162 bool ViewManagerConnection::DeleteViewImpl(ViewManagerConnection* source, | 170 bool ViewManagerConnection::DeleteViewImpl(ViewManagerConnection* source, |
| 163 const ViewId& view_id, | 171 const ViewId& view_id, |
| 164 TransportChangeId change_id) { | 172 TransportChangeId change_id) { |
| 165 DCHECK_EQ(view_id.connection_id, id_); | 173 DCHECK_EQ(view_id.connection_id, id_); |
| 166 View* view = GetView(view_id); | 174 service::View* view = GetView(view_id); |
| 167 if (!view) | 175 if (!view) |
| 168 return false; | 176 return false; |
| 169 RootNodeManager::ScopedChange change( | 177 RootNodeManager::ScopedChange change( |
| 170 source, context(), change_id, | 178 source, context(), change_id, |
| 171 RootNodeManager::CHANGE_TYPE_DONT_ADVANCE_SERVER_CHANGE_ID); | 179 RootNodeManager::CHANGE_TYPE_DONT_ADVANCE_SERVER_CHANGE_ID); |
| 172 if (view->node()) | 180 if (view->node()) |
| 173 view->node()->SetView(NULL); | 181 view->node()->SetView(NULL); |
| 174 view_map_.erase(view_id.view_id); | 182 view_map_.erase(view_id.view_id); |
| 175 delete view; | 183 delete view; |
| 184 context()->NotifyViewDeleted(view_id); |
| 176 return true; | 185 return true; |
| 177 } | 186 } |
| 178 | 187 |
| 179 bool ViewManagerConnection::SetViewImpl(const NodeId& node_id, | 188 bool ViewManagerConnection::SetViewImpl(const NodeId& node_id, |
| 180 const ViewId& view_id, | 189 const ViewId& view_id, |
| 181 TransportChangeId change_id) { | 190 TransportChangeId change_id) { |
| 182 Node* node = GetNode(node_id); | 191 Node* node = GetNode(node_id); |
| 183 if (!node) | 192 if (!node) |
| 184 return false; | 193 return false; |
| 185 View* view = GetView(view_id); | 194 service::View* view = GetView(view_id); |
| 186 if (!view && view_id != ViewId()) | 195 if (!view && view_id != ViewId()) |
| 187 return false; | 196 return false; |
| 188 RootNodeManager::ScopedChange change( | 197 RootNodeManager::ScopedChange change( |
| 189 this, context(), change_id, | 198 this, context(), change_id, |
| 190 RootNodeManager::CHANGE_TYPE_DONT_ADVANCE_SERVER_CHANGE_ID); | 199 RootNodeManager::CHANGE_TYPE_DONT_ADVANCE_SERVER_CHANGE_ID); |
| 191 node->SetView(view); | 200 node->SetView(view); |
| 192 return true; | 201 return true; |
| 193 } | 202 } |
| 194 | 203 |
| 195 void ViewManagerConnection::CreateNode( | 204 void ViewManagerConnection::CreateNode( |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 269 callback.Run(array_builder.Finish()); | 278 callback.Run(array_builder.Finish()); |
| 270 } | 279 } |
| 271 | 280 |
| 272 void ViewManagerConnection::CreateView( | 281 void ViewManagerConnection::CreateView( |
| 273 TransportConnectionSpecificViewId view_id, | 282 TransportConnectionSpecificViewId view_id, |
| 274 const Callback<void(bool)>& callback) { | 283 const Callback<void(bool)>& callback) { |
| 275 if (view_map_.count(view_id)) { | 284 if (view_map_.count(view_id)) { |
| 276 callback.Run(false); | 285 callback.Run(false); |
| 277 return; | 286 return; |
| 278 } | 287 } |
| 279 view_map_[view_id] = new View(ViewId(id_, view_id)); | 288 view_map_[view_id] = new service::View(ViewId(id_, view_id)); |
| 280 callback.Run(true); | 289 callback.Run(true); |
| 281 } | 290 } |
| 282 | 291 |
| 283 void ViewManagerConnection::DeleteView( | 292 void ViewManagerConnection::DeleteView( |
| 284 TransportViewId transport_view_id, | 293 TransportViewId transport_view_id, |
| 285 TransportChangeId change_id, | 294 TransportChangeId change_id, |
| 286 const Callback<void(bool)>& callback) { | 295 const Callback<void(bool)>& callback) { |
| 287 const ViewId view_id(ViewIdFromTransportId(transport_view_id)); | 296 const ViewId view_id(ViewIdFromTransportId(transport_view_id)); |
| 288 ViewManagerConnection* connection = context()->GetConnection( | 297 ViewManagerConnection* connection = context()->GetConnection( |
| 289 view_id.connection_id); | 298 view_id.connection_id); |
| 290 callback.Run(connection && | 299 callback.Run(connection && |
| 291 connection->DeleteViewImpl(this, view_id, change_id)); | 300 connection->DeleteViewImpl(this, view_id, change_id)); |
| 292 } | 301 } |
| 293 | 302 |
| 294 void ViewManagerConnection::SetView( | 303 void ViewManagerConnection::SetView( |
| 295 TransportNodeId transport_node_id, | 304 TransportNodeId transport_node_id, |
| 296 TransportViewId transport_view_id, | 305 TransportViewId transport_view_id, |
| 297 TransportChangeId change_id, | 306 TransportChangeId change_id, |
| 298 const Callback<void(bool)>& callback) { | 307 const Callback<void(bool)>& callback) { |
| 299 const NodeId node_id(NodeIdFromTransportId(transport_node_id)); | 308 const NodeId node_id(NodeIdFromTransportId(transport_node_id)); |
| 300 callback.Run(SetViewImpl(node_id, ViewIdFromTransportId(transport_view_id), | 309 callback.Run(SetViewImpl(node_id, ViewIdFromTransportId(transport_view_id), |
| 301 change_id)); | 310 change_id)); |
| 302 } | 311 } |
| 303 | 312 |
| 304 void ViewManagerConnection::SetViewContents( | 313 void ViewManagerConnection::SetViewContents( |
| 305 TransportViewId view_id, | 314 TransportViewId view_id, |
| 306 ScopedSharedBufferHandle buffer, | 315 ScopedSharedBufferHandle buffer, |
| 307 uint32_t buffer_size) { | 316 uint32_t buffer_size) { |
| 308 View* view = GetView(ViewIdFromTransportId(view_id)); | 317 service::View* view = GetView(ViewIdFromTransportId(view_id)); |
| 309 if (!view) | 318 if (!view) |
| 310 return; | 319 return; |
| 311 void* handle_data; | 320 void* handle_data; |
| 312 if (MapBuffer(buffer.get(), 0, buffer_size, &handle_data, | 321 if (MapBuffer(buffer.get(), 0, buffer_size, &handle_data, |
| 313 MOJO_MAP_BUFFER_FLAG_NONE) != MOJO_RESULT_OK) { | 322 MOJO_MAP_BUFFER_FLAG_NONE) != MOJO_RESULT_OK) { |
| 314 return; | 323 return; |
| 315 } | 324 } |
| 316 SkBitmap bitmap; | 325 SkBitmap bitmap; |
| 317 gfx::PNGCodec::Decode(static_cast<const unsigned char*>(handle_data), | 326 gfx::PNGCodec::Decode(static_cast<const unsigned char*>(handle_data), |
| 318 buffer_size, &bitmap); | 327 buffer_size, &bitmap); |
| 319 view->SetBitmap(bitmap); | 328 view->SetBitmap(bitmap); |
| 320 UnmapBuffer(handle_data); | 329 UnmapBuffer(handle_data); |
| 321 } | 330 } |
| 322 | 331 |
| 323 void ViewManagerConnection::OnNodeHierarchyChanged(const NodeId& node, | 332 void ViewManagerConnection::OnNodeHierarchyChanged(const NodeId& node, |
| 324 const NodeId& new_parent, | 333 const NodeId& new_parent, |
| 325 const NodeId& old_parent) { | 334 const NodeId& old_parent) { |
| 326 context()->NotifyNodeHierarchyChanged(node, new_parent, old_parent); | 335 context()->NotifyNodeHierarchyChanged(node, new_parent, old_parent); |
| 327 } | 336 } |
| 328 | 337 |
| 329 void ViewManagerConnection::OnNodeViewReplaced(const NodeId& node, | 338 void ViewManagerConnection::OnNodeViewReplaced(const NodeId& node, |
| 330 const ViewId& new_view_id, | 339 const ViewId& new_view_id, |
| 331 const ViewId& old_view_id) { | 340 const ViewId& old_view_id) { |
| 332 context()->NotifyNodeViewReplaced(node, new_view_id, old_view_id); | 341 context()->NotifyNodeViewReplaced(node, new_view_id, old_view_id); |
| 333 } | 342 } |
| 334 | 343 |
| 335 } // namespace view_manager | 344 } // namespace view_manager |
| 336 } // namespace services | 345 } // namespace services |
| 337 } // namespace mojo | 346 } // namespace mojo |
| OLD | NEW |