1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file. 4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "cloud_print/gcp20/prototype/printer.h" 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include <limits.h> 8bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include <stdio.h> 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <algorithm> 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <string> 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <vector> 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 13558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/bind.h" 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/command_line.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/format_macros.h" 17ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/guid.h" 18a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/json/json_reader.h" 19a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/json/json_writer.h" 20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/rand_util.h" 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/string_number_conversions.h" 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/strings/string_util.h" 23558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/strings/stringprintf.h" 24a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "cloud_print/gcp20/prototype/command_line_reader.h" 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "cloud_print/gcp20/prototype/gcp20_switches.h" 263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cloud_print/gcp20/prototype/local_settings.h" 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "cloud_print/gcp20/prototype/service_parameters.h" 28bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "cloud_print/gcp20/prototype/special_io.h" 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "cloud_print/version.h" 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/base/net_util.h" 31ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "net/base/url_util.h" 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)const char kPrinterStatePathDefault[] = "printer_state.json"; 34a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace { 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 37558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochconst uint16 kHttpPortDefault = 10101; 383240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochconst uint32 kTtlDefault = 60*60; // in seconds 39558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 40bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochconst char kServiceType[] = "_privet._tcp.local"; 410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)const char kSecondaryServiceType[] = "_printer._sub._privet._tcp.local"; 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kServiceNamePrefixDefault[] = "gcp20_device_"; 43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const char kServiceDomainNameFormatDefault[] = "my-privet-device%d.local"; 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 45bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochconst char kPrinterName[] = "Google GCP2.0 Prototype"; 46bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochconst char kPrinterDescription[] = "Printer emulator"; 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 48bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochconst char kUserConfirmationTitle[] = "Confirm registration: type 'y' if you " 49bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch "agree and any other to discard\n"; 503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const int kUserConfirmationTimeout = 30; // in seconds 513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const int kRegistrationTimeout = 60; // in seconds 523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const int kReconnectTimeout = 5; // in seconds 53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)const double kTimeToNextAccessTokenUpdate = 0.8; // relatively to living time. 55558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 56bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochconst char kCdd[] = 57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)"{" 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" 'version': '1.0'," 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" 'printer': {" 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" 'supported_content_type': [" 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" {" 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" 'content_type': 'application/pdf'" 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" }," 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" {" 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" 'content_type': 'image/pwg-raster'" 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" }," 67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" {" 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" 'content_type': 'image/jpeg'" 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" }" 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" ]," 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" 'color': {" 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" 'option': [" 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" {" 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" 'is_default': true," 75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)" 'type': 'STANDARD_COLOR'" 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" }," 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" {" 78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)" 'type': 'STANDARD_MONOCHROME'" 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" }" 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" ]" 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" }," 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" 'media_size': {" 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" 'option': [ {" 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" 'height_microns': 297000," 85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)" 'name': 'ISO_A4'," 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" 'width_microns': 210000" 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" }, {" 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" 'custom_display_name': 'Letter'," 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" 'height_microns': 279400," 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" 'is_default': true," 91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)" 'name': 'NA_LETTER'," 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" 'width_microns': 215900" 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" } ]" 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" }," 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" 'page_orientation': {" 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" 'option': [ {" 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" 'is_default': true," 98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" 'type': 'PORTRAIT'" 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" }, {" 100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" 'type': 'LANDSCAPE'" 101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" } ]" 102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" }," 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" 'reverse_order': {" 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" 'default': false" 105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" }" 106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)" }" 107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)"}"; 108ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Returns local IP address number of first interface found (except loopback). 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Return value is empty if no interface found. Possible interfaces names are 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// "eth0", "wlan0" etc. If interface name is empty, function will return IP 112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// address of first interface found. 113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnet::IPAddressNumber GetLocalIp(const std::string& interface_name, 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool return_ipv6_number) { 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch net::NetworkInterfaceList interfaces; 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool success = net::GetNetworkList( 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &interfaces, net::INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES); 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(success); 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch size_t expected_address_size = return_ipv6_number ? net::kIPv6AddressSize 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : net::kIPv4AddressSize; 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (net::NetworkInterfaceList::iterator iter = interfaces.begin(); 124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch iter != interfaces.end(); ++iter) { 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (iter->address.size() == expected_address_size && 126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch (interface_name.empty() || interface_name == iter->name)) { 127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return iter->address; 128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return net::IPAddressNumber(); 132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)std::string GetDescription() { 135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string result = kPrinterDescription; 136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::IPAddressNumber ip = GetLocalIp("", false); 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!ip.empty()) 138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) result += " at " + net::IPAddressToString(ip); 139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return result; 140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner() { 143a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return base::MessageLoop::current()->message_loop_proxy(); 144a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 145a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace 147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 148558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochusing cloud_print_response_parser::Job; 149558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 150a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)Printer::Printer() 1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) : connection_state_(OFFLINE), 1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) http_server_(this), 153a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) on_idle_posted_(false), 154a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) pending_local_settings_check_(false), 1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) pending_print_jobs_check_(false), 1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) pending_deletion_(false) { 157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochPrinter::~Printer() { 160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Stop(); 161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool Printer::Start() { 164a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (IsRunning()) 165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) LoadFromFile(); 168ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (state_.local_settings.local_discovery && !StartLocalDiscoveryServers()) 170ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return false; 171ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 172a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) print_job_handler_.reset(new PrintJobHandler); 173a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch xtoken_ = XPrivetToken(); 174a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch starttime_ = base::Time::Now(); 175a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 176a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) TryConnect(); 177ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return true; 178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 180a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool Printer::IsRunning() const { 181a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return print_job_handler_; 182558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 183558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 184ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid Printer::Stop() { 1853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!IsRunning()) 1863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch dns_server_.Shutdown(); 188ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch http_server_.Shutdown(); 189ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch requester_.reset(); 190558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch print_job_handler_.reset(); 191a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) xmpp_listener_.reset(); 192a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 193a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)std::string Printer::GetRawCdd() { 195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string json_str; 196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::JSONWriter::WriteWithOptions(&GetCapabilities(), 197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::JSONWriter::OPTIONS_PRETTY_PRINT, 198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) &json_str); 199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return json_str; 2003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 2013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 202a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void Printer::OnAuthError() { 2033240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch LOG(ERROR) << "Auth error occurred"; 2043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state_.access_token_update = base::Time(); 2053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) FallOffline(true); 206a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 207a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 208a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)std::string Printer::GetAccessToken() { 2093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return state_.access_token; 210ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 211ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 212ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochPrivetHttpServer::RegistrationErrorStatus Printer::RegistrationStart( 213ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const std::string& user) { 2143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CheckRegistrationExpiration(); 2153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PrinterState::ConfirmationState conf_state = state_.confirmation_state; 2173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (state_.registration_state == PrinterState::REGISTRATION_ERROR || 2183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) conf_state == PrinterState::CONFIRMATION_TIMEOUT || 2193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) conf_state == PrinterState::CONFIRMATION_DISCARDED) { 2203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state_ = PrinterState(); 2213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 2223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 223a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch PrivetHttpServer::RegistrationErrorStatus status = CheckCommonRegErrors(user); 224a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (status != PrivetHttpServer::REG_ERROR_OK) 225ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return status; 226ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (state_.registration_state != PrinterState::UNREGISTERED) 228ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return PrivetHttpServer::REG_ERROR_INVALID_ACTION; 229ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) UpdateRegistrationExpiration(); 2313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state_ = PrinterState(); 2333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state_.user = user; 2343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state_.registration_state = PrinterState::REGISTRATION_STARTED; 235ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 236558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (CommandLine::ForCurrentProcess()->HasSwitch("disable-confirmation")) { 2373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state_.confirmation_state = PrinterState::CONFIRMATION_CONFIRMED; 238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) VLOG(0) << "Registration confirmed by default."; 239558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } else { 240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LOG(WARNING) << kUserConfirmationTitle; 241558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::Time valid_until = base::Time::Now() + 242558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::TimeDelta::FromSeconds(kUserConfirmationTimeout); 243558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::MessageLoop::current()->PostTask( 244558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch FROM_HERE, 245558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::Bind(&Printer::WaitUserConfirmation, AsWeakPtr(), valid_until)); 246558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 247bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 2483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) requester_->StartRegistration(GenerateProxyId(), kPrinterName, user, 249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) state_.local_settings, GetRawCdd()); 250ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 251ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return PrivetHttpServer::REG_ERROR_OK; 252ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 253ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 254ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochPrivetHttpServer::RegistrationErrorStatus Printer::RegistrationGetClaimToken( 255ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const std::string& user, 256ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::string* token, 257ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::string* claim_url) { 258a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch PrivetHttpServer::RegistrationErrorStatus status = CheckCommonRegErrors(user); 259a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (status != PrivetHttpServer::REG_ERROR_OK) 260ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return status; 261ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 262bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Check if |action=start| was called, but |action=complete| wasn't. 2633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (state_.registration_state != PrinterState::REGISTRATION_STARTED && 2643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state_.registration_state != 2653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PrinterState::REGISTRATION_CLAIM_TOKEN_READY) { 266bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return PrivetHttpServer::REG_ERROR_INVALID_ACTION; 2673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 268ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 269bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // If |action=getClaimToken| is valid in this state (was checked above) then 270bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // check confirmation status. 2713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (state_.confirmation_state != PrinterState::CONFIRMATION_CONFIRMED) 2723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return ConfirmationToRegistrationError(state_.confirmation_state); 2733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) UpdateRegistrationExpiration(); 275bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 2762385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // If reply wasn't received yet, reply with |pending_user_action| error. 2773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (state_.registration_state == PrinterState::REGISTRATION_STARTED) 2782385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return PrivetHttpServer::REG_ERROR_PENDING_USER_ACTION; 279ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK_EQ(state_.confirmation_state, PrinterState::CONFIRMATION_CONFIRMED); 2813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK_EQ(state_.registration_state, 2823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PrinterState::REGISTRATION_CLAIM_TOKEN_READY); 283ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *token = state_.registration_token; 2853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *claim_url = state_.complete_invite_url; 286bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return PrivetHttpServer::REG_ERROR_OK; 287ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 288ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 289ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochPrivetHttpServer::RegistrationErrorStatus Printer::RegistrationComplete( 290ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const std::string& user, 291ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::string* device_id) { 292a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch PrivetHttpServer::RegistrationErrorStatus status = CheckCommonRegErrors(user); 293a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (status != PrivetHttpServer::REG_ERROR_OK) 294ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return status; 295ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (state_.registration_state != PrinterState::REGISTRATION_CLAIM_TOKEN_READY) 297ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return PrivetHttpServer::REG_ERROR_INVALID_ACTION; 298ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) UpdateRegistrationExpiration(); 300bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 3013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (state_.confirmation_state != PrinterState::CONFIRMATION_CONFIRMED) 3023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return ConfirmationToRegistrationError(state_.confirmation_state); 3033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state_.registration_state = PrinterState::REGISTRATION_COMPLETING; 305ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch requester_->CompleteRegistration(); 3063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *device_id = state_.device_id; 307ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 308ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return PrivetHttpServer::REG_ERROR_OK; 309ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 310ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 311ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochPrivetHttpServer::RegistrationErrorStatus Printer::RegistrationCancel( 312ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const std::string& user) { 313a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch PrivetHttpServer::RegistrationErrorStatus status = CheckCommonRegErrors(user); 314a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (status != PrivetHttpServer::REG_ERROR_OK && 315a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch status != PrivetHttpServer::REG_ERROR_SERVER_ERROR) { 316ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return status; 317a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch } 318ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 3193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (state_.registration_state == PrinterState::UNREGISTERED) 320ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return PrivetHttpServer::REG_ERROR_INVALID_ACTION; 321ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 3223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) InvalidateRegistrationExpiration(); 3233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state_ = PrinterState(); 3253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 326a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) requester_.reset(new CloudPrintRequester(GetTaskRunner(), this)); 327bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 328ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return PrivetHttpServer::REG_ERROR_OK; 329ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 330ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 331ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid Printer::GetRegistrationServerError(std::string* description) { 3323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK_EQ(state_.registration_state, PrinterState::REGISTRATION_ERROR) 3333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) << "Method shouldn't be called when not needed."; 334ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 3353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *description = state_.error_description; 336ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 337ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 338ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid Printer::CreateInfo(PrivetHttpServer::DeviceInfo* info) { 3393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CheckRegistrationExpiration(); 3403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 341a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // TODO(maksymb): Replace "text" with constants. 342ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch *info = PrivetHttpServer::DeviceInfo(); 343ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch info->version = "1.0"; 344a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch info->name = kPrinterName; 345f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) info->description = GetDescription(); 346a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch info->url = kCloudPrintUrl; 3473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) info->id = state_.device_id; 348a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch info->device_state = "idle"; 349558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch info->connection_state = ConnectionStateToString(connection_state_); 350f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) info->manufacturer = COMPANY_FULLNAME_STRING; 351f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) info->model = "Prototype r" + std::string(LASTCHANGE_STRING); 352f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) info->serial_number = "20CB5FF2-B28C-4EFA-8DCD-516CFF0455A2"; 353f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) info->firmware = CHROME_VERSION_STRING; 354a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch info->uptime = static_cast<int>((base::Time::Now() - starttime_).InSeconds()); 355a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 356a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch info->x_privet_token = xtoken_.GenerateXToken(); 357a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 3583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // TODO(maksymb): Create enum for available APIs and replace 3593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // this API text names with constants from enum. API text names should be only 3603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // known in PrivetHttpServer. 3613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!IsRegistered()) { 362ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch info->api.push_back("/privet/register"); 3633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } else { 3643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) info->api.push_back("/privet/capabilities"); 3653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (IsLocalPrintingAllowed()) { 3663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) info->api.push_back("/privet/printer/createjob"); 3673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) info->api.push_back("/privet/printer/submitdoc"); 3683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) info->api.push_back("/privet/printer/jobstate"); 3693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 3703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 371a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 372a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch info->type.push_back("printer"); 373ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 374ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 375558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochbool Printer::IsRegistered() const { 3763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return state_.registration_state == PrinterState::REGISTERED; 3773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 3783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool Printer::IsLocalPrintingAllowed() const { 3803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return state_.local_settings.local_printing_enabled; 381558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 382558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 383558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochbool Printer::CheckXPrivetTokenHeader(const std::string& token) const { 384558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return xtoken_.CheckValidXToken(token); 385558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 386558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 387f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const base::DictionaryValue& Printer::GetCapabilities() { 388f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!state_.cdd.get()) { 389f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string cdd_string; 390a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::ReplaceChars(kCdd, "'", "\"", &cdd_string); 391f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<base::Value> json_val(base::JSONReader::Read(cdd_string)); 392f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::DictionaryValue* json = NULL; 393f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CHECK(json_val->GetAsDictionary(&json)); 394f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) state_.cdd.reset(json->DeepCopy()); 395f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 396f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return *state_.cdd; 3973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 3983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)LocalPrintJob::CreateResult Printer::CreateJob(const std::string& ticket, 4003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string* job_id, 4013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int* expires_in, 4023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int* error_timeout, 4033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string* error_description) { 4043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return print_job_handler_->CreatePrintJob(ticket, job_id, expires_in, 4053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) error_timeout, error_description); 4063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 4073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)LocalPrintJob::SaveResult Printer::SubmitDoc(const LocalPrintJob& job, 4093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string* job_id, 4103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int* expires_in, 4113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string* error_description, 4123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int* timeout) { 4133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return print_job_handler_->SaveLocalPrintJob(job, job_id, expires_in, 4143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) error_description, timeout); 4153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 4163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)LocalPrintJob::SaveResult Printer::SubmitDocWithId( 4183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const LocalPrintJob& job, 4193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& job_id, 4203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int* expires_in, 4213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string* error_description, 4223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int* timeout) { 4233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return print_job_handler_->CompleteLocalPrintJob(job, job_id, expires_in, 4243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) error_description, timeout); 4253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 4263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool Printer::GetJobState(const std::string& id, LocalPrintJob::Info* info) { 4283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return print_job_handler_->GetJobState(id, info); 4293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 4303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 431ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid Printer::OnRegistrationStartResponseParsed( 432ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const std::string& registration_token, 433ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const std::string& complete_invite_url, 434ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const std::string& device_id) { 4353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state_.registration_state = PrinterState::REGISTRATION_CLAIM_TOKEN_READY; 4363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state_.device_id = device_id; 4373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state_.registration_token = registration_token; 4383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state_.complete_invite_url = complete_invite_url; 439ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 440ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void Printer::OnRegistrationFinished(const std::string& refresh_token, 4423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& access_token, 4433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int access_token_expires_in_seconds) { 4443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) InvalidateRegistrationExpiration(); 4453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state_.registration_state = PrinterState::REGISTERED; 4473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state_.refresh_token = refresh_token; 448a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RememberAccessToken(access_token, access_token_expires_in_seconds); 449a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) TryConnect(); 450a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 451a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 452a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void Printer::OnAccesstokenReceviced(const std::string& access_token, 453a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int expires_in_seconds) { 454a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) VLOG(3) << "Function: " << __FUNCTION__; 455a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RememberAccessToken(access_token, expires_in_seconds); 456a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) switch (connection_state_) { 457a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case ONLINE: 458a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostOnIdle(); 459a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 460a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 461a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case CONNECTING: 462a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) TryConnect(); 463a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 464a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 465a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) default: 466a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) NOTREACHED(); 467a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 468a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 469a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 470a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void Printer::OnXmppJidReceived(const std::string& xmpp_jid) { 4713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state_.xmpp_jid = xmpp_jid; 472ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 473ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 474ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid Printer::OnRegistrationError(const std::string& description) { 475ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch LOG(ERROR) << "server_error: " << description; 476ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SetRegistrationError(description); 478ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 479ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 480a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void Printer::OnNetworkError() { 481558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch VLOG(3) << "Function: " << __FUNCTION__; 4823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) FallOffline(false); 483558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 484558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 485a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void Printer::OnServerError(const std::string& description) { 486558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch VLOG(3) << "Function: " << __FUNCTION__; 487a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LOG(ERROR) << "Server error: " << description; 4883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) FallOffline(false); 489558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 490558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 491558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid Printer::OnPrintJobsAvailable(const std::vector<Job>& jobs) { 492558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch VLOG(3) << "Function: " << __FUNCTION__; 493558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 494a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) VLOG(0) << "Available printjobs: " << jobs.size(); 495558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (jobs.empty()) { 496a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) pending_print_jobs_check_ = false; 497a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostOnIdle(); 498558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return; 499558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 500558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 501a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) VLOG(0) << "Downloading printjob."; 502558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch requester_->RequestPrintJob(jobs[0]); 503558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return; 504558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 505558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 506558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid Printer::OnPrintJobDownloaded(const Job& job) { 507558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch VLOG(3) << "Function: " << __FUNCTION__; 5083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) print_job_handler_->SavePrintJob(job.file, job.ticket, job.create_time, 509f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) job.job_id, job.title, "pdf"); 510558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch requester_->SendPrintJobDone(job.job_id); 511558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 512558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 513558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid Printer::OnPrintJobDone() { 514558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch VLOG(3) << "Function: " << __FUNCTION__; 515a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostOnIdle(); 516a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 517a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 5183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void Printer::OnLocalSettingsReceived(LocalSettings::State state, 5193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const LocalSettings& settings) { 5203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) pending_local_settings_check_ = false; 5213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) switch (state) { 5223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case LocalSettings::CURRENT: 523a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) VLOG(0) << "No new local settings"; 5243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PostOnIdle(); 5253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) break; 5263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case LocalSettings::PENDING: 527a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) VLOG(0) << "New local settings were received"; 5283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ApplyLocalSettings(settings); 5293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) break; 5303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case LocalSettings::PRINTER_DELETED: 5313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) LOG(WARNING) << "Printer was deleted on server"; 5323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) pending_deletion_ = true; 5333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PostOnIdle(); 5343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) break; 5353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 5363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) default: 5373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) NOTREACHED(); 5383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 5393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 5403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 5413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void Printer::OnLocalSettingsUpdated() { 5423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PostOnIdle(); 5433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 5443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 545a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void Printer::OnXmppConnected() { 546a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) pending_local_settings_check_ = true; 547a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) pending_print_jobs_check_ = true; 548a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ChangeState(ONLINE); 549a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostOnIdle(); 550a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 551a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 552a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void Printer::OnXmppAuthError() { 553a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnAuthError(); 554a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 555a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 556a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void Printer::OnXmppNetworkError() { 5573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) FallOffline(false); 558a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 559a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 560a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void Printer::OnXmppNewPrintJob(const std::string& device_id) { 5613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK_EQ(state_.device_id, device_id) << "Data should contain printer_id"; 562a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) pending_print_jobs_check_ = true; 563a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 564a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 565a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void Printer::OnXmppNewLocalSettings(const std::string& device_id) { 5663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK_EQ(state_.device_id, device_id) << "Data should contain printer_id"; 5673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) pending_local_settings_check_ = true; 568a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 569a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 570a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void Printer::OnXmppDeleteNotification(const std::string& device_id) { 5713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK_EQ(state_.device_id, device_id) << "Data should contain printer_id"; 5723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) pending_deletion_ = true; 573a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 574a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 575a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void Printer::TryConnect() { 576a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) VLOG(3) << "Function: " << __FUNCTION__; 577a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 578a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ChangeState(CONNECTING); 579a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!requester_) 580a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) requester_.reset(new CloudPrintRequester(GetTaskRunner(), this)); 581a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 582a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (IsRegistered()) { 5833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (state_.access_token_update < base::Time::Now()) { 5843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) requester_->UpdateAccesstoken(state_.refresh_token); 585a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } else { 586a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ConnectXmpp(); 587a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 588a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } else { 589a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // TODO(maksymb): Ping google.com to check connection state. 590a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ChangeState(ONLINE); 591a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 592a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 593a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 594a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void Printer::ConnectXmpp() { 595a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) xmpp_listener_.reset( 5963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) new CloudPrintXmppListener(state_.xmpp_jid, 5973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state_.local_settings.xmpp_timeout_value, 5983240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch GetTaskRunner(), this)); 5993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) xmpp_listener_->Connect(state_.access_token); 600a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 601a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 602a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void Printer::OnIdle() { 603a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK(IsRegistered()); 604a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK(on_idle_posted_) << "Instant call is not allowed"; 605a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) on_idle_posted_ = false; 606a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 607a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (connection_state_ != ONLINE) 608a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return; 609a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 6103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (pending_deletion_) { 6113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) OnPrinterDeleted(); 612a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return; 613a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 614a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 6153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (state_.access_token_update < base::Time::Now()) { 6163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) requester_->UpdateAccesstoken(state_.refresh_token); 6173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 6183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 619a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 6203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // TODO(maksymb): Check if privet-accesstoken was requested. 621a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 622a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (pending_local_settings_check_) { 623a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GetLocalSettings(); 624a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return; 625a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 626a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 627a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (pending_print_jobs_check_) { 628a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FetchPrintJobs(); 629a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return; 630a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 631a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 632a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::MessageLoop::current()->PostDelayedTask( 633a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FROM_HERE, 634a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&Printer::PostOnIdle, AsWeakPtr()), 635a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::TimeDelta::FromMilliseconds(1000)); 636a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 637a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 6383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void Printer::FetchPrintJobs() { 6393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) VLOG(3) << "Function: " << __FUNCTION__; 6403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK(IsRegistered()); 6413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) requester_->FetchPrintJobs(state_.device_id); 6423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 6433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 644a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void Printer::GetLocalSettings() { 6453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) VLOG(3) << "Function: " << __FUNCTION__; 646a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK(IsRegistered()); 6473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) requester_->RequestLocalSettings(state_.device_id); 6483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 649a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 6503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void Printer::ApplyLocalSettings(const LocalSettings& settings) { 6513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state_.local_settings = settings; 6523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SaveToFile(); 6533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 6543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (state_.local_settings.local_discovery) { 6553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool success = StartLocalDiscoveryServers(); 6563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!success) 6573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) LOG(ERROR) << "Local discovery servers cannot be started"; 6583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // TODO(maksymb): If start failed try to start them again after some timeout 6593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } else { 6603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) dns_server_.Shutdown(); 6613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) http_server_.Shutdown(); 6623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 6633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) xmpp_listener_->set_ping_interval(state_.local_settings.xmpp_timeout_value); 6643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 6653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) requester_->SendLocalSettings(state_.device_id, state_.local_settings); 666a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 667a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 6683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void Printer::OnPrinterDeleted() { 6693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) pending_deletion_ = false; 670a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 6713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state_ = PrinterState(); 6723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 6733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SaveToFile(); 6743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) Stop(); 6753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) Start(); 676a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 677a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 678a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void Printer::RememberAccessToken(const std::string& access_token, 679a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int expires_in_seconds) { 680a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) using base::Time; 681a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) using base::TimeDelta; 6823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state_.access_token = access_token; 683a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int64 time_to_update = static_cast<int64>(expires_in_seconds * 684a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) kTimeToNextAccessTokenUpdate); 6853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state_.access_token_update = 6863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) Time::Now() + TimeDelta::FromSeconds(time_to_update); 687a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) VLOG(0) << "Current access_token: " << access_token; 688a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) SaveToFile(); 689558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 690558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 6913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void Printer::SetRegistrationError(const std::string& description) { 6923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK(!IsRegistered()); 6933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state_.registration_state = PrinterState::REGISTRATION_ERROR; 6943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state_.error_description = description; 6953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 6963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 697a3f7b4e666c476898878fa745f637129375cd889Ben MurdochPrivetHttpServer::RegistrationErrorStatus Printer::CheckCommonRegErrors( 6983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& user) { 6993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CheckRegistrationExpiration(); 700a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch DCHECK(!IsRegistered()); 7013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (connection_state_ != ONLINE) 7023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return PrivetHttpServer::REG_ERROR_OFFLINE; 703ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 7043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (state_.registration_state != PrinterState::UNREGISTERED && 7053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) user != state_.user) { 706a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return PrivetHttpServer::REG_ERROR_DEVICE_BUSY; 707ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 708ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 7093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (state_.registration_state == PrinterState::REGISTRATION_ERROR) 710a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return PrivetHttpServer::REG_ERROR_SERVER_ERROR; 711ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 7123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK_EQ(connection_state_, ONLINE); 7133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 714a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return PrivetHttpServer::REG_ERROR_OK; 715a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 716a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 717bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochvoid Printer::WaitUserConfirmation(base::Time valid_until) { 7183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // TODO(maksymb): Move to separate class. 7193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 720bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (base::Time::Now() > valid_until) { 7213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state_.confirmation_state = PrinterState::CONFIRMATION_TIMEOUT; 722a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) VLOG(0) << "Confirmation timeout reached."; 723bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return; 724bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 725bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 726bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (_kbhit()) { 727bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int c = _getche(); 728bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (c == 'y' || c == 'Y') { 7293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state_.confirmation_state = PrinterState::CONFIRMATION_CONFIRMED; 730a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) VLOG(0) << "Registration confirmed by user."; 731bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } else { 7323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state_.confirmation_state = PrinterState::CONFIRMATION_DISCARDED; 733a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) VLOG(0) << "Registration discarded by user."; 734bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 735bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return; 736bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 737bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 738bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch base::MessageLoop::current()->PostDelayedTask( 739bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch FROM_HERE, 740bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch base::Bind(&Printer::WaitUserConfirmation, AsWeakPtr(), valid_until), 741bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch base::TimeDelta::FromMilliseconds(100)); 742bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 743bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 744a3f7b4e666c476898878fa745f637129375cd889Ben Murdochstd::string Printer::GenerateProxyId() const { 745a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return "{" + base::GenerateGUID() +"}"; 746eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 747eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 748eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstd::vector<std::string> Printer::CreateTxt() const { 749eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<std::string> txt; 750eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch txt.push_back("txtvers=1"); 751ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch txt.push_back("ty=" + std::string(kPrinterName)); 752f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) txt.push_back("note=" + std::string(GetDescription())); 753a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch txt.push_back("url=" + std::string(kCloudPrintUrl)); 754eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch txt.push_back("type=printer"); 7553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) txt.push_back("id=" + state_.device_id); 756558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch txt.push_back("cs=" + ConnectionStateToString(connection_state_)); 757eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 758eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return txt; 759eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 760eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 761f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void Printer::SaveToFile() { 762f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetCapabilities(); // Make sure capabilities created. 763a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::FilePath file_path; 764a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) file_path = file_path.AppendASCII( 765a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) command_line_reader::ReadStatePath(kPrinterStatePathDefault)); 766558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 7673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (printer_state::SaveToFile(file_path, state_)) { 768a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) VLOG(0) << "Printer state written to file"; 769a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch } else { 770a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) VLOG(0) << "Cannot write printer state to file"; 771a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch } 772a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 773a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 774a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool Printer::LoadFromFile() { 7753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state_ = PrinterState(); 7763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 777a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::FilePath file_path; 778a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) file_path = file_path.AppendASCII( 779a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) command_line_reader::ReadStatePath(kPrinterStatePathDefault)); 7803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 781a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (!base::PathExists(file_path)) { 782a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) VLOG(0) << "Printer state file not found"; 783a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return false; 784a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch } 785a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 7863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (printer_state::LoadFromFile(file_path, &state_)) { 787a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) VLOG(0) << "Printer state loaded from file"; 788f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SaveToFile(); 7893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } else { 790a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) VLOG(0) << "Reading/parsing printer state from file failed"; 791a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch } 792a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 7933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return true; 7943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 795a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 7963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void Printer::PostOnIdle() { 7973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) VLOG(3) << "Function: " << __FUNCTION__; 7983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK(!on_idle_posted_) << "Only one instance can be posted."; 7993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) on_idle_posted_ = true; 800a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 8013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::MessageLoop::current()->PostTask( 8023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) FROM_HERE, 8033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::Bind(&Printer::OnIdle, AsWeakPtr())); 8043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 805a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 8063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void Printer::CheckRegistrationExpiration() { 8073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!registration_expiration_.is_null() && 8083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) registration_expiration_ < base::Time::Now()) { 8093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state_ = PrinterState(); 8103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) InvalidateRegistrationExpiration(); 811a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch } 8123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 813a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 8143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void Printer::UpdateRegistrationExpiration() { 8153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) registration_expiration_ = 8163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::Time::Now() + base::TimeDelta::FromSeconds(kRegistrationTimeout); 8173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 818a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 8193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void Printer::InvalidateRegistrationExpiration() { 8203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) registration_expiration_ = base::Time(); 8213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 822a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 8233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool Printer::StartLocalDiscoveryServers() { 8243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!StartHttpServer()) 825a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 8263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!StartDnsServer()) { 8273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) http_server_.Shutdown(); 828a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 829a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 8303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return true; 8313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 832a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 8333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool Printer::StartDnsServer() { 8343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK(state_.local_settings.local_discovery); 8353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 8361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net::IPAddressNumber ipv4; 8371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net::IPAddressNumber ipv6; 8381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!base::CommandLine::ForCurrentProcess()->HasSwitch( 8401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switches::kDisableIpv4)) { 8411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ipv4 = GetLocalIp("", false); 8421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 8431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!base::CommandLine::ForCurrentProcess()->HasSwitch( 8441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switches::kDisableIpv6)) { 8451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ipv6 = GetLocalIp("", true); 8461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 8471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // TODO(maksymb): Add switch for command line to control interface name. 8491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (ipv4.empty() && ipv6.empty()) { 8503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) LOG(ERROR) << "No local IP found. Cannot start printer."; 851a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 852a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 853a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 8543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) uint16 port = command_line_reader::ReadHttpPort(kHttpPortDefault); 855a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 8561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci VLOG_IF(0, !ipv4.empty()) 8571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci << "Local IPv4 address: " << net::IPAddressToStringWithPort(ipv4, port); 8581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci VLOG_IF(0, !ipv6.empty()) 8591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci << "Local IPv6 address: " << net::IPAddressToStringWithPort(ipv6, port); 8601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string service_name_prefix = kServiceNamePrefixDefault; 8621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!ipv4.empty()) 8631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci service_name_prefix += net::IPAddressToString(ipv4); 8641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci service_name_prefix = 8651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci command_line_reader::ReadServiceNamePrefix(service_name_prefix); 8661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::replace( 8671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci service_name_prefix.begin(), service_name_prefix.end(), '.', '_'); 868a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 8693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string service_domain_name = 870a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) command_line_reader::ReadDomainName( 871a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::StringPrintf(kServiceDomainNameFormatDefault, 872a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::RandInt(0, INT_MAX))); 873a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 8741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ServiceParameters params(kServiceType, 8751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kSecondaryServiceType, 8761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci service_name_prefix, 8771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci service_domain_name, 8781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ipv4, 8791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ipv6, 8801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci port); 881558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 8823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return dns_server_.Start(params, 8833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) command_line_reader::ReadTtl(kTtlDefault), 8843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CreateTxt()); 8853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 8863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 8873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool Printer::StartHttpServer() { 8883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK(state_.local_settings.local_discovery); 8893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) using command_line_reader::ReadHttpPort; 8903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return http_server_.Start(ReadHttpPort(kHttpPortDefault)); 891558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 892558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 893bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochPrivetHttpServer::RegistrationErrorStatus 8943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)Printer::ConfirmationToRegistrationError( 8953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PrinterState::ConfirmationState state) { 896bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch switch (state) { 8973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case PrinterState::CONFIRMATION_PENDING: 898bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return PrivetHttpServer::REG_ERROR_PENDING_USER_ACTION; 8993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case PrinterState::CONFIRMATION_DISCARDED: 900bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return PrivetHttpServer::REG_ERROR_USER_CANCEL; 9013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case PrinterState::CONFIRMATION_CONFIRMED: 902bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 903bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return PrivetHttpServer::REG_ERROR_OK; 9043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case PrinterState::CONFIRMATION_TIMEOUT: 905bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return PrivetHttpServer::REG_ERROR_CONFIRMATION_TIMEOUT; 906bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch default: 907bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 908bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return PrivetHttpServer::REG_ERROR_OK; 909bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 910bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 911bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 912558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochstd::string Printer::ConnectionStateToString(ConnectionState state) const { 913558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch switch (state) { 914558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case OFFLINE: 915558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return "offline"; 916558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case ONLINE: 917558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return "online"; 918558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case CONNECTING: 919558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return "connecting"; 920558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case NOT_CONFIGURED: 921558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return "not-configured"; 922558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 923558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch default: 924558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch NOTREACHED(); 925558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return ""; 926558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 927558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 928558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 9293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void Printer::FallOffline(bool instant_reconnect) { 9303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool changed = ChangeState(OFFLINE); 9313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK(changed) << "Falling offline from offline is now allowed"; 9323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 9333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!IsRegistered()) 9343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SetRegistrationError("Cannot access server during registration process"); 9353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 9363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (instant_reconnect) { 9373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) TryConnect(); 9383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } else { 9393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::MessageLoop::current()->PostDelayedTask( 9403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) FROM_HERE, 9413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::Bind(&Printer::TryConnect, AsWeakPtr()), 9423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::TimeDelta::FromSeconds(kReconnectTimeout)); 9433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 9443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 9453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 946558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochbool Printer::ChangeState(ConnectionState new_state) { 947558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (connection_state_ == new_state) 948558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return false; 949558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 950558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch connection_state_ = new_state; 951a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) VLOG(0) << base::StringPrintf( 952a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) "Printer is now %s (%s)", 953a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ConnectionStateToString(connection_state_).c_str(), 954a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) IsRegistered() ? "registered" : "unregistered"); 955a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 956558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch dns_server_.UpdateMetadata(CreateTxt()); 957a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 9583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (connection_state_ == OFFLINE) { 9593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) requester_.reset(); 9603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) xmpp_listener_.reset(); 961a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 962a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 963558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return true; 964558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 965