• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "components/copresence/copresence_manager_impl.h"
6 
7 #include "base/bind.h"
8 #include "components/copresence/public/copresence_delegate.h"
9 #include "components/copresence/public/whispernet_client.h"
10 #include "components/copresence/rpc/rpc_handler.h"
11 
12 namespace copresence {
13 
PendingRequest(const copresence::ReportRequest & report,const std::string app_id,const StatusCallback & callback)14 PendingRequest::PendingRequest(const copresence::ReportRequest& report,
15                                const std::string app_id,
16                                const StatusCallback& callback)
17     : report(report), app_id(app_id), callback(callback) {
18 }
19 
~PendingRequest()20 PendingRequest::~PendingRequest() {
21 }
22 
23 // Public methods
24 
~CopresenceManagerImpl()25 CopresenceManagerImpl::~CopresenceManagerImpl() {}
26 
27 // Returns false if any operations were malformed.
ExecuteReportRequest(ReportRequest request,const std::string & app_id,const StatusCallback & callback)28 void CopresenceManagerImpl::ExecuteReportRequest(
29     ReportRequest request,
30     const std::string& app_id,
31     const StatusCallback& callback) {
32   // Don't take on any more requests. We can't execute them since init failed.
33   if (init_failed_) {
34     callback.Run(FAIL);
35     return;
36   }
37 
38   DCHECK(rpc_handler_.get());
39   if (pending_init_operations_) {
40     pending_requests_queue_.push_back(
41         PendingRequest(request, app_id, callback));
42   } else {
43     rpc_handler_->SendReportRequest(
44         make_scoped_ptr(new copresence::ReportRequest(request)),
45         app_id,
46         callback);
47   }
48 }
49 
50 // Private methods
51 
CopresenceManagerImpl(CopresenceDelegate * delegate)52 CopresenceManagerImpl::CopresenceManagerImpl(CopresenceDelegate* delegate)
53     : init_failed_(false),
54       pending_init_operations_(0),
55       delegate_(delegate) {
56   DCHECK(delegate);
57 }
58 
CompleteInitialization()59 void CopresenceManagerImpl::CompleteInitialization() {
60   if (pending_init_operations_)
61     return;
62 
63   DCHECK(rpc_handler_.get());
64   if (!init_failed_)
65     rpc_handler_->ConnectToWhispernet();
66 
67   for (std::vector<PendingRequest>::iterator request =
68            pending_requests_queue_.begin();
69        request != pending_requests_queue_.end();
70        ++request) {
71     if (init_failed_) {
72       request->callback.Run(FAIL);
73     } else {
74       rpc_handler_->SendReportRequest(
75           make_scoped_ptr(new copresence::ReportRequest(request->report)),
76           request->app_id,
77           request->callback);
78     }
79   }
80   pending_requests_queue_.clear();
81 }
82 
InitStepComplete(const std::string & step,bool success)83 void CopresenceManagerImpl::InitStepComplete(
84     const std::string& step, bool success) {
85   if (!success) {
86     LOG(ERROR) << step << " failed!";
87     init_failed_ = true;
88   }
89 
90   DVLOG(3) << "Init step: " << step << " complete.";
91   pending_init_operations_--;
92   CompleteInitialization();
93 }
94 
95 }  // namespace copresence
96