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
3// found in the LICENSE file.
4
5#ifndef COMPONENTS_COPRESENCE_COPRESENCE_MANAGER_IMPL_H_
6#define COMPONENTS_COPRESENCE_COPRESENCE_MANAGER_IMPL_H_
7
8#include <string>
9#include <vector>
10
11#include "base/callback.h"
12#include "base/cancelable_callback.h"
13#include "base/macros.h"
14#include "base/memory/scoped_ptr.h"
15#include "components/copresence/proto/rpcs.pb.h"
16#include "components/copresence/public/copresence_manager.h"
17
18namespace net {
19class URLContextGetter;
20}
21
22namespace copresence {
23
24class RpcHandler;
25
26struct PendingRequest {
27  PendingRequest(const ReportRequest& report,
28                 const std::string app_id,
29                 const StatusCallback& callback);
30  ~PendingRequest();
31
32  ReportRequest report;
33  std::string app_id;
34  StatusCallback callback;
35};
36
37// The implementation for CopresenceManager.
38class CopresenceManagerImpl : public CopresenceManager {
39 public:
40  virtual ~CopresenceManagerImpl();
41  virtual void ExecuteReportRequest(ReportRequest request,
42                                    const std::string& app_id,
43                                    const StatusCallback& callback) OVERRIDE;
44
45 private:
46  // Create managers with the CopresenceManager::Create() method.
47  friend class CopresenceManager;
48  CopresenceManagerImpl(CopresenceDelegate* delegate);
49
50  void CompleteInitialization();
51  void InitStepComplete(const std::string& step, bool success);
52
53  bool init_failed_;
54  std::vector<PendingRequest> pending_requests_queue_;
55
56  base::CancelableCallback<void(bool)> init_callback_;
57
58  // TODO(rkc): This code is almost identical to what we use in feedback to
59  // perform multiple blocking tasks and then run a post process method. Look
60  // into refactoring it all out to a common construct, like maybe a
61  // PostMultipleTasksAndReply?
62  size_t pending_init_operations_;
63
64  CopresenceDelegate* const delegate_;
65  scoped_ptr<RpcHandler> rpc_handler_;
66
67  DISALLOW_COPY_AND_ASSIGN(CopresenceManagerImpl);
68};
69
70}  // namespace copresence
71
72#endif  // COMPONENTS_COPRESENCE_COPRESENCE_MANAGER_IMPL_H_
73