summaryrefslogtreecommitdiffstats
path: root/ppapi
diff options
context:
space:
mode:
authorteravest@chromium.org <teravest@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-25 17:18:04 +0000
committerteravest@chromium.org <teravest@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-25 17:18:04 +0000
commit8917a67934617e7627d9241e8fb31545d4141429 (patch)
tree6e21410ab64832a51499bd05716c5e98836e2667 /ppapi
parent60780f41729ab40ba08b93ad4c279fbe0aee4c13 (diff)
downloadchromium_src-8917a67934617e7627d9241e8fb31545d4141429.zip
chromium_src-8917a67934617e7627d9241e8fb31545d4141429.tar.gz
chromium_src-8917a67934617e7627d9241e8fb31545d4141429.tar.bz2
Pepper IDL: Autogenerate thunk for ppb_audio_input
BUG= Review URL: https://chromiumcodereview.appspot.com/12212166 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@184424 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ppapi')
-rw-r--r--ppapi/api/dev/ppb_audio_input_dev.idl2
-rwxr-xr-xppapi/generators/idl_thunk.py129
-rw-r--r--ppapi/ppapi_shared.gypi4
-rw-r--r--ppapi/proxy/audio_input_resource.cc13
-rw-r--r--ppapi/proxy/audio_input_resource.h2
-rw-r--r--ppapi/thunk/ppb_audio_input_api.h2
-rw-r--r--ppapi/thunk/ppb_audio_input_dev_thunk.cc (renamed from ppapi/thunk/ppb_audio_input_thunk.cc)77
7 files changed, 137 insertions, 92 deletions
diff --git a/ppapi/api/dev/ppb_audio_input_dev.idl b/ppapi/api/dev/ppb_audio_input_dev.idl
index 9fe406c..29c60cc 100644
--- a/ppapi/api/dev/ppb_audio_input_dev.idl
+++ b/ppapi/api/dev/ppb_audio_input_dev.idl
@@ -8,6 +8,8 @@
* provides realtime audio input capture.
*/
+[generate_thunk]
+
label Chrome {
M19 = 0.2,
M25 = 0.3
diff --git a/ppapi/generators/idl_thunk.py b/ppapi/generators/idl_thunk.py
index 117f54a..a754e3f 100755
--- a/ppapi/generators/idl_thunk.py
+++ b/ppapi/generators/idl_thunk.py
@@ -163,38 +163,41 @@ def _MakeCreateMemberBody(interface, member, args):
args - List of arguments for the Create() function
"""
if args[0][0] == 'PP_Resource':
- body = ' Resource* object =\n'
- body += ' PpapiGlobals::Get()->GetResourceTracker()->'
+ body = 'Resource* object =\n'
+ body += ' PpapiGlobals::Get()->GetResourceTracker()->'
body += 'GetResource(%s);\n' % args[0][1]
- body += ' if (!object)\n'
- body += ' return 0;\n'
- body += ' EnterResourceCreation enter(object->pp_instance());\n'
+ body += 'if (!object)\n'
+ body += ' return 0;\n'
+ body += 'EnterResourceCreation enter(object->pp_instance());\n'
elif args[0][0] == 'PP_Instance':
- body = ' EnterResourceCreation enter(%s);\n' % args[0][1]
+ body = 'EnterResourceCreation enter(%s);\n' % args[0][1]
else:
raise TGenError('Unknown arg type for Create(): %s' % args[0][0])
- body += ' if (enter.failed())\n'
- body += ' return 0;\n'
+ body += 'if (enter.failed())\n'
+ body += ' return 0;\n'
arg_list = ', '.join([a[1] for a in args])
if member.GetProperty('create_func'):
create_func = member.GetProperty('create_func')
else:
create_func = _GetCreateFuncName(interface)
- body += ' return enter.functions()->%s(%s);' % (create_func,
- arg_list)
+ body += 'return enter.functions()->%s(%s);' % (create_func,
+ arg_list)
return body
-def _MakeNormalMemberBody(filenode, node, member, rtype, args, meta):
+def _MakeNormalMemberBody(filenode, release, node, member, rtype, args,
+ include_version, meta):
"""Returns the body of a typical function.
Args:
filenode - IDLNode for the file
+ release - release to generate body for
node - IDLNode for the interface
member - IDLNode for the member function
rtype - Return type for the member function
args - List of 4-tuple arguments for the member function
+ include_version - whether to include the version in the invocation
meta - ThunkBodyMetadata for header hints
"""
is_callback_func = args[len(args) - 1][0] == 'struct PP_CompletionCallback'
@@ -212,25 +215,30 @@ def _MakeNormalMemberBody(filenode, node, member, rtype, args, meta):
call_arglist = ', '.join(a[1] for a in call_args[1:])
function_container = 'object'
+ function_name = member.GetName()
+ if include_version:
+ version = node.GetVersion(release).replace('.', '_')
+ function_name += version
+
invocation = 'enter.%s()->%s(%s)' % (function_container,
- member.GetName(),
+ function_name,
call_arglist)
handle_errors = not (member.GetProperty('report_errors') == 'False')
if is_callback_func:
- body = ' %s\n' % _MakeEnterLine(filenode, node, args[0], handle_errors,
- args[len(args) - 1][1], meta)
- body += ' if (enter.failed())\n'
+ body = '%s\n' % _MakeEnterLine(filenode, node, args[0], handle_errors,
+ args[len(args) - 1][1], meta)
+ body += 'if (enter.failed())\n'
value = member.GetProperty('on_failure')
if value is None:
value = 'enter.retval()'
- body += ' return %s;\n' % value
- body += ' return enter.SetResult(%s);' % invocation
+ body += ' return %s;\n' % value
+ body += 'return enter.SetResult(%s);' % invocation
elif rtype == 'void':
- body = ' %s\n' % _MakeEnterLine(filenode, node, args[0], handle_errors,
- None, meta)
- body += ' if (enter.succeeded())\n'
- body += ' %s;' % invocation
+ body = '%s\n' % _MakeEnterLine(filenode, node, args[0], handle_errors,
+ None, meta)
+ body += 'if (enter.succeeded())\n'
+ body += ' %s;' % invocation
else:
value = member.GetProperty('on_failure')
if value is None:
@@ -238,11 +246,11 @@ def _MakeNormalMemberBody(filenode, node, member, rtype, args, meta):
if value is None:
raise TGenError('No default value for rtype %s' % rtype)
- body = ' %s\n' % _MakeEnterLine(filenode, node, args[0], handle_errors,
- None, meta)
- body += ' if (enter.failed())\n'
- body += ' return %s;\n' % value
- body += ' return %s;' % invocation
+ body = '%s\n' % _MakeEnterLine(filenode, node, args[0], handle_errors,
+ None, meta)
+ body += 'if (enter.failed())\n'
+ body += ' return %s;\n' % value
+ body += 'return %s;' % invocation
return body
@@ -263,17 +271,49 @@ def DefineMember(filenode, node, member, release, include_version, meta):
rtype, name, arrays, args = cgen.GetComponents(member, release, 'return')
if _IsTypeCheck(node, member):
- body = ' %s\n' % _MakeEnterLine(filenode, node, args[0], False, None, meta)
- body += ' return PP_FromBool(enter.succeeded());'
+ body = '%s\n' % _MakeEnterLine(filenode, node, args[0], False, None, meta)
+ body += 'return PP_FromBool(enter.succeeded());'
elif member.GetName() == 'Create':
body = _MakeCreateMemberBody(node, member, args)
else:
- body = _MakeNormalMemberBody(filenode, node, member, rtype, args, meta)
+ body = _MakeNormalMemberBody(filenode, release, node, member, rtype, args,
+ include_version, meta)
signature = cgen.GetSignature(member, release, 'return', func_as_ptr=False,
include_version=include_version)
- member_code = '%s {\n%s\n}' % (signature, body)
- return cgen.Indent(member_code, tabs=0)
+ return '%s\n%s\n}' % (cgen.Indent('%s {' % signature, tabs=0),
+ cgen.Indent(body, tabs=1))
+
+
+def _IsNewestMember(member, members, releases):
+ """Returns true if member is the newest node with its name in members.
+
+ Currently, every node in the AST only has one version. This means that we
+ will have two sibling nodes with the same name to represent different
+ versions.
+ See http://crbug.com/157017 .
+
+ Special handling is required for nodes which share their name with others,
+ but aren't the newest version in the IDL.
+
+ Args:
+ member - The member which is checked if it's newest
+ members - The list of members to inspect
+ releases - The set of releases to check for versions in.
+ """
+ build_list = member.GetUniqueReleases(releases)
+ assert(len(build_list) == 1)
+ release = build_list[-1] # Pick the newest release.
+ same_name_siblings = filter(
+ lambda n: str(n) == str(member) and n != member, members)
+
+ for s in same_name_siblings:
+ sibling_build_list = s.GetUniqueReleases(releases)
+ assert(len(sibling_build_list) == 1)
+ sibling_release = sibling_build_list[-1]
+ if sibling_release > release:
+ return False
+ return True
class TGen(GeneratorByFile):
@@ -347,7 +387,7 @@ class TGen(GeneratorByFile):
meta - a ThunkMetadata instance for hinting which headers are needed.
"""
__pychecker__ = 'unusednames=options'
- members = []
+ out_members = []
meta = ThunkBodyMetadata()
for node in filenode.GetListOf('Interface'):
# Skip if this node is not in this release
@@ -357,23 +397,22 @@ class TGen(GeneratorByFile):
# Generate Member functions
if node.IsA('Interface'):
- for child in node.GetListOf('Member'):
+ members = node.GetListOf('Member')
+ for child in members:
build_list = child.GetUniqueReleases(releases)
# We have to filter out releases this node isn't in.
build_list = filter(lambda r: child.InReleases([r]), build_list)
if len(build_list) == 0:
continue
- release = build_list[-1] # Pick the newest release.
- member = DefineMember(filenode, node, child, release, False, meta)
+ assert(len(build_list) == 1)
+ release = build_list[-1]
+ include_version = not _IsNewestMember(child, members, releases)
+ member = DefineMember(filenode, node, child, release, include_version,
+ meta)
if not member:
continue
- members.append(member)
- for build in build_list[:-1]:
- member = DefineMember(filenode, node, child, build, True, meta)
- if not member:
- continue
- members.append(member)
- return (members, meta)
+ out_members.append(member)
+ return (out_members, meta)
def WriteTail(self, out, filenode, releases, options):
__pychecker__ = 'unusednames=options'
@@ -392,9 +431,13 @@ class TGen(GeneratorByFile):
out.Write('const %s %s = {\n' % (thunk_type, thunk_name))
generated_functions = []
- for child in node.GetListOf('Member'):
+ members = node.GetListOf('Member')
+ for child in members:
rtype, name, arrays, args = cgen.GetComponents(
child, build, 'return')
+ if not _IsNewestMember(child, members, releases):
+ version = node.GetVersion(build).replace('.', '_')
+ name += '_' + version
if child.InReleases([build]):
generated_functions.append(name)
out.Write(',\n'.join([' &%s' % f for f in generated_functions]))
diff --git a/ppapi/ppapi_shared.gypi b/ppapi/ppapi_shared.gypi
index 36b2a6f..2a8f83f 100644
--- a/ppapi/ppapi_shared.gypi
+++ b/ppapi/ppapi_shared.gypi
@@ -130,7 +130,7 @@
'thunk/ppb_audio_config_api.h',
'thunk/ppb_audio_config_thunk.cc',
'thunk/ppb_audio_input_api.h',
- 'thunk/ppb_audio_input_thunk.cc',
+ 'thunk/ppb_audio_input_dev_thunk.cc',
'thunk/ppb_audio_thunk.cc',
'thunk/ppb_audio_trusted_thunk.cc',
'thunk/ppb_broker_api.h',
@@ -258,7 +258,7 @@
'shared_impl/ppb_video_capture_shared.cc',
'shared_impl/private/ppb_browser_font_trusted_shared.cc',
'shared_impl/private/ppb_char_set_shared.cc',
- 'thunk/ppb_audio_input_thunk.cc',
+ 'thunk/ppb_audio_input_dev_thunk.cc',
'thunk/ppb_audio_trusted_thunk.cc',
'thunk/ppb_broker_thunk.cc',
'thunk/ppb_browser_font_trusted_thunk.cc',
diff --git a/ppapi/proxy/audio_input_resource.cc b/ppapi/proxy/audio_input_resource.cc
index 14dd236..5f700ec 100644
--- a/ppapi/proxy/audio_input_resource.cc
+++ b/ppapi/proxy/audio_input_resource.cc
@@ -68,11 +68,22 @@ int32_t AudioInputResource::MonitorDeviceChange(
return enumeration_helper_.MonitorDeviceChange(callback, user_data);
}
-int32_t AudioInputResource::Open(const std::string& device_id,
+int32_t AudioInputResource::Open(PP_Resource device_ref,
PP_Resource config,
PPB_AudioInput_Callback audio_input_callback,
void* user_data,
scoped_refptr<TrackedCallback> callback) {
+ std::string device_id;
+ // |device_id| remains empty if |device_ref| is 0, which means the default
+ // device.
+ if (device_ref != 0) {
+ thunk::EnterResourceNoLock<thunk::PPB_DeviceRef_API> enter_device_ref(
+ device_ref, true);
+ if (enter_device_ref.failed())
+ return PP_ERROR_BADRESOURCE;
+ device_id = enter_device_ref.object()->GetDeviceRefData().id;
+ }
+
if (TrackedCallback::IsPending(open_callback_))
return PP_ERROR_INPROGRESS;
if (open_state_ != BEFORE_OPEN)
diff --git a/ppapi/proxy/audio_input_resource.h b/ppapi/proxy/audio_input_resource.h
index 85f27e2..abe18db 100644
--- a/ppapi/proxy/audio_input_resource.h
+++ b/ppapi/proxy/audio_input_resource.h
@@ -44,7 +44,7 @@ class AudioInputResource : public PluginResource,
virtual int32_t MonitorDeviceChange(
PP_MonitorDeviceChangeCallback callback,
void* user_data) OVERRIDE;
- virtual int32_t Open(const std::string& device_id,
+ virtual int32_t Open(PP_Resource device_ref,
PP_Resource config,
PPB_AudioInput_Callback audio_input_callback,
void* user_data,
diff --git a/ppapi/thunk/ppb_audio_input_api.h b/ppapi/thunk/ppb_audio_input_api.h
index 2e7b818..ebae557 100644
--- a/ppapi/thunk/ppb_audio_input_api.h
+++ b/ppapi/thunk/ppb_audio_input_api.h
@@ -27,7 +27,7 @@ class PPB_AudioInput_API {
scoped_refptr<TrackedCallback> callback) = 0;
virtual int32_t MonitorDeviceChange(PP_MonitorDeviceChangeCallback callback,
void* user_data) = 0;
- virtual int32_t Open(const std::string& device_id,
+ virtual int32_t Open(PP_Resource device_ref,
PP_Resource config,
PPB_AudioInput_Callback audio_input_callback,
void* user_data,
diff --git a/ppapi/thunk/ppb_audio_input_thunk.cc b/ppapi/thunk/ppb_audio_input_dev_thunk.cc
index 5fa512e..7a23c63 100644
--- a/ppapi/thunk/ppb_audio_input_thunk.cc
+++ b/ppapi/thunk/ppb_audio_input_dev_thunk.cc
@@ -2,12 +2,15 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// From dev/ppb_audio_input_dev.idl modified Fri Feb 22 11:43:43 2013.
+
+#include "ppapi/c/dev/ppb_audio_input_dev.h"
+#include "ppapi/c/pp_completion_callback.h"
#include "ppapi/c/pp_errors.h"
-#include "ppapi/shared_impl/ppb_device_ref_shared.h"
#include "ppapi/shared_impl/tracked_callback.h"
#include "ppapi/thunk/enter.h"
-#include "ppapi/thunk/ppb_device_ref_api.h"
#include "ppapi/thunk/ppb_audio_input_api.h"
+#include "ppapi/thunk/ppb_instance_api.h"
#include "ppapi/thunk/resource_creation_api.h"
#include "ppapi/thunk/thunk.h"
@@ -16,39 +19,35 @@ namespace thunk {
namespace {
-typedef EnterResource<PPB_AudioInput_API> EnterAudioInput;
-
PP_Resource Create(PP_Instance instance) {
EnterResourceCreation enter(instance);
if (enter.failed())
return 0;
-
return enter.functions()->CreateAudioInput(instance);
}
PP_Bool IsAudioInput(PP_Resource resource) {
- EnterAudioInput enter(resource, false);
+ EnterResource<PPB_AudioInput_API> enter(resource, false);
return PP_FromBool(enter.succeeded());
}
-int32_t EnumerateDevices0_2(PP_Resource audio_input,
- PP_Resource* devices,
- PP_CompletionCallback callback) {
- EnterAudioInput enter(audio_input, callback, true);
+int32_t EnumerateDevices_0_2(PP_Resource audio_input,
+ PP_Resource* devices,
+ struct PP_CompletionCallback callback) {
+ EnterResource<PPB_AudioInput_API> enter(audio_input, callback, true);
if (enter.failed())
return enter.retval();
-
- return enter.SetResult(enter.object()->EnumerateDevices0_2(devices,
- enter.callback()));
+ return enter.SetResult(enter.object()->EnumerateDevices0_2(
+ devices,
+ enter.callback()));
}
int32_t EnumerateDevices(PP_Resource audio_input,
- PP_ArrayOutput output,
- PP_CompletionCallback callback) {
- EnterAudioInput enter(audio_input, callback, true);
+ struct PP_ArrayOutput output,
+ struct PP_CompletionCallback callback) {
+ EnterResource<PPB_AudioInput_API> enter(audio_input, callback, true);
if (enter.failed())
return enter.retval();
-
return enter.SetResult(enter.object()->EnumerateDevices(output,
enter.callback()));
}
@@ -56,7 +55,7 @@ int32_t EnumerateDevices(PP_Resource audio_input,
int32_t MonitorDeviceChange(PP_Resource audio_input,
PP_MonitorDeviceChangeCallback callback,
void* user_data) {
- EnterAudioInput enter(audio_input, true);
+ EnterResource<PPB_AudioInput_API> enter(audio_input, true);
if (enter.failed())
return enter.retval();
return enter.object()->MonitorDeviceChange(callback, user_data);
@@ -67,58 +66,48 @@ int32_t Open(PP_Resource audio_input,
PP_Resource config,
PPB_AudioInput_Callback audio_input_callback,
void* user_data,
- PP_CompletionCallback callback) {
- EnterAudioInput enter(audio_input, callback, true);
+ struct PP_CompletionCallback callback) {
+ EnterResource<PPB_AudioInput_API> enter(audio_input, callback, true);
if (enter.failed())
return enter.retval();
-
- std::string device_id;
- // |device_id| remains empty if |device_ref| is 0, which means the default
- // device.
- if (device_ref != 0) {
- EnterResourceNoLock<PPB_DeviceRef_API> enter_device_ref(device_ref, true);
- if (enter_device_ref.failed())
- return enter.SetResult(PP_ERROR_BADRESOURCE);
- device_id = enter_device_ref.object()->GetDeviceRefData().id;
- }
-
- return enter.SetResult(enter.object()->Open(
- device_id, config, audio_input_callback, user_data, enter.callback()));
+ return enter.SetResult(enter.object()->Open(device_ref,
+ config,
+ audio_input_callback,
+ user_data,
+ enter.callback()));
}
PP_Resource GetCurrentConfig(PP_Resource audio_input) {
- EnterAudioInput enter(audio_input, true);
+ EnterResource<PPB_AudioInput_API> enter(audio_input, true);
if (enter.failed())
return 0;
return enter.object()->GetCurrentConfig();
}
PP_Bool StartCapture(PP_Resource audio_input) {
- EnterAudioInput enter(audio_input, true);
+ EnterResource<PPB_AudioInput_API> enter(audio_input, true);
if (enter.failed())
return PP_FALSE;
-
return enter.object()->StartCapture();
}
PP_Bool StopCapture(PP_Resource audio_input) {
- EnterAudioInput enter(audio_input, true);
+ EnterResource<PPB_AudioInput_API> enter(audio_input, true);
if (enter.failed())
return PP_FALSE;
-
return enter.object()->StopCapture();
}
void Close(PP_Resource audio_input) {
- EnterAudioInput enter(audio_input, true);
+ EnterResource<PPB_AudioInput_API> enter(audio_input, true);
if (enter.succeeded())
enter.object()->Close();
}
-const PPB_AudioInput_Dev_0_2 g_ppb_audioinput_0_2_thunk = {
+const PPB_AudioInput_Dev_0_2 g_ppb_audioinput_dev_thunk_0_2 = {
&Create,
&IsAudioInput,
- &EnumerateDevices0_2,
+ &EnumerateDevices_0_2,
&Open,
&GetCurrentConfig,
&StartCapture,
@@ -126,7 +115,7 @@ const PPB_AudioInput_Dev_0_2 g_ppb_audioinput_0_2_thunk = {
&Close
};
-const PPB_AudioInput_Dev_0_3 g_ppb_audioinput_0_3_thunk = {
+const PPB_AudioInput_Dev_0_3 g_ppb_audioinput_dev_thunk_0_3 = {
&Create,
&IsAudioInput,
&EnumerateDevices,
@@ -141,11 +130,11 @@ const PPB_AudioInput_Dev_0_3 g_ppb_audioinput_0_3_thunk = {
} // namespace
const PPB_AudioInput_Dev_0_2* GetPPB_AudioInput_Dev_0_2_Thunk() {
- return &g_ppb_audioinput_0_2_thunk;
+ return &g_ppb_audioinput_dev_thunk_0_2;
}
const PPB_AudioInput_Dev_0_3* GetPPB_AudioInput_Dev_0_3_Thunk() {
- return &g_ppb_audioinput_0_3_thunk;
+ return &g_ppb_audioinput_dev_thunk_0_3;
}
} // namespace thunk