| Index: extensions/browser/api/printer_provider/printer_provider_api.cc
|
| diff --git a/extensions/browser/api/printer_provider/printer_provider_api.cc b/extensions/browser/api/printer_provider/printer_provider_api.cc
|
| index 04f663bd1f9443fa26f7fe978f04233312023f2f..d0244e4a3d8b7dd2784860562aa35c92f20ee783 100644
|
| --- a/extensions/browser/api/printer_provider/printer_provider_api.cc
|
| +++ b/extensions/browser/api/printer_provider/printer_provider_api.cc
|
| @@ -24,6 +24,35 @@ namespace {
|
| static base::LazyInstance<BrowserContextKeyedAPIFactory<PrinterProviderAPI>>
|
| g_api_factory = LAZY_INSTANCE_INITIALIZER;
|
|
|
| +// The separator between extension id and the extension's internal printer id
|
| +// used when generating a printer id unique across extensions.
|
| +const char kPrinterIdSeparator = ':';
|
| +
|
| +// Given an extension ID and an ID of a printer reported by the extension, it
|
| +// generates a ID for the printer unique across extensions (assuming that the
|
| +// printer id is unique in the extension's space).
|
| +std::string GeneratePrinterId(const std::string& extension_id,
|
| + const std::string& internal_printer_id) {
|
| + std::string result = extension_id;
|
| + result.append(1, kPrinterIdSeparator);
|
| + result.append(internal_printer_id);
|
| + return result;
|
| +}
|
| +
|
| +// Parses an ID created using |GeneratePrinterId| to it's components:
|
| +// the extension ID and the printer ID internal to the extension.
|
| +// Returns whenter the ID was succesfully parsed.
|
| +bool ParsePrinterId(const std::string& printer_id,
|
| + std::string* extension_id,
|
| + std::string* internal_printer_id) {
|
| + size_t separator = printer_id.find_first_of(kPrinterIdSeparator);
|
| + if (separator == std::string::npos)
|
| + return false;
|
| + *extension_id = printer_id.substr(0, separator);
|
| + *internal_printer_id = printer_id.substr(separator + 1);
|
| + return true;
|
| +}
|
| +
|
| PrinterProviderAPI::PrintError APIPrintErrorToInternalType(
|
| core_api::printer_provider_internal::PrintError error) {
|
| switch (error) {
|
| @@ -100,9 +129,15 @@ void PrinterProviderAPI::DispatchGetPrintersRequested(
|
| }
|
|
|
| void PrinterProviderAPI::DispatchGetCapabilityRequested(
|
| - const std::string& extension_id,
|
| const std::string& printer_id,
|
| const PrinterProviderAPI::GetCapabilityCallback& callback) {
|
| + std::string extension_id;
|
| + std::string internal_printer_id;
|
| + if (!ParsePrinterId(printer_id, &extension_id, &internal_printer_id)) {
|
| + callback.Run(base::DictionaryValue());
|
| + return;
|
| + }
|
| +
|
| EventRouter* event_router = EventRouter::Get(browser_context_);
|
| if (!event_router->ExtensionHasEventListener(
|
| extension_id,
|
| @@ -117,7 +152,7 @@ void PrinterProviderAPI::DispatchGetCapabilityRequested(
|
| // Request id is not part of the public API, but it will be massaged out in
|
| // custom bindings.
|
| internal_args->AppendInteger(request_id);
|
| - internal_args->AppendString(printer_id);
|
| + internal_args->AppendString(internal_printer_id);
|
|
|
| scoped_ptr<Event> event(new Event(
|
| core_api::printer_provider::OnGetCapabilityRequested::kEventName,
|
| @@ -127,9 +162,15 @@ void PrinterProviderAPI::DispatchGetCapabilityRequested(
|
| }
|
|
|
| void PrinterProviderAPI::DispatchPrintRequested(
|
| - const std::string& extension_id,
|
| const PrinterProviderAPI::PrintJob& job,
|
| const PrinterProviderAPI::PrintCallback& callback) {
|
| + std::string extension_id;
|
| + std::string internal_printer_id;
|
| + if (!ParsePrinterId(job.printer_id, &extension_id, &internal_printer_id)) {
|
| + callback.Run(PRINT_ERROR_FAILED);
|
| + return;
|
| + }
|
| +
|
| EventRouter* event_router = EventRouter::Get(browser_context_);
|
| if (!event_router->ExtensionHasEventListener(
|
| extension_id,
|
| @@ -139,7 +180,7 @@ void PrinterProviderAPI::DispatchPrintRequested(
|
| }
|
|
|
| core_api::printer_provider::PrintJob print_job;
|
| - print_job.printer_id = job.printer_id;
|
| + print_job.printer_id = internal_printer_id;
|
| print_job.content_type = job.content_type;
|
| print_job.document =
|
| std::vector<char>(job.document_bytes.begin(), job.document_bytes.end());
|
| @@ -268,11 +309,26 @@ bool PrinterProviderAPI::PendingPrintRequests::Complete(int request_id,
|
| return true;
|
| }
|
|
|
| -void PrinterProviderAPI::OnGetPrintersResult(const Extension* extension,
|
| - int request_id,
|
| - const base::ListValue& result) {
|
| +void PrinterProviderAPI::OnGetPrintersResult(
|
| + const Extension* extension,
|
| + int request_id,
|
| + const PrinterProviderInternalAPIObserver::PrinterInfoVector& result) {
|
| + base::ListValue printer_list;
|
| +
|
| + // Update some printer description properties to better identify the extension
|
| + // managing the printer.
|
| + for (size_t i = 0; i < result.size(); ++i) {
|
| + scoped_ptr<base::DictionaryValue> printer(result[i]->ToValue());
|
| + std::string internal_printer_id;
|
| + CHECK(printer->GetString("id", &internal_printer_id));
|
| + printer->SetString("id",
|
| + GeneratePrinterId(extension->id(), internal_printer_id));
|
| + printer->SetString("extensionId", extension->id());
|
| + printer_list.Append(printer.release());
|
| + }
|
| +
|
| pending_get_printers_requests_.CompleteForExtension(extension->id(),
|
| - request_id, result);
|
| + request_id, printer_list);
|
| }
|
|
|
| void PrinterProviderAPI::OnGetCapabilityResult(
|
|
|