Add ability to directly retrieve plugin information (issue #575).

git-svn-id: https://chromiumembedded.googlecode.com/svn/trunk@609 5089003a-bbd8-11dd-ad1f-f1f9622dbc98
This commit is contained in:
Marshall Greenblatt 2012-04-27 19:12:01 +00:00
parent 9017c0e74e
commit 4fe0ddf640
22 changed files with 847 additions and 1 deletions

View File

@ -814,6 +814,7 @@
'libcef/browser/url_request_context_getter_proxy.h', 'libcef/browser/url_request_context_getter_proxy.h',
'libcef/browser/url_request_interceptor.cc', 'libcef/browser/url_request_interceptor.cc',
'libcef/browser/url_request_interceptor.h', 'libcef/browser/url_request_interceptor.h',
'libcef/browser/web_plugin_impl.cc',
'libcef/browser/xml_reader_impl.cc', 'libcef/browser/xml_reader_impl.cc',
'libcef/browser/xml_reader_impl.h', 'libcef/browser/xml_reader_impl.h',
'libcef/browser/zip_reader_impl.cc', 'libcef/browser/zip_reader_impl.cc',

View File

@ -42,6 +42,7 @@
'include/cef_url.h', 'include/cef_url.h',
'include/cef_v8.h', 'include/cef_v8.h',
'include/cef_values.h', 'include/cef_values.h',
'include/cef_web_plugin.h',
'include/cef_xml_reader.h', 'include/cef_xml_reader.h',
'include/cef_zip_reader.h', 'include/cef_zip_reader.h',
], ],
@ -76,6 +77,7 @@
'include/capi/cef_url_capi.h', 'include/capi/cef_url_capi.h',
'include/capi/cef_v8_capi.h', 'include/capi/cef_v8_capi.h',
'include/capi/cef_values_capi.h', 'include/capi/cef_values_capi.h',
'include/capi/cef_web_plugin_capi.h',
'include/capi/cef_xml_reader_capi.h', 'include/capi/cef_xml_reader_capi.h',
'include/capi/cef_zip_reader_capi.h', 'include/capi/cef_zip_reader_capi.h',
], ],
@ -170,6 +172,10 @@
'libcef_dll/ctocpp/v8handler_ctocpp.h', 'libcef_dll/ctocpp/v8handler_ctocpp.h',
'libcef_dll/cpptoc/v8value_cpptoc.cc', 'libcef_dll/cpptoc/v8value_cpptoc.cc',
'libcef_dll/cpptoc/v8value_cpptoc.h', 'libcef_dll/cpptoc/v8value_cpptoc.h',
'libcef_dll/cpptoc/web_plugin_info_cpptoc.cc',
'libcef_dll/cpptoc/web_plugin_info_cpptoc.h',
'libcef_dll/ctocpp/web_plugin_info_visitor_ctocpp.cc',
'libcef_dll/ctocpp/web_plugin_info_visitor_ctocpp.h',
'libcef_dll/ctocpp/write_handler_ctocpp.cc', 'libcef_dll/ctocpp/write_handler_ctocpp.cc',
'libcef_dll/ctocpp/write_handler_ctocpp.h', 'libcef_dll/ctocpp/write_handler_ctocpp.h',
'libcef_dll/cpptoc/xml_reader_cpptoc.cc', 'libcef_dll/cpptoc/xml_reader_cpptoc.cc',
@ -268,6 +274,10 @@
'libcef_dll/cpptoc/v8handler_cpptoc.h', 'libcef_dll/cpptoc/v8handler_cpptoc.h',
'libcef_dll/ctocpp/v8value_ctocpp.cc', 'libcef_dll/ctocpp/v8value_ctocpp.cc',
'libcef_dll/ctocpp/v8value_ctocpp.h', 'libcef_dll/ctocpp/v8value_ctocpp.h',
'libcef_dll/ctocpp/web_plugin_info_ctocpp.cc',
'libcef_dll/ctocpp/web_plugin_info_ctocpp.h',
'libcef_dll/cpptoc/web_plugin_info_visitor_cpptoc.cc',
'libcef_dll/cpptoc/web_plugin_info_visitor_cpptoc.h',
'libcef_dll/cpptoc/write_handler_cpptoc.cc', 'libcef_dll/cpptoc/write_handler_cpptoc.cc',
'libcef_dll/cpptoc/write_handler_cpptoc.h', 'libcef_dll/cpptoc/write_handler_cpptoc.h',
'libcef_dll/ctocpp/xml_reader_ctocpp.cc', 'libcef_dll/ctocpp/xml_reader_ctocpp.cc',

View File

@ -0,0 +1,118 @@
// Copyright (c) 2012 Marshall A. Greenblatt. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the name Chromium Embedded
// Framework nor the names of its contributors may be used to endorse
// or promote products derived from this software without specific prior
// written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// ---------------------------------------------------------------------------
//
// This file was generated by the CEF translator tool and should not edited
// by hand. See the translator.README.txt file in the tools directory for
// more information.
//
#ifndef CEF_INCLUDE_CAPI_CEF_WEB_PLUGIN_CAPI_H_
#define CEF_INCLUDE_CAPI_CEF_WEB_PLUGIN_CAPI_H_
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
#include "include/capi/cef_base_capi.h"
///
// Visit web plugin information.
///
CEF_EXPORT void cef_visit_web_plugin_info(
struct _cef_web_plugin_info_visitor_t* visitor);
///
// Information about a specific web plugin.
///
typedef struct _cef_web_plugin_info_t {
///
// Base structure.
///
cef_base_t base;
///
// Returns the plugin name (i.e. Flash).
///
// The resulting string must be freed by calling cef_string_userfree_free().
cef_string_userfree_t (CEF_CALLBACK *get_name)(
struct _cef_web_plugin_info_t* self);
///
// Returns the plugin file path (DLL/bundle/library).
///
// The resulting string must be freed by calling cef_string_userfree_free().
cef_string_userfree_t (CEF_CALLBACK *get_path)(
struct _cef_web_plugin_info_t* self);
///
// Returns the version of the plugin (may be OS-specific).
///
// The resulting string must be freed by calling cef_string_userfree_free().
cef_string_userfree_t (CEF_CALLBACK *get_version)(
struct _cef_web_plugin_info_t* self);
///
// Returns a description of the plugin from the version information.
///
// The resulting string must be freed by calling cef_string_userfree_free().
cef_string_userfree_t (CEF_CALLBACK *get_description)(
struct _cef_web_plugin_info_t* self);
} cef_web_plugin_info_t;
///
// Structure to implement for visiting web plugin information. The functions of
// this structure will be called on the UI thread.
///
typedef struct _cef_web_plugin_info_visitor_t {
///
// Base structure.
///
cef_base_t base;
///
// Method that will be called once for each plugin. |count| is the 0-based
// index for the current plugin. |total| is the total number of plugins.
// Return false (0) to stop visiting plugins. This function may never be
// called if no plugins are found.
///
int (CEF_CALLBACK *visit)(struct _cef_web_plugin_info_visitor_t* self,
struct _cef_web_plugin_info_t* info, int count, int total);
} cef_web_plugin_info_visitor_t;
#ifdef __cplusplus
}
#endif
#endif // CEF_INCLUDE_CAPI_CEF_WEB_PLUGIN_CAPI_H_

101
include/cef_web_plugin.h Normal file
View File

@ -0,0 +1,101 @@
// Copyright (c) 2012 Marshall A. Greenblatt. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the name Chromium Embedded
// Framework nor the names of its contributors may be used to endorse
// or promote products derived from this software without specific prior
// written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// ---------------------------------------------------------------------------
//
// The contents of this file must follow a specific format in order to
// support the CEF translator tool. See the translator.README.txt file in the
// tools directory for more information.
//
#ifndef CEF_INCLUDE_CEF_WEB_PLUGIN_H_
#define CEF_INCLUDE_CEF_WEB_PLUGIN_H_
#include "include/cef_base.h"
class CefWebPluginInfoVisitor;
///
// Visit web plugin information.
///
/*--cef()--*/
void CefVisitWebPluginInfo(CefRefPtr<CefWebPluginInfoVisitor> visitor);
///
// Information about a specific web plugin.
///
/*--cef(source=library)--*/
class CefWebPluginInfo : public virtual CefBase {
public:
///
// Returns the plugin name (i.e. Flash).
///
/*--cef()--*/
virtual CefString GetName() =0;
///
// Returns the plugin file path (DLL/bundle/library).
///
/*--cef()--*/
virtual CefString GetPath() =0;
///
// Returns the version of the plugin (may be OS-specific).
///
/*--cef()--*/
virtual CefString GetVersion() =0;
///
// Returns a description of the plugin from the version information.
///
/*--cef()--*/
virtual CefString GetDescription() =0;
};
///
// Interface to implement for visiting web plugin information. The methods of
// this class will be called on the UI thread.
///
/*--cef(source=client)--*/
class CefWebPluginInfoVisitor : public virtual CefBase {
public:
///
// Method that will be called once for each plugin. |count| is the 0-based
// index for the current plugin. |total| is the total number of plugins.
// Return false to stop visiting plugins. This method may never be called if
// no plugins are found.
///
/*--cef()--*/
virtual bool Visit(CefRefPtr<CefWebPluginInfo> info, int count, int total) =0;
};
#endif // CEF_INCLUDE_CEF_WEB_PLUGIN_H_

View File

@ -0,0 +1,75 @@
// Copyright (c) 2012 The Chromium Embedded Framework 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 "include/cef_web_plugin.h"
#include "libcef/browser/context.h"
#include "libcef/browser/thread_util.h"
#include "base/bind.h"
#include "base/file_path.h"
#include "content/browser/plugin_service_impl.h"
namespace {
class CefWebPluginInfoImpl : public CefWebPluginInfo {
public:
explicit CefWebPluginInfoImpl(const webkit::WebPluginInfo& plugin_info)
: plugin_info_(plugin_info) {
}
virtual CefString GetName() OVERRIDE {
return plugin_info_.name;
}
virtual CefString GetPath() OVERRIDE {
return plugin_info_.path.value();
}
virtual CefString GetVersion() OVERRIDE {
return plugin_info_.version;
}
virtual CefString GetDescription() OVERRIDE {
return plugin_info_.desc;
}
private:
webkit::WebPluginInfo plugin_info_;
IMPLEMENT_REFCOUNTING(CefWebPluginInfoImpl);
};
void PluginsCallbackImpl(
CefRefPtr<CefWebPluginInfoVisitor> visitor,
const std::vector<webkit::WebPluginInfo>& all_plugins) {
CEF_REQUIRE_UIT();
int count = 0;
int total = static_cast<int>(all_plugins.size());
std::vector<webkit::WebPluginInfo>::const_iterator it = all_plugins.begin();
for (; it != all_plugins.end(); ++it, ++count) {
CefRefPtr<CefWebPluginInfoImpl> info(new CefWebPluginInfoImpl(*it));
if (!visitor->Visit(info.get(), count, total))
break;
}
}
} // namespace
void CefVisitWebPluginInfo(CefRefPtr<CefWebPluginInfoVisitor> visitor) {
// Verify that the context is in a valid state.
if (!CONTEXT_STATE_VALID()) {
NOTREACHED() << "context not valid";
return;
}
if (CEF_CURRENTLY_ON_UIT()) {
PluginServiceImpl::GetInstance()->GetPlugins(
base::Bind(PluginsCallbackImpl, visitor));
} else {
// Execute on the UI thread.
CEF_POST_TASK(CEF_UIT, base::Bind(CefVisitWebPluginInfo, visitor));
}
}

View File

@ -0,0 +1,94 @@
// Copyright (c) 2012 The Chromium Embedded Framework Authors. All rights
// reserved. Use of this source code is governed by a BSD-style license that
// can be found in the LICENSE file.
//
// ---------------------------------------------------------------------------
//
// This file was generated by the CEF translator tool. If making changes by
// hand only do so within the body of existing method and function
// implementations. See the translator.README.txt file in the tools directory
// for more information.
//
#include "libcef_dll/cpptoc/web_plugin_info_cpptoc.h"
// MEMBER FUNCTIONS - Body may be edited by hand.
cef_string_userfree_t CEF_CALLBACK web_plugin_info_get_name(
struct _cef_web_plugin_info_t* self) {
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
DCHECK(self);
if (!self)
return NULL;
// Execute
CefString _retval = CefWebPluginInfoCppToC::Get(self)->GetName();
// Return type: string
return _retval.DetachToUserFree();
}
cef_string_userfree_t CEF_CALLBACK web_plugin_info_get_path(
struct _cef_web_plugin_info_t* self) {
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
DCHECK(self);
if (!self)
return NULL;
// Execute
CefString _retval = CefWebPluginInfoCppToC::Get(self)->GetPath();
// Return type: string
return _retval.DetachToUserFree();
}
cef_string_userfree_t CEF_CALLBACK web_plugin_info_get_version(
struct _cef_web_plugin_info_t* self) {
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
DCHECK(self);
if (!self)
return NULL;
// Execute
CefString _retval = CefWebPluginInfoCppToC::Get(self)->GetVersion();
// Return type: string
return _retval.DetachToUserFree();
}
cef_string_userfree_t CEF_CALLBACK web_plugin_info_get_description(
struct _cef_web_plugin_info_t* self) {
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
DCHECK(self);
if (!self)
return NULL;
// Execute
CefString _retval = CefWebPluginInfoCppToC::Get(self)->GetDescription();
// Return type: string
return _retval.DetachToUserFree();
}
// CONSTRUCTOR - Do not edit by hand.
CefWebPluginInfoCppToC::CefWebPluginInfoCppToC(CefWebPluginInfo* cls)
: CefCppToC<CefWebPluginInfoCppToC, CefWebPluginInfo,
cef_web_plugin_info_t>(cls) {
struct_.struct_.get_name = web_plugin_info_get_name;
struct_.struct_.get_path = web_plugin_info_get_path;
struct_.struct_.get_version = web_plugin_info_get_version;
struct_.struct_.get_description = web_plugin_info_get_description;
}
#ifndef NDEBUG
template<> long CefCppToC<CefWebPluginInfoCppToC, CefWebPluginInfo,
cef_web_plugin_info_t>::DebugObjCt = 0;
#endif

View File

@ -0,0 +1,37 @@
// Copyright (c) 2012 The Chromium Embedded Framework Authors. All rights
// reserved. Use of this source code is governed by a BSD-style license that
// can be found in the LICENSE file.
//
// ---------------------------------------------------------------------------
//
// This file was generated by the CEF translator tool. If making changes by
// hand only do so within the body of existing method and function
// implementations. See the translator.README.txt file in the tools directory
// for more information.
//
#ifndef CEF_LIBCEF_DLL_CPPTOC_WEB_PLUGIN_INFO_CPPTOC_H_
#define CEF_LIBCEF_DLL_CPPTOC_WEB_PLUGIN_INFO_CPPTOC_H_
#pragma once
#ifndef BUILDING_CEF_SHARED
#pragma message("Warning: "__FILE__" may be accessed DLL-side only")
#else // BUILDING_CEF_SHARED
#include "include/cef_web_plugin.h"
#include "include/capi/cef_web_plugin_capi.h"
#include "libcef_dll/cpptoc/cpptoc.h"
// Wrap a C++ class with a C structure.
// This class may be instantiated and accessed DLL-side only.
class CefWebPluginInfoCppToC
: public CefCppToC<CefWebPluginInfoCppToC, CefWebPluginInfo,
cef_web_plugin_info_t> {
public:
explicit CefWebPluginInfoCppToC(CefWebPluginInfo* cls);
virtual ~CefWebPluginInfoCppToC() {}
};
#endif // BUILDING_CEF_SHARED
#endif // CEF_LIBCEF_DLL_CPPTOC_WEB_PLUGIN_INFO_CPPTOC_H_

View File

@ -0,0 +1,56 @@
// Copyright (c) 2012 The Chromium Embedded Framework Authors. All rights
// reserved. Use of this source code is governed by a BSD-style license that
// can be found in the LICENSE file.
//
// ---------------------------------------------------------------------------
//
// This file was generated by the CEF translator tool. If making changes by
// hand only do so within the body of existing method and function
// implementations. See the translator.README.txt file in the tools directory
// for more information.
//
#include "libcef_dll/cpptoc/web_plugin_info_visitor_cpptoc.h"
#include "libcef_dll/ctocpp/web_plugin_info_ctocpp.h"
// MEMBER FUNCTIONS - Body may be edited by hand.
int CEF_CALLBACK web_plugin_info_visitor_visit(
struct _cef_web_plugin_info_visitor_t* self, cef_web_plugin_info_t* info,
int count, int total) {
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
DCHECK(self);
if (!self)
return 0;
// Verify param: info; type: refptr_diff
DCHECK(info);
if (!info)
return 0;
// Execute
bool _retval = CefWebPluginInfoVisitorCppToC::Get(self)->Visit(
CefWebPluginInfoCToCpp::Wrap(info),
count,
total);
// Return type: bool
return _retval;
}
// CONSTRUCTOR - Do not edit by hand.
CefWebPluginInfoVisitorCppToC::CefWebPluginInfoVisitorCppToC(
CefWebPluginInfoVisitor* cls)
: CefCppToC<CefWebPluginInfoVisitorCppToC, CefWebPluginInfoVisitor,
cef_web_plugin_info_visitor_t>(cls) {
struct_.struct_.visit = web_plugin_info_visitor_visit;
}
#ifndef NDEBUG
template<> long CefCppToC<CefWebPluginInfoVisitorCppToC,
CefWebPluginInfoVisitor, cef_web_plugin_info_visitor_t>::DebugObjCt = 0;
#endif

View File

@ -0,0 +1,37 @@
// Copyright (c) 2012 The Chromium Embedded Framework Authors. All rights
// reserved. Use of this source code is governed by a BSD-style license that
// can be found in the LICENSE file.
//
// ---------------------------------------------------------------------------
//
// This file was generated by the CEF translator tool. If making changes by
// hand only do so within the body of existing method and function
// implementations. See the translator.README.txt file in the tools directory
// for more information.
//
#ifndef CEF_LIBCEF_DLL_CPPTOC_WEB_PLUGIN_INFO_VISITOR_CPPTOC_H_
#define CEF_LIBCEF_DLL_CPPTOC_WEB_PLUGIN_INFO_VISITOR_CPPTOC_H_
#pragma once
#ifndef USING_CEF_SHARED
#pragma message("Warning: "__FILE__" may be accessed wrapper-side only")
#else // USING_CEF_SHARED
#include "include/cef_web_plugin.h"
#include "include/capi/cef_web_plugin_capi.h"
#include "libcef_dll/cpptoc/cpptoc.h"
// Wrap a C++ class with a C structure.
// This class may be instantiated and accessed wrapper-side only.
class CefWebPluginInfoVisitorCppToC
: public CefCppToC<CefWebPluginInfoVisitorCppToC, CefWebPluginInfoVisitor,
cef_web_plugin_info_visitor_t> {
public:
explicit CefWebPluginInfoVisitorCppToC(CefWebPluginInfoVisitor* cls);
virtual ~CefWebPluginInfoVisitorCppToC() {}
};
#endif // USING_CEF_SHARED
#endif // CEF_LIBCEF_DLL_CPPTOC_WEB_PLUGIN_INFO_VISITOR_CPPTOC_H_

View File

@ -0,0 +1,83 @@
// Copyright (c) 2012 The Chromium Embedded Framework Authors. All rights
// reserved. Use of this source code is governed by a BSD-style license that
// can be found in the LICENSE file.
//
// ---------------------------------------------------------------------------
//
// This file was generated by the CEF translator tool. If making changes by
// hand only do so within the body of existing method and function
// implementations. See the translator.README.txt file in the tools directory
// for more information.
//
#include "libcef_dll/ctocpp/web_plugin_info_ctocpp.h"
// VIRTUAL METHODS - Body may be edited by hand.
CefString CefWebPluginInfoCToCpp::GetName() {
if (CEF_MEMBER_MISSING(struct_, get_name))
return CefString();
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
// Execute
cef_string_userfree_t _retval = struct_->get_name(struct_);
// Return type: string
CefString _retvalStr;
_retvalStr.AttachToUserFree(_retval);
return _retvalStr;
}
CefString CefWebPluginInfoCToCpp::GetPath() {
if (CEF_MEMBER_MISSING(struct_, get_path))
return CefString();
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
// Execute
cef_string_userfree_t _retval = struct_->get_path(struct_);
// Return type: string
CefString _retvalStr;
_retvalStr.AttachToUserFree(_retval);
return _retvalStr;
}
CefString CefWebPluginInfoCToCpp::GetVersion() {
if (CEF_MEMBER_MISSING(struct_, get_version))
return CefString();
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
// Execute
cef_string_userfree_t _retval = struct_->get_version(struct_);
// Return type: string
CefString _retvalStr;
_retvalStr.AttachToUserFree(_retval);
return _retvalStr;
}
CefString CefWebPluginInfoCToCpp::GetDescription() {
if (CEF_MEMBER_MISSING(struct_, get_description))
return CefString();
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
// Execute
cef_string_userfree_t _retval = struct_->get_description(struct_);
// Return type: string
CefString _retvalStr;
_retvalStr.AttachToUserFree(_retval);
return _retvalStr;
}
#ifndef NDEBUG
template<> long CefCToCpp<CefWebPluginInfoCToCpp, CefWebPluginInfo,
cef_web_plugin_info_t>::DebugObjCt = 0;
#endif

View File

@ -0,0 +1,45 @@
// Copyright (c) 2012 The Chromium Embedded Framework Authors. All rights
// reserved. Use of this source code is governed by a BSD-style license that
// can be found in the LICENSE file.
//
// ---------------------------------------------------------------------------
//
// This file was generated by the CEF translator tool. If making changes by
// hand only do so within the body of existing method and function
// implementations. See the translator.README.txt file in the tools directory
// for more information.
//
#ifndef CEF_LIBCEF_DLL_CTOCPP_WEB_PLUGIN_INFO_CTOCPP_H_
#define CEF_LIBCEF_DLL_CTOCPP_WEB_PLUGIN_INFO_CTOCPP_H_
#pragma once
#ifndef USING_CEF_SHARED
#pragma message("Warning: "__FILE__" may be accessed wrapper-side only")
#else // USING_CEF_SHARED
#include "include/cef_web_plugin.h"
#include "include/capi/cef_web_plugin_capi.h"
#include "libcef_dll/ctocpp/ctocpp.h"
// Wrap a C structure with a C++ class.
// This class may be instantiated and accessed wrapper-side only.
class CefWebPluginInfoCToCpp
: public CefCToCpp<CefWebPluginInfoCToCpp, CefWebPluginInfo,
cef_web_plugin_info_t> {
public:
explicit CefWebPluginInfoCToCpp(cef_web_plugin_info_t* str)
: CefCToCpp<CefWebPluginInfoCToCpp, CefWebPluginInfo,
cef_web_plugin_info_t>(str) {}
virtual ~CefWebPluginInfoCToCpp() {}
// CefWebPluginInfo methods
virtual CefString GetName() OVERRIDE;
virtual CefString GetPath() OVERRIDE;
virtual CefString GetVersion() OVERRIDE;
virtual CefString GetDescription() OVERRIDE;
};
#endif // USING_CEF_SHARED
#endif // CEF_LIBCEF_DLL_CTOCPP_WEB_PLUGIN_INFO_CTOCPP_H_

View File

@ -0,0 +1,46 @@
// Copyright (c) 2012 The Chromium Embedded Framework Authors. All rights
// reserved. Use of this source code is governed by a BSD-style license that
// can be found in the LICENSE file.
//
// ---------------------------------------------------------------------------
//
// This file was generated by the CEF translator tool. If making changes by
// hand only do so within the body of existing method and function
// implementations. See the translator.README.txt file in the tools directory
// for more information.
//
#include "libcef_dll/cpptoc/web_plugin_info_cpptoc.h"
#include "libcef_dll/ctocpp/web_plugin_info_visitor_ctocpp.h"
// VIRTUAL METHODS - Body may be edited by hand.
bool CefWebPluginInfoVisitorCToCpp::Visit(CefRefPtr<CefWebPluginInfo> info,
int count, int total) {
if (CEF_MEMBER_MISSING(struct_, visit))
return false;
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
// Verify param: info; type: refptr_diff
DCHECK(info.get());
if (!info.get())
return false;
// Execute
int _retval = struct_->visit(struct_,
CefWebPluginInfoCppToC::Wrap(info),
count,
total);
// Return type: bool
return _retval?true:false;
}
#ifndef NDEBUG
template<> long CefCToCpp<CefWebPluginInfoVisitorCToCpp,
CefWebPluginInfoVisitor, cef_web_plugin_info_visitor_t>::DebugObjCt = 0;
#endif

View File

@ -0,0 +1,43 @@
// Copyright (c) 2012 The Chromium Embedded Framework Authors. All rights
// reserved. Use of this source code is governed by a BSD-style license that
// can be found in the LICENSE file.
//
// ---------------------------------------------------------------------------
//
// This file was generated by the CEF translator tool. If making changes by
// hand only do so within the body of existing method and function
// implementations. See the translator.README.txt file in the tools directory
// for more information.
//
#ifndef CEF_LIBCEF_DLL_CTOCPP_WEB_PLUGIN_INFO_VISITOR_CTOCPP_H_
#define CEF_LIBCEF_DLL_CTOCPP_WEB_PLUGIN_INFO_VISITOR_CTOCPP_H_
#pragma once
#ifndef BUILDING_CEF_SHARED
#pragma message("Warning: "__FILE__" may be accessed DLL-side only")
#else // BUILDING_CEF_SHARED
#include "include/cef_web_plugin.h"
#include "include/capi/cef_web_plugin_capi.h"
#include "libcef_dll/ctocpp/ctocpp.h"
// Wrap a C structure with a C++ class.
// This class may be instantiated and accessed DLL-side only.
class CefWebPluginInfoVisitorCToCpp
: public CefCToCpp<CefWebPluginInfoVisitorCToCpp, CefWebPluginInfoVisitor,
cef_web_plugin_info_visitor_t> {
public:
explicit CefWebPluginInfoVisitorCToCpp(cef_web_plugin_info_visitor_t* str)
: CefCToCpp<CefWebPluginInfoVisitorCToCpp, CefWebPluginInfoVisitor,
cef_web_plugin_info_visitor_t>(str) {}
virtual ~CefWebPluginInfoVisitorCToCpp() {}
// CefWebPluginInfoVisitor methods
virtual bool Visit(CefRefPtr<CefWebPluginInfo> info, int count,
int total) OVERRIDE;
};
#endif // BUILDING_CEF_SHARED
#endif // CEF_LIBCEF_DLL_CTOCPP_WEB_PLUGIN_INFO_VISITOR_CTOCPP_H_

View File

@ -22,6 +22,8 @@
#include "include/capi/cef_url_capi.h" #include "include/capi/cef_url_capi.h"
#include "include/cef_v8.h" #include "include/cef_v8.h"
#include "include/capi/cef_v8_capi.h" #include "include/capi/cef_v8_capi.h"
#include "include/cef_web_plugin.h"
#include "include/capi/cef_web_plugin_capi.h"
#include "libcef_dll/cpptoc/auth_callback_cpptoc.h" #include "libcef_dll/cpptoc/auth_callback_cpptoc.h"
#include "libcef_dll/cpptoc/binary_value_cpptoc.h" #include "libcef_dll/cpptoc/binary_value_cpptoc.h"
#include "libcef_dll/cpptoc/browser_cpptoc.h" #include "libcef_dll/cpptoc/browser_cpptoc.h"
@ -46,6 +48,7 @@
#include "libcef_dll/cpptoc/v8context_cpptoc.h" #include "libcef_dll/cpptoc/v8context_cpptoc.h"
#include "libcef_dll/cpptoc/v8exception_cpptoc.h" #include "libcef_dll/cpptoc/v8exception_cpptoc.h"
#include "libcef_dll/cpptoc/v8value_cpptoc.h" #include "libcef_dll/cpptoc/v8value_cpptoc.h"
#include "libcef_dll/cpptoc/web_plugin_info_cpptoc.h"
#include "libcef_dll/cpptoc/xml_reader_cpptoc.h" #include "libcef_dll/cpptoc/xml_reader_cpptoc.h"
#include "libcef_dll/cpptoc/zip_reader_cpptoc.h" #include "libcef_dll/cpptoc/zip_reader_cpptoc.h"
#include "libcef_dll/ctocpp/app_ctocpp.h" #include "libcef_dll/ctocpp/app_ctocpp.h"
@ -67,6 +70,7 @@
#include "libcef_dll/ctocpp/task_ctocpp.h" #include "libcef_dll/ctocpp/task_ctocpp.h"
#include "libcef_dll/ctocpp/v8accessor_ctocpp.h" #include "libcef_dll/ctocpp/v8accessor_ctocpp.h"
#include "libcef_dll/ctocpp/v8handler_ctocpp.h" #include "libcef_dll/ctocpp/v8handler_ctocpp.h"
#include "libcef_dll/ctocpp/web_plugin_info_visitor_ctocpp.h"
#include "libcef_dll/ctocpp/write_handler_ctocpp.h" #include "libcef_dll/ctocpp/write_handler_ctocpp.h"
@ -179,6 +183,8 @@ CEF_EXPORT void cef_shutdown() {
DCHECK_EQ(CefV8ExceptionCppToC::DebugObjCt, 0); DCHECK_EQ(CefV8ExceptionCppToC::DebugObjCt, 0);
DCHECK_EQ(CefV8HandlerCToCpp::DebugObjCt, 0); DCHECK_EQ(CefV8HandlerCToCpp::DebugObjCt, 0);
DCHECK_EQ(CefV8ValueCppToC::DebugObjCt, 0); DCHECK_EQ(CefV8ValueCppToC::DebugObjCt, 0);
DCHECK_EQ(CefWebPluginInfoCppToC::DebugObjCt, 0);
DCHECK_EQ(CefWebPluginInfoVisitorCToCpp::DebugObjCt, 0);
DCHECK_EQ(CefWriteHandlerCToCpp::DebugObjCt, 0); DCHECK_EQ(CefWriteHandlerCToCpp::DebugObjCt, 0);
DCHECK_EQ(CefXmlReaderCppToC::DebugObjCt, 0); DCHECK_EQ(CefXmlReaderCppToC::DebugObjCt, 0);
DCHECK_EQ(CefZipReaderCppToC::DebugObjCt, 0); DCHECK_EQ(CefZipReaderCppToC::DebugObjCt, 0);
@ -437,3 +443,17 @@ CEF_EXPORT int cef_register_extension(const cef_string_t* extension_name,
return _retval; return _retval;
} }
CEF_EXPORT void cef_visit_web_plugin_info(
struct _cef_web_plugin_info_visitor_t* visitor) {
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
// Verify param: visitor; type: refptr_diff
DCHECK(visitor);
if (!visitor)
return;
// Execute
CefVisitWebPluginInfo(
CefWebPluginInfoVisitorCToCpp::Wrap(visitor));
}

View File

@ -22,6 +22,8 @@
#include "include/capi/cef_url_capi.h" #include "include/capi/cef_url_capi.h"
#include "include/cef_v8.h" #include "include/cef_v8.h"
#include "include/capi/cef_v8_capi.h" #include "include/capi/cef_v8_capi.h"
#include "include/cef_web_plugin.h"
#include "include/capi/cef_web_plugin_capi.h"
#include "include/cef_version.h" #include "include/cef_version.h"
#include "libcef_dll/cpptoc/app_cpptoc.h" #include "libcef_dll/cpptoc/app_cpptoc.h"
#include "libcef_dll/cpptoc/context_menu_handler_cpptoc.h" #include "libcef_dll/cpptoc/context_menu_handler_cpptoc.h"
@ -42,6 +44,7 @@
#include "libcef_dll/cpptoc/task_cpptoc.h" #include "libcef_dll/cpptoc/task_cpptoc.h"
#include "libcef_dll/cpptoc/v8accessor_cpptoc.h" #include "libcef_dll/cpptoc/v8accessor_cpptoc.h"
#include "libcef_dll/cpptoc/v8handler_cpptoc.h" #include "libcef_dll/cpptoc/v8handler_cpptoc.h"
#include "libcef_dll/cpptoc/web_plugin_info_visitor_cpptoc.h"
#include "libcef_dll/cpptoc/write_handler_cpptoc.h" #include "libcef_dll/cpptoc/write_handler_cpptoc.h"
#include "libcef_dll/ctocpp/auth_callback_ctocpp.h" #include "libcef_dll/ctocpp/auth_callback_ctocpp.h"
#include "libcef_dll/ctocpp/binary_value_ctocpp.h" #include "libcef_dll/ctocpp/binary_value_ctocpp.h"
@ -67,6 +70,7 @@
#include "libcef_dll/ctocpp/v8context_ctocpp.h" #include "libcef_dll/ctocpp/v8context_ctocpp.h"
#include "libcef_dll/ctocpp/v8exception_ctocpp.h" #include "libcef_dll/ctocpp/v8exception_ctocpp.h"
#include "libcef_dll/ctocpp/v8value_ctocpp.h" #include "libcef_dll/ctocpp/v8value_ctocpp.h"
#include "libcef_dll/ctocpp/web_plugin_info_ctocpp.h"
#include "libcef_dll/ctocpp/xml_reader_ctocpp.h" #include "libcef_dll/ctocpp/xml_reader_ctocpp.h"
#include "libcef_dll/ctocpp/zip_reader_ctocpp.h" #include "libcef_dll/ctocpp/zip_reader_ctocpp.h"
@ -171,6 +175,8 @@ CEF_GLOBAL void CefShutdown() {
DCHECK_EQ(CefV8ExceptionCToCpp::DebugObjCt, 0); DCHECK_EQ(CefV8ExceptionCToCpp::DebugObjCt, 0);
DCHECK_EQ(CefV8HandlerCppToC::DebugObjCt, 0); DCHECK_EQ(CefV8HandlerCppToC::DebugObjCt, 0);
DCHECK_EQ(CefV8ValueCToCpp::DebugObjCt, 0); DCHECK_EQ(CefV8ValueCToCpp::DebugObjCt, 0);
DCHECK_EQ(CefWebPluginInfoCToCpp::DebugObjCt, 0);
DCHECK_EQ(CefWebPluginInfoVisitorCppToC::DebugObjCt, 0);
DCHECK_EQ(CefWriteHandlerCppToC::DebugObjCt, 0); DCHECK_EQ(CefWriteHandlerCppToC::DebugObjCt, 0);
DCHECK_EQ(CefXmlReaderCToCpp::DebugObjCt, 0); DCHECK_EQ(CefXmlReaderCToCpp::DebugObjCt, 0);
DCHECK_EQ(CefZipReaderCToCpp::DebugObjCt, 0); DCHECK_EQ(CefZipReaderCToCpp::DebugObjCt, 0);
@ -397,3 +403,17 @@ CEF_GLOBAL bool CefRegisterExtension(const CefString& extension_name,
return _retval?true:false; return _retval?true:false;
} }
CEF_GLOBAL void CefVisitWebPluginInfo(
CefRefPtr<CefWebPluginInfoVisitor> visitor) {
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
// Verify param: visitor; type: refptr_diff
DCHECK(visitor.get());
if (!visitor.get())
return;
// Execute
cef_visit_web_plugin_info(
CefWebPluginInfoVisitorCppToC::Wrap(visitor));
}

View File

@ -12,6 +12,7 @@
#include "include/cef_command_line.h" #include "include/cef_command_line.h"
#include "include/cef_frame.h" #include "include/cef_frame.h"
#include "include/cef_runnable.h" #include "include/cef_runnable.h"
#include "include/cef_web_plugin.h"
#include "cefclient/client_handler.h" #include "cefclient/client_handler.h"
#include "cefclient/client_switches.h" #include "cefclient/client_switches.h"
#include "cefclient/string_util.h" #include "cefclient/string_util.h"
@ -326,6 +327,39 @@ void RunDialogTest(CefRefPtr<CefBrowser> browser) {
browser->GetMainFrame()->LoadURL("http://tests/dialogs"); browser->GetMainFrame()->LoadURL("http://tests/dialogs");
} }
void RunPluginInfoTest(CefRefPtr<CefBrowser> browser) {
class Visitor : public CefWebPluginInfoVisitor {
public:
explicit Visitor(CefRefPtr<CefBrowser> browser)
: browser_(browser) {
html_ = "<html><head><title>Plugin Info Test</title></head><body>"
"\n<b>Installed plugins:</b>";
}
~Visitor() {
html_ += "\n</body></html>";
// Load the html in the browser.
browser_->GetMainFrame()->LoadString(html_, "http://tests/plugin_info");
}
virtual bool Visit(CefRefPtr<CefWebPluginInfo> info, int count, int total)
OVERRIDE {
html_ += "\n<br/><br/>Name: " + info->GetName().ToString() +
"\n<br/>Description: " + info->GetDescription().ToString() +
"\n<br/>Version: " + info->GetVersion().ToString() +
"\n<br/>Path: " + info->GetPath().ToString();
return true;
}
private:
std::string html_;
CefRefPtr<CefBrowser> browser_;
IMPLEMENT_REFCOUNTING(Visitor);
};
CefVisitWebPluginInfo(new Visitor(browser));
}
void RunLocalStorageTest(CefRefPtr<CefBrowser> browser) { void RunLocalStorageTest(CefRefPtr<CefBrowser> browser) {
browser->GetMainFrame()->LoadURL("http://tests/localstorage"); browser->GetMainFrame()->LoadURL("http://tests/localstorage");
} }

View File

@ -41,6 +41,7 @@ void RunGetTextTest(CefRefPtr<CefBrowser> browser);
void RunRequestTest(CefRefPtr<CefBrowser> browser); void RunRequestTest(CefRefPtr<CefBrowser> browser);
void RunPopupTest(CefRefPtr<CefBrowser> browser); void RunPopupTest(CefRefPtr<CefBrowser> browser);
void RunDialogTest(CefRefPtr<CefBrowser> browser); void RunDialogTest(CefRefPtr<CefBrowser> browser);
void RunPluginInfoTest(CefRefPtr<CefBrowser> browser);
void RunLocalStorageTest(CefRefPtr<CefBrowser> browser); void RunLocalStorageTest(CefRefPtr<CefBrowser> browser);
void RunAccelerated2DCanvasTest(CefRefPtr<CefBrowser> browser); void RunAccelerated2DCanvasTest(CefRefPtr<CefBrowser> browser);
void RunAcceleratedLayersTest(CefRefPtr<CefBrowser> browser); void RunAcceleratedLayersTest(CefRefPtr<CefBrowser> browser);

View File

@ -69,6 +69,7 @@ BEGIN
MENUITEM "Scheme Handler", ID_TESTS_SCHEME_HANDLER MENUITEM "Scheme Handler", ID_TESTS_SCHEME_HANDLER
MENUITEM "JavaScript Binding", ID_TESTS_BINDING MENUITEM "JavaScript Binding", ID_TESTS_BINDING
MENUITEM "JavaScript Dialogs", ID_TESTS_DIALOGS MENUITEM "JavaScript Dialogs", ID_TESTS_DIALOGS
MENUITEM "Plugin Info", ID_TESTS_PLUGIN_INFO
MENUITEM "Local Storage", ID_TESTS_LOCALSTORAGE MENUITEM "Local Storage", ID_TESTS_LOCALSTORAGE
MENUITEM "XMLHttpRequest", ID_TESTS_XMLHTTPREQUEST MENUITEM "XMLHttpRequest", ID_TESTS_XMLHTTPREQUEST
MENUITEM "Accelerated 2D Canvas", ID_TESTS_ACCELERATED2DCANVAS MENUITEM "Accelerated 2D Canvas", ID_TESTS_ACCELERATED2DCANVAS

View File

@ -85,6 +85,14 @@ gboolean BindingActivated(GtkWidget* widget) {
return FALSE; // Don't stop this message. return FALSE; // Don't stop this message.
} }
// Callback for Debug > Plugin Info... menu item.
gboolean PluginInfoActivated(GtkWidget* widget) {
if (g_handler.get() && g_handler->GetBrowserId())
RunPluginInfoTest(g_handler->GetBrowser());
return FALSE; // Don't stop this message.
}
// Callback for Debug > Popup Window... menu item. // Callback for Debug > Popup Window... menu item.
gboolean PopupWindowActivated(GtkWidget* widget) { gboolean PopupWindowActivated(GtkWidget* widget) {
if (g_handler.get() && g_handler->GetBrowserId()) if (g_handler.get() && g_handler->GetBrowserId())
@ -202,6 +210,8 @@ GtkWidget* CreateMenuBar() {
G_CALLBACK(SchemeHandlerActivated)); G_CALLBACK(SchemeHandlerActivated));
AddMenuEntry(debug_menu, "JavaScript Binding", AddMenuEntry(debug_menu, "JavaScript Binding",
G_CALLBACK(BindingActivated)); G_CALLBACK(BindingActivated));
AddMenuEntry(debug_menu, "Plugin Info",
G_CALLBACK(PluginInfoActivated));
AddMenuEntry(debug_menu, "Popup Window", AddMenuEntry(debug_menu, "Popup Window",
G_CALLBACK(PopupWindowActivated)); G_CALLBACK(PopupWindowActivated));
AddMenuEntry(debug_menu, "Accelerated 2D Canvas", AddMenuEntry(debug_menu, "Accelerated 2D Canvas",

View File

@ -194,6 +194,7 @@ NSButton* MakeButton(NSRect* rect, NSString* title, NSView* parent) {
- (IBAction)testSchemeHandler:(id)sender; - (IBAction)testSchemeHandler:(id)sender;
- (IBAction)testBinding:(id)sender; - (IBAction)testBinding:(id)sender;
- (IBAction)testDialogs:(id)sender; - (IBAction)testDialogs:(id)sender;
- (IBAction)testPluginInfo:(id)sender;
- (IBAction)testPopupWindow:(id)sender; - (IBAction)testPopupWindow:(id)sender;
- (IBAction)testAccelerated2DCanvas:(id)sender; - (IBAction)testAccelerated2DCanvas:(id)sender;
- (IBAction)testAcceleratedLayers:(id)sender; - (IBAction)testAcceleratedLayers:(id)sender;
@ -239,6 +240,9 @@ NSButton* MakeButton(NSRect* rect, NSString* title, NSView* parent) {
[testMenu addItemWithTitle:@"JavaScript Dialogs" [testMenu addItemWithTitle:@"JavaScript Dialogs"
action:@selector(testDialogs:) action:@selector(testDialogs:)
keyEquivalent:@""]; keyEquivalent:@""];
[testMenu addItemWithTitle:@"Plugin Info"
action:@selector(testPluginInfo:)
keyEquivalent:@""];
[testMenu addItemWithTitle:@"Local Storage" [testMenu addItemWithTitle:@"Local Storage"
action:@selector(testLocalStorage:) action:@selector(testLocalStorage:)
keyEquivalent:@""]; keyEquivalent:@""];
@ -391,6 +395,11 @@ NSButton* MakeButton(NSRect* rect, NSString* title, NSView* parent) {
RunDialogTest(g_handler->GetBrowser()); RunDialogTest(g_handler->GetBrowser());
} }
- (IBAction)testPluginInfo:(id)sender {
if (g_handler.get() && g_handler->GetBrowserId())
RunPluginInfoTest(g_handler->GetBrowser());
}
- (IBAction)testPopupWindow:(id)sender { - (IBAction)testPopupWindow:(id)sender {
if (g_handler.get() && g_handler->GetBrowserId()) if (g_handler.get() && g_handler->GetBrowserId())
RunPopupTest(g_handler->GetBrowser()); RunPopupTest(g_handler->GetBrowser());

View File

@ -377,10 +377,14 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam,
if (browser.get()) if (browser.get())
binding_test::RunTest(browser); binding_test::RunTest(browser);
return 0; return 0;
case ID_TESTS_DIALOGS: // Test JavaScript dialofs case ID_TESTS_DIALOGS: // Test JavaScript dialogs
if (browser.get()) if (browser.get())
RunDialogTest(browser); RunDialogTest(browser);
return 0; return 0;
case ID_TESTS_PLUGIN_INFO: // Test plugin info
if (browser.get())
RunPluginInfoTest(browser);
return 0;
case ID_TESTS_LOCALSTORAGE: // Test localStorage case ID_TESTS_LOCALSTORAGE: // Test localStorage
if (browser.get()) if (browser.get())
RunLocalStorageTest(browser); RunLocalStorageTest(browser);

View File

@ -39,6 +39,7 @@
#define ID_TESTS_GEOLOCATION 32772 #define ID_TESTS_GEOLOCATION 32772
#define ID_TESTS_BINDING 32773 #define ID_TESTS_BINDING 32773
#define ID_TESTS_DIALOGS 32774 #define ID_TESTS_DIALOGS 32774
#define ID_TESTS_PLUGIN_INFO 32775
#define IDC_STATIC -1 #define IDC_STATIC -1
#define IDS_BINDING 1000 #define IDS_BINDING 1000
#define IDS_DIALOGS 1001 #define IDS_DIALOGS 1001