Index: extensions/browser/api/printer_provider_internal/printer_provider_internal_api.cc |
diff --git a/extensions/browser/api/printer_provider_internal/printer_provider_internal_api.cc b/extensions/browser/api/printer_provider_internal/printer_provider_internal_api.cc |
index e8879659d2a49b1fd64737c70868739221991123..8914616fb8bf720a66ec0cd0dfbebb8017f2597a 100644 |
--- a/extensions/browser/api/printer_provider_internal/printer_provider_internal_api.cc |
+++ b/extensions/browser/api/printer_provider_internal/printer_provider_internal_api.cc |
@@ -4,8 +4,26 @@ |
#include "extensions/browser/api/printer_provider_internal/printer_provider_internal_api.h" |
+#include <string> |
+#include <vector> |
+ |
+#include "base/bind.h" |
+#include "base/guid.h" |
#include "base/lazy_instance.h" |
+#include "base/location.h" |
+#include "base/memory/ref_counted_memory.h" |
+#include "base/memory/scoped_ptr.h" |
#include "base/values.h" |
+#include "content/public/browser/blob_handle.h" |
+#include "content/public/browser/browser_context.h" |
+#include "content/public/browser/browser_thread.h" |
+#include "content/public/browser/render_process_host.h" |
+#include "content/public/browser/render_view_host.h" |
+#include "content/public/browser/web_contents.h" |
+#include "extensions/browser/api/printer_provider/printer_provider_api.h" |
+#include "extensions/browser/api/printer_provider/printer_provider_api_factory.h" |
+#include "extensions/browser/api/printer_provider/printer_provider_print_job.h" |
+#include "extensions/browser/blob_holder.h" |
#include "extensions/common/api/printer_provider.h" |
#include "extensions/common/api/printer_provider_internal.h" |
@@ -146,4 +164,78 @@ PrinterProviderInternalReportPrintersFunction::Run() { |
return RespondNow(NoArguments()); |
} |
+PrinterProviderInternalGetPrintDataFunction:: |
+ PrinterProviderInternalGetPrintDataFunction() { |
+} |
+ |
+PrinterProviderInternalGetPrintDataFunction:: |
+ ~PrinterProviderInternalGetPrintDataFunction() { |
+} |
+ |
+ExtensionFunction::ResponseAction |
+PrinterProviderInternalGetPrintDataFunction::Run() { |
+ scoped_ptr<internal_api::GetPrintData::Params> params( |
+ internal_api::GetPrintData::Params::Create(*args_)); |
+ EXTENSION_FUNCTION_VALIDATE(params.get()); |
+ |
+ const PrinterProviderPrintJob* job = |
+ PrinterProviderAPIFactory::GetInstance() |
+ ->GetForBrowserContext(browser_context()) |
+ ->GetPrintJob(extension(), params->request_id); |
+ if (!job) |
+ return RespondNow(Error("Print request not found.")); |
+ |
+ if (job->document_bytes.get()) { |
+ // |job->document_bytes| are passed to the callback to make sure the ref |
+ // counted memory does not go away before the memory backed blob is created. |
+ content::BrowserContext::CreateMemoryBackedBlob( |
+ browser_context(), job->document_bytes->front_as<char>(), |
+ job->document_bytes->size(), |
+ base::Bind(&PrinterProviderInternalGetPrintDataFunction::OnBlob, this, |
+ job->content_type, job->document_bytes->size(), |
+ job->document_bytes)); |
+ } else if (!job->document_path.empty()) { |
+ content::BrowserContext::CreateFileBackedBlob( |
+ browser_context(), job->document_path, 0 /* offset */, |
+ job->file_info.size, job->file_info.last_modified, |
+ base::Bind(&PrinterProviderInternalGetPrintDataFunction::OnBlob, this, |
+ job->content_type, job->file_info.size, |
+ scoped_refptr<base::RefCountedMemory>())); |
+ } else { |
+ return RespondNow(Error("Job data not set")); |
+ } |
+ return RespondLater(); |
+} |
+ |
+void PrinterProviderInternalGetPrintDataFunction::OnBlob( |
+ const std::string& type, |
+ int size, |
+ const scoped_refptr<base::RefCountedMemory>& data, |
+ scoped_ptr<content::BlobHandle> blob) { |
+ if (!blob) { |
+ SetError("Unable to create the blob."); |
+ SendResponse(false); |
+ return; |
+ } |
+ |
+ internal_api::BlobInfo info; |
+ info.blob_uuid = blob->GetUUID(); |
+ info.type = type; |
+ info.size = size; |
+ |
+ std::vector<std::string> uuids; |
+ uuids.push_back(blob->GetUUID()); |
+ |
+ content::WebContents* contents = |
+ content::WebContents::FromRenderViewHost(render_view_host()); |
+ extensions::BlobHolder* holder = |
+ extensions::BlobHolder::FromRenderProcessHost( |
+ contents->GetRenderProcessHost()); |
+ holder->HoldBlobReference(blob.Pass()); |
+ |
+ results_ = internal_api::GetPrintData::Results::Create(info); |
+ SetTransferredBlobUUIDs(uuids); |
+ SendResponse(true); |
+} |
+ |
} // namespace extensions |