Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "extensions/browser/api/printer_provider/printer_provider_api.h" | 5 #include "extensions/browser/api/printer_provider/printer_provider_api.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 #include <set> | 8 #include <set> |
| 9 #include <utility> | 9 #include <utility> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 82 | 82 |
| 83 private: | 83 private: |
| 84 // Callback reporting event result for an extension. Called once for each | 84 // Callback reporting event result for an extension. Called once for each |
| 85 // extension. | 85 // extension. |
| 86 PrinterProviderAPI::GetPrintersCallback callback_; | 86 PrinterProviderAPI::GetPrintersCallback callback_; |
| 87 | 87 |
| 88 // The list of extensions that still have to respond to the event. | 88 // The list of extensions that still have to respond to the event. |
| 89 std::set<std::string> extensions_; | 89 std::set<std::string> extensions_; |
| 90 }; | 90 }; |
| 91 | 91 |
| 92 struct PrintRequest { | |
|
Vitaly Buka (NO REVIEWS)
2015/03/05 22:10:01
nested in PendingPrintRequests?
tbarzic
2015/03/05 23:57:36
Done.
| |
| 93 PrinterProviderAPI::PrintCallback callback; | |
| 94 PrinterProviderPrintJob job; | |
| 95 }; | |
| 96 | |
| 92 // Keeps track of pending chrome.printerProvider.onGetPrintersRequested | 97 // Keeps track of pending chrome.printerProvider.onGetPrintersRequested |
| 93 // requests. | 98 // requests. |
| 94 class PendingGetPrintersRequests { | 99 class PendingGetPrintersRequests { |
| 95 public: | 100 public: |
| 96 PendingGetPrintersRequests(); | 101 PendingGetPrintersRequests(); |
| 97 ~PendingGetPrintersRequests(); | 102 ~PendingGetPrintersRequests(); |
| 98 | 103 |
| 99 // Adds a new request to the set of pending requests. Returns the id | 104 // Adds a new request to the set of pending requests. Returns the id |
| 100 // assigned to the request. | 105 // assigned to the request. |
| 101 int Add(const PrinterProviderAPI::GetPrintersCallback& callback); | 106 int Add(const PrinterProviderAPI::GetPrintersCallback& callback); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 148 | 153 |
| 149 // Keeps track of pending chrome.printerProvider.ontPrintRequested requests | 154 // Keeps track of pending chrome.printerProvider.ontPrintRequested requests |
| 150 // for an extension. | 155 // for an extension. |
| 151 class PendingPrintRequests { | 156 class PendingPrintRequests { |
| 152 public: | 157 public: |
| 153 PendingPrintRequests(); | 158 PendingPrintRequests(); |
| 154 ~PendingPrintRequests(); | 159 ~PendingPrintRequests(); |
| 155 | 160 |
| 156 // Adds a new request to the set. Only information needed is the callback | 161 // Adds a new request to the set. Only information needed is the callback |
| 157 // associated with the request. Returns the id assigned to the request. | 162 // associated with the request. Returns the id assigned to the request. |
| 158 int Add(const PrinterProviderAPI::PrintCallback& callback); | 163 int Add(const PrinterProviderPrintJob& job, |
| 164 const PrinterProviderAPI::PrintCallback& callback); | |
| 165 | |
| 166 // Gets print job associated with a request. | |
| 167 const PrinterProviderPrintJob* GetPrintJob(int request_id) const; | |
| 159 | 168 |
| 160 // Completes the request with the provided request id. It runs the request | 169 // Completes the request with the provided request id. It runs the request |
| 161 // callback and removes the request from the set. | 170 // callback and removes the request from the set. |
| 162 bool Complete(int request_id, bool success, const std::string& result); | 171 bool Complete(int request_id, bool success, const std::string& result); |
| 163 | 172 |
| 164 // Runs all pending callbacks with ERROR_FAILED and clears the set of | 173 // Runs all pending callbacks with ERROR_FAILED and clears the set of |
| 165 // pending requests. | 174 // pending requests. |
| 166 void FailAll(); | 175 void FailAll(); |
| 167 | 176 |
| 168 private: | 177 private: |
| 169 int last_request_id_; | 178 int last_request_id_; |
| 170 std::map<int, PrinterProviderAPI::PrintCallback> pending_requests_; | 179 std::map<int, PrintRequest> pending_requests_; |
| 171 }; | 180 }; |
| 172 | 181 |
| 173 // Implements chrome.printerProvider API events. | 182 // Implements chrome.printerProvider API events. |
| 174 class PrinterProviderAPIImpl : public PrinterProviderAPI, | 183 class PrinterProviderAPIImpl : public PrinterProviderAPI, |
| 175 public PrinterProviderInternalAPIObserver, | 184 public PrinterProviderInternalAPIObserver, |
| 176 public ExtensionRegistryObserver { | 185 public ExtensionRegistryObserver { |
| 177 public: | 186 public: |
| 178 explicit PrinterProviderAPIImpl(content::BrowserContext* browser_context); | 187 explicit PrinterProviderAPIImpl(content::BrowserContext* browser_context); |
| 179 ~PrinterProviderAPIImpl() override; | 188 ~PrinterProviderAPIImpl() override; |
| 180 | 189 |
| 181 private: | 190 private: |
| 182 // PrinterProviderAPI implementation: | 191 // PrinterProviderAPI implementation: |
| 183 void DispatchGetPrintersRequested( | 192 void DispatchGetPrintersRequested( |
| 184 const PrinterProviderAPI::GetPrintersCallback& callback) override; | 193 const PrinterProviderAPI::GetPrintersCallback& callback) override; |
| 185 void DispatchGetCapabilityRequested( | 194 void DispatchGetCapabilityRequested( |
| 186 const std::string& printer_id, | 195 const std::string& printer_id, |
| 187 const PrinterProviderAPI::GetCapabilityCallback& callback) override; | 196 const PrinterProviderAPI::GetCapabilityCallback& callback) override; |
| 188 void DispatchPrintRequested( | 197 void DispatchPrintRequested( |
| 189 const PrinterProviderPrintJob& job, | 198 const PrinterProviderPrintJob& job, |
| 190 const PrinterProviderAPI::PrintCallback& callback) override; | 199 const PrinterProviderAPI::PrintCallback& callback) override; |
| 200 const PrinterProviderPrintJob* GetPrintJob(const Extension* extension, | |
| 201 int request_id) const override; | |
| 191 | 202 |
| 192 // PrinterProviderInternalAPIObserver implementation: | 203 // PrinterProviderInternalAPIObserver implementation: |
| 193 void OnGetPrintersResult( | 204 void OnGetPrintersResult( |
| 194 const Extension* extension, | 205 const Extension* extension, |
| 195 int request_id, | 206 int request_id, |
| 196 const PrinterProviderInternalAPIObserver::PrinterInfoVector& result) | 207 const PrinterProviderInternalAPIObserver::PrinterInfoVector& result) |
| 197 override; | 208 override; |
| 198 void OnGetCapabilityResult(const Extension* extension, | 209 void OnGetCapabilityResult(const Extension* extension, |
| 199 int request_id, | 210 int request_id, |
| 200 const base::DictionaryValue& result) override; | 211 const base::DictionaryValue& result) override; |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 341 pending_requests_.clear(); | 352 pending_requests_.clear(); |
| 342 } | 353 } |
| 343 | 354 |
| 344 PendingPrintRequests::PendingPrintRequests() : last_request_id_(0) { | 355 PendingPrintRequests::PendingPrintRequests() : last_request_id_(0) { |
| 345 } | 356 } |
| 346 | 357 |
| 347 PendingPrintRequests::~PendingPrintRequests() { | 358 PendingPrintRequests::~PendingPrintRequests() { |
| 348 } | 359 } |
| 349 | 360 |
| 350 int PendingPrintRequests::Add( | 361 int PendingPrintRequests::Add( |
| 362 const PrinterProviderPrintJob& job, | |
| 351 const PrinterProviderAPI::PrintCallback& callback) { | 363 const PrinterProviderAPI::PrintCallback& callback) { |
| 352 pending_requests_[++last_request_id_] = callback; | 364 PrintRequest request; |
| 365 request.callback = callback; | |
| 366 request.job = job; | |
| 367 pending_requests_[++last_request_id_] = request; | |
| 353 return last_request_id_; | 368 return last_request_id_; |
| 354 } | 369 } |
| 355 | 370 |
| 356 bool PendingPrintRequests::Complete(int request_id, | 371 bool PendingPrintRequests::Complete(int request_id, |
| 357 bool success, | 372 bool success, |
| 358 const std::string& response) { | 373 const std::string& response) { |
| 359 auto it = pending_requests_.find(request_id); | 374 auto it = pending_requests_.find(request_id); |
| 360 if (it == pending_requests_.end()) | 375 if (it == pending_requests_.end()) |
| 361 return false; | 376 return false; |
| 362 | 377 |
| 363 PrinterProviderAPI::PrintCallback callback = it->second; | 378 PrinterProviderAPI::PrintCallback callback = it->second.callback; |
| 364 pending_requests_.erase(it); | 379 pending_requests_.erase(it); |
| 365 | 380 |
| 366 callback.Run(success, response); | 381 callback.Run(success, response); |
| 367 return true; | 382 return true; |
| 368 } | 383 } |
| 369 | 384 |
| 385 const PrinterProviderPrintJob* PendingPrintRequests::GetPrintJob( | |
| 386 int request_id) const { | |
| 387 auto it = pending_requests_.find(request_id); | |
| 388 if (it == pending_requests_.end()) | |
| 389 return nullptr; | |
| 390 | |
| 391 return &it->second.job; | |
| 392 } | |
| 393 | |
| 370 void PendingPrintRequests::FailAll() { | 394 void PendingPrintRequests::FailAll() { |
| 371 for (auto& request : pending_requests_) | 395 for (auto& request : pending_requests_) |
| 372 request.second.Run(false, PrinterProviderAPI::GetDefaultPrintError()); | 396 request.second.callback.Run(false, |
| 397 PrinterProviderAPI::GetDefaultPrintError()); | |
| 373 pending_requests_.clear(); | 398 pending_requests_.clear(); |
| 374 } | 399 } |
| 375 | 400 |
| 376 PrinterProviderAPIImpl::PrinterProviderAPIImpl( | 401 PrinterProviderAPIImpl::PrinterProviderAPIImpl( |
| 377 content::BrowserContext* browser_context) | 402 content::BrowserContext* browser_context) |
| 378 : browser_context_(browser_context), | 403 : browser_context_(browser_context), |
| 379 internal_api_observer_(this), | 404 internal_api_observer_(this), |
| 380 extension_registry_observer_(this) { | 405 extension_registry_observer_(this) { |
| 381 internal_api_observer_.Add( | 406 internal_api_observer_.Add( |
| 382 PrinterProviderInternalAPI::GetFactoryInstance()->Get(browser_context)); | 407 PrinterProviderInternalAPI::GetFactoryInstance()->Get(browser_context)); |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 475 scoped_ptr<base::Value> ticket_value(serializer.Deserialize(NULL, NULL)); | 500 scoped_ptr<base::Value> ticket_value(serializer.Deserialize(NULL, NULL)); |
| 476 if (!ticket_value || | 501 if (!ticket_value || |
| 477 !core_api::printer_provider::PrintJob::Ticket::Populate( | 502 !core_api::printer_provider::PrintJob::Ticket::Populate( |
| 478 *ticket_value, &print_job.ticket)) { | 503 *ticket_value, &print_job.ticket)) { |
| 479 callback.Run(false, | 504 callback.Run(false, |
| 480 core_api::printer_provider::ToString( | 505 core_api::printer_provider::ToString( |
| 481 core_api::printer_provider::PRINT_ERROR_INVALID_TICKET)); | 506 core_api::printer_provider::PRINT_ERROR_INVALID_TICKET)); |
| 482 return; | 507 return; |
| 483 } | 508 } |
| 484 | 509 |
| 485 // TODO(tbarzic): Figure out how to support huge documents. | |
| 486 if (job.document_bytes->size() > PrinterProviderAPI::kMaxDocumentSize) { | |
| 487 callback.Run(false, | |
| 488 core_api::printer_provider::ToString( | |
| 489 core_api::printer_provider::PRINT_ERROR_INVALID_DATA)); | |
| 490 return; | |
| 491 } | |
| 492 | |
| 493 print_job.content_type = job.content_type; | 510 print_job.content_type = job.content_type; |
| 494 print_job.document = std::vector<char>( | 511 int request_id = pending_print_requests_[extension_id].Add(job, callback); |
| 495 job.document_bytes->front(), | |
| 496 job.document_bytes->front() + job.document_bytes->size()); | |
| 497 | |
| 498 int request_id = pending_print_requests_[extension_id].Add(callback); | |
| 499 | 512 |
| 500 scoped_ptr<base::ListValue> internal_args(new base::ListValue); | 513 scoped_ptr<base::ListValue> internal_args(new base::ListValue); |
| 501 // Request id is not part of the public API and it will be massaged out in | 514 // Request id is not part of the public API and it will be massaged out in |
| 502 // custom bindings. | 515 // custom bindings. |
| 503 internal_args->AppendInteger(request_id); | 516 internal_args->AppendInteger(request_id); |
| 504 internal_args->Append(print_job.ToValue().release()); | 517 internal_args->Append(print_job.ToValue().release()); |
| 505 scoped_ptr<Event> event( | 518 scoped_ptr<Event> event( |
| 506 new Event(core_api::printer_provider::OnPrintRequested::kEventName, | 519 new Event(core_api::printer_provider::OnPrintRequested::kEventName, |
| 507 internal_args.Pass())); | 520 internal_args.Pass())); |
| 521 event_router->DispatchEventToExtension(extension_id, event.Pass()); | |
| 522 } | |
| 508 | 523 |
| 509 event_router->DispatchEventToExtension(extension_id, event.Pass()); | 524 const PrinterProviderPrintJob* PrinterProviderAPIImpl::GetPrintJob( |
| 525 const Extension* extension, | |
| 526 int request_id) const { | |
| 527 auto it = pending_print_requests_.find(extension->id()); | |
| 528 if (it == pending_print_requests_.end()) | |
| 529 return nullptr; | |
| 530 return it->second.GetPrintJob(request_id); | |
| 510 } | 531 } |
| 511 | 532 |
| 512 void PrinterProviderAPIImpl::OnGetPrintersResult( | 533 void PrinterProviderAPIImpl::OnGetPrintersResult( |
| 513 const Extension* extension, | 534 const Extension* extension, |
| 514 int request_id, | 535 int request_id, |
| 515 const PrinterProviderInternalAPIObserver::PrinterInfoVector& result) { | 536 const PrinterProviderInternalAPIObserver::PrinterInfoVector& result) { |
| 516 base::ListValue printer_list; | 537 base::ListValue printer_list; |
| 517 | 538 |
| 518 // Update some printer description properties to better identify the extension | 539 // Update some printer description properties to better identify the extension |
| 519 // managing the printer. | 540 // managing the printer. |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 595 return new PrinterProviderAPIImpl(context); | 616 return new PrinterProviderAPIImpl(context); |
| 596 } | 617 } |
| 597 | 618 |
| 598 // static | 619 // static |
| 599 std::string PrinterProviderAPI::GetDefaultPrintError() { | 620 std::string PrinterProviderAPI::GetDefaultPrintError() { |
| 600 return core_api::printer_provider_internal::ToString( | 621 return core_api::printer_provider_internal::ToString( |
| 601 core_api::printer_provider_internal::PRINT_ERROR_FAILED); | 622 core_api::printer_provider_internal::PRINT_ERROR_FAILED); |
| 602 } | 623 } |
| 603 | 624 |
| 604 } // namespace extensions | 625 } // namespace extensions |
| OLD | NEW |