1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file. 4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/spy/spy_server_impl.h" 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/public/cpp/system/core.h" 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace { 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool NextId(uint32_t* out_id) { 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static uint32_t id = 1; 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!++id) 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *out_id = id; 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace mojo { 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstruct SpyServerImpl::Item { 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch enum Type { 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kServiceIntercept, 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kMessage 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch }; 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch uint32_t id; 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Type type; 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Item(uint32_t id, Type type) : id(id), type(type) {} 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 35116680a4aac90f2aa7413d9095a592090648e557Ben MurdochSpyServerImpl::SpyServerImpl() : has_session_(false) { 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch BindToPipe(this, pipe_.handle0.Pass()); 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 39116680a4aac90f2aa7413d9095a592090648e557Ben MurdochSpyServerImpl::~SpyServerImpl() { 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid SpyServerImpl::StartSession( 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch spy_api::VersionPtr version, 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const mojo::Callback<void(spy_api::Result, mojo::String)>& callback) { 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (has_session_) { 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch callback.Run(spy_api::RESULT_RESOURCE_LIMIT, ""); 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch callback.Run(spy_api::RESULT_ALL_OK, "session 0"); 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch has_session_ = true; 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid SpyServerImpl::StopSession( 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const mojo::Callback<void(spy_api::Result)>& callback) { 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!has_session_) { 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch callback.Run(spy_api::RESULT_INVALID_CALL); 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch callback.Run(spy_api::RESULT_ALL_OK); 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch has_session_ = false; 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid SpyServerImpl::TrackConnection( 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch uint32_t id, 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch spy_api::ConnectionOptions options, 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const mojo::Callback<void(spy_api::Result)>& callback) { 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid SpyServerImpl::OnConnectionError() { 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Pipe got disconnected. 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid SpyServerImpl::OnIntercept(const GURL& url) { 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!has_session_) 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch uint32_t id; 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!NextId(&id)) { 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch client()->OnFatalError(spy_api::RESULT_NO_MORE_IDS); 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch items_[id] = new Item(id, Item::kServiceIntercept); 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch client()->OnClientConnection(url.possibly_invalid_spec(), 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch id, 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch spy_api::CONNECTION_OPTIONS_PEEK_MESSAGES); 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 88116680a4aac90f2aa7413d9095a592090648e557Ben MurdochScopedMessagePipeHandle SpyServerImpl::ServerPipe() { 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ScopedMessagePipeHandle(pipe_.handle1.Pass()).Pass(); 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace mojo 93