1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "extensions/browser/api/printer_provider_internal/printer_provider_internal_api.h"
10 #include "base/bind.h"
11 #include "base/guid.h"
12 #include "base/lazy_instance.h"
13 #include "base/location.h"
14 #include "base/memory/ref_counted_memory.h"
15 #include "base/memory/scoped_ptr.h"
16 #include "base/values.h"
17 #include "content/public/browser/blob_handle.h"
18 #include "content/public/browser/browser_context.h"
19 #include "content/public/browser/browser_thread.h"
20 #include "content/public/browser/render_frame_host.h"
21 #include "content/public/browser/render_process_host.h"
22 #include "content/public/browser/web_contents.h"
23 #include "extensions/browser/api/printer_provider/printer_provider_api.h"
24 #include "extensions/browser/api/printer_provider/printer_provider_api_factory.h"
25 #include "extensions/browser/api/printer_provider/printer_provider_print_job.h"
26 #include "extensions/browser/blob_holder.h"
27 #include "extensions/common/api/printer_provider.h"
28 #include "extensions/common/api/printer_provider_internal.h"
30 namespace internal_api
= extensions::api::printer_provider_internal
;
32 namespace extensions
{
36 static base::LazyInstance
<
37 BrowserContextKeyedAPIFactory
<PrinterProviderInternalAPI
>> g_api_factory
=
38 LAZY_INSTANCE_INITIALIZER
;
43 BrowserContextKeyedAPIFactory
<PrinterProviderInternalAPI
>*
44 PrinterProviderInternalAPI::GetFactoryInstance() {
45 return g_api_factory
.Pointer();
48 PrinterProviderInternalAPI::PrinterProviderInternalAPI(
49 content::BrowserContext
* browser_context
) {
52 PrinterProviderInternalAPI::~PrinterProviderInternalAPI() {
55 void PrinterProviderInternalAPI::AddObserver(
56 PrinterProviderInternalAPIObserver
* observer
) {
57 observers_
.AddObserver(observer
);
60 void PrinterProviderInternalAPI::RemoveObserver(
61 PrinterProviderInternalAPIObserver
* observer
) {
62 observers_
.RemoveObserver(observer
);
65 void PrinterProviderInternalAPI::NotifyGetPrintersResult(
66 const Extension
* extension
,
68 const PrinterProviderInternalAPIObserver::PrinterInfoVector
& printers
) {
69 FOR_EACH_OBSERVER(PrinterProviderInternalAPIObserver
, observers_
,
70 OnGetPrintersResult(extension
, request_id
, printers
));
73 void PrinterProviderInternalAPI::NotifyGetCapabilityResult(
74 const Extension
* extension
,
76 const base::DictionaryValue
& capability
) {
77 FOR_EACH_OBSERVER(PrinterProviderInternalAPIObserver
, observers_
,
78 OnGetCapabilityResult(extension
, request_id
, capability
));
81 void PrinterProviderInternalAPI::NotifyPrintResult(
82 const Extension
* extension
,
84 api::printer_provider_internal::PrintError error
) {
85 FOR_EACH_OBSERVER(PrinterProviderInternalAPIObserver
, observers_
,
86 OnPrintResult(extension
, request_id
, error
));
89 void PrinterProviderInternalAPI::NotifyGetUsbPrinterInfoResult(
90 const Extension
* extension
,
92 const api::printer_provider::PrinterInfo
* printer_info
) {
94 PrinterProviderInternalAPIObserver
, observers_
,
95 OnGetUsbPrinterInfoResult(extension
, request_id
, printer_info
));
98 PrinterProviderInternalReportPrintResultFunction::
99 PrinterProviderInternalReportPrintResultFunction() {
102 PrinterProviderInternalReportPrintResultFunction::
103 ~PrinterProviderInternalReportPrintResultFunction() {
106 ExtensionFunction::ResponseAction
107 PrinterProviderInternalReportPrintResultFunction::Run() {
108 scoped_ptr
<internal_api::ReportPrintResult::Params
> params(
109 internal_api::ReportPrintResult::Params::Create(*args_
));
110 EXTENSION_FUNCTION_VALIDATE(params
.get());
112 PrinterProviderInternalAPI::GetFactoryInstance()
113 ->Get(browser_context())
114 ->NotifyPrintResult(extension(), params
->request_id
, params
->error
);
115 return RespondNow(NoArguments());
118 PrinterProviderInternalReportPrinterCapabilityFunction::
119 PrinterProviderInternalReportPrinterCapabilityFunction() {
122 PrinterProviderInternalReportPrinterCapabilityFunction::
123 ~PrinterProviderInternalReportPrinterCapabilityFunction() {
126 ExtensionFunction::ResponseAction
127 PrinterProviderInternalReportPrinterCapabilityFunction::Run() {
128 scoped_ptr
<internal_api::ReportPrinterCapability::Params
> params(
129 internal_api::ReportPrinterCapability::Params::Create(*args_
));
130 EXTENSION_FUNCTION_VALIDATE(params
.get());
132 if (params
->capability
) {
133 PrinterProviderInternalAPI::GetFactoryInstance()
134 ->Get(browser_context())
135 ->NotifyGetCapabilityResult(extension(), params
->request_id
,
136 params
->capability
->additional_properties
);
138 PrinterProviderInternalAPI::GetFactoryInstance()
139 ->Get(browser_context())
140 ->NotifyGetCapabilityResult(extension(), params
->request_id
,
141 base::DictionaryValue());
143 return RespondNow(NoArguments());
146 PrinterProviderInternalReportPrintersFunction::
147 PrinterProviderInternalReportPrintersFunction() {
150 PrinterProviderInternalReportPrintersFunction::
151 ~PrinterProviderInternalReportPrintersFunction() {
154 ExtensionFunction::ResponseAction
155 PrinterProviderInternalReportPrintersFunction::Run() {
156 scoped_ptr
<internal_api::ReportPrinters::Params
> params(
157 internal_api::ReportPrinters::Params::Create(*args_
));
158 EXTENSION_FUNCTION_VALIDATE(params
.get());
160 base::ListValue printers
;
161 if (params
->printers
) {
162 PrinterProviderInternalAPI::GetFactoryInstance()
163 ->Get(browser_context())
164 ->NotifyGetPrintersResult(extension(), params
->request_id
,
167 PrinterProviderInternalAPI::GetFactoryInstance()
168 ->Get(browser_context())
169 ->NotifyGetPrintersResult(
170 extension(), params
->request_id
,
171 PrinterProviderInternalAPIObserver::PrinterInfoVector());
173 return RespondNow(NoArguments());
176 PrinterProviderInternalGetPrintDataFunction::
177 PrinterProviderInternalGetPrintDataFunction() {
180 PrinterProviderInternalGetPrintDataFunction::
181 ~PrinterProviderInternalGetPrintDataFunction() {
184 ExtensionFunction::ResponseAction
185 PrinterProviderInternalGetPrintDataFunction::Run() {
186 scoped_ptr
<internal_api::GetPrintData::Params
> params(
187 internal_api::GetPrintData::Params::Create(*args_
));
188 EXTENSION_FUNCTION_VALIDATE(params
.get());
190 const PrinterProviderPrintJob
* job
=
191 PrinterProviderAPIFactory::GetInstance()
192 ->GetForBrowserContext(browser_context())
193 ->GetPrintJob(extension(), params
->request_id
);
195 return RespondNow(Error("Print request not found."));
197 if (job
->document_bytes
.get()) {
198 // |job->document_bytes| are passed to the callback to make sure the ref
199 // counted memory does not go away before the memory backed blob is created.
200 content::BrowserContext::CreateMemoryBackedBlob(
201 browser_context(), job
->document_bytes
->front_as
<char>(),
202 job
->document_bytes
->size(),
203 base::Bind(&PrinterProviderInternalGetPrintDataFunction::OnBlob
, this,
204 job
->content_type
, job
->document_bytes
->size(),
205 job
->document_bytes
));
206 } else if (!job
->document_path
.empty()) {
207 content::BrowserContext::CreateFileBackedBlob(
208 browser_context(), job
->document_path
, 0 /* offset */,
209 job
->file_info
.size
, job
->file_info
.last_modified
,
210 base::Bind(&PrinterProviderInternalGetPrintDataFunction::OnBlob
, this,
211 job
->content_type
, job
->file_info
.size
,
212 scoped_refptr
<base::RefCountedMemory
>()));
214 return RespondNow(Error("Job data not set"));
216 return RespondLater();
219 void PrinterProviderInternalGetPrintDataFunction::OnBlob(
220 const std::string
& type
,
222 const scoped_refptr
<base::RefCountedMemory
>& data
,
223 scoped_ptr
<content::BlobHandle
> blob
) {
225 SetError("Unable to create the blob.");
230 internal_api::BlobInfo info
;
231 info
.blob_uuid
= blob
->GetUUID();
235 std::vector
<std::string
> uuids
;
236 uuids
.push_back(blob
->GetUUID());
238 extensions::BlobHolder
* holder
=
239 extensions::BlobHolder::FromRenderProcessHost(
240 render_frame_host()->GetProcess());
241 holder
->HoldBlobReference(blob
.Pass());
243 results_
= internal_api::GetPrintData::Results::Create(info
);
244 SetTransferredBlobUUIDs(uuids
);
248 PrinterProviderInternalReportUsbPrinterInfoFunction::
249 PrinterProviderInternalReportUsbPrinterInfoFunction() {
252 PrinterProviderInternalReportUsbPrinterInfoFunction::
253 ~PrinterProviderInternalReportUsbPrinterInfoFunction() {
256 ExtensionFunction::ResponseAction
257 PrinterProviderInternalReportUsbPrinterInfoFunction::Run() {
258 scoped_ptr
<internal_api::ReportUsbPrinterInfo::Params
> params(
259 internal_api::ReportUsbPrinterInfo::Params::Create(*args_
));
260 EXTENSION_FUNCTION_VALIDATE(params
.get());
262 PrinterProviderInternalAPI::GetFactoryInstance()
263 ->Get(browser_context())
264 ->NotifyGetUsbPrinterInfoResult(extension(), params
->request_id
,
265 params
->printer_info
.get());
266 return RespondNow(NoArguments());
269 } // namespace extensions