// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "apps/app_shim/app_shim_host_mac.h" #include "apps/app_shim/app_shim_handler_mac.h" #include "apps/app_shim/app_shim_messages.h" #include "base/bind.h" #include "base/files/file_path.h" #include "base/logging.h" #include "content/public/browser/browser_thread.h" #include "ipc/ipc_channel_proxy.h" AppShimHost::AppShimHost() : initial_launch_finished_(false) {} AppShimHost::~AppShimHost() { DCHECK(CalledOnValidThread()); apps::AppShimHandler* handler = apps::AppShimHandler::GetForAppMode(app_id_); if (handler) handler->OnShimClose(this); } void AppShimHost::ServeChannel(const IPC::ChannelHandle& handle) { DCHECK(CalledOnValidThread()); DCHECK(!channel_.get()); channel_ = IPC::ChannelProxy::Create( handle, IPC::Channel::MODE_SERVER, this, content::BrowserThread::GetMessageLoopProxyForThread( content::BrowserThread::IO).get()); } base::FilePath AppShimHost::GetProfilePath() const { return profile_path_; } std::string AppShimHost::GetAppId() const { return app_id_; } bool AppShimHost::OnMessageReceived(const IPC::Message& message) { DCHECK(CalledOnValidThread()); bool handled = true; IPC_BEGIN_MESSAGE_MAP(AppShimHost, message) IPC_MESSAGE_HANDLER(AppShimHostMsg_LaunchApp, OnLaunchApp) IPC_MESSAGE_HANDLER(AppShimHostMsg_FocusApp, OnFocus) IPC_MESSAGE_HANDLER(AppShimHostMsg_SetAppHidden, OnSetHidden) IPC_MESSAGE_HANDLER(AppShimHostMsg_QuitApp, OnQuit) IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() return handled; } void AppShimHost::OnChannelError() { Close(); } bool AppShimHost::Send(IPC::Message* message) { DCHECK(channel_.get()); return channel_->Send(message); } void AppShimHost::OnLaunchApp(const base::FilePath& profile_dir, const std::string& app_id, apps::AppShimLaunchType launch_type, const std::vector& files) { DCHECK(CalledOnValidThread()); DCHECK(profile_path_.empty()); // Only one app launch message per channel. if (!profile_path_.empty()) return; profile_path_ = profile_dir; app_id_ = app_id; apps::AppShimHandler* handler = apps::AppShimHandler::GetForAppMode(app_id_); if (handler) handler->OnShimLaunch(this, launch_type, files); // |handler| can only be NULL after AppShimHostManager is destroyed. Since // this only happens at shutdown, do nothing here. } void AppShimHost::OnFocus(apps::AppShimFocusType focus_type, const std::vector& files) { DCHECK(CalledOnValidThread()); apps::AppShimHandler* handler = apps::AppShimHandler::GetForAppMode(app_id_); if (handler) handler->OnShimFocus(this, focus_type, files); } void AppShimHost::OnSetHidden(bool hidden) { DCHECK(CalledOnValidThread()); apps::AppShimHandler* handler = apps::AppShimHandler::GetForAppMode(app_id_); if (handler) handler->OnShimSetHidden(this, hidden); } void AppShimHost::OnQuit() { DCHECK(CalledOnValidThread()); apps::AppShimHandler* handler = apps::AppShimHandler::GetForAppMode(app_id_); if (handler) handler->OnShimQuit(this); } void AppShimHost::OnAppLaunchComplete(apps::AppShimLaunchResult result) { if (!initial_launch_finished_) { Send(new AppShimMsg_LaunchApp_Done(result)); initial_launch_finished_ = true; } } void AppShimHost::OnAppClosed() { Close(); } void AppShimHost::OnAppHide() { Send(new AppShimMsg_Hide); } void AppShimHost::OnAppRequestUserAttention() { Send(new AppShimMsg_RequestUserAttention); } void AppShimHost::Close() { DCHECK(CalledOnValidThread()); delete this; }