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.
5 #include "google_apis/gcm/engine/checkin_request.h"
8 #include "base/message_loop/message_loop.h"
9 #include "google_apis/gcm/protocol/checkin.pb.h"
10 #include "net/http/http_status_code.h"
11 #include "net/url_request/url_fetcher.h"
12 #include "net/url_request/url_request_status.h"
18 const char kCheckinURL
[] = "https://android.clients.google.com/checkin";
19 const char kRequestContentType
[] = "application/x-protobuf";
20 const int kRequestVersionValue
= 2;
23 CheckinRequest::CheckinRequest(
24 const CheckinRequestCallback
& callback
,
25 const checkin_proto::ChromeBuildProto
& chrome_build_proto
,
26 int64 user_serial_number
,
28 uint64 security_token
,
29 net::URLRequestContextGetter
* request_context_getter
)
30 : request_context_getter_(request_context_getter
),
32 chrome_build_proto_(chrome_build_proto
),
33 android_id_(android_id
),
34 security_token_(security_token
),
35 user_serial_number_(user_serial_number
) {}
37 CheckinRequest::~CheckinRequest() {}
39 void CheckinRequest::Start() {
40 DCHECK(!url_fetcher_
.get());
42 checkin_proto::AndroidCheckinRequest request
;
43 request
.set_id(android_id_
);
44 request
.set_security_token(security_token_
);
45 request
.set_user_serial_number(user_serial_number_
);
46 request
.set_version(kRequestVersionValue
);
48 checkin_proto::AndroidCheckinProto
* checkin
= request
.mutable_checkin();
49 checkin
->mutable_chrome_build()->CopyFrom(chrome_build_proto_
);
50 #if defined(CHROME_OS)
51 checkin
->set_type(checkin_proto::DEVICE_CHROME_OS
);
53 checkin
->set_type(checkin_proto::DEVICE_CHROME_BROWSER
);
57 std::string upload_data
;
58 CHECK(request
.SerializeToString(&upload_data
));
61 net::URLFetcher::Create(GURL(kCheckinURL
), net::URLFetcher::POST
, this));
62 url_fetcher_
->SetRequestContext(request_context_getter_
);
63 url_fetcher_
->SetUploadData(kRequestContentType
, upload_data
);
64 url_fetcher_
->Start();
67 void CheckinRequest::OnURLFetchComplete(const net::URLFetcher
* source
) {
68 std::string response_string
;
69 checkin_proto::AndroidCheckinResponse response_proto
;
70 if (!source
->GetStatus().is_success() ||
71 source
->GetResponseCode() != net::HTTP_OK
||
72 !source
->GetResponseAsString(&response_string
) ||
73 !response_proto
.ParseFromString(response_string
)) {
74 LOG(ERROR
) << "Failed to get checkin response: "
75 << source
->GetStatus().is_success() << " "
76 << source
->GetResponseCode();
77 // TODO(fgorski): Handle retry logic for certain responses.
82 if (!response_proto
.has_android_id() ||
83 !response_proto
.has_security_token() ||
84 response_proto
.android_id() == 0 ||
85 response_proto
.security_token() == 0) {
86 LOG(ERROR
) << "Badly formatted checkin response.";
91 callback_
.Run(response_proto
.android_id(), response_proto
.security_token());