Index: chrome/utility/extensions/extensions_handler.cc |
diff --git a/chrome/utility/extensions/extensions_handler.cc b/chrome/utility/extensions/extensions_handler.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0786b9ec380c91374899e859775c5811116590fe |
--- /dev/null |
+++ b/chrome/utility/extensions/extensions_handler.cc |
@@ -0,0 +1,290 @@ |
+// Copyright 2014 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 "chrome/utility/extensions/extensions_handler.h" |
+ |
+#include "base/command_line.h" |
+#include "base/path_service.h" |
+#include "chrome/common/chrome_utility_messages.h" |
+#include "chrome/common/extensions/chrome_extensions_client.h" |
+#include "chrome/common/extensions/chrome_utility_extensions_messages.h" |
+#include "chrome/common/extensions/update_manifest.h" |
+#include "chrome/common/media_galleries/metadata_types.h" |
+#include "chrome/utility/chrome_content_utility_client.h" |
+#include "chrome/utility/extensions/unpacker.h" |
+#include "chrome/utility/media_galleries/image_metadata_extractor.h" |
+#include "content/public/common/content_paths.h" |
+#include "content/public/utility/utility_thread.h" |
+#include "extensions/common/extension.h" |
+#include "extensions/common/extension_l10n_util.h" |
+#include "extensions/common/manifest.h" |
+#include "media/base/media.h" |
+#include "media/base/media_file_checker.h" |
+#include "ui/base/ui_base_switches.h" |
+ |
+#if defined(OS_WIN) |
+#include "chrome/common/extensions/api/networking_private/networking_private_crypto.h" |
+#include "chrome/utility/media_galleries/itunes_pref_parser_win.h" |
+#include "components/wifi/wifi_service.h" |
+#endif // defined(OS_WIN) |
+ |
+#if defined(OS_MACOSX) |
+#include "chrome/utility/media_galleries/iphoto_library_parser.h" |
+#endif // defined(OS_MACOSX) |
+ |
+#if defined(OS_WIN) || defined(OS_MACOSX) |
+#include "chrome/utility/media_galleries/iapps_xml_utils.h" |
+#include "chrome/utility/media_galleries/itunes_library_parser.h" |
+#include "chrome/utility/media_galleries/picasa_album_table_reader.h" |
+#include "chrome/utility/media_galleries/picasa_albums_indexer.h" |
+#endif // defined(OS_WIN) || defined(OS_MACOSX) |
+ |
+namespace extensions { |
+ |
+namespace { |
+ |
+bool Send(IPC::Message* message) { |
+ return content::UtilityThread::Get()->Send(message); |
+} |
+ |
+void ReleaseProcessIfNeeded() { |
+ content::UtilityThread::Get()->ReleaseProcessIfNeeded(); |
+} |
+ |
+} // namespace |
+ |
+ExtensionsHandler::ExtensionsHandler() {} |
+ |
+ExtensionsHandler::~ExtensionsHandler() {} |
+ |
+// static |
+void ExtensionsHandler::PreSandboxStartup() { |
+ // Initialize libexif for image metadata parsing. |
+ metadata::ImageMetadataExtractor::InitializeLibrary(); |
+ |
+ // Load media libraries for media file validation. |
+ base::FilePath media_path; |
+ PathService::Get(content::DIR_MEDIA_LIBS, &media_path); |
+ if (!media_path.empty()) |
+ media::InitializeMediaLibrary(media_path); |
+} |
+ |
+void ExtensionsHandler::UtilityThreadStarted() { |
+ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); |
+ std::string lang = command_line->GetSwitchValueASCII(switches::kLang); |
+ if (!lang.empty()) |
+ extension_l10n_util::SetProcessLocale(lang); |
+} |
+ |
+bool ExtensionsHandler::OnMessageReceived(const IPC::Message& message) { |
+ bool handled = true; |
+ IPC_BEGIN_MESSAGE_MAP(ExtensionsHandler, message) |
+ IPC_MESSAGE_HANDLER(ChromeUtilityMsg_UnpackExtension, OnUnpackExtension) |
+ IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParseUpdateManifest, |
+ OnParseUpdateManifest) |
+ IPC_MESSAGE_HANDLER(ChromeUtilityMsg_DecodeImageBase64, OnDecodeImageBase64) |
+ IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParseJSON, OnParseJSON) |
+ IPC_MESSAGE_HANDLER(ChromeUtilityMsg_CheckMediaFile, OnCheckMediaFile) |
+#if defined(OS_WIN) |
+ IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParseITunesPrefXml, |
+ OnParseITunesPrefXml) |
+#endif // defined(OS_WIN) |
+ |
+#if defined(OS_MACOSX) |
+ IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParseIPhotoLibraryXmlFile, |
+ OnParseIPhotoLibraryXmlFile) |
+#endif // defined(OS_MACOSX) |
+ |
+#if defined(OS_WIN) || defined(OS_MACOSX) |
+ IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParseITunesLibraryXmlFile, |
+ OnParseITunesLibraryXmlFile) |
+ IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParsePicasaPMPDatabase, |
+ OnParsePicasaPMPDatabase) |
+ IPC_MESSAGE_HANDLER(ChromeUtilityMsg_IndexPicasaAlbumsContents, |
+ OnIndexPicasaAlbumsContents) |
+#endif // defined(OS_WIN) || defined(OS_MACOSX) |
+ |
+#if defined(OS_WIN) |
+ IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_GetAndEncryptWiFiCredentials, |
+ OnGetAndEncryptWiFiCredentials) |
+#endif // defined(OS_WIN) |
+ |
+ IPC_MESSAGE_UNHANDLED(handled = false) |
+ IPC_END_MESSAGE_MAP() |
+ return handled; |
+} |
+ |
+void ExtensionsHandler::OnUnpackExtension( |
+ const base::FilePath& extension_path, |
+ const std::string& extension_id, |
+ int location, |
+ int creation_flags) { |
+ CHECK_GT(location, Manifest::INVALID_LOCATION); |
+ CHECK_LT(location, Manifest::NUM_LOCATIONS); |
+ ExtensionsClient::Set(ChromeExtensionsClient::GetInstance()); |
+ Unpacker unpacker(extension_path, |
+ extension_id, |
+ static_cast<Manifest::Location>(location), |
+ creation_flags); |
+ if (unpacker.Run() && unpacker.DumpImagesToFile() && |
+ unpacker.DumpMessageCatalogsToFile()) { |
+ Send(new ChromeUtilityHostMsg_UnpackExtension_Succeeded( |
+ *unpacker.parsed_manifest())); |
+ } else { |
+ Send(new ChromeUtilityHostMsg_UnpackExtension_Failed( |
+ unpacker.error_message())); |
+ } |
+ |
+ ReleaseProcessIfNeeded(); |
+} |
+ |
+void ExtensionsHandler::OnParseUpdateManifest(const std::string& xml) { |
+ UpdateManifest manifest; |
+ if (!manifest.Parse(xml)) { |
+ Send(new ChromeUtilityHostMsg_ParseUpdateManifest_Failed( |
+ manifest.errors())); |
+ } else { |
+ Send(new ChromeUtilityHostMsg_ParseUpdateManifest_Succeeded( |
+ manifest.results())); |
+ } |
+ ReleaseProcessIfNeeded(); |
+} |
+ |
+void ExtensionsHandler::OnDecodeImageBase64( |
+ const std::string& encoded_string) { |
+ std::string decoded_string; |
+ |
+ if (!base::Base64Decode(encoded_string, &decoded_string)) { |
+ Send(new ChromeUtilityHostMsg_DecodeImage_Failed()); |
+ return; |
+ } |
+ |
+ std::vector<unsigned char> decoded_vector(decoded_string.size()); |
+ for (size_t i = 0; i < decoded_string.size(); ++i) { |
+ decoded_vector[i] = static_cast<unsigned char>(decoded_string[i]); |
+ } |
+ |
+ ChromeContentUtilityClient::DecodeImage(decoded_vector); |
+} |
+ |
+void ExtensionsHandler::OnParseJSON(const std::string& json) { |
+ int error_code; |
+ std::string error; |
+ base::Value* value = base::JSONReader::ReadAndReturnError( |
+ json, base::JSON_PARSE_RFC, &error_code, &error); |
+ if (value) { |
+ base::ListValue wrapper; |
+ wrapper.Append(value); |
+ Send(new ChromeUtilityHostMsg_ParseJSON_Succeeded(wrapper)); |
+ } else { |
+ Send(new ChromeUtilityHostMsg_ParseJSON_Failed(error)); |
+ } |
+ ReleaseProcessIfNeeded(); |
+} |
+ |
+void ExtensionsHandler::OnCheckMediaFile( |
+ int64 milliseconds_of_decoding, |
+ const IPC::PlatformFileForTransit& media_file) { |
+ media::MediaFileChecker checker( |
+ IPC::PlatformFileForTransitToFile(media_file)); |
+ const bool check_success = checker.Start( |
+ base::TimeDelta::FromMilliseconds(milliseconds_of_decoding)); |
+ Send(new ChromeUtilityHostMsg_CheckMediaFile_Finished(check_success)); |
+ ReleaseProcessIfNeeded(); |
+} |
+ |
+#if defined(OS_WIN) |
+void ExtensionsHandler::OnParseITunesPrefXml( |
+ const std::string& itunes_xml_data) { |
+ base::FilePath library_path( |
+ itunes::FindLibraryLocationInPrefXml(itunes_xml_data)); |
+ Send(new ChromeUtilityHostMsg_GotITunesDirectory(library_path)); |
+ ReleaseProcessIfNeeded(); |
+} |
+#endif // defined(OS_WIN) |
+ |
+#if defined(OS_MACOSX) |
+void ExtensionsHandler::OnParseIPhotoLibraryXmlFile( |
+ const IPC::PlatformFileForTransit& iphoto_library_file) { |
+ iphoto::IPhotoLibraryParser parser; |
+ base::File file = IPC::PlatformFileForTransitToFile(iphoto_library_file); |
+ bool result = parser.Parse(iapps::ReadFileAsString(file.Pass())); |
+ Send(new ChromeUtilityHostMsg_GotIPhotoLibrary(result, parser.library())); |
+ ReleaseProcessIfNeeded(); |
+} |
+#endif // defined(OS_MACOSX) |
+ |
+#if defined(OS_WIN) || defined(OS_MACOSX) |
+void ExtensionsHandler::OnParseITunesLibraryXmlFile( |
+ const IPC::PlatformFileForTransit& itunes_library_file) { |
+ itunes::ITunesLibraryParser parser; |
+ base::File file = IPC::PlatformFileForTransitToFile(itunes_library_file); |
+ bool result = parser.Parse(iapps::ReadFileAsString(file.Pass())); |
+ Send(new ChromeUtilityHostMsg_GotITunesLibrary(result, parser.library())); |
+ ReleaseProcessIfNeeded(); |
+} |
+ |
+void ExtensionsHandler::OnParsePicasaPMPDatabase( |
+ const picasa::AlbumTableFilesForTransit& album_table_files) { |
+ picasa::AlbumTableFiles files; |
+ files.indicator_file = |
+ IPC::PlatformFileForTransitToFile(album_table_files.indicator_file); |
+ files.category_file = |
+ IPC::PlatformFileForTransitToFile(album_table_files.category_file); |
+ files.date_file = |
+ IPC::PlatformFileForTransitToFile(album_table_files.date_file); |
+ files.filename_file = |
+ IPC::PlatformFileForTransitToFile(album_table_files.filename_file); |
+ files.name_file = |
+ IPC::PlatformFileForTransitToFile(album_table_files.name_file); |
+ files.token_file = |
+ IPC::PlatformFileForTransitToFile(album_table_files.token_file); |
+ files.uid_file = |
+ IPC::PlatformFileForTransitToFile(album_table_files.uid_file); |
+ |
+ picasa::PicasaAlbumTableReader reader(files.Pass()); |
+ bool parse_success = reader.Init(); |
+ Send(new ChromeUtilityHostMsg_ParsePicasaPMPDatabase_Finished( |
+ parse_success, |
+ reader.albums(), |
+ reader.folders())); |
+ ReleaseProcessIfNeeded(); |
+} |
+ |
+void ExtensionsHandler::OnIndexPicasaAlbumsContents( |
+ const picasa::AlbumUIDSet& album_uids, |
+ const std::vector<picasa::FolderINIContents>& folders_inis) { |
+ picasa::PicasaAlbumsIndexer indexer(album_uids); |
+ indexer.ParseFolderINI(folders_inis); |
+ |
+ Send(new ChromeUtilityHostMsg_IndexPicasaAlbumsContents_Finished( |
+ indexer.albums_images())); |
+ ReleaseProcessIfNeeded(); |
+} |
+#endif // defined(OS_WIN) || defined(OS_MACOSX) |
+ |
+#if defined(OS_WIN) |
+void ExtensionsHandler::OnGetAndEncryptWiFiCredentials( |
+ const std::string& network_guid, |
+ const std::vector<uint8>& public_key) { |
+ scoped_ptr<wifi::WiFiService> wifi_service(wifi::WiFiService::Create()); |
+ wifi_service->Initialize(NULL); |
+ |
+ std::string key_data; |
+ std::string error; |
+ wifi_service->GetKeyFromSystem(network_guid, &key_data, &error); |
+ |
+ std::vector<uint8> ciphertext; |
+ bool success = error.empty() && !key_data.empty(); |
+ if (success) { |
+ NetworkingPrivateCrypto crypto; |
+ success = crypto.EncryptByteString(public_key, key_data, &ciphertext); |
+ } |
+ |
+ Send(new ChromeUtilityHostMsg_GotEncryptedWiFiCredentials(ciphertext, |
+ success)); |
+} |
+#endif // defined(OS_WIN) |
+ |
+} // namespace extensions |