15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO: Need mechanism to cleanup the static instance
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#ifndef CONTENT_CHILD_NPAPI_PLUGIN_HOST_H_
8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define CONTENT_CHILD_NPAPI_PLUGIN_HOST_H_
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/npapi/bindings/npapi.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/npapi/bindings/nphostapi.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace content {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The Plugin Host implements the NPN_xxx functions for NPAPI plugins.
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These are the functions exposed from the Plugin Host for use
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by the Plugin.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The PluginHost is managed as a singleton.  This isn't strictly
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// necessary, but since the callback functions are all global C
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// functions, there is really no point in having per-instance PluginHosts.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PluginHost : public base::RefCounted<PluginHost> {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Access the single PluginHost instance.  Callers
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // must call deref() when finished with the object.
30ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  static PluginHost* Singleton();
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The table of functions provided to the plugin.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPNetscapeFuncs* host_functions() { return &host_funcs_; }
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper function for parsing post headers, and applying attributes
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to the stream.  NPAPI post data include headers + data combined.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This function parses it out and adds it to the stream in a WebKit
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // style.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool SetPostData(const char *buf,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          uint32 length,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          std::vector<std::string>* names,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          std::vector<std::string>* values,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          std::vector<char>* body);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  void PatchNPNetscapeFuncs(NPNetscapeFuncs* overrides);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCounted<PluginHost>;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PluginHost();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PluginHost();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InitializeHostFuncs();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPNetscapeFuncs host_funcs_;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PluginHost);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}  // namespace content
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif  // CONTENT_CHILD_NPAPI_PLUGIN_HOST_H_
61