blob: 0b8517308589eebbf329c4047209eb2a327467a7 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/chromeos/printing/printer_event_tracker.h"
namespace chromeos {
namespace {
// Set the event_type on |event| based on |mode|.
void SetEventType(metrics::PrinterEventProto* event,
PrinterEventTracker::SetupMode mode) {
switch (mode) {
case PrinterEventTracker::kUnknownMode:
event->set_event_type(metrics::PrinterEventProto::UNKNOWN);
break;
case PrinterEventTracker::kUser:
event->set_event_type(metrics::PrinterEventProto::SETUP_MANUAL);
break;
case PrinterEventTracker::kAutomatic:
event->set_event_type(metrics::PrinterEventProto::SETUP_AUTOMATIC);
break;
}
}
// Populate PPD information in |event| based on |ppd|.
void SetPpdInfo(metrics::PrinterEventProto* event,
const Printer::PpdReference& ppd) {
if (!ppd.user_supplied_ppd_url.empty()) {
event->set_user_ppd(true);
} else if (!ppd.effective_make_and_model.empty()) {
event->set_ppd_identifier(ppd.effective_make_and_model);
}
// PPD information is not populated for autoconfigured printers.
}
// Add information to |event| specific to |usb_printer|.
void SetUsbInfo(metrics::PrinterEventProto* event,
const PrinterDetector::DetectedPrinter& detected) {
event->set_usb_vendor_id(detected.ppd_search_data.usb_vendor_id);
event->set_usb_model_id(detected.ppd_search_data.usb_product_id);
// TODO(skau) - Pull USB-specific manufacturer/model strings directly into
// DetectedPrinter and supply those here instead of the deprecated Printer
// fields.
event->set_usb_printer_manufacturer(detected.printer.manufacturer());
event->set_usb_printer_model(detected.printer.model());
}
// Add information to the |event| that only network printers have.
void SetNetworkPrinterInfo(metrics::PrinterEventProto* event,
const Printer& printer) {
if (!printer.make_and_model().empty()) {
event->set_ipp_make_and_model(printer.make_and_model());
}
}
} // namespace
PrinterEventTracker::PrinterEventTracker() = default;
PrinterEventTracker::~PrinterEventTracker() = default;
void PrinterEventTracker::set_logging(bool logging) {
base::AutoLock l(lock_);
logging_ = logging;
}
void PrinterEventTracker::RecordUsbPrinterInstalled(
const PrinterDetector::DetectedPrinter& detected,
SetupMode mode) {
base::AutoLock l(lock_);
if (!logging_) {
return;
}
metrics::PrinterEventProto event;
SetEventType(&event, mode);
SetPpdInfo(&event, detected.printer.ppd_reference());
SetUsbInfo(&event, detected);
events_.push_back(event);
}
void PrinterEventTracker::RecordIppPrinterInstalled(const Printer& printer,
SetupMode mode) {
base::AutoLock l(lock_);
if (!logging_) {
return;
}
metrics::PrinterEventProto event;
SetEventType(&event, mode);
SetPpdInfo(&event, printer.ppd_reference());
SetNetworkPrinterInfo(&event, printer);
events_.push_back(event);
}
void PrinterEventTracker::RecordUsbSetupAbandoned(
const PrinterDetector::DetectedPrinter& detected) {
base::AutoLock l(lock_);
if (!logging_) {
return;
}
metrics::PrinterEventProto event;
event.set_event_type(metrics::PrinterEventProto::SETUP_ABANDONED);
SetUsbInfo(&event, detected);
events_.push_back(event);
}
void PrinterEventTracker::RecordSetupAbandoned(const Printer& printer) {
base::AutoLock l(lock_);
if (!logging_) {
return;
}
metrics::PrinterEventProto event;
event.set_event_type(metrics::PrinterEventProto::SETUP_ABANDONED);
SetNetworkPrinterInfo(&event, printer);
events_.push_back(event);
}
void PrinterEventTracker::RecordPrinterRemoved(const Printer& printer) {
base::AutoLock l(lock_);
if (!logging_) {
return;
}
metrics::PrinterEventProto event;
event.set_event_type(metrics::PrinterEventProto::PRINTER_DELETED);
SetNetworkPrinterInfo(&event, printer);
SetPpdInfo(&event, printer.ppd_reference());
events_.push_back(event);
}
void PrinterEventTracker::FlushPrinterEvents(
std::vector<metrics::PrinterEventProto>* events) {
base::AutoLock l(lock_);
events->swap(events_);
events_.clear();
}
} // namespace chromeos