diff options
Diffstat (limited to 'webkit/default_plugin/plugin_database_handler.h')
-rw-r--r-- | webkit/default_plugin/plugin_database_handler.h | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/webkit/default_plugin/plugin_database_handler.h b/webkit/default_plugin/plugin_database_handler.h new file mode 100644 index 0000000..ae83a28 --- /dev/null +++ b/webkit/default_plugin/plugin_database_handler.h @@ -0,0 +1,156 @@ +// Copyright (c) 2006-2008 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. + +#ifndef WEBKIT_DEFAULT_PLUGIN_PLUGIN_DATABASE_HANDLER_H +#define WEBKIT_DEFAULT_PLUGIN_PLUGIN_DATABASE_HANDLER_H + +#include <windows.h> +#include <string> +#include <vector> + +#include "base/basictypes.h" +#include "third_party/npapi/bindings/npapi.h" + +// Individual plugin details +struct PluginDetail { + // List of mime types supported by the plugin. + std::vector<std::string> mime_types; + // The URL where the plugin can be downloaded from. + std::string download_url; + // The display name for the plugin. + std::wstring display_name; + // Language of the plugin installer. (en-us, etc). + std::string language; + // Indicates if the download URL points to an exe or to a URL which + // needs to be displayed in a tab. + bool download_url_for_display; +}; + +typedef std::vector<PluginDetail> PluginList; + +class PluginInstallerImpl; +struct _xmlNode; + +// This class handles download of the plugins database file from the plugin +// finder URL passed in. It also provides functionality to parse the plugins +// file and to locate the desired plugin mime type in the parsed plugin list. +// The format of the plugins databse file is as below:- +// <plugins> +// <plugin> +// <mime_types> </mime_types> (semicolon separated list of mime types +// supported by the plugin) +// <lang> </lang> (Supported language) +// <url> </url> (Link to the plugin installer) +// <displayurl> 0 </displayurl> (Indicates if the URL is a display URL. +// defaults to 0. +// </plugin> +// <plugin> +// </plugins> +class PluginDatabaseHandler { + public: + // plugin_installer_instance is a reference maintained to the current + // PluginInstallerImpl instance. + explicit PluginDatabaseHandler( + PluginInstallerImpl& plugin_installer_instance); + + virtual ~PluginDatabaseHandler(); + + // Downloads the plugins database file if needed. + // + // Parameters: + // plugin_finder_url + // Specifies the http/https location of the chrome plugin finder. + // Returns true on success. + bool DownloadPluginsFileIfNeeded(const std::string& plugin_finder_url); + + // Writes data to the plugins database file. + // + // Parameters: + // stream + // Pointer to the current stream. + // offset + // Indicates the data offset. + // buffer_length + // Specifies the length of the data buffer. + // buffer + // Pointer to the actual buffer. + // Returns the number of bytes actually written, 0 on error. + int32 Write(NPStream* stream, int32 offset, int32 buffer_length, + void* buffer); + + const std::wstring& plugins_file() const { + return plugins_file_; + } + + // Parses the XML file containing the list of available third-party + // plugins and adds them to a list. + // Returns true on success + bool ParsePluginList(); + + // Returns the plugin details for the third party plugin mime type passed in. + // + // Parameters: + // mime_type + // Specifies the mime type of the desired third party plugin. + // language + // Specifies the desired plugin language. + // download_url + // Output parameter which contans the plugin download URL on success. + // display_name + // Output parameter which contains the display name of the plugin on + // success. + // download_url_for_display + // Output parameter which indicates if the plugin URL points to an exe + // or not. + // Returns true if the plugin details were found. + bool GetPluginDetailsForMimeType(const char* mime_type, + const char* language, + std::string* download_url, + std::wstring* display_name, + bool* download_url_for_display); + + // Closes the handle to the plugin database file. + // + // Parameters: + // delete_file + // Indicates if the plugin database file should be deleted. + void Close(bool delete_file); + + protected: + // Reads plugin information off an individual XML node. + // + // Parameters: + // plugin_node + // Pointer to the plugin XML node. + // plugin_detail + // Output parameter which contains the details of the plugin on success. + // Returns true on success. + bool ReadPluginInfo(_xmlNode* plugin_node, PluginDetail* plugin_detail); + + private: + // Contains the full path of the downloaded plugins file containing + // information about available third party plugin downloads. + std::wstring plugins_file_; + // Handle to the downloaded plugins file. + HANDLE plugin_downloads_file_; + // List of downloaded plugins. This is generated the first time the + // plugins file is downloaded and parsed. Each item in the list is + // of the type PluginDetail, and contains information about the third + // party plugin like it's mime type, download link, etc. + PluginList downloaded_plugins_list_; + // We maintain a reference to the PluginInstallerImpl instance to be able + // to achieve plugin installer state changes and to notify the instance + // about download completions. + PluginInstallerImpl& plugin_installer_instance_; + // The plugin finder url + std::string plugin_finder_url_; + // Set if the current instance should ignore plugin data. This is required + // if multiple null plugin instances attempt to download the plugin + // database. In this case the first instance to create the plugins database + // file locally writes to the file. The remaining instances ignore the + // downloaded data. + bool ignore_plugin_db_data_; +}; + +#endif // WEBKIT_DEFAULT_PLUGIN_PLUGIN_DATABASE_DOWNLOAD_HANDLER_H |