This source file includes following definitions.
- Verify
- Cancel
- Shutdown
- StartHost
- OnProcessCrashed
- OnProcessLaunchFailed
- OnMessageReceived
- Send
- OnWriteImageSucceeded
- OnWriteImageCancelled
- OnWriteImageFailed
- OnWriteImageProgress
#include "base/bind.h"
#include "base/message_loop/message_loop.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.h"
#include "chrome/common/chrome_utility_messages.h"
#include "content/public/browser/browser_thread.h"
using content::BrowserThread;
ImageWriterUtilityClient::ImageWriterUtilityClient()
    : message_loop_proxy_(base::MessageLoopProxy::current()) {}
ImageWriterUtilityClient::~ImageWriterUtilityClient() {}
void ImageWriterUtilityClient::Write(const ProgressCallback& progress_callback,
                                     const SuccessCallback& success_callback,
                                     const ErrorCallback& error_callback,
                                     const base::FilePath& source,
                                     const base::FilePath& target) {
  DCHECK_CURRENTLY_ON(BrowserThread::IO);
  StartHost();
  progress_callback_ = progress_callback;
  success_callback_ = success_callback;
  error_callback_ = error_callback;
  if (!Send(new ChromeUtilityMsg_ImageWriter_Write(source, target))) {
    DLOG(ERROR) << "Unable to send Write message to Utility Process.";
    message_loop_proxy_->PostTask(
        FROM_HERE, base::Bind(error_callback_, "IPC communication failed"));
  }
}
void ImageWriterUtilityClient::Verify(const ProgressCallback& progress_callback,
                                      const SuccessCallback& success_callback,
                                      const ErrorCallback& error_callback,
                                      const base::FilePath& source,
                                      const base::FilePath& target) {
  DCHECK_CURRENTLY_ON(BrowserThread::IO);
  StartHost();
  progress_callback_ = progress_callback;
  success_callback_ = success_callback;
  error_callback_ = error_callback;
  if (!Send(new ChromeUtilityMsg_ImageWriter_Verify(source, target))) {
    DLOG(ERROR) << "Unable to send Verify message to Utility Process.";
    message_loop_proxy_->PostTask(
        FROM_HERE, base::Bind(error_callback_, "IPC communication failed"));
  }
}
void ImageWriterUtilityClient::Cancel(const CancelCallback& cancel_callback) {
  DCHECK_CURRENTLY_ON(BrowserThread::IO);
  if (!utility_process_host_) {
    
    message_loop_proxy_->PostTask(FROM_HERE, cancel_callback);
    return;
  }
  cancel_callback_ = cancel_callback;
  if (!Send(new ChromeUtilityMsg_ImageWriter_Cancel())) {
    DLOG(ERROR) << "Unable to send Cancel message to Utility Process.";
  }
}
void ImageWriterUtilityClient::Shutdown() {
  if (utility_process_host_ &&
      Send(new ChromeUtilityMsg_ImageWriter_Cancel())) {
    utility_process_host_->EndBatchMode();
  }
  
  success_callback_ = base::Closure();
  progress_callback_ = base::Callback<void(int64)>();
  error_callback_ = base::Callback<void(const std::string&)>();
  cancel_callback_ = base::Closure();
}
void ImageWriterUtilityClient::StartHost() {
  if (!utility_process_host_) {
    scoped_refptr<base::SequencedTaskRunner> task_runner =
        base::MessageLoop::current()->message_loop_proxy();
    utility_process_host_ = content::UtilityProcessHost::Create(
                                this, task_runner.get())->AsWeakPtr();
#if defined(OS_WIN)
    utility_process_host_->ElevatePrivileges();
#else
    utility_process_host_->DisableSandbox();
#endif
    utility_process_host_->StartBatchMode();
    utility_process_host_->DisableSandbox();
  }
}
void ImageWriterUtilityClient::OnProcessCrashed(int exit_code) {
  message_loop_proxy_->PostTask(
      FROM_HERE, base::Bind(error_callback_, "Utility process crashed."));
}
void ImageWriterUtilityClient::OnProcessLaunchFailed() {
  message_loop_proxy_->PostTask(
      FROM_HERE, base::Bind(error_callback_, "Process launch failed."));
}
bool ImageWriterUtilityClient::OnMessageReceived(const IPC::Message& message) {
  bool handled = true;
  IPC_BEGIN_MESSAGE_MAP(ImageWriterUtilityClient, message)
  IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_ImageWriter_Succeeded,
                      OnWriteImageSucceeded)
  IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_ImageWriter_Cancelled,
                      OnWriteImageCancelled)
  IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_ImageWriter_Failed,
                      OnWriteImageFailed)
  IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_ImageWriter_Progress,
                      OnWriteImageProgress)
  IPC_MESSAGE_UNHANDLED(handled = false)
  IPC_END_MESSAGE_MAP()
  return handled;
}
bool ImageWriterUtilityClient::Send(IPC::Message* msg) {
  return utility_process_host_ && utility_process_host_->Send(msg);
}
void ImageWriterUtilityClient::OnWriteImageSucceeded() {
  if (!success_callback_.is_null()) {
    message_loop_proxy_->PostTask(FROM_HERE, success_callback_);
  }
}
void ImageWriterUtilityClient::OnWriteImageCancelled() {
  if (!cancel_callback_.is_null()) {
    message_loop_proxy_->PostTask(FROM_HERE, cancel_callback_);
  }
}
void ImageWriterUtilityClient::OnWriteImageFailed(const std::string& message) {
  if (!error_callback_.is_null()) {
    message_loop_proxy_->PostTask(FROM_HERE,
                                  base::Bind(error_callback_, message));
  }
}
void ImageWriterUtilityClient::OnWriteImageProgress(int64 progress) {
  if (!progress_callback_.is_null()) {
    message_loop_proxy_->PostTask(FROM_HERE,
                                  base::Bind(progress_callback_, progress));
  }
}