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