2008-08-09 14:55:32 +02:00
|
|
|
/* GObject introspection: typelib validation, auxiliary functions
|
|
|
|
* related to the binary typelib format
|
2008-02-08 16:31:03 +01:00
|
|
|
*
|
|
|
|
* Copyright (C) 2005 Matthias Clasen
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Lesser General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
* License along with this library; if not, write to the
|
|
|
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
|
|
* Boston, MA 02111-1307, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
#include <glib.h>
|
|
|
|
|
2008-09-19 04:24:05 +02:00
|
|
|
#include "config.h"
|
2008-06-08 16:37:30 +02:00
|
|
|
#include "gtypelib.h"
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-24 18:51:43 +02:00
|
|
|
typedef struct {
|
|
|
|
GTypelib *typelib;
|
|
|
|
GSList *context_stack;
|
|
|
|
} ValidateContext;
|
2008-02-08 16:31:03 +01:00
|
|
|
|
|
|
|
#define ALIGN_VALUE(this, boundary) \
|
|
|
|
(( ((unsigned long)(this)) + (((unsigned long)(boundary)) -1)) & (~(((unsigned long)(boundary))-1)))
|
|
|
|
|
2008-08-24 18:51:43 +02:00
|
|
|
static void
|
|
|
|
push_context (ValidateContext *ctx, const char *name)
|
|
|
|
{
|
|
|
|
ctx->context_stack = g_slist_prepend (ctx->context_stack, (char*)name);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
pop_context (ValidateContext *ctx)
|
|
|
|
{
|
|
|
|
g_assert (ctx->context_stack != NULL);
|
|
|
|
ctx->context_stack = g_slist_delete_link (ctx->context_stack,
|
|
|
|
ctx->context_stack);
|
|
|
|
}
|
|
|
|
|
2008-08-23 23:30:09 +02:00
|
|
|
static gboolean
|
2008-08-24 18:51:43 +02:00
|
|
|
validate_interface_blob (ValidateContext *ctx,
|
2008-08-23 23:30:09 +02:00
|
|
|
guint32 offset,
|
|
|
|
GError **error);
|
|
|
|
|
2008-10-22 16:31:58 +02:00
|
|
|
static DirEntry *
|
2008-08-24 18:51:43 +02:00
|
|
|
get_dir_entry_checked (GTypelib *typelib,
|
|
|
|
guint16 index,
|
|
|
|
GError **error)
|
|
|
|
{
|
|
|
|
Header *header = (Header *)typelib->data;
|
|
|
|
guint32 offset;
|
|
|
|
|
|
|
|
if (index == 0 || index > header->n_entries)
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
|
|
|
"Invalid directory index %d", index);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
offset = header->directory + (index - 1) * header->entry_blob_size;
|
|
|
|
|
|
|
|
if (typelib->len < offset + sizeof (DirEntry))
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID,
|
|
|
|
"The buffer is too short");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return (DirEntry *)&typelib->data[offset];
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static CommonBlob *
|
|
|
|
get_blob (GTypelib *typelib,
|
|
|
|
guint32 offset,
|
|
|
|
GError **error)
|
|
|
|
{
|
|
|
|
if (typelib->len < offset + sizeof (CommonBlob))
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID,
|
|
|
|
"The buffer is too short");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
return (CommonBlob *)&typelib->data[offset];
|
|
|
|
}
|
|
|
|
|
2008-08-23 23:30:09 +02:00
|
|
|
static InterfaceTypeBlob *
|
|
|
|
get_type_blob (GTypelib *typelib,
|
|
|
|
SimpleTypeBlob *simple,
|
|
|
|
GError **error)
|
|
|
|
{
|
|
|
|
if (simple->offset == 0)
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID,
|
|
|
|
"Expected blob for type");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2009-06-24 23:52:05 +02:00
|
|
|
if (simple->flags.reserved == 0 && simple->flags.reserved2 == 0)
|
2008-08-23 23:30:09 +02:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID,
|
2008-08-24 18:51:43 +02:00
|
|
|
"Expected non-basic type but got %d",
|
2009-06-24 23:52:05 +02:00
|
|
|
simple->flags.tag);
|
2008-08-23 23:30:09 +02:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-08-24 18:51:43 +02:00
|
|
|
return (InterfaceTypeBlob*) get_blob (typelib, simple->offset, error);
|
2008-08-23 23:30:09 +02:00
|
|
|
}
|
2008-02-08 16:31:03 +01:00
|
|
|
|
|
|
|
DirEntry *
|
2008-08-09 14:55:32 +02:00
|
|
|
g_typelib_get_dir_entry (GTypelib *typelib,
|
2008-02-08 16:31:03 +01:00
|
|
|
guint16 index)
|
|
|
|
{
|
2008-08-09 14:55:32 +02:00
|
|
|
Header *header = (Header *)typelib->data;
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
return (DirEntry *)&typelib->data[header->directory + (index - 1) * header->entry_blob_size];
|
Revert revisions 157,149-148,136-129 and 120. Move back to using
2008-04-22 Johan Dahlin <johan@gnome.org>
* girepository/ginfo.c (g_info_from_entry), (g_type_info_new),
(g_type_info_is_pointer), (g_type_info_get_tag),
(g_type_info_get_param_type), (g_type_info_get_interface),
(g_type_info_get_array_length), (g_type_info_is_zero_terminated),
(g_type_info_get_n_error_domains), (g_type_info_get_error_domain),
(g_error_domain_info_get_codes), (g_enum_info_get_value),
(g_object_info_get_interface), (g_object_info_get_field),
(g_interface_info_get_prerequisite),
(g_signal_info_get_class_closure), (g_constant_info_get_value):
* girepository/ginvoke.c (get_ffi_type):
* girepository/girepository.h:
* girepository/gmetadata.c (g_metadata_get_dir_entry),
(g_metadata_check_sanity), (validate_header),
(validate_array_type_blob), (validate_iface_type_blob),
(validate_param_type_blob), (validate_error_type_blob),
(validate_type_blob), (validate_constant_blob),
(validate_struct_blob), (validate_enum_blob):
* girepository/gmetadata.h:
* tests/Makefile.am:
* tests/invoke/Makefile.am:
* tests/invoke/invoke.c (main):
* tests/roundtrips.sh:
* tools/Makefile.am:
* tools/compiler.c (format_output), (write_out_metadata), (main):
* tools/generate.c (write_type_name), (write_type_info),
(write_constant_value), (write_enum_info), (load_metadata), (main):
* tools/gidlcompilercontext.c:
* tools/gidlcompilercontext.h:
* tools/gidlcompilerentrynode.c:
* tools/gidlcompilerentrynode.h:
* tools/gidlcompilertypenode.c:
* tools/gidlcompilertypenode.h:
* tools/gidlmodule.c (g_idl_module_build_metadata):
* tools/gidlmodule.h:
* tools/gidlnode.c (init_stats), (dump_stats),
(g_idl_node_get_size), (g_idl_node_get_full_size),
(g_idl_node_cmp), (g_idl_node_can_have_member),
(g_idl_node_add_member), (g_idl_node_param_direction_string),
(parse_int_value), (parse_uint_value), (parse_float_value),
(parse_boolean_value), (find_entry_node), (find_entry),
(serialize_type), (g_idl_node_build_metadata), (write_string):
* tools/gidlnode.h:
* tools/gidlparser.c (parse_type_internal):
* tools/quote-file.sh:
Revert revisions 157,149-148,136-129 and 120.
Move back to using g-idl-generate to generate the metadata and
avoids dependency on a c compiler.
svn path=/trunk/; revision=214
2008-04-23 00:48:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2008-06-08 16:37:30 +02:00
|
|
|
g_typelib_check_sanity (void)
|
Revert revisions 157,149-148,136-129 and 120. Move back to using
2008-04-22 Johan Dahlin <johan@gnome.org>
* girepository/ginfo.c (g_info_from_entry), (g_type_info_new),
(g_type_info_is_pointer), (g_type_info_get_tag),
(g_type_info_get_param_type), (g_type_info_get_interface),
(g_type_info_get_array_length), (g_type_info_is_zero_terminated),
(g_type_info_get_n_error_domains), (g_type_info_get_error_domain),
(g_error_domain_info_get_codes), (g_enum_info_get_value),
(g_object_info_get_interface), (g_object_info_get_field),
(g_interface_info_get_prerequisite),
(g_signal_info_get_class_closure), (g_constant_info_get_value):
* girepository/ginvoke.c (get_ffi_type):
* girepository/girepository.h:
* girepository/gmetadata.c (g_metadata_get_dir_entry),
(g_metadata_check_sanity), (validate_header),
(validate_array_type_blob), (validate_iface_type_blob),
(validate_param_type_blob), (validate_error_type_blob),
(validate_type_blob), (validate_constant_blob),
(validate_struct_blob), (validate_enum_blob):
* girepository/gmetadata.h:
* tests/Makefile.am:
* tests/invoke/Makefile.am:
* tests/invoke/invoke.c (main):
* tests/roundtrips.sh:
* tools/Makefile.am:
* tools/compiler.c (format_output), (write_out_metadata), (main):
* tools/generate.c (write_type_name), (write_type_info),
(write_constant_value), (write_enum_info), (load_metadata), (main):
* tools/gidlcompilercontext.c:
* tools/gidlcompilercontext.h:
* tools/gidlcompilerentrynode.c:
* tools/gidlcompilerentrynode.h:
* tools/gidlcompilertypenode.c:
* tools/gidlcompilertypenode.h:
* tools/gidlmodule.c (g_idl_module_build_metadata):
* tools/gidlmodule.h:
* tools/gidlnode.c (init_stats), (dump_stats),
(g_idl_node_get_size), (g_idl_node_get_full_size),
(g_idl_node_cmp), (g_idl_node_can_have_member),
(g_idl_node_add_member), (g_idl_node_param_direction_string),
(parse_int_value), (parse_uint_value), (parse_float_value),
(parse_boolean_value), (find_entry_node), (find_entry),
(serialize_type), (g_idl_node_build_metadata), (write_string):
* tools/gidlnode.h:
* tools/gidlparser.c (parse_type_internal):
* tools/quote-file.sh:
Revert revisions 157,149-148,136-129 and 120.
Move back to using g-idl-generate to generate the metadata and
avoids dependency on a c compiler.
svn path=/trunk/; revision=214
2008-04-23 00:48:16 +02:00
|
|
|
{
|
|
|
|
/* Check that struct layout is as we expect */
|
Make g-ir-scanner work on Windows. Still problems with the typelib code.
2008-08-27 Tor Lillqvist <tml@novell.com>
Make g-ir-scanner work on Windows. Still problems with the typelib
code. Changes okayed by jdahlin.
* configure.ac: Check for Windows, set Automake conditional
OS_WIN32. Change backslashes to forward slashes in pyexecdir to
avoid shell quoting issues
* girepository/Makefile.am: Use -no-undefined so that libtool
agrees to build a shared library on Windows.
* girepository/girparser.c (backtrace_stderr): No backtrace() on
Windows. Empty implementation on Windows so far.
* girepository/gtypelib.c (g_typelib_check_sanity): Give more
informative error message for the assertion failures. Tell also
what the expected size of the struct is. Check all sizes first and
fail afterwards if at least one size was different from expected.
* tools/Makefile.am: Reorder libraries into proper logical
dependency order.
* tools/generate.c: Don't include <dlfcn.h>, not used.
* giscanner/Makefile.am: On Windows, link with the Python library,
and install the module DLL as _giscanner.pyd. Remove the
unnecessary import library and libtool library that libtool has
installed.
* giscanner/scannerlexer.l: Recognize the gcc __attribute__ syntax
and just skip it. Recognize also two "l" suffixes for long long
constants. Recognize also __inline__.
* giscanner/grealpath.h (g_realpath): Implement on Windows, using
GetFullPathName(). As such, GetFullPathName() does more than the
UNIX realpath(). It also changes relative paths into absolute
paths. But for our purposes that shouldn't matter.
* giscanner/giscannermodule.c (pygi_source_scanner_parse_file): On
Windows the file descriptor passed to us is from Python. Python
Python2.5 uses the msvcr71.dll C library, while mingw-built code
uses msvcrt.dll. On Windows, file descriptors are specific to
which C library is used. So we must find out what underlying OS
handle corresponds to the file descriptor Python passes us, and
then make that into a file descriptor valid for the C library this
code uses.
* giscanner/sourcescanner.py (_parse): Don't need to bypass
__attribute__ as the lexer now handles it. The definition as empty
was ineffective for mingw anyway, as mingw's _mingw.h undefines
__attribute__. Close the temp file before unlinking it.
* giscanner/cgobject.py: Use correct library name for the gobject
DLL on Windows.
* gir/Makefile.am: Must pass the full basename of the DLLs on
Windows to g-ir-scanner. It's a bit ugly that we have to "know"
that the names of the GLib DLLs are like libglib-2.0-0.dll, but in
reality they won't change, until there is a GLib 3, and then also
the Unix code here needs changing.
Must pass CPPFLAGS to g-ir-scanner when building GLib.gir so that
libintl.h is found.
svn path=/trunk/; revision=503
2008-08-27 15:33:21 +02:00
|
|
|
|
|
|
|
gboolean size_check_ok = TRUE;
|
|
|
|
|
|
|
|
#define CHECK_SIZE(s,n) \
|
|
|
|
if (sizeof(s) != n) \
|
|
|
|
{ \
|
|
|
|
g_printerr ("sizeof("#s") is expected to be %d but is %"G_GSIZE_FORMAT".\n", \
|
|
|
|
n, sizeof (s)); \
|
|
|
|
size_check_ok = FALSE; \
|
|
|
|
}
|
2008-11-18 19:42:32 +01:00
|
|
|
|
|
|
|
/* When changing the size of a typelib structure, you are required to update
|
|
|
|
* the hardcoded size here. Do NOT change these to use sizeof(); these
|
|
|
|
* should match whatever is defined in the text specification and serve as
|
|
|
|
* a sanity check on structure modifications.
|
|
|
|
*
|
|
|
|
* Everything else in the code however should be using sizeof().
|
|
|
|
*/
|
Make g-ir-scanner work on Windows. Still problems with the typelib code.
2008-08-27 Tor Lillqvist <tml@novell.com>
Make g-ir-scanner work on Windows. Still problems with the typelib
code. Changes okayed by jdahlin.
* configure.ac: Check for Windows, set Automake conditional
OS_WIN32. Change backslashes to forward slashes in pyexecdir to
avoid shell quoting issues
* girepository/Makefile.am: Use -no-undefined so that libtool
agrees to build a shared library on Windows.
* girepository/girparser.c (backtrace_stderr): No backtrace() on
Windows. Empty implementation on Windows so far.
* girepository/gtypelib.c (g_typelib_check_sanity): Give more
informative error message for the assertion failures. Tell also
what the expected size of the struct is. Check all sizes first and
fail afterwards if at least one size was different from expected.
* tools/Makefile.am: Reorder libraries into proper logical
dependency order.
* tools/generate.c: Don't include <dlfcn.h>, not used.
* giscanner/Makefile.am: On Windows, link with the Python library,
and install the module DLL as _giscanner.pyd. Remove the
unnecessary import library and libtool library that libtool has
installed.
* giscanner/scannerlexer.l: Recognize the gcc __attribute__ syntax
and just skip it. Recognize also two "l" suffixes for long long
constants. Recognize also __inline__.
* giscanner/grealpath.h (g_realpath): Implement on Windows, using
GetFullPathName(). As such, GetFullPathName() does more than the
UNIX realpath(). It also changes relative paths into absolute
paths. But for our purposes that shouldn't matter.
* giscanner/giscannermodule.c (pygi_source_scanner_parse_file): On
Windows the file descriptor passed to us is from Python. Python
Python2.5 uses the msvcr71.dll C library, while mingw-built code
uses msvcrt.dll. On Windows, file descriptors are specific to
which C library is used. So we must find out what underlying OS
handle corresponds to the file descriptor Python passes us, and
then make that into a file descriptor valid for the C library this
code uses.
* giscanner/sourcescanner.py (_parse): Don't need to bypass
__attribute__ as the lexer now handles it. The definition as empty
was ineffective for mingw anyway, as mingw's _mingw.h undefines
__attribute__. Close the temp file before unlinking it.
* giscanner/cgobject.py: Use correct library name for the gobject
DLL on Windows.
* gir/Makefile.am: Must pass the full basename of the DLLs on
Windows to g-ir-scanner. It's a bit ugly that we have to "know"
that the names of the GLib DLLs are like libglib-2.0-0.dll, but in
reality they won't change, until there is a GLib 3, and then also
the Unix code here needs changing.
Must pass CPPFLAGS to g-ir-scanner when building GLib.gir so that
libintl.h is found.
svn path=/trunk/; revision=503
2008-08-27 15:33:21 +02:00
|
|
|
|
2009-02-13 00:42:47 +01:00
|
|
|
CHECK_SIZE (Header, 112);
|
Make g-ir-scanner work on Windows. Still problems with the typelib code.
2008-08-27 Tor Lillqvist <tml@novell.com>
Make g-ir-scanner work on Windows. Still problems with the typelib
code. Changes okayed by jdahlin.
* configure.ac: Check for Windows, set Automake conditional
OS_WIN32. Change backslashes to forward slashes in pyexecdir to
avoid shell quoting issues
* girepository/Makefile.am: Use -no-undefined so that libtool
agrees to build a shared library on Windows.
* girepository/girparser.c (backtrace_stderr): No backtrace() on
Windows. Empty implementation on Windows so far.
* girepository/gtypelib.c (g_typelib_check_sanity): Give more
informative error message for the assertion failures. Tell also
what the expected size of the struct is. Check all sizes first and
fail afterwards if at least one size was different from expected.
* tools/Makefile.am: Reorder libraries into proper logical
dependency order.
* tools/generate.c: Don't include <dlfcn.h>, not used.
* giscanner/Makefile.am: On Windows, link with the Python library,
and install the module DLL as _giscanner.pyd. Remove the
unnecessary import library and libtool library that libtool has
installed.
* giscanner/scannerlexer.l: Recognize the gcc __attribute__ syntax
and just skip it. Recognize also two "l" suffixes for long long
constants. Recognize also __inline__.
* giscanner/grealpath.h (g_realpath): Implement on Windows, using
GetFullPathName(). As such, GetFullPathName() does more than the
UNIX realpath(). It also changes relative paths into absolute
paths. But for our purposes that shouldn't matter.
* giscanner/giscannermodule.c (pygi_source_scanner_parse_file): On
Windows the file descriptor passed to us is from Python. Python
Python2.5 uses the msvcr71.dll C library, while mingw-built code
uses msvcrt.dll. On Windows, file descriptors are specific to
which C library is used. So we must find out what underlying OS
handle corresponds to the file descriptor Python passes us, and
then make that into a file descriptor valid for the C library this
code uses.
* giscanner/sourcescanner.py (_parse): Don't need to bypass
__attribute__ as the lexer now handles it. The definition as empty
was ineffective for mingw anyway, as mingw's _mingw.h undefines
__attribute__. Close the temp file before unlinking it.
* giscanner/cgobject.py: Use correct library name for the gobject
DLL on Windows.
* gir/Makefile.am: Must pass the full basename of the DLLs on
Windows to g-ir-scanner. It's a bit ugly that we have to "know"
that the names of the GLib DLLs are like libglib-2.0-0.dll, but in
reality they won't change, until there is a GLib 3, and then also
the Unix code here needs changing.
Must pass CPPFLAGS to g-ir-scanner when building GLib.gir so that
libintl.h is found.
svn path=/trunk/; revision=503
2008-08-27 15:33:21 +02:00
|
|
|
CHECK_SIZE (DirEntry, 12);
|
|
|
|
CHECK_SIZE (SimpleTypeBlob, 4);
|
Bug 556489 – callback annotations
2008-01-03 Andreas Rottmann <a.rottmann@gmx.at>
Bug 556489 – callback annotations
* giscanner/transformer.py
* tools/generate.c (write_callable_info): Write out the new scope,
closure and destroy attributes.
* giscanner/transformer.py (Transformer._type_is_callback): New
method, checking if a given type is a callback.
(Transformer._augment_callback_params): New method; adds
information (closure, destroy) to callback parameters.
(Transformer._handle_closure, Transformer._handle_destroy): New methods,
auxiliary to _augment_callback_params.
(Transformer._create_function): Call _augment_callback_params().
(Transformer._create_parameter): Handle scope option.
(Transformer._create_typedef_callback): New method, creates a
callback, and registers it in the typedef namespace
(Transformer._create_typedef): Use _create_typedef_callback()
instead of the plain _create_callback().
* giscanner/ast.py (Parameter): Added callback-related fields.
* giscanner/girwriter.py: Write out new Parameter fields.
* girepository/girnode.h (GIrNodeParam): Added fields scope,
closure and destroy.
* girepository/gtypelib.h (ArgBlob): Ditto.
* girepository/girparser.c (start_parameter): Handle new fields.
* girepository/girmodule.c (g_ir_module_build_typelib): Adjust
arg_blob_size, bump major version due to this change.
* girepository/girnode.c (g_ir_node_get_full_size_internal)
(g_ir_node_build_typelib)
* girepository/gtypelib.c (g_typelib_check_sanity): ArgBlob size
adjustments.
(g_ir_node_build_typelib): Fill in new ArgBlob flags from param.
* girepository/girepository.h (GIScope): New enumeration, listing
the different possible scopes for callbacks.
* girepository/ginfo.c (g_arg_info_get_scope)
(g_arg_info_get_closure, g_arg_info_get_destroy): Accessors for
callback-related argument indices (callback scope, closure for a
callback, destroy notification for a callback).
* tests/scanner/: Added testcases for new features.
svn path=/trunk/; revision=998
2009-01-03 14:44:42 +01:00
|
|
|
CHECK_SIZE (ArgBlob, 16);
|
Make g-ir-scanner work on Windows. Still problems with the typelib code.
2008-08-27 Tor Lillqvist <tml@novell.com>
Make g-ir-scanner work on Windows. Still problems with the typelib
code. Changes okayed by jdahlin.
* configure.ac: Check for Windows, set Automake conditional
OS_WIN32. Change backslashes to forward slashes in pyexecdir to
avoid shell quoting issues
* girepository/Makefile.am: Use -no-undefined so that libtool
agrees to build a shared library on Windows.
* girepository/girparser.c (backtrace_stderr): No backtrace() on
Windows. Empty implementation on Windows so far.
* girepository/gtypelib.c (g_typelib_check_sanity): Give more
informative error message for the assertion failures. Tell also
what the expected size of the struct is. Check all sizes first and
fail afterwards if at least one size was different from expected.
* tools/Makefile.am: Reorder libraries into proper logical
dependency order.
* tools/generate.c: Don't include <dlfcn.h>, not used.
* giscanner/Makefile.am: On Windows, link with the Python library,
and install the module DLL as _giscanner.pyd. Remove the
unnecessary import library and libtool library that libtool has
installed.
* giscanner/scannerlexer.l: Recognize the gcc __attribute__ syntax
and just skip it. Recognize also two "l" suffixes for long long
constants. Recognize also __inline__.
* giscanner/grealpath.h (g_realpath): Implement on Windows, using
GetFullPathName(). As such, GetFullPathName() does more than the
UNIX realpath(). It also changes relative paths into absolute
paths. But for our purposes that shouldn't matter.
* giscanner/giscannermodule.c (pygi_source_scanner_parse_file): On
Windows the file descriptor passed to us is from Python. Python
Python2.5 uses the msvcr71.dll C library, while mingw-built code
uses msvcrt.dll. On Windows, file descriptors are specific to
which C library is used. So we must find out what underlying OS
handle corresponds to the file descriptor Python passes us, and
then make that into a file descriptor valid for the C library this
code uses.
* giscanner/sourcescanner.py (_parse): Don't need to bypass
__attribute__ as the lexer now handles it. The definition as empty
was ineffective for mingw anyway, as mingw's _mingw.h undefines
__attribute__. Close the temp file before unlinking it.
* giscanner/cgobject.py: Use correct library name for the gobject
DLL on Windows.
* gir/Makefile.am: Must pass the full basename of the DLLs on
Windows to g-ir-scanner. It's a bit ugly that we have to "know"
that the names of the GLib DLLs are like libglib-2.0-0.dll, but in
reality they won't change, until there is a GLib 3, and then also
the Unix code here needs changing.
Must pass CPPFLAGS to g-ir-scanner when building GLib.gir so that
libintl.h is found.
svn path=/trunk/; revision=503
2008-08-27 15:33:21 +02:00
|
|
|
CHECK_SIZE (SignatureBlob, 8);
|
|
|
|
CHECK_SIZE (CommonBlob, 8);
|
2008-11-25 23:29:20 +01:00
|
|
|
CHECK_SIZE (FunctionBlob, 20);
|
2009-02-12 05:36:31 +01:00
|
|
|
CHECK_SIZE (CallbackBlob, 12);
|
Make g-ir-scanner work on Windows. Still problems with the typelib code.
2008-08-27 Tor Lillqvist <tml@novell.com>
Make g-ir-scanner work on Windows. Still problems with the typelib
code. Changes okayed by jdahlin.
* configure.ac: Check for Windows, set Automake conditional
OS_WIN32. Change backslashes to forward slashes in pyexecdir to
avoid shell quoting issues
* girepository/Makefile.am: Use -no-undefined so that libtool
agrees to build a shared library on Windows.
* girepository/girparser.c (backtrace_stderr): No backtrace() on
Windows. Empty implementation on Windows so far.
* girepository/gtypelib.c (g_typelib_check_sanity): Give more
informative error message for the assertion failures. Tell also
what the expected size of the struct is. Check all sizes first and
fail afterwards if at least one size was different from expected.
* tools/Makefile.am: Reorder libraries into proper logical
dependency order.
* tools/generate.c: Don't include <dlfcn.h>, not used.
* giscanner/Makefile.am: On Windows, link with the Python library,
and install the module DLL as _giscanner.pyd. Remove the
unnecessary import library and libtool library that libtool has
installed.
* giscanner/scannerlexer.l: Recognize the gcc __attribute__ syntax
and just skip it. Recognize also two "l" suffixes for long long
constants. Recognize also __inline__.
* giscanner/grealpath.h (g_realpath): Implement on Windows, using
GetFullPathName(). As such, GetFullPathName() does more than the
UNIX realpath(). It also changes relative paths into absolute
paths. But for our purposes that shouldn't matter.
* giscanner/giscannermodule.c (pygi_source_scanner_parse_file): On
Windows the file descriptor passed to us is from Python. Python
Python2.5 uses the msvcr71.dll C library, while mingw-built code
uses msvcrt.dll. On Windows, file descriptors are specific to
which C library is used. So we must find out what underlying OS
handle corresponds to the file descriptor Python passes us, and
then make that into a file descriptor valid for the C library this
code uses.
* giscanner/sourcescanner.py (_parse): Don't need to bypass
__attribute__ as the lexer now handles it. The definition as empty
was ineffective for mingw anyway, as mingw's _mingw.h undefines
__attribute__. Close the temp file before unlinking it.
* giscanner/cgobject.py: Use correct library name for the gobject
DLL on Windows.
* gir/Makefile.am: Must pass the full basename of the DLLs on
Windows to g-ir-scanner. It's a bit ugly that we have to "know"
that the names of the GLib DLLs are like libglib-2.0-0.dll, but in
reality they won't change, until there is a GLib 3, and then also
the Unix code here needs changing.
Must pass CPPFLAGS to g-ir-scanner when building GLib.gir so that
libintl.h is found.
svn path=/trunk/; revision=503
2008-08-27 15:33:21 +02:00
|
|
|
CHECK_SIZE (InterfaceTypeBlob, 4);
|
|
|
|
CHECK_SIZE (ArrayTypeBlob, 8);
|
|
|
|
CHECK_SIZE (ParamTypeBlob, 4);
|
|
|
|
CHECK_SIZE (ErrorTypeBlob, 4);
|
|
|
|
CHECK_SIZE (ErrorDomainBlob, 16);
|
|
|
|
CHECK_SIZE (ValueBlob, 12);
|
2009-02-12 21:17:25 +01:00
|
|
|
CHECK_SIZE (FieldBlob, 16);
|
Make g-ir-scanner work on Windows. Still problems with the typelib code.
2008-08-27 Tor Lillqvist <tml@novell.com>
Make g-ir-scanner work on Windows. Still problems with the typelib
code. Changes okayed by jdahlin.
* configure.ac: Check for Windows, set Automake conditional
OS_WIN32. Change backslashes to forward slashes in pyexecdir to
avoid shell quoting issues
* girepository/Makefile.am: Use -no-undefined so that libtool
agrees to build a shared library on Windows.
* girepository/girparser.c (backtrace_stderr): No backtrace() on
Windows. Empty implementation on Windows so far.
* girepository/gtypelib.c (g_typelib_check_sanity): Give more
informative error message for the assertion failures. Tell also
what the expected size of the struct is. Check all sizes first and
fail afterwards if at least one size was different from expected.
* tools/Makefile.am: Reorder libraries into proper logical
dependency order.
* tools/generate.c: Don't include <dlfcn.h>, not used.
* giscanner/Makefile.am: On Windows, link with the Python library,
and install the module DLL as _giscanner.pyd. Remove the
unnecessary import library and libtool library that libtool has
installed.
* giscanner/scannerlexer.l: Recognize the gcc __attribute__ syntax
and just skip it. Recognize also two "l" suffixes for long long
constants. Recognize also __inline__.
* giscanner/grealpath.h (g_realpath): Implement on Windows, using
GetFullPathName(). As such, GetFullPathName() does more than the
UNIX realpath(). It also changes relative paths into absolute
paths. But for our purposes that shouldn't matter.
* giscanner/giscannermodule.c (pygi_source_scanner_parse_file): On
Windows the file descriptor passed to us is from Python. Python
Python2.5 uses the msvcr71.dll C library, while mingw-built code
uses msvcrt.dll. On Windows, file descriptors are specific to
which C library is used. So we must find out what underlying OS
handle corresponds to the file descriptor Python passes us, and
then make that into a file descriptor valid for the C library this
code uses.
* giscanner/sourcescanner.py (_parse): Don't need to bypass
__attribute__ as the lexer now handles it. The definition as empty
was ineffective for mingw anyway, as mingw's _mingw.h undefines
__attribute__. Close the temp file before unlinking it.
* giscanner/cgobject.py: Use correct library name for the gobject
DLL on Windows.
* gir/Makefile.am: Must pass the full basename of the DLLs on
Windows to g-ir-scanner. It's a bit ugly that we have to "know"
that the names of the GLib DLLs are like libglib-2.0-0.dll, but in
reality they won't change, until there is a GLib 3, and then also
the Unix code here needs changing.
Must pass CPPFLAGS to g-ir-scanner when building GLib.gir so that
libintl.h is found.
svn path=/trunk/; revision=503
2008-08-27 15:33:21 +02:00
|
|
|
CHECK_SIZE (RegisteredTypeBlob, 16);
|
2009-02-12 21:17:25 +01:00
|
|
|
CHECK_SIZE (StructBlob, 32);
|
|
|
|
CHECK_SIZE (EnumBlob, 24);
|
|
|
|
CHECK_SIZE (PropertyBlob, 16);
|
|
|
|
CHECK_SIZE (SignalBlob, 16);
|
|
|
|
CHECK_SIZE (VFuncBlob, 20);
|
|
|
|
CHECK_SIZE (ObjectBlob, 44);
|
2009-02-20 23:34:20 +01:00
|
|
|
CHECK_SIZE (InterfaceBlob, 40);
|
2009-02-12 21:17:25 +01:00
|
|
|
CHECK_SIZE (ConstantBlob, 24);
|
2009-02-20 03:48:51 +01:00
|
|
|
CHECK_SIZE (AttributeBlob, 12);
|
2009-02-12 21:17:25 +01:00
|
|
|
CHECK_SIZE (UnionBlob, 40);
|
Make g-ir-scanner work on Windows. Still problems with the typelib code.
2008-08-27 Tor Lillqvist <tml@novell.com>
Make g-ir-scanner work on Windows. Still problems with the typelib
code. Changes okayed by jdahlin.
* configure.ac: Check for Windows, set Automake conditional
OS_WIN32. Change backslashes to forward slashes in pyexecdir to
avoid shell quoting issues
* girepository/Makefile.am: Use -no-undefined so that libtool
agrees to build a shared library on Windows.
* girepository/girparser.c (backtrace_stderr): No backtrace() on
Windows. Empty implementation on Windows so far.
* girepository/gtypelib.c (g_typelib_check_sanity): Give more
informative error message for the assertion failures. Tell also
what the expected size of the struct is. Check all sizes first and
fail afterwards if at least one size was different from expected.
* tools/Makefile.am: Reorder libraries into proper logical
dependency order.
* tools/generate.c: Don't include <dlfcn.h>, not used.
* giscanner/Makefile.am: On Windows, link with the Python library,
and install the module DLL as _giscanner.pyd. Remove the
unnecessary import library and libtool library that libtool has
installed.
* giscanner/scannerlexer.l: Recognize the gcc __attribute__ syntax
and just skip it. Recognize also two "l" suffixes for long long
constants. Recognize also __inline__.
* giscanner/grealpath.h (g_realpath): Implement on Windows, using
GetFullPathName(). As such, GetFullPathName() does more than the
UNIX realpath(). It also changes relative paths into absolute
paths. But for our purposes that shouldn't matter.
* giscanner/giscannermodule.c (pygi_source_scanner_parse_file): On
Windows the file descriptor passed to us is from Python. Python
Python2.5 uses the msvcr71.dll C library, while mingw-built code
uses msvcrt.dll. On Windows, file descriptors are specific to
which C library is used. So we must find out what underlying OS
handle corresponds to the file descriptor Python passes us, and
then make that into a file descriptor valid for the C library this
code uses.
* giscanner/sourcescanner.py (_parse): Don't need to bypass
__attribute__ as the lexer now handles it. The definition as empty
was ineffective for mingw anyway, as mingw's _mingw.h undefines
__attribute__. Close the temp file before unlinking it.
* giscanner/cgobject.py: Use correct library name for the gobject
DLL on Windows.
* gir/Makefile.am: Must pass the full basename of the DLLs on
Windows to g-ir-scanner. It's a bit ugly that we have to "know"
that the names of the GLib DLLs are like libglib-2.0-0.dll, but in
reality they won't change, until there is a GLib 3, and then also
the Unix code here needs changing.
Must pass CPPFLAGS to g-ir-scanner when building GLib.gir so that
libintl.h is found.
svn path=/trunk/; revision=503
2008-08-27 15:33:21 +02:00
|
|
|
#undef CHECK_SIZE
|
|
|
|
|
|
|
|
g_assert (size_check_ok);
|
2008-02-08 16:31:03 +01:00
|
|
|
}
|
|
|
|
|
Revert revisions 157,149-148,136-129 and 120. Move back to using
2008-04-22 Johan Dahlin <johan@gnome.org>
* girepository/ginfo.c (g_info_from_entry), (g_type_info_new),
(g_type_info_is_pointer), (g_type_info_get_tag),
(g_type_info_get_param_type), (g_type_info_get_interface),
(g_type_info_get_array_length), (g_type_info_is_zero_terminated),
(g_type_info_get_n_error_domains), (g_type_info_get_error_domain),
(g_error_domain_info_get_codes), (g_enum_info_get_value),
(g_object_info_get_interface), (g_object_info_get_field),
(g_interface_info_get_prerequisite),
(g_signal_info_get_class_closure), (g_constant_info_get_value):
* girepository/ginvoke.c (get_ffi_type):
* girepository/girepository.h:
* girepository/gmetadata.c (g_metadata_get_dir_entry),
(g_metadata_check_sanity), (validate_header),
(validate_array_type_blob), (validate_iface_type_blob),
(validate_param_type_blob), (validate_error_type_blob),
(validate_type_blob), (validate_constant_blob),
(validate_struct_blob), (validate_enum_blob):
* girepository/gmetadata.h:
* tests/Makefile.am:
* tests/invoke/Makefile.am:
* tests/invoke/invoke.c (main):
* tests/roundtrips.sh:
* tools/Makefile.am:
* tools/compiler.c (format_output), (write_out_metadata), (main):
* tools/generate.c (write_type_name), (write_type_info),
(write_constant_value), (write_enum_info), (load_metadata), (main):
* tools/gidlcompilercontext.c:
* tools/gidlcompilercontext.h:
* tools/gidlcompilerentrynode.c:
* tools/gidlcompilerentrynode.h:
* tools/gidlcompilertypenode.c:
* tools/gidlcompilertypenode.h:
* tools/gidlmodule.c (g_idl_module_build_metadata):
* tools/gidlmodule.h:
* tools/gidlnode.c (init_stats), (dump_stats),
(g_idl_node_get_size), (g_idl_node_get_full_size),
(g_idl_node_cmp), (g_idl_node_can_have_member),
(g_idl_node_add_member), (g_idl_node_param_direction_string),
(parse_int_value), (parse_uint_value), (parse_float_value),
(parse_boolean_value), (find_entry_node), (find_entry),
(serialize_type), (g_idl_node_build_metadata), (write_string):
* tools/gidlnode.h:
* tools/gidlparser.c (parse_type_internal):
* tools/quote-file.sh:
Revert revisions 157,149-148,136-129 and 120.
Move back to using g-idl-generate to generate the metadata and
avoids dependency on a c compiler.
svn path=/trunk/; revision=214
2008-04-23 00:48:16 +02:00
|
|
|
|
2008-02-08 16:31:03 +01:00
|
|
|
static gboolean
|
|
|
|
is_aligned (guint32 offset)
|
|
|
|
{
|
|
|
|
return offset == ALIGN_VALUE (offset, 4);
|
|
|
|
}
|
|
|
|
|
|
|
|
#define MAX_NAME_LEN 200
|
|
|
|
|
2008-08-23 23:30:09 +02:00
|
|
|
static const char *
|
|
|
|
get_string (GTypelib *typelib, guint32 offset, GError **error)
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
2008-08-21 18:15:55 +02:00
|
|
|
if (typelib->len < offset)
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID,
|
2008-08-23 23:30:09 +02:00
|
|
|
"Buffer is too short while looking up name");
|
|
|
|
return NULL;
|
2008-08-21 18:15:55 +02:00
|
|
|
}
|
|
|
|
|
2008-08-23 23:30:09 +02:00
|
|
|
return (const char*)&typelib->data[offset];
|
|
|
|
}
|
|
|
|
|
|
|
|
static const char *
|
|
|
|
get_string_nofail (GTypelib *typelib, guint32 offset)
|
|
|
|
{
|
|
|
|
const char *ret = get_string (typelib, offset, NULL);
|
|
|
|
g_assert (ret);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2008-08-24 18:51:43 +02:00
|
|
|
validate_name (GTypelib *typelib,
|
2008-08-23 23:30:09 +02:00
|
|
|
const char *msg,
|
|
|
|
const guchar *data, guint32 offset,
|
|
|
|
GError **error)
|
|
|
|
{
|
|
|
|
const char *name;
|
|
|
|
|
|
|
|
name = get_string (typelib, offset, error);
|
|
|
|
if (!name)
|
|
|
|
return FALSE;
|
|
|
|
|
2008-08-21 18:15:55 +02:00
|
|
|
if (!memchr (name, '\0', MAX_NAME_LEN))
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID,
|
|
|
|
"The %s is too long: %s",
|
|
|
|
msg, name);
|
|
|
|
return FALSE;
|
|
|
|
}
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-21 18:15:55 +02:00
|
|
|
if (strspn (name, G_CSET_a_2_z G_CSET_A_2_Z G_CSET_DIGITS "-_") < strlen (name))
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID,
|
|
|
|
"The %s is contains invalid characters: %s",
|
|
|
|
msg, name);
|
|
|
|
return FALSE;
|
|
|
|
}
|
2008-02-08 16:31:03 +01:00
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2008-08-24 18:51:43 +02:00
|
|
|
validate_header (ValidateContext *ctx,
|
|
|
|
GError **error)
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
2008-08-24 18:51:43 +02:00
|
|
|
GTypelib *typelib = ctx->typelib;
|
2008-02-08 16:31:03 +01:00
|
|
|
Header *header;
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
if (typelib->len < sizeof (Header))
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID,
|
2008-02-08 16:31:03 +01:00
|
|
|
"The buffer is too short");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
header = (Header *)typelib->data;
|
2008-02-08 16:31:03 +01:00
|
|
|
|
Merge in the gir-compiler branch. Thanks to Philip and Colin for their
2008-08-08 Johan Dahlin <johan@gnome.org>
* girepository/gtypelib.c (validate_header):
* girepository/gtypelib.h:
* giscanner/ast.py:
* giscanner/girwriter.py:
* giscanner/sourcescanner.c (gi_source_symbol_ref),
(gi_source_symbol_unref):
* tests/array.test:
* tests/boxed.test:
* tests/constant.test:
* tests/enum.test:
* tests/errors.test:
* tests/function.test:
* tests/gobject.test:
* tests/interface.test:
* tests/invoke/Makefile.am:
* tests/invoke/testfns.xml:
* tests/object.test:
* tests/parser/Makefile.am:
* tests/roundtrips.sh:
* tests/struct.test:
* tests/types.test:
* tests/union.test:
* tests/xref1.test:
* tests/xref2.test:
* tools/Makefile.am:
* tools/compiler.c (main):
* tools/generate.c (write_callable_info), (write_function_info),
(write_repository):
* tools/gidlmodule.c:
* tools/gidlmodule.h:
* tools/gidlnode.c:
* tools/gidlnode.h:
* tools/gidlparser.c:
* tools/gidlparser.h:
* tools/gidlwriter.c:
* tools/gidlwriter.h:
* tools/scanner.c (create_node_from_gtype),
(create_node_from_ctype), (g_igenerator_process_properties),
(g_igenerator_process_signals), (g_igenerator_create_object),
(g_igenerator_create_interface), (g_igenerator_create_boxed),
(g_igenerator_create_enum), (g_igenerator_create_flags),
(g_igenerator_process_function_symbol),
(g_igenerator_process_unregistered_struct_typedef),
(g_igenerator_process_struct_typedef),
(g_igenerator_process_union_typedef),
(g_igenerator_process_enum_typedef),
(g_igenerator_process_function_typedef),
(g_igenerator_process_constant), (g_igenerator_process_symbols),
(g_igenerator_add_module), (g_igenerator_add_include_idl):
Merge in the gir-compiler branch.
Thanks to Philip and Colin for their help.
svn path=/trunk/; revision=325
2008-08-08 21:09:17 +02:00
|
|
|
if (strncmp (header->magic, G_IR_MAGIC, 16) != 0)
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_HEADER,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Magic string not found");
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
Bug 556489 – callback annotations
2008-01-03 Andreas Rottmann <a.rottmann@gmx.at>
Bug 556489 – callback annotations
* giscanner/transformer.py
* tools/generate.c (write_callable_info): Write out the new scope,
closure and destroy attributes.
* giscanner/transformer.py (Transformer._type_is_callback): New
method, checking if a given type is a callback.
(Transformer._augment_callback_params): New method; adds
information (closure, destroy) to callback parameters.
(Transformer._handle_closure, Transformer._handle_destroy): New methods,
auxiliary to _augment_callback_params.
(Transformer._create_function): Call _augment_callback_params().
(Transformer._create_parameter): Handle scope option.
(Transformer._create_typedef_callback): New method, creates a
callback, and registers it in the typedef namespace
(Transformer._create_typedef): Use _create_typedef_callback()
instead of the plain _create_callback().
* giscanner/ast.py (Parameter): Added callback-related fields.
* giscanner/girwriter.py: Write out new Parameter fields.
* girepository/girnode.h (GIrNodeParam): Added fields scope,
closure and destroy.
* girepository/gtypelib.h (ArgBlob): Ditto.
* girepository/girparser.c (start_parameter): Handle new fields.
* girepository/girmodule.c (g_ir_module_build_typelib): Adjust
arg_blob_size, bump major version due to this change.
* girepository/girnode.c (g_ir_node_get_full_size_internal)
(g_ir_node_build_typelib)
* girepository/gtypelib.c (g_typelib_check_sanity): ArgBlob size
adjustments.
(g_ir_node_build_typelib): Fill in new ArgBlob flags from param.
* girepository/girepository.h (GIScope): New enumeration, listing
the different possible scopes for callbacks.
* girepository/ginfo.c (g_arg_info_get_scope)
(g_arg_info_get_closure, g_arg_info_get_destroy): Accessors for
callback-related argument indices (callback scope, closure for a
callback, destroy notification for a callback).
* tests/scanner/: Added testcases for new features.
svn path=/trunk/; revision=998
2009-01-03 14:44:42 +01:00
|
|
|
if (header->major_version != 2 || header->minor_version != 0)
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_HEADER,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Version mismatch");
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (header->n_entries < header->n_local_entries)
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_HEADER,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Inconsistent entry counts");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
if (header->size != typelib->len)
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_HEADER,
|
2008-08-09 14:55:32 +02:00
|
|
|
"Typelib size mismatch");
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
}
|
2009-02-06 19:37:13 +01:00
|
|
|
|
|
|
|
/* This is a sanity check for a specific typelib; it
|
2009-02-12 05:36:31 +01:00
|
|
|
* prevents us from loading an incompatible typelib.
|
2009-02-06 19:37:13 +01:00
|
|
|
*
|
2009-02-12 05:36:31 +01:00
|
|
|
* The hardcoded checks in g_typelib_check_sanity to
|
2009-02-06 19:37:13 +01:00
|
|
|
* protect against inadvertent or buggy changes to the typelib format
|
|
|
|
* itself.
|
|
|
|
*/
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2009-02-12 05:36:31 +01:00
|
|
|
if (header->entry_blob_size != sizeof (DirEntry) ||
|
|
|
|
header->function_blob_size != sizeof (FunctionBlob) ||
|
|
|
|
header->callback_blob_size != sizeof (CallbackBlob) ||
|
|
|
|
header->signal_blob_size != sizeof (SignalBlob) ||
|
|
|
|
header->vfunc_blob_size != sizeof (VFuncBlob) ||
|
|
|
|
header->arg_blob_size != sizeof (ArgBlob) ||
|
|
|
|
header->property_blob_size != sizeof (PropertyBlob) ||
|
|
|
|
header->field_blob_size != sizeof (FieldBlob) ||
|
|
|
|
header->value_blob_size != sizeof (ValueBlob) ||
|
|
|
|
header->constant_blob_size != sizeof (ConstantBlob) ||
|
|
|
|
header->error_domain_blob_size != sizeof (ErrorDomainBlob) ||
|
2009-02-20 03:48:51 +01:00
|
|
|
header->attribute_blob_size != sizeof (AttributeBlob) ||
|
2009-02-12 05:36:31 +01:00
|
|
|
header->signature_blob_size != sizeof (SignatureBlob) ||
|
|
|
|
header->enum_blob_size != sizeof (EnumBlob) ||
|
|
|
|
header->struct_blob_size != sizeof (StructBlob) ||
|
2009-02-06 19:37:13 +01:00
|
|
|
header->object_blob_size != sizeof(ObjectBlob) ||
|
2009-02-12 05:36:31 +01:00
|
|
|
header->interface_blob_size != sizeof (InterfaceBlob) ||
|
|
|
|
header->union_blob_size != sizeof (UnionBlob))
|
Revert revisions 157,149-148,136-129 and 120. Move back to using
2008-04-22 Johan Dahlin <johan@gnome.org>
* girepository/ginfo.c (g_info_from_entry), (g_type_info_new),
(g_type_info_is_pointer), (g_type_info_get_tag),
(g_type_info_get_param_type), (g_type_info_get_interface),
(g_type_info_get_array_length), (g_type_info_is_zero_terminated),
(g_type_info_get_n_error_domains), (g_type_info_get_error_domain),
(g_error_domain_info_get_codes), (g_enum_info_get_value),
(g_object_info_get_interface), (g_object_info_get_field),
(g_interface_info_get_prerequisite),
(g_signal_info_get_class_closure), (g_constant_info_get_value):
* girepository/ginvoke.c (get_ffi_type):
* girepository/girepository.h:
* girepository/gmetadata.c (g_metadata_get_dir_entry),
(g_metadata_check_sanity), (validate_header),
(validate_array_type_blob), (validate_iface_type_blob),
(validate_param_type_blob), (validate_error_type_blob),
(validate_type_blob), (validate_constant_blob),
(validate_struct_blob), (validate_enum_blob):
* girepository/gmetadata.h:
* tests/Makefile.am:
* tests/invoke/Makefile.am:
* tests/invoke/invoke.c (main):
* tests/roundtrips.sh:
* tools/Makefile.am:
* tools/compiler.c (format_output), (write_out_metadata), (main):
* tools/generate.c (write_type_name), (write_type_info),
(write_constant_value), (write_enum_info), (load_metadata), (main):
* tools/gidlcompilercontext.c:
* tools/gidlcompilercontext.h:
* tools/gidlcompilerentrynode.c:
* tools/gidlcompilerentrynode.h:
* tools/gidlcompilertypenode.c:
* tools/gidlcompilertypenode.h:
* tools/gidlmodule.c (g_idl_module_build_metadata):
* tools/gidlmodule.h:
* tools/gidlnode.c (init_stats), (dump_stats),
(g_idl_node_get_size), (g_idl_node_get_full_size),
(g_idl_node_cmp), (g_idl_node_can_have_member),
(g_idl_node_add_member), (g_idl_node_param_direction_string),
(parse_int_value), (parse_uint_value), (parse_float_value),
(parse_boolean_value), (find_entry_node), (find_entry),
(serialize_type), (g_idl_node_build_metadata), (write_string):
* tools/gidlnode.h:
* tools/gidlparser.c (parse_type_internal):
* tools/quote-file.sh:
Revert revisions 157,149-148,136-129 and 120.
Move back to using g-idl-generate to generate the metadata and
avoids dependency on a c compiler.
svn path=/trunk/; revision=214
2008-04-23 00:48:16 +02:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_HEADER,
|
Revert revisions 157,149-148,136-129 and 120. Move back to using
2008-04-22 Johan Dahlin <johan@gnome.org>
* girepository/ginfo.c (g_info_from_entry), (g_type_info_new),
(g_type_info_is_pointer), (g_type_info_get_tag),
(g_type_info_get_param_type), (g_type_info_get_interface),
(g_type_info_get_array_length), (g_type_info_is_zero_terminated),
(g_type_info_get_n_error_domains), (g_type_info_get_error_domain),
(g_error_domain_info_get_codes), (g_enum_info_get_value),
(g_object_info_get_interface), (g_object_info_get_field),
(g_interface_info_get_prerequisite),
(g_signal_info_get_class_closure), (g_constant_info_get_value):
* girepository/ginvoke.c (get_ffi_type):
* girepository/girepository.h:
* girepository/gmetadata.c (g_metadata_get_dir_entry),
(g_metadata_check_sanity), (validate_header),
(validate_array_type_blob), (validate_iface_type_blob),
(validate_param_type_blob), (validate_error_type_blob),
(validate_type_blob), (validate_constant_blob),
(validate_struct_blob), (validate_enum_blob):
* girepository/gmetadata.h:
* tests/Makefile.am:
* tests/invoke/Makefile.am:
* tests/invoke/invoke.c (main):
* tests/roundtrips.sh:
* tools/Makefile.am:
* tools/compiler.c (format_output), (write_out_metadata), (main):
* tools/generate.c (write_type_name), (write_type_info),
(write_constant_value), (write_enum_info), (load_metadata), (main):
* tools/gidlcompilercontext.c:
* tools/gidlcompilercontext.h:
* tools/gidlcompilerentrynode.c:
* tools/gidlcompilerentrynode.h:
* tools/gidlcompilertypenode.c:
* tools/gidlcompilertypenode.h:
* tools/gidlmodule.c (g_idl_module_build_metadata):
* tools/gidlmodule.h:
* tools/gidlnode.c (init_stats), (dump_stats),
(g_idl_node_get_size), (g_idl_node_get_full_size),
(g_idl_node_cmp), (g_idl_node_can_have_member),
(g_idl_node_add_member), (g_idl_node_param_direction_string),
(parse_int_value), (parse_uint_value), (parse_float_value),
(parse_boolean_value), (find_entry_node), (find_entry),
(serialize_type), (g_idl_node_build_metadata), (write_string):
* tools/gidlnode.h:
* tools/gidlparser.c (parse_type_internal):
* tools/quote-file.sh:
Revert revisions 157,149-148,136-129 and 120.
Move back to using g-idl-generate to generate the metadata and
avoids dependency on a c compiler.
svn path=/trunk/; revision=214
2008-04-23 00:48:16 +02:00
|
|
|
"Blob size mismatch");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-02-08 16:31:03 +01:00
|
|
|
if (!is_aligned (header->directory))
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_HEADER,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Misaligned directory");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2009-02-20 03:48:51 +01:00
|
|
|
if (!is_aligned (header->attributes))
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_HEADER,
|
2009-02-20 03:48:51 +01:00
|
|
|
"Misaligned attributes");
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2009-02-20 03:48:51 +01:00
|
|
|
if (header->attributes == 0 && header->n_attributes > 0)
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_HEADER,
|
2009-02-20 03:48:51 +01:00
|
|
|
"Wrong number of attributes");
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-08-21 18:15:55 +02:00
|
|
|
if (!validate_name (typelib, "namespace", typelib->data, header->namespace, error))
|
|
|
|
return FALSE;
|
2008-02-08 16:31:03 +01:00
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
static gboolean validate_type_blob (GTypelib *typelib,
|
2008-02-08 16:31:03 +01:00
|
|
|
guint32 offset,
|
|
|
|
guint32 signature_offset,
|
|
|
|
gboolean return_type,
|
|
|
|
GError **error);
|
|
|
|
|
|
|
|
static gboolean
|
2008-08-09 14:55:32 +02:00
|
|
|
validate_array_type_blob (GTypelib *typelib,
|
2008-02-08 16:31:03 +01:00
|
|
|
guint32 offset,
|
|
|
|
guint32 signature_offset,
|
|
|
|
gboolean return_type,
|
|
|
|
GError **error)
|
|
|
|
{
|
Revert revisions 157,149-148,136-129 and 120. Move back to using
2008-04-22 Johan Dahlin <johan@gnome.org>
* girepository/ginfo.c (g_info_from_entry), (g_type_info_new),
(g_type_info_is_pointer), (g_type_info_get_tag),
(g_type_info_get_param_type), (g_type_info_get_interface),
(g_type_info_get_array_length), (g_type_info_is_zero_terminated),
(g_type_info_get_n_error_domains), (g_type_info_get_error_domain),
(g_error_domain_info_get_codes), (g_enum_info_get_value),
(g_object_info_get_interface), (g_object_info_get_field),
(g_interface_info_get_prerequisite),
(g_signal_info_get_class_closure), (g_constant_info_get_value):
* girepository/ginvoke.c (get_ffi_type):
* girepository/girepository.h:
* girepository/gmetadata.c (g_metadata_get_dir_entry),
(g_metadata_check_sanity), (validate_header),
(validate_array_type_blob), (validate_iface_type_blob),
(validate_param_type_blob), (validate_error_type_blob),
(validate_type_blob), (validate_constant_blob),
(validate_struct_blob), (validate_enum_blob):
* girepository/gmetadata.h:
* tests/Makefile.am:
* tests/invoke/Makefile.am:
* tests/invoke/invoke.c (main):
* tests/roundtrips.sh:
* tools/Makefile.am:
* tools/compiler.c (format_output), (write_out_metadata), (main):
* tools/generate.c (write_type_name), (write_type_info),
(write_constant_value), (write_enum_info), (load_metadata), (main):
* tools/gidlcompilercontext.c:
* tools/gidlcompilercontext.h:
* tools/gidlcompilerentrynode.c:
* tools/gidlcompilerentrynode.h:
* tools/gidlcompilertypenode.c:
* tools/gidlcompilertypenode.h:
* tools/gidlmodule.c (g_idl_module_build_metadata):
* tools/gidlmodule.h:
* tools/gidlnode.c (init_stats), (dump_stats),
(g_idl_node_get_size), (g_idl_node_get_full_size),
(g_idl_node_cmp), (g_idl_node_can_have_member),
(g_idl_node_add_member), (g_idl_node_param_direction_string),
(parse_int_value), (parse_uint_value), (parse_float_value),
(parse_boolean_value), (find_entry_node), (find_entry),
(serialize_type), (g_idl_node_build_metadata), (write_string):
* tools/gidlnode.h:
* tools/gidlparser.c (parse_type_internal):
* tools/quote-file.sh:
Revert revisions 157,149-148,136-129 and 120.
Move back to using g-idl-generate to generate the metadata and
avoids dependency on a c compiler.
svn path=/trunk/; revision=214
2008-04-23 00:48:16 +02:00
|
|
|
ArrayTypeBlob *blob;
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
blob = (ArrayTypeBlob*)&typelib->data[offset];
|
2008-02-08 16:31:03 +01:00
|
|
|
|
Revert revisions 157,149-148,136-129 and 120. Move back to using
2008-04-22 Johan Dahlin <johan@gnome.org>
* girepository/ginfo.c (g_info_from_entry), (g_type_info_new),
(g_type_info_is_pointer), (g_type_info_get_tag),
(g_type_info_get_param_type), (g_type_info_get_interface),
(g_type_info_get_array_length), (g_type_info_is_zero_terminated),
(g_type_info_get_n_error_domains), (g_type_info_get_error_domain),
(g_error_domain_info_get_codes), (g_enum_info_get_value),
(g_object_info_get_interface), (g_object_info_get_field),
(g_interface_info_get_prerequisite),
(g_signal_info_get_class_closure), (g_constant_info_get_value):
* girepository/ginvoke.c (get_ffi_type):
* girepository/girepository.h:
* girepository/gmetadata.c (g_metadata_get_dir_entry),
(g_metadata_check_sanity), (validate_header),
(validate_array_type_blob), (validate_iface_type_blob),
(validate_param_type_blob), (validate_error_type_blob),
(validate_type_blob), (validate_constant_blob),
(validate_struct_blob), (validate_enum_blob):
* girepository/gmetadata.h:
* tests/Makefile.am:
* tests/invoke/Makefile.am:
* tests/invoke/invoke.c (main):
* tests/roundtrips.sh:
* tools/Makefile.am:
* tools/compiler.c (format_output), (write_out_metadata), (main):
* tools/generate.c (write_type_name), (write_type_info),
(write_constant_value), (write_enum_info), (load_metadata), (main):
* tools/gidlcompilercontext.c:
* tools/gidlcompilercontext.h:
* tools/gidlcompilerentrynode.c:
* tools/gidlcompilerentrynode.h:
* tools/gidlcompilertypenode.c:
* tools/gidlcompilertypenode.h:
* tools/gidlmodule.c (g_idl_module_build_metadata):
* tools/gidlmodule.h:
* tools/gidlnode.c (init_stats), (dump_stats),
(g_idl_node_get_size), (g_idl_node_get_full_size),
(g_idl_node_cmp), (g_idl_node_can_have_member),
(g_idl_node_add_member), (g_idl_node_param_direction_string),
(parse_int_value), (parse_uint_value), (parse_float_value),
(parse_boolean_value), (find_entry_node), (find_entry),
(serialize_type), (g_idl_node_build_metadata), (write_string):
* tools/gidlnode.h:
* tools/gidlparser.c (parse_type_internal):
* tools/quote-file.sh:
Revert revisions 157,149-148,136-129 and 120.
Move back to using g-idl-generate to generate the metadata and
avoids dependency on a c compiler.
svn path=/trunk/; revision=214
2008-04-23 00:48:16 +02:00
|
|
|
if (!blob->pointer)
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
Revert revisions 157,149-148,136-129 and 120. Move back to using
2008-04-22 Johan Dahlin <johan@gnome.org>
* girepository/ginfo.c (g_info_from_entry), (g_type_info_new),
(g_type_info_is_pointer), (g_type_info_get_tag),
(g_type_info_get_param_type), (g_type_info_get_interface),
(g_type_info_get_array_length), (g_type_info_is_zero_terminated),
(g_type_info_get_n_error_domains), (g_type_info_get_error_domain),
(g_error_domain_info_get_codes), (g_enum_info_get_value),
(g_object_info_get_interface), (g_object_info_get_field),
(g_interface_info_get_prerequisite),
(g_signal_info_get_class_closure), (g_constant_info_get_value):
* girepository/ginvoke.c (get_ffi_type):
* girepository/girepository.h:
* girepository/gmetadata.c (g_metadata_get_dir_entry),
(g_metadata_check_sanity), (validate_header),
(validate_array_type_blob), (validate_iface_type_blob),
(validate_param_type_blob), (validate_error_type_blob),
(validate_type_blob), (validate_constant_blob),
(validate_struct_blob), (validate_enum_blob):
* girepository/gmetadata.h:
* tests/Makefile.am:
* tests/invoke/Makefile.am:
* tests/invoke/invoke.c (main):
* tests/roundtrips.sh:
* tools/Makefile.am:
* tools/compiler.c (format_output), (write_out_metadata), (main):
* tools/generate.c (write_type_name), (write_type_info),
(write_constant_value), (write_enum_info), (load_metadata), (main):
* tools/gidlcompilercontext.c:
* tools/gidlcompilercontext.h:
* tools/gidlcompilerentrynode.c:
* tools/gidlcompilerentrynode.h:
* tools/gidlcompilertypenode.c:
* tools/gidlcompilertypenode.h:
* tools/gidlmodule.c (g_idl_module_build_metadata):
* tools/gidlmodule.h:
* tools/gidlnode.c (init_stats), (dump_stats),
(g_idl_node_get_size), (g_idl_node_get_full_size),
(g_idl_node_cmp), (g_idl_node_can_have_member),
(g_idl_node_add_member), (g_idl_node_param_direction_string),
(parse_int_value), (parse_uint_value), (parse_float_value),
(parse_boolean_value), (find_entry_node), (find_entry),
(serialize_type), (g_idl_node_build_metadata), (write_string):
* tools/gidlnode.h:
* tools/gidlparser.c (parse_type_internal):
* tools/quote-file.sh:
Revert revisions 157,149-148,136-129 and 120.
Move back to using g-idl-generate to generate the metadata and
avoids dependency on a c compiler.
svn path=/trunk/; revision=214
2008-04-23 00:48:16 +02:00
|
|
|
"Pointer type exected for tag %d", blob->tag);
|
|
|
|
return FALSE;
|
2008-02-08 16:31:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/* FIXME validate length */
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
if (!validate_type_blob (typelib,
|
2008-02-08 16:31:03 +01:00
|
|
|
offset + G_STRUCT_OFFSET (ArrayTypeBlob, type),
|
|
|
|
0, FALSE, error))
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
Revert revisions 157,149-148,136-129 and 120. Move back to using
2008-04-22 Johan Dahlin <johan@gnome.org>
* girepository/ginfo.c (g_info_from_entry), (g_type_info_new),
(g_type_info_is_pointer), (g_type_info_get_tag),
(g_type_info_get_param_type), (g_type_info_get_interface),
(g_type_info_get_array_length), (g_type_info_is_zero_terminated),
(g_type_info_get_n_error_domains), (g_type_info_get_error_domain),
(g_error_domain_info_get_codes), (g_enum_info_get_value),
(g_object_info_get_interface), (g_object_info_get_field),
(g_interface_info_get_prerequisite),
(g_signal_info_get_class_closure), (g_constant_info_get_value):
* girepository/ginvoke.c (get_ffi_type):
* girepository/girepository.h:
* girepository/gmetadata.c (g_metadata_get_dir_entry),
(g_metadata_check_sanity), (validate_header),
(validate_array_type_blob), (validate_iface_type_blob),
(validate_param_type_blob), (validate_error_type_blob),
(validate_type_blob), (validate_constant_blob),
(validate_struct_blob), (validate_enum_blob):
* girepository/gmetadata.h:
* tests/Makefile.am:
* tests/invoke/Makefile.am:
* tests/invoke/invoke.c (main):
* tests/roundtrips.sh:
* tools/Makefile.am:
* tools/compiler.c (format_output), (write_out_metadata), (main):
* tools/generate.c (write_type_name), (write_type_info),
(write_constant_value), (write_enum_info), (load_metadata), (main):
* tools/gidlcompilercontext.c:
* tools/gidlcompilercontext.h:
* tools/gidlcompilerentrynode.c:
* tools/gidlcompilerentrynode.h:
* tools/gidlcompilertypenode.c:
* tools/gidlcompilertypenode.h:
* tools/gidlmodule.c (g_idl_module_build_metadata):
* tools/gidlmodule.h:
* tools/gidlnode.c (init_stats), (dump_stats),
(g_idl_node_get_size), (g_idl_node_get_full_size),
(g_idl_node_cmp), (g_idl_node_can_have_member),
(g_idl_node_add_member), (g_idl_node_param_direction_string),
(parse_int_value), (parse_uint_value), (parse_float_value),
(parse_boolean_value), (find_entry_node), (find_entry),
(serialize_type), (g_idl_node_build_metadata), (write_string):
* tools/gidlnode.h:
* tools/gidlparser.c (parse_type_internal):
* tools/quote-file.sh:
Revert revisions 157,149-148,136-129 and 120.
Move back to using g-idl-generate to generate the metadata and
avoids dependency on a c compiler.
svn path=/trunk/; revision=214
2008-04-23 00:48:16 +02:00
|
|
|
static gboolean
|
2008-08-09 14:55:32 +02:00
|
|
|
validate_iface_type_blob (GTypelib *typelib,
|
Revert revisions 157,149-148,136-129 and 120. Move back to using
2008-04-22 Johan Dahlin <johan@gnome.org>
* girepository/ginfo.c (g_info_from_entry), (g_type_info_new),
(g_type_info_is_pointer), (g_type_info_get_tag),
(g_type_info_get_param_type), (g_type_info_get_interface),
(g_type_info_get_array_length), (g_type_info_is_zero_terminated),
(g_type_info_get_n_error_domains), (g_type_info_get_error_domain),
(g_error_domain_info_get_codes), (g_enum_info_get_value),
(g_object_info_get_interface), (g_object_info_get_field),
(g_interface_info_get_prerequisite),
(g_signal_info_get_class_closure), (g_constant_info_get_value):
* girepository/ginvoke.c (get_ffi_type):
* girepository/girepository.h:
* girepository/gmetadata.c (g_metadata_get_dir_entry),
(g_metadata_check_sanity), (validate_header),
(validate_array_type_blob), (validate_iface_type_blob),
(validate_param_type_blob), (validate_error_type_blob),
(validate_type_blob), (validate_constant_blob),
(validate_struct_blob), (validate_enum_blob):
* girepository/gmetadata.h:
* tests/Makefile.am:
* tests/invoke/Makefile.am:
* tests/invoke/invoke.c (main):
* tests/roundtrips.sh:
* tools/Makefile.am:
* tools/compiler.c (format_output), (write_out_metadata), (main):
* tools/generate.c (write_type_name), (write_type_info),
(write_constant_value), (write_enum_info), (load_metadata), (main):
* tools/gidlcompilercontext.c:
* tools/gidlcompilercontext.h:
* tools/gidlcompilerentrynode.c:
* tools/gidlcompilerentrynode.h:
* tools/gidlcompilertypenode.c:
* tools/gidlcompilertypenode.h:
* tools/gidlmodule.c (g_idl_module_build_metadata):
* tools/gidlmodule.h:
* tools/gidlnode.c (init_stats), (dump_stats),
(g_idl_node_get_size), (g_idl_node_get_full_size),
(g_idl_node_cmp), (g_idl_node_can_have_member),
(g_idl_node_add_member), (g_idl_node_param_direction_string),
(parse_int_value), (parse_uint_value), (parse_float_value),
(parse_boolean_value), (find_entry_node), (find_entry),
(serialize_type), (g_idl_node_build_metadata), (write_string):
* tools/gidlnode.h:
* tools/gidlparser.c (parse_type_internal):
* tools/quote-file.sh:
Revert revisions 157,149-148,136-129 and 120.
Move back to using g-idl-generate to generate the metadata and
avoids dependency on a c compiler.
svn path=/trunk/; revision=214
2008-04-23 00:48:16 +02:00
|
|
|
guint32 offset,
|
|
|
|
guint32 signature_offset,
|
|
|
|
gboolean return_type,
|
|
|
|
GError **error)
|
|
|
|
{
|
|
|
|
InterfaceTypeBlob *blob;
|
2008-08-24 18:51:43 +02:00
|
|
|
InterfaceBlob *target;
|
Revert revisions 157,149-148,136-129 and 120. Move back to using
2008-04-22 Johan Dahlin <johan@gnome.org>
* girepository/ginfo.c (g_info_from_entry), (g_type_info_new),
(g_type_info_is_pointer), (g_type_info_get_tag),
(g_type_info_get_param_type), (g_type_info_get_interface),
(g_type_info_get_array_length), (g_type_info_is_zero_terminated),
(g_type_info_get_n_error_domains), (g_type_info_get_error_domain),
(g_error_domain_info_get_codes), (g_enum_info_get_value),
(g_object_info_get_interface), (g_object_info_get_field),
(g_interface_info_get_prerequisite),
(g_signal_info_get_class_closure), (g_constant_info_get_value):
* girepository/ginvoke.c (get_ffi_type):
* girepository/girepository.h:
* girepository/gmetadata.c (g_metadata_get_dir_entry),
(g_metadata_check_sanity), (validate_header),
(validate_array_type_blob), (validate_iface_type_blob),
(validate_param_type_blob), (validate_error_type_blob),
(validate_type_blob), (validate_constant_blob),
(validate_struct_blob), (validate_enum_blob):
* girepository/gmetadata.h:
* tests/Makefile.am:
* tests/invoke/Makefile.am:
* tests/invoke/invoke.c (main):
* tests/roundtrips.sh:
* tools/Makefile.am:
* tools/compiler.c (format_output), (write_out_metadata), (main):
* tools/generate.c (write_type_name), (write_type_info),
(write_constant_value), (write_enum_info), (load_metadata), (main):
* tools/gidlcompilercontext.c:
* tools/gidlcompilercontext.h:
* tools/gidlcompilerentrynode.c:
* tools/gidlcompilerentrynode.h:
* tools/gidlcompilertypenode.c:
* tools/gidlcompilertypenode.h:
* tools/gidlmodule.c (g_idl_module_build_metadata):
* tools/gidlmodule.h:
* tools/gidlnode.c (init_stats), (dump_stats),
(g_idl_node_get_size), (g_idl_node_get_full_size),
(g_idl_node_cmp), (g_idl_node_can_have_member),
(g_idl_node_add_member), (g_idl_node_param_direction_string),
(parse_int_value), (parse_uint_value), (parse_float_value),
(parse_boolean_value), (find_entry_node), (find_entry),
(serialize_type), (g_idl_node_build_metadata), (write_string):
* tools/gidlnode.h:
* tools/gidlparser.c (parse_type_internal):
* tools/quote-file.sh:
Revert revisions 157,149-148,136-129 and 120.
Move back to using g-idl-generate to generate the metadata and
avoids dependency on a c compiler.
svn path=/trunk/; revision=214
2008-04-23 00:48:16 +02:00
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
blob = (InterfaceTypeBlob*)&typelib->data[offset];
|
Revert revisions 157,149-148,136-129 and 120. Move back to using
2008-04-22 Johan Dahlin <johan@gnome.org>
* girepository/ginfo.c (g_info_from_entry), (g_type_info_new),
(g_type_info_is_pointer), (g_type_info_get_tag),
(g_type_info_get_param_type), (g_type_info_get_interface),
(g_type_info_get_array_length), (g_type_info_is_zero_terminated),
(g_type_info_get_n_error_domains), (g_type_info_get_error_domain),
(g_error_domain_info_get_codes), (g_enum_info_get_value),
(g_object_info_get_interface), (g_object_info_get_field),
(g_interface_info_get_prerequisite),
(g_signal_info_get_class_closure), (g_constant_info_get_value):
* girepository/ginvoke.c (get_ffi_type):
* girepository/girepository.h:
* girepository/gmetadata.c (g_metadata_get_dir_entry),
(g_metadata_check_sanity), (validate_header),
(validate_array_type_blob), (validate_iface_type_blob),
(validate_param_type_blob), (validate_error_type_blob),
(validate_type_blob), (validate_constant_blob),
(validate_struct_blob), (validate_enum_blob):
* girepository/gmetadata.h:
* tests/Makefile.am:
* tests/invoke/Makefile.am:
* tests/invoke/invoke.c (main):
* tests/roundtrips.sh:
* tools/Makefile.am:
* tools/compiler.c (format_output), (write_out_metadata), (main):
* tools/generate.c (write_type_name), (write_type_info),
(write_constant_value), (write_enum_info), (load_metadata), (main):
* tools/gidlcompilercontext.c:
* tools/gidlcompilercontext.h:
* tools/gidlcompilerentrynode.c:
* tools/gidlcompilerentrynode.h:
* tools/gidlcompilertypenode.c:
* tools/gidlcompilertypenode.h:
* tools/gidlmodule.c (g_idl_module_build_metadata):
* tools/gidlmodule.h:
* tools/gidlnode.c (init_stats), (dump_stats),
(g_idl_node_get_size), (g_idl_node_get_full_size),
(g_idl_node_cmp), (g_idl_node_can_have_member),
(g_idl_node_add_member), (g_idl_node_param_direction_string),
(parse_int_value), (parse_uint_value), (parse_float_value),
(parse_boolean_value), (find_entry_node), (find_entry),
(serialize_type), (g_idl_node_build_metadata), (write_string):
* tools/gidlnode.h:
* tools/gidlparser.c (parse_type_internal):
* tools/quote-file.sh:
Revert revisions 157,149-148,136-129 and 120.
Move back to using g-idl-generate to generate the metadata and
avoids dependency on a c compiler.
svn path=/trunk/; revision=214
2008-04-23 00:48:16 +02:00
|
|
|
|
2008-08-24 18:51:43 +02:00
|
|
|
target = (InterfaceBlob*) get_dir_entry_checked (typelib, blob->interface, error);
|
|
|
|
|
|
|
|
if (!target)
|
|
|
|
return FALSE;
|
|
|
|
if (target->blob_type == 0) /* non-local */
|
|
|
|
return TRUE;
|
Revert revisions 157,149-148,136-129 and 120. Move back to using
2008-04-22 Johan Dahlin <johan@gnome.org>
* girepository/ginfo.c (g_info_from_entry), (g_type_info_new),
(g_type_info_is_pointer), (g_type_info_get_tag),
(g_type_info_get_param_type), (g_type_info_get_interface),
(g_type_info_get_array_length), (g_type_info_is_zero_terminated),
(g_type_info_get_n_error_domains), (g_type_info_get_error_domain),
(g_error_domain_info_get_codes), (g_enum_info_get_value),
(g_object_info_get_interface), (g_object_info_get_field),
(g_interface_info_get_prerequisite),
(g_signal_info_get_class_closure), (g_constant_info_get_value):
* girepository/ginvoke.c (get_ffi_type):
* girepository/girepository.h:
* girepository/gmetadata.c (g_metadata_get_dir_entry),
(g_metadata_check_sanity), (validate_header),
(validate_array_type_blob), (validate_iface_type_blob),
(validate_param_type_blob), (validate_error_type_blob),
(validate_type_blob), (validate_constant_blob),
(validate_struct_blob), (validate_enum_blob):
* girepository/gmetadata.h:
* tests/Makefile.am:
* tests/invoke/Makefile.am:
* tests/invoke/invoke.c (main):
* tests/roundtrips.sh:
* tools/Makefile.am:
* tools/compiler.c (format_output), (write_out_metadata), (main):
* tools/generate.c (write_type_name), (write_type_info),
(write_constant_value), (write_enum_info), (load_metadata), (main):
* tools/gidlcompilercontext.c:
* tools/gidlcompilercontext.h:
* tools/gidlcompilerentrynode.c:
* tools/gidlcompilerentrynode.h:
* tools/gidlcompilertypenode.c:
* tools/gidlcompilertypenode.h:
* tools/gidlmodule.c (g_idl_module_build_metadata):
* tools/gidlmodule.h:
* tools/gidlnode.c (init_stats), (dump_stats),
(g_idl_node_get_size), (g_idl_node_get_full_size),
(g_idl_node_cmp), (g_idl_node_can_have_member),
(g_idl_node_add_member), (g_idl_node_param_direction_string),
(parse_int_value), (parse_uint_value), (parse_float_value),
(parse_boolean_value), (find_entry_node), (find_entry),
(serialize_type), (g_idl_node_build_metadata), (write_string):
* tools/gidlnode.h:
* tools/gidlparser.c (parse_type_internal):
* tools/quote-file.sh:
Revert revisions 157,149-148,136-129 and 120.
Move back to using g-idl-generate to generate the metadata and
avoids dependency on a c compiler.
svn path=/trunk/; revision=214
2008-04-23 00:48:16 +02:00
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2008-02-08 16:31:03 +01:00
|
|
|
static gboolean
|
2008-08-09 14:55:32 +02:00
|
|
|
validate_param_type_blob (GTypelib *typelib,
|
2008-02-08 16:31:03 +01:00
|
|
|
guint32 offset,
|
|
|
|
guint32 signature_offset,
|
|
|
|
gboolean return_type,
|
|
|
|
gint n_params,
|
|
|
|
GError **error)
|
|
|
|
{
|
Revert revisions 157,149-148,136-129 and 120. Move back to using
2008-04-22 Johan Dahlin <johan@gnome.org>
* girepository/ginfo.c (g_info_from_entry), (g_type_info_new),
(g_type_info_is_pointer), (g_type_info_get_tag),
(g_type_info_get_param_type), (g_type_info_get_interface),
(g_type_info_get_array_length), (g_type_info_is_zero_terminated),
(g_type_info_get_n_error_domains), (g_type_info_get_error_domain),
(g_error_domain_info_get_codes), (g_enum_info_get_value),
(g_object_info_get_interface), (g_object_info_get_field),
(g_interface_info_get_prerequisite),
(g_signal_info_get_class_closure), (g_constant_info_get_value):
* girepository/ginvoke.c (get_ffi_type):
* girepository/girepository.h:
* girepository/gmetadata.c (g_metadata_get_dir_entry),
(g_metadata_check_sanity), (validate_header),
(validate_array_type_blob), (validate_iface_type_blob),
(validate_param_type_blob), (validate_error_type_blob),
(validate_type_blob), (validate_constant_blob),
(validate_struct_blob), (validate_enum_blob):
* girepository/gmetadata.h:
* tests/Makefile.am:
* tests/invoke/Makefile.am:
* tests/invoke/invoke.c (main):
* tests/roundtrips.sh:
* tools/Makefile.am:
* tools/compiler.c (format_output), (write_out_metadata), (main):
* tools/generate.c (write_type_name), (write_type_info),
(write_constant_value), (write_enum_info), (load_metadata), (main):
* tools/gidlcompilercontext.c:
* tools/gidlcompilercontext.h:
* tools/gidlcompilerentrynode.c:
* tools/gidlcompilerentrynode.h:
* tools/gidlcompilertypenode.c:
* tools/gidlcompilertypenode.h:
* tools/gidlmodule.c (g_idl_module_build_metadata):
* tools/gidlmodule.h:
* tools/gidlnode.c (init_stats), (dump_stats),
(g_idl_node_get_size), (g_idl_node_get_full_size),
(g_idl_node_cmp), (g_idl_node_can_have_member),
(g_idl_node_add_member), (g_idl_node_param_direction_string),
(parse_int_value), (parse_uint_value), (parse_float_value),
(parse_boolean_value), (find_entry_node), (find_entry),
(serialize_type), (g_idl_node_build_metadata), (write_string):
* tools/gidlnode.h:
* tools/gidlparser.c (parse_type_internal):
* tools/quote-file.sh:
Revert revisions 157,149-148,136-129 and 120.
Move back to using g-idl-generate to generate the metadata and
avoids dependency on a c compiler.
svn path=/trunk/; revision=214
2008-04-23 00:48:16 +02:00
|
|
|
ParamTypeBlob *blob;
|
2008-02-08 16:31:03 +01:00
|
|
|
gint i;
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
blob = (ParamTypeBlob*)&typelib->data[offset];
|
2008-02-08 16:31:03 +01:00
|
|
|
|
Revert revisions 157,149-148,136-129 and 120. Move back to using
2008-04-22 Johan Dahlin <johan@gnome.org>
* girepository/ginfo.c (g_info_from_entry), (g_type_info_new),
(g_type_info_is_pointer), (g_type_info_get_tag),
(g_type_info_get_param_type), (g_type_info_get_interface),
(g_type_info_get_array_length), (g_type_info_is_zero_terminated),
(g_type_info_get_n_error_domains), (g_type_info_get_error_domain),
(g_error_domain_info_get_codes), (g_enum_info_get_value),
(g_object_info_get_interface), (g_object_info_get_field),
(g_interface_info_get_prerequisite),
(g_signal_info_get_class_closure), (g_constant_info_get_value):
* girepository/ginvoke.c (get_ffi_type):
* girepository/girepository.h:
* girepository/gmetadata.c (g_metadata_get_dir_entry),
(g_metadata_check_sanity), (validate_header),
(validate_array_type_blob), (validate_iface_type_blob),
(validate_param_type_blob), (validate_error_type_blob),
(validate_type_blob), (validate_constant_blob),
(validate_struct_blob), (validate_enum_blob):
* girepository/gmetadata.h:
* tests/Makefile.am:
* tests/invoke/Makefile.am:
* tests/invoke/invoke.c (main):
* tests/roundtrips.sh:
* tools/Makefile.am:
* tools/compiler.c (format_output), (write_out_metadata), (main):
* tools/generate.c (write_type_name), (write_type_info),
(write_constant_value), (write_enum_info), (load_metadata), (main):
* tools/gidlcompilercontext.c:
* tools/gidlcompilercontext.h:
* tools/gidlcompilerentrynode.c:
* tools/gidlcompilerentrynode.h:
* tools/gidlcompilertypenode.c:
* tools/gidlcompilertypenode.h:
* tools/gidlmodule.c (g_idl_module_build_metadata):
* tools/gidlmodule.h:
* tools/gidlnode.c (init_stats), (dump_stats),
(g_idl_node_get_size), (g_idl_node_get_full_size),
(g_idl_node_cmp), (g_idl_node_can_have_member),
(g_idl_node_add_member), (g_idl_node_param_direction_string),
(parse_int_value), (parse_uint_value), (parse_float_value),
(parse_boolean_value), (find_entry_node), (find_entry),
(serialize_type), (g_idl_node_build_metadata), (write_string):
* tools/gidlnode.h:
* tools/gidlparser.c (parse_type_internal):
* tools/quote-file.sh:
Revert revisions 157,149-148,136-129 and 120.
Move back to using g-idl-generate to generate the metadata and
avoids dependency on a c compiler.
svn path=/trunk/; revision=214
2008-04-23 00:48:16 +02:00
|
|
|
if (!blob->pointer)
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
Revert revisions 157,149-148,136-129 and 120. Move back to using
2008-04-22 Johan Dahlin <johan@gnome.org>
* girepository/ginfo.c (g_info_from_entry), (g_type_info_new),
(g_type_info_is_pointer), (g_type_info_get_tag),
(g_type_info_get_param_type), (g_type_info_get_interface),
(g_type_info_get_array_length), (g_type_info_is_zero_terminated),
(g_type_info_get_n_error_domains), (g_type_info_get_error_domain),
(g_error_domain_info_get_codes), (g_enum_info_get_value),
(g_object_info_get_interface), (g_object_info_get_field),
(g_interface_info_get_prerequisite),
(g_signal_info_get_class_closure), (g_constant_info_get_value):
* girepository/ginvoke.c (get_ffi_type):
* girepository/girepository.h:
* girepository/gmetadata.c (g_metadata_get_dir_entry),
(g_metadata_check_sanity), (validate_header),
(validate_array_type_blob), (validate_iface_type_blob),
(validate_param_type_blob), (validate_error_type_blob),
(validate_type_blob), (validate_constant_blob),
(validate_struct_blob), (validate_enum_blob):
* girepository/gmetadata.h:
* tests/Makefile.am:
* tests/invoke/Makefile.am:
* tests/invoke/invoke.c (main):
* tests/roundtrips.sh:
* tools/Makefile.am:
* tools/compiler.c (format_output), (write_out_metadata), (main):
* tools/generate.c (write_type_name), (write_type_info),
(write_constant_value), (write_enum_info), (load_metadata), (main):
* tools/gidlcompilercontext.c:
* tools/gidlcompilercontext.h:
* tools/gidlcompilerentrynode.c:
* tools/gidlcompilerentrynode.h:
* tools/gidlcompilertypenode.c:
* tools/gidlcompilertypenode.h:
* tools/gidlmodule.c (g_idl_module_build_metadata):
* tools/gidlmodule.h:
* tools/gidlnode.c (init_stats), (dump_stats),
(g_idl_node_get_size), (g_idl_node_get_full_size),
(g_idl_node_cmp), (g_idl_node_can_have_member),
(g_idl_node_add_member), (g_idl_node_param_direction_string),
(parse_int_value), (parse_uint_value), (parse_float_value),
(parse_boolean_value), (find_entry_node), (find_entry),
(serialize_type), (g_idl_node_build_metadata), (write_string):
* tools/gidlnode.h:
* tools/gidlparser.c (parse_type_internal):
* tools/quote-file.sh:
Revert revisions 157,149-148,136-129 and 120.
Move back to using g-idl-generate to generate the metadata and
avoids dependency on a c compiler.
svn path=/trunk/; revision=214
2008-04-23 00:48:16 +02:00
|
|
|
"Pointer type exected for tag %d", blob->tag);
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (blob->n_types != n_params)
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Parameter type number mismatch");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < n_params; i++)
|
|
|
|
{
|
2008-08-09 14:55:32 +02:00
|
|
|
if (!validate_type_blob (typelib,
|
2008-02-08 16:31:03 +01:00
|
|
|
offset + sizeof (ParamTypeBlob) +
|
|
|
|
i * sizeof (SimpleTypeBlob),
|
|
|
|
0, FALSE, error))
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2008-08-09 14:55:32 +02:00
|
|
|
validate_error_type_blob (GTypelib *typelib,
|
2008-02-08 16:31:03 +01:00
|
|
|
guint32 offset,
|
|
|
|
guint32 signature_offset,
|
|
|
|
gboolean return_type,
|
|
|
|
GError **error)
|
|
|
|
{
|
|
|
|
ErrorTypeBlob *blob;
|
|
|
|
Header *header;
|
|
|
|
gint i;
|
|
|
|
DirEntry *entry;
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
blob = (ErrorTypeBlob*)&typelib->data[offset];
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
header = (Header *)typelib->data;
|
2008-02-08 16:31:03 +01:00
|
|
|
|
Revert revisions 157,149-148,136-129 and 120. Move back to using
2008-04-22 Johan Dahlin <johan@gnome.org>
* girepository/ginfo.c (g_info_from_entry), (g_type_info_new),
(g_type_info_is_pointer), (g_type_info_get_tag),
(g_type_info_get_param_type), (g_type_info_get_interface),
(g_type_info_get_array_length), (g_type_info_is_zero_terminated),
(g_type_info_get_n_error_domains), (g_type_info_get_error_domain),
(g_error_domain_info_get_codes), (g_enum_info_get_value),
(g_object_info_get_interface), (g_object_info_get_field),
(g_interface_info_get_prerequisite),
(g_signal_info_get_class_closure), (g_constant_info_get_value):
* girepository/ginvoke.c (get_ffi_type):
* girepository/girepository.h:
* girepository/gmetadata.c (g_metadata_get_dir_entry),
(g_metadata_check_sanity), (validate_header),
(validate_array_type_blob), (validate_iface_type_blob),
(validate_param_type_blob), (validate_error_type_blob),
(validate_type_blob), (validate_constant_blob),
(validate_struct_blob), (validate_enum_blob):
* girepository/gmetadata.h:
* tests/Makefile.am:
* tests/invoke/Makefile.am:
* tests/invoke/invoke.c (main):
* tests/roundtrips.sh:
* tools/Makefile.am:
* tools/compiler.c (format_output), (write_out_metadata), (main):
* tools/generate.c (write_type_name), (write_type_info),
(write_constant_value), (write_enum_info), (load_metadata), (main):
* tools/gidlcompilercontext.c:
* tools/gidlcompilercontext.h:
* tools/gidlcompilerentrynode.c:
* tools/gidlcompilerentrynode.h:
* tools/gidlcompilertypenode.c:
* tools/gidlcompilertypenode.h:
* tools/gidlmodule.c (g_idl_module_build_metadata):
* tools/gidlmodule.h:
* tools/gidlnode.c (init_stats), (dump_stats),
(g_idl_node_get_size), (g_idl_node_get_full_size),
(g_idl_node_cmp), (g_idl_node_can_have_member),
(g_idl_node_add_member), (g_idl_node_param_direction_string),
(parse_int_value), (parse_uint_value), (parse_float_value),
(parse_boolean_value), (find_entry_node), (find_entry),
(serialize_type), (g_idl_node_build_metadata), (write_string):
* tools/gidlnode.h:
* tools/gidlparser.c (parse_type_internal):
* tools/quote-file.sh:
Revert revisions 157,149-148,136-129 and 120.
Move back to using g-idl-generate to generate the metadata and
avoids dependency on a c compiler.
svn path=/trunk/; revision=214
2008-04-23 00:48:16 +02:00
|
|
|
if (!blob->pointer)
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
Revert revisions 157,149-148,136-129 and 120. Move back to using
2008-04-22 Johan Dahlin <johan@gnome.org>
* girepository/ginfo.c (g_info_from_entry), (g_type_info_new),
(g_type_info_is_pointer), (g_type_info_get_tag),
(g_type_info_get_param_type), (g_type_info_get_interface),
(g_type_info_get_array_length), (g_type_info_is_zero_terminated),
(g_type_info_get_n_error_domains), (g_type_info_get_error_domain),
(g_error_domain_info_get_codes), (g_enum_info_get_value),
(g_object_info_get_interface), (g_object_info_get_field),
(g_interface_info_get_prerequisite),
(g_signal_info_get_class_closure), (g_constant_info_get_value):
* girepository/ginvoke.c (get_ffi_type):
* girepository/girepository.h:
* girepository/gmetadata.c (g_metadata_get_dir_entry),
(g_metadata_check_sanity), (validate_header),
(validate_array_type_blob), (validate_iface_type_blob),
(validate_param_type_blob), (validate_error_type_blob),
(validate_type_blob), (validate_constant_blob),
(validate_struct_blob), (validate_enum_blob):
* girepository/gmetadata.h:
* tests/Makefile.am:
* tests/invoke/Makefile.am:
* tests/invoke/invoke.c (main):
* tests/roundtrips.sh:
* tools/Makefile.am:
* tools/compiler.c (format_output), (write_out_metadata), (main):
* tools/generate.c (write_type_name), (write_type_info),
(write_constant_value), (write_enum_info), (load_metadata), (main):
* tools/gidlcompilercontext.c:
* tools/gidlcompilercontext.h:
* tools/gidlcompilerentrynode.c:
* tools/gidlcompilerentrynode.h:
* tools/gidlcompilertypenode.c:
* tools/gidlcompilertypenode.h:
* tools/gidlmodule.c (g_idl_module_build_metadata):
* tools/gidlmodule.h:
* tools/gidlnode.c (init_stats), (dump_stats),
(g_idl_node_get_size), (g_idl_node_get_full_size),
(g_idl_node_cmp), (g_idl_node_can_have_member),
(g_idl_node_add_member), (g_idl_node_param_direction_string),
(parse_int_value), (parse_uint_value), (parse_float_value),
(parse_boolean_value), (find_entry_node), (find_entry),
(serialize_type), (g_idl_node_build_metadata), (write_string):
* tools/gidlnode.h:
* tools/gidlparser.c (parse_type_internal):
* tools/quote-file.sh:
Revert revisions 157,149-148,136-129 and 120.
Move back to using g-idl-generate to generate the metadata and
avoids dependency on a c compiler.
svn path=/trunk/; revision=214
2008-04-23 00:48:16 +02:00
|
|
|
"Pointer type exected for tag %d", blob->tag);
|
|
|
|
return FALSE;
|
2008-02-08 16:31:03 +01:00
|
|
|
}
|
|
|
|
|
Revert revisions 157,149-148,136-129 and 120. Move back to using
2008-04-22 Johan Dahlin <johan@gnome.org>
* girepository/ginfo.c (g_info_from_entry), (g_type_info_new),
(g_type_info_is_pointer), (g_type_info_get_tag),
(g_type_info_get_param_type), (g_type_info_get_interface),
(g_type_info_get_array_length), (g_type_info_is_zero_terminated),
(g_type_info_get_n_error_domains), (g_type_info_get_error_domain),
(g_error_domain_info_get_codes), (g_enum_info_get_value),
(g_object_info_get_interface), (g_object_info_get_field),
(g_interface_info_get_prerequisite),
(g_signal_info_get_class_closure), (g_constant_info_get_value):
* girepository/ginvoke.c (get_ffi_type):
* girepository/girepository.h:
* girepository/gmetadata.c (g_metadata_get_dir_entry),
(g_metadata_check_sanity), (validate_header),
(validate_array_type_blob), (validate_iface_type_blob),
(validate_param_type_blob), (validate_error_type_blob),
(validate_type_blob), (validate_constant_blob),
(validate_struct_blob), (validate_enum_blob):
* girepository/gmetadata.h:
* tests/Makefile.am:
* tests/invoke/Makefile.am:
* tests/invoke/invoke.c (main):
* tests/roundtrips.sh:
* tools/Makefile.am:
* tools/compiler.c (format_output), (write_out_metadata), (main):
* tools/generate.c (write_type_name), (write_type_info),
(write_constant_value), (write_enum_info), (load_metadata), (main):
* tools/gidlcompilercontext.c:
* tools/gidlcompilercontext.h:
* tools/gidlcompilerentrynode.c:
* tools/gidlcompilerentrynode.h:
* tools/gidlcompilertypenode.c:
* tools/gidlcompilertypenode.h:
* tools/gidlmodule.c (g_idl_module_build_metadata):
* tools/gidlmodule.h:
* tools/gidlnode.c (init_stats), (dump_stats),
(g_idl_node_get_size), (g_idl_node_get_full_size),
(g_idl_node_cmp), (g_idl_node_can_have_member),
(g_idl_node_add_member), (g_idl_node_param_direction_string),
(parse_int_value), (parse_uint_value), (parse_float_value),
(parse_boolean_value), (find_entry_node), (find_entry),
(serialize_type), (g_idl_node_build_metadata), (write_string):
* tools/gidlnode.h:
* tools/gidlparser.c (parse_type_internal):
* tools/quote-file.sh:
Revert revisions 157,149-148,136-129 and 120.
Move back to using g-idl-generate to generate the metadata and
avoids dependency on a c compiler.
svn path=/trunk/; revision=214
2008-04-23 00:48:16 +02:00
|
|
|
for (i = 0; i < blob->n_domains; i++)
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
Revert revisions 157,149-148,136-129 and 120. Move back to using
2008-04-22 Johan Dahlin <johan@gnome.org>
* girepository/ginfo.c (g_info_from_entry), (g_type_info_new),
(g_type_info_is_pointer), (g_type_info_get_tag),
(g_type_info_get_param_type), (g_type_info_get_interface),
(g_type_info_get_array_length), (g_type_info_is_zero_terminated),
(g_type_info_get_n_error_domains), (g_type_info_get_error_domain),
(g_error_domain_info_get_codes), (g_enum_info_get_value),
(g_object_info_get_interface), (g_object_info_get_field),
(g_interface_info_get_prerequisite),
(g_signal_info_get_class_closure), (g_constant_info_get_value):
* girepository/ginvoke.c (get_ffi_type):
* girepository/girepository.h:
* girepository/gmetadata.c (g_metadata_get_dir_entry),
(g_metadata_check_sanity), (validate_header),
(validate_array_type_blob), (validate_iface_type_blob),
(validate_param_type_blob), (validate_error_type_blob),
(validate_type_blob), (validate_constant_blob),
(validate_struct_blob), (validate_enum_blob):
* girepository/gmetadata.h:
* tests/Makefile.am:
* tests/invoke/Makefile.am:
* tests/invoke/invoke.c (main):
* tests/roundtrips.sh:
* tools/Makefile.am:
* tools/compiler.c (format_output), (write_out_metadata), (main):
* tools/generate.c (write_type_name), (write_type_info),
(write_constant_value), (write_enum_info), (load_metadata), (main):
* tools/gidlcompilercontext.c:
* tools/gidlcompilercontext.h:
* tools/gidlcompilerentrynode.c:
* tools/gidlcompilerentrynode.h:
* tools/gidlcompilertypenode.c:
* tools/gidlcompilertypenode.h:
* tools/gidlmodule.c (g_idl_module_build_metadata):
* tools/gidlmodule.h:
* tools/gidlnode.c (init_stats), (dump_stats),
(g_idl_node_get_size), (g_idl_node_get_full_size),
(g_idl_node_cmp), (g_idl_node_can_have_member),
(g_idl_node_add_member), (g_idl_node_param_direction_string),
(parse_int_value), (parse_uint_value), (parse_float_value),
(parse_boolean_value), (find_entry_node), (find_entry),
(serialize_type), (g_idl_node_build_metadata), (write_string):
* tools/gidlnode.h:
* tools/gidlparser.c (parse_type_internal):
* tools/quote-file.sh:
Revert revisions 157,149-148,136-129 and 120.
Move back to using g-idl-generate to generate the metadata and
avoids dependency on a c compiler.
svn path=/trunk/; revision=214
2008-04-23 00:48:16 +02:00
|
|
|
if (blob->domains[i] == 0 || blob->domains[i] > header->n_entries)
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
Revert revisions 157,149-148,136-129 and 120. Move back to using
2008-04-22 Johan Dahlin <johan@gnome.org>
* girepository/ginfo.c (g_info_from_entry), (g_type_info_new),
(g_type_info_is_pointer), (g_type_info_get_tag),
(g_type_info_get_param_type), (g_type_info_get_interface),
(g_type_info_get_array_length), (g_type_info_is_zero_terminated),
(g_type_info_get_n_error_domains), (g_type_info_get_error_domain),
(g_error_domain_info_get_codes), (g_enum_info_get_value),
(g_object_info_get_interface), (g_object_info_get_field),
(g_interface_info_get_prerequisite),
(g_signal_info_get_class_closure), (g_constant_info_get_value):
* girepository/ginvoke.c (get_ffi_type):
* girepository/girepository.h:
* girepository/gmetadata.c (g_metadata_get_dir_entry),
(g_metadata_check_sanity), (validate_header),
(validate_array_type_blob), (validate_iface_type_blob),
(validate_param_type_blob), (validate_error_type_blob),
(validate_type_blob), (validate_constant_blob),
(validate_struct_blob), (validate_enum_blob):
* girepository/gmetadata.h:
* tests/Makefile.am:
* tests/invoke/Makefile.am:
* tests/invoke/invoke.c (main):
* tests/roundtrips.sh:
* tools/Makefile.am:
* tools/compiler.c (format_output), (write_out_metadata), (main):
* tools/generate.c (write_type_name), (write_type_info),
(write_constant_value), (write_enum_info), (load_metadata), (main):
* tools/gidlcompilercontext.c:
* tools/gidlcompilercontext.h:
* tools/gidlcompilerentrynode.c:
* tools/gidlcompilerentrynode.h:
* tools/gidlcompilertypenode.c:
* tools/gidlcompilertypenode.h:
* tools/gidlmodule.c (g_idl_module_build_metadata):
* tools/gidlmodule.h:
* tools/gidlnode.c (init_stats), (dump_stats),
(g_idl_node_get_size), (g_idl_node_get_full_size),
(g_idl_node_cmp), (g_idl_node_can_have_member),
(g_idl_node_add_member), (g_idl_node_param_direction_string),
(parse_int_value), (parse_uint_value), (parse_float_value),
(parse_boolean_value), (find_entry_node), (find_entry),
(serialize_type), (g_idl_node_build_metadata), (write_string):
* tools/gidlnode.h:
* tools/gidlparser.c (parse_type_internal):
* tools/quote-file.sh:
Revert revisions 157,149-148,136-129 and 120.
Move back to using g-idl-generate to generate the metadata and
avoids dependency on a c compiler.
svn path=/trunk/; revision=214
2008-04-23 00:48:16 +02:00
|
|
|
"Invalid directory index %d", blob->domains[i]);
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
entry = g_typelib_get_dir_entry (typelib, blob->domains[i]);
|
2008-02-08 16:31:03 +01:00
|
|
|
|
|
|
|
if (entry->blob_type != BLOB_TYPE_ERROR_DOMAIN &&
|
|
|
|
(entry->local || entry->blob_type != BLOB_TYPE_INVALID))
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Wrong blob type");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2008-08-09 14:55:32 +02:00
|
|
|
validate_type_blob (GTypelib *typelib,
|
2008-02-08 16:31:03 +01:00
|
|
|
guint32 offset,
|
|
|
|
guint32 signature_offset,
|
|
|
|
gboolean return_type,
|
|
|
|
GError **error)
|
|
|
|
{
|
|
|
|
SimpleTypeBlob *simple;
|
Revert revisions 157,149-148,136-129 and 120. Move back to using
2008-04-22 Johan Dahlin <johan@gnome.org>
* girepository/ginfo.c (g_info_from_entry), (g_type_info_new),
(g_type_info_is_pointer), (g_type_info_get_tag),
(g_type_info_get_param_type), (g_type_info_get_interface),
(g_type_info_get_array_length), (g_type_info_is_zero_terminated),
(g_type_info_get_n_error_domains), (g_type_info_get_error_domain),
(g_error_domain_info_get_codes), (g_enum_info_get_value),
(g_object_info_get_interface), (g_object_info_get_field),
(g_interface_info_get_prerequisite),
(g_signal_info_get_class_closure), (g_constant_info_get_value):
* girepository/ginvoke.c (get_ffi_type):
* girepository/girepository.h:
* girepository/gmetadata.c (g_metadata_get_dir_entry),
(g_metadata_check_sanity), (validate_header),
(validate_array_type_blob), (validate_iface_type_blob),
(validate_param_type_blob), (validate_error_type_blob),
(validate_type_blob), (validate_constant_blob),
(validate_struct_blob), (validate_enum_blob):
* girepository/gmetadata.h:
* tests/Makefile.am:
* tests/invoke/Makefile.am:
* tests/invoke/invoke.c (main):
* tests/roundtrips.sh:
* tools/Makefile.am:
* tools/compiler.c (format_output), (write_out_metadata), (main):
* tools/generate.c (write_type_name), (write_type_info),
(write_constant_value), (write_enum_info), (load_metadata), (main):
* tools/gidlcompilercontext.c:
* tools/gidlcompilercontext.h:
* tools/gidlcompilerentrynode.c:
* tools/gidlcompilerentrynode.h:
* tools/gidlcompilertypenode.c:
* tools/gidlcompilertypenode.h:
* tools/gidlmodule.c (g_idl_module_build_metadata):
* tools/gidlmodule.h:
* tools/gidlnode.c (init_stats), (dump_stats),
(g_idl_node_get_size), (g_idl_node_get_full_size),
(g_idl_node_cmp), (g_idl_node_can_have_member),
(g_idl_node_add_member), (g_idl_node_param_direction_string),
(parse_int_value), (parse_uint_value), (parse_float_value),
(parse_boolean_value), (find_entry_node), (find_entry),
(serialize_type), (g_idl_node_build_metadata), (write_string):
* tools/gidlnode.h:
* tools/gidlparser.c (parse_type_internal):
* tools/quote-file.sh:
Revert revisions 157,149-148,136-129 and 120.
Move back to using g-idl-generate to generate the metadata and
avoids dependency on a c compiler.
svn path=/trunk/; revision=214
2008-04-23 00:48:16 +02:00
|
|
|
InterfaceTypeBlob *iface;
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
simple = (SimpleTypeBlob *)&typelib->data[offset];
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2009-06-24 23:52:05 +02:00
|
|
|
if (simple->flags.reserved == 0 &&
|
|
|
|
simple->flags.reserved2 == 0)
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
2009-06-24 23:52:05 +02:00
|
|
|
if (simple->flags.tag >= GI_TYPE_TAG_ARRAY)
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Wrong tag in simple type");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2009-06-24 23:52:05 +02:00
|
|
|
if (simple->flags.tag >= GI_TYPE_TAG_UTF8 &&
|
|
|
|
!simple->flags.pointer)
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
2009-06-24 23:52:05 +02:00
|
|
|
"Pointer type exected for tag %d", simple->flags.tag);
|
Revert revisions 157,149-148,136-129 and 120. Move back to using
2008-04-22 Johan Dahlin <johan@gnome.org>
* girepository/ginfo.c (g_info_from_entry), (g_type_info_new),
(g_type_info_is_pointer), (g_type_info_get_tag),
(g_type_info_get_param_type), (g_type_info_get_interface),
(g_type_info_get_array_length), (g_type_info_is_zero_terminated),
(g_type_info_get_n_error_domains), (g_type_info_get_error_domain),
(g_error_domain_info_get_codes), (g_enum_info_get_value),
(g_object_info_get_interface), (g_object_info_get_field),
(g_interface_info_get_prerequisite),
(g_signal_info_get_class_closure), (g_constant_info_get_value):
* girepository/ginvoke.c (get_ffi_type):
* girepository/girepository.h:
* girepository/gmetadata.c (g_metadata_get_dir_entry),
(g_metadata_check_sanity), (validate_header),
(validate_array_type_blob), (validate_iface_type_blob),
(validate_param_type_blob), (validate_error_type_blob),
(validate_type_blob), (validate_constant_blob),
(validate_struct_blob), (validate_enum_blob):
* girepository/gmetadata.h:
* tests/Makefile.am:
* tests/invoke/Makefile.am:
* tests/invoke/invoke.c (main):
* tests/roundtrips.sh:
* tools/Makefile.am:
* tools/compiler.c (format_output), (write_out_metadata), (main):
* tools/generate.c (write_type_name), (write_type_info),
(write_constant_value), (write_enum_info), (load_metadata), (main):
* tools/gidlcompilercontext.c:
* tools/gidlcompilercontext.h:
* tools/gidlcompilerentrynode.c:
* tools/gidlcompilerentrynode.h:
* tools/gidlcompilertypenode.c:
* tools/gidlcompilertypenode.h:
* tools/gidlmodule.c (g_idl_module_build_metadata):
* tools/gidlmodule.h:
* tools/gidlnode.c (init_stats), (dump_stats),
(g_idl_node_get_size), (g_idl_node_get_full_size),
(g_idl_node_cmp), (g_idl_node_can_have_member),
(g_idl_node_add_member), (g_idl_node_param_direction_string),
(parse_int_value), (parse_uint_value), (parse_float_value),
(parse_boolean_value), (find_entry_node), (find_entry),
(serialize_type), (g_idl_node_build_metadata), (write_string):
* tools/gidlnode.h:
* tools/gidlparser.c (parse_type_internal):
* tools/quote-file.sh:
Revert revisions 157,149-148,136-129 and 120.
Move back to using g-idl-generate to generate the metadata and
avoids dependency on a c compiler.
svn path=/trunk/; revision=214
2008-04-23 00:48:16 +02:00
|
|
|
return FALSE;
|
2008-02-08 16:31:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
iface = (InterfaceTypeBlob*)&typelib->data[simple->offset];
|
Revert revisions 157,149-148,136-129 and 120. Move back to using
2008-04-22 Johan Dahlin <johan@gnome.org>
* girepository/ginfo.c (g_info_from_entry), (g_type_info_new),
(g_type_info_is_pointer), (g_type_info_get_tag),
(g_type_info_get_param_type), (g_type_info_get_interface),
(g_type_info_get_array_length), (g_type_info_is_zero_terminated),
(g_type_info_get_n_error_domains), (g_type_info_get_error_domain),
(g_error_domain_info_get_codes), (g_enum_info_get_value),
(g_object_info_get_interface), (g_object_info_get_field),
(g_interface_info_get_prerequisite),
(g_signal_info_get_class_closure), (g_constant_info_get_value):
* girepository/ginvoke.c (get_ffi_type):
* girepository/girepository.h:
* girepository/gmetadata.c (g_metadata_get_dir_entry),
(g_metadata_check_sanity), (validate_header),
(validate_array_type_blob), (validate_iface_type_blob),
(validate_param_type_blob), (validate_error_type_blob),
(validate_type_blob), (validate_constant_blob),
(validate_struct_blob), (validate_enum_blob):
* girepository/gmetadata.h:
* tests/Makefile.am:
* tests/invoke/Makefile.am:
* tests/invoke/invoke.c (main):
* tests/roundtrips.sh:
* tools/Makefile.am:
* tools/compiler.c (format_output), (write_out_metadata), (main):
* tools/generate.c (write_type_name), (write_type_info),
(write_constant_value), (write_enum_info), (load_metadata), (main):
* tools/gidlcompilercontext.c:
* tools/gidlcompilercontext.h:
* tools/gidlcompilerentrynode.c:
* tools/gidlcompilerentrynode.h:
* tools/gidlcompilertypenode.c:
* tools/gidlcompilertypenode.h:
* tools/gidlmodule.c (g_idl_module_build_metadata):
* tools/gidlmodule.h:
* tools/gidlnode.c (init_stats), (dump_stats),
(g_idl_node_get_size), (g_idl_node_get_full_size),
(g_idl_node_cmp), (g_idl_node_can_have_member),
(g_idl_node_add_member), (g_idl_node_param_direction_string),
(parse_int_value), (parse_uint_value), (parse_float_value),
(parse_boolean_value), (find_entry_node), (find_entry),
(serialize_type), (g_idl_node_build_metadata), (write_string):
* tools/gidlnode.h:
* tools/gidlparser.c (parse_type_internal):
* tools/quote-file.sh:
Revert revisions 157,149-148,136-129 and 120.
Move back to using g-idl-generate to generate the metadata and
avoids dependency on a c compiler.
svn path=/trunk/; revision=214
2008-04-23 00:48:16 +02:00
|
|
|
|
|
|
|
switch (iface->tag)
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
2008-08-12 17:34:27 +02:00
|
|
|
case GI_TYPE_TAG_ARRAY:
|
2008-08-09 14:55:32 +02:00
|
|
|
if (!validate_array_type_blob (typelib, simple->offset,
|
2008-02-08 16:31:03 +01:00
|
|
|
signature_offset, return_type, error))
|
|
|
|
return FALSE;
|
|
|
|
break;
|
2008-08-12 17:34:27 +02:00
|
|
|
case GI_TYPE_TAG_INTERFACE:
|
2008-08-09 14:55:32 +02:00
|
|
|
if (!validate_iface_type_blob (typelib, simple->offset,
|
Revert revisions 157,149-148,136-129 and 120. Move back to using
2008-04-22 Johan Dahlin <johan@gnome.org>
* girepository/ginfo.c (g_info_from_entry), (g_type_info_new),
(g_type_info_is_pointer), (g_type_info_get_tag),
(g_type_info_get_param_type), (g_type_info_get_interface),
(g_type_info_get_array_length), (g_type_info_is_zero_terminated),
(g_type_info_get_n_error_domains), (g_type_info_get_error_domain),
(g_error_domain_info_get_codes), (g_enum_info_get_value),
(g_object_info_get_interface), (g_object_info_get_field),
(g_interface_info_get_prerequisite),
(g_signal_info_get_class_closure), (g_constant_info_get_value):
* girepository/ginvoke.c (get_ffi_type):
* girepository/girepository.h:
* girepository/gmetadata.c (g_metadata_get_dir_entry),
(g_metadata_check_sanity), (validate_header),
(validate_array_type_blob), (validate_iface_type_blob),
(validate_param_type_blob), (validate_error_type_blob),
(validate_type_blob), (validate_constant_blob),
(validate_struct_blob), (validate_enum_blob):
* girepository/gmetadata.h:
* tests/Makefile.am:
* tests/invoke/Makefile.am:
* tests/invoke/invoke.c (main):
* tests/roundtrips.sh:
* tools/Makefile.am:
* tools/compiler.c (format_output), (write_out_metadata), (main):
* tools/generate.c (write_type_name), (write_type_info),
(write_constant_value), (write_enum_info), (load_metadata), (main):
* tools/gidlcompilercontext.c:
* tools/gidlcompilercontext.h:
* tools/gidlcompilerentrynode.c:
* tools/gidlcompilerentrynode.h:
* tools/gidlcompilertypenode.c:
* tools/gidlcompilertypenode.h:
* tools/gidlmodule.c (g_idl_module_build_metadata):
* tools/gidlmodule.h:
* tools/gidlnode.c (init_stats), (dump_stats),
(g_idl_node_get_size), (g_idl_node_get_full_size),
(g_idl_node_cmp), (g_idl_node_can_have_member),
(g_idl_node_add_member), (g_idl_node_param_direction_string),
(parse_int_value), (parse_uint_value), (parse_float_value),
(parse_boolean_value), (find_entry_node), (find_entry),
(serialize_type), (g_idl_node_build_metadata), (write_string):
* tools/gidlnode.h:
* tools/gidlparser.c (parse_type_internal):
* tools/quote-file.sh:
Revert revisions 157,149-148,136-129 and 120.
Move back to using g-idl-generate to generate the metadata and
avoids dependency on a c compiler.
svn path=/trunk/; revision=214
2008-04-23 00:48:16 +02:00
|
|
|
signature_offset, return_type, error))
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
break;
|
2008-08-12 17:34:27 +02:00
|
|
|
case GI_TYPE_TAG_GLIST:
|
|
|
|
case GI_TYPE_TAG_GSLIST:
|
2008-08-09 14:55:32 +02:00
|
|
|
if (!validate_param_type_blob (typelib, simple->offset,
|
2008-02-08 16:31:03 +01:00
|
|
|
signature_offset, return_type, 1, error))
|
|
|
|
return FALSE;
|
|
|
|
break;
|
2008-08-12 17:34:27 +02:00
|
|
|
case GI_TYPE_TAG_GHASH:
|
2008-08-09 14:55:32 +02:00
|
|
|
if (!validate_param_type_blob (typelib, simple->offset,
|
2008-02-08 16:31:03 +01:00
|
|
|
signature_offset, return_type, 2, error))
|
|
|
|
return FALSE;
|
|
|
|
break;
|
2008-08-12 17:34:27 +02:00
|
|
|
case GI_TYPE_TAG_ERROR:
|
2008-08-09 14:55:32 +02:00
|
|
|
if (!validate_error_type_blob (typelib, simple->offset,
|
2008-02-08 16:31:03 +01:00
|
|
|
signature_offset, return_type, error))
|
|
|
|
return FALSE;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Wrong tag in complex type");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2008-08-09 14:55:32 +02:00
|
|
|
validate_arg_blob (GTypelib *typelib,
|
2008-02-08 16:31:03 +01:00
|
|
|
guint32 offset,
|
|
|
|
guint32 signature_offset,
|
|
|
|
GError **error)
|
|
|
|
{
|
|
|
|
ArgBlob *blob;
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
if (typelib->len < offset + sizeof (ArgBlob))
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID,
|
2008-02-08 16:31:03 +01:00
|
|
|
"The buffer is too short");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
blob = (ArgBlob*) &typelib->data[offset];
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-21 18:15:55 +02:00
|
|
|
if (!validate_name (typelib, "argument", typelib->data, blob->name, error))
|
|
|
|
return FALSE;
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
if (!validate_type_blob (typelib,
|
2008-02-08 16:31:03 +01:00
|
|
|
offset + G_STRUCT_OFFSET (ArgBlob, arg_type),
|
|
|
|
signature_offset, FALSE, error))
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2008-08-23 23:30:09 +02:00
|
|
|
static SimpleTypeBlob *
|
|
|
|
return_type_from_signature (GTypelib *typelib,
|
|
|
|
guint32 offset,
|
|
|
|
GError **error)
|
|
|
|
{
|
|
|
|
SignatureBlob *blob;
|
|
|
|
if (typelib->len < offset + sizeof (SignatureBlob))
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID,
|
|
|
|
"The buffer is too short");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
blob = (SignatureBlob*) &typelib->data[offset];
|
|
|
|
if (blob->return_type.offset == 0)
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID,
|
|
|
|
"No return type found in signature");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
return (SimpleTypeBlob *)&typelib->data[offset + G_STRUCT_OFFSET (SignatureBlob, return_type)];
|
|
|
|
}
|
|
|
|
|
2008-02-08 16:31:03 +01:00
|
|
|
static gboolean
|
2008-08-09 14:55:32 +02:00
|
|
|
validate_signature_blob (GTypelib *typelib,
|
2008-02-08 16:31:03 +01:00
|
|
|
guint32 offset,
|
|
|
|
GError **error)
|
|
|
|
{
|
|
|
|
SignatureBlob *blob;
|
|
|
|
gint i;
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
if (typelib->len < offset + sizeof (SignatureBlob))
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID,
|
2008-02-08 16:31:03 +01:00
|
|
|
"The buffer is too short");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
blob = (SignatureBlob*) &typelib->data[offset];
|
2008-02-08 16:31:03 +01:00
|
|
|
|
|
|
|
if (blob->return_type.offset != 0)
|
|
|
|
{
|
2008-08-09 14:55:32 +02:00
|
|
|
if (!validate_type_blob (typelib,
|
2008-02-08 16:31:03 +01:00
|
|
|
offset + G_STRUCT_OFFSET (SignatureBlob, return_type),
|
|
|
|
offset, TRUE, error))
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < blob->n_arguments; i++)
|
|
|
|
{
|
2008-08-09 14:55:32 +02:00
|
|
|
if (!validate_arg_blob (typelib,
|
2008-02-08 16:31:03 +01:00
|
|
|
offset + sizeof (SignatureBlob) +
|
|
|
|
i * sizeof (ArgBlob),
|
|
|
|
offset,
|
|
|
|
error))
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* FIXME check constraints on return_value */
|
|
|
|
/* FIXME check array-length pairs */
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2008-08-24 18:51:43 +02:00
|
|
|
validate_function_blob (ValidateContext *ctx,
|
2008-02-08 16:31:03 +01:00
|
|
|
guint32 offset,
|
|
|
|
guint16 container_type,
|
|
|
|
GError **error)
|
|
|
|
{
|
2008-08-24 18:51:43 +02:00
|
|
|
GTypelib *typelib = ctx->typelib;
|
2008-02-08 16:31:03 +01:00
|
|
|
FunctionBlob *blob;
|
2008-08-23 23:30:09 +02:00
|
|
|
SignatureBlob *sigblob;
|
2008-09-19 16:55:20 +02:00
|
|
|
gboolean is_method;
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
if (typelib->len < offset + sizeof (FunctionBlob))
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID,
|
2008-02-08 16:31:03 +01:00
|
|
|
"The buffer is too short");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
blob = (FunctionBlob*) &typelib->data[offset];
|
2008-02-08 16:31:03 +01:00
|
|
|
|
|
|
|
if (blob->blob_type != BLOB_TYPE_FUNCTION)
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
2008-11-25 23:29:20 +01:00
|
|
|
"Wrong blob type %d, expected function", blob->blob_type);
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-08-21 18:15:55 +02:00
|
|
|
if (!validate_name (typelib, "function", typelib->data, blob->name, error))
|
|
|
|
return FALSE;
|
2008-08-23 23:30:09 +02:00
|
|
|
|
2008-08-24 18:51:43 +02:00
|
|
|
push_context (ctx, get_string_nofail (typelib, blob->name));
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-21 18:15:55 +02:00
|
|
|
if (!validate_name (typelib, "function symbol", typelib->data, blob->symbol, error))
|
|
|
|
return FALSE;
|
2008-09-19 16:55:20 +02:00
|
|
|
|
|
|
|
switch (container_type)
|
|
|
|
{
|
|
|
|
case BLOB_TYPE_BOXED:
|
2008-10-03 21:30:12 +02:00
|
|
|
case BLOB_TYPE_STRUCT:
|
|
|
|
case BLOB_TYPE_UNION:
|
2008-09-19 16:55:20 +02:00
|
|
|
case BLOB_TYPE_OBJECT:
|
|
|
|
case BLOB_TYPE_INTERFACE:
|
|
|
|
is_method = !(blob->constructor || blob->setter || blob->getter || blob->wraps_vfunc);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
is_method = FALSE;
|
|
|
|
}
|
2008-02-08 16:31:03 +01:00
|
|
|
|
|
|
|
if (blob->constructor)
|
|
|
|
{
|
|
|
|
switch (container_type)
|
|
|
|
{
|
|
|
|
case BLOB_TYPE_BOXED:
|
2008-10-03 21:30:12 +02:00
|
|
|
case BLOB_TYPE_STRUCT:
|
|
|
|
case BLOB_TYPE_UNION:
|
2008-02-08 16:31:03 +01:00
|
|
|
case BLOB_TYPE_OBJECT:
|
|
|
|
case BLOB_TYPE_INTERFACE:
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
2008-08-24 18:51:43 +02:00
|
|
|
"Constructor not allowed");
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (blob->setter || blob->getter || blob->wraps_vfunc)
|
|
|
|
{
|
|
|
|
switch (container_type)
|
|
|
|
{
|
|
|
|
case BLOB_TYPE_OBJECT:
|
|
|
|
case BLOB_TYPE_INTERFACE:
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Setter, getter or wrapper not allowed");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (blob->index)
|
|
|
|
{
|
|
|
|
if (!(blob->setter || blob->getter || blob->wraps_vfunc))
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Must be setter, getter or wrapper");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* FIXME: validate index range */
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
if (!validate_signature_blob (typelib, blob->signature, error))
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
2008-08-23 23:30:09 +02:00
|
|
|
|
|
|
|
sigblob = (SignatureBlob*) &typelib->data[blob->signature];
|
|
|
|
|
|
|
|
if (blob->constructor)
|
|
|
|
{
|
|
|
|
SimpleTypeBlob *simple = return_type_from_signature (typelib,
|
|
|
|
blob->signature,
|
|
|
|
error);
|
2008-08-24 18:51:43 +02:00
|
|
|
InterfaceTypeBlob *iface_type;
|
|
|
|
|
2008-08-23 23:30:09 +02:00
|
|
|
if (!simple)
|
|
|
|
return FALSE;
|
2008-08-24 18:51:43 +02:00
|
|
|
iface_type = get_type_blob (typelib, simple, error);
|
|
|
|
if (!iface_type)
|
2008-08-23 23:30:09 +02:00
|
|
|
return FALSE;
|
2008-08-24 18:51:43 +02:00
|
|
|
if (!(iface_type->tag == GI_TYPE_TAG_INTERFACE))
|
2008-08-23 23:30:09 +02:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID,
|
2008-08-24 18:51:43 +02:00
|
|
|
"Invalid return type %d for constructor",
|
|
|
|
iface_type->tag);
|
2008-08-23 23:30:09 +02:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
2008-08-24 18:51:43 +02:00
|
|
|
|
|
|
|
pop_context (ctx);
|
|
|
|
|
2008-02-08 16:31:03 +01:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2008-08-24 18:51:43 +02:00
|
|
|
validate_callback_blob (ValidateContext *ctx,
|
2008-02-08 16:31:03 +01:00
|
|
|
guint32 offset,
|
|
|
|
GError **error)
|
|
|
|
{
|
2008-08-24 18:51:43 +02:00
|
|
|
GTypelib *typelib = ctx->typelib;
|
2008-02-08 16:31:03 +01:00
|
|
|
CallbackBlob *blob;
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
if (typelib->len < offset + sizeof (CallbackBlob))
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID,
|
2008-02-08 16:31:03 +01:00
|
|
|
"The buffer is too short");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
blob = (CallbackBlob*) &typelib->data[offset];
|
2008-02-08 16:31:03 +01:00
|
|
|
|
|
|
|
if (blob->blob_type != BLOB_TYPE_CALLBACK)
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Wrong blob type");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-08-21 18:15:55 +02:00
|
|
|
if (!validate_name (typelib, "callback", typelib->data, blob->name, error))
|
|
|
|
return FALSE;
|
2008-08-24 18:51:43 +02:00
|
|
|
|
|
|
|
push_context (ctx, get_string_nofail (typelib, blob->name));
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
if (!validate_signature_blob (typelib, blob->signature, error))
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
2008-08-24 18:51:43 +02:00
|
|
|
|
|
|
|
pop_context (ctx);
|
2008-02-08 16:31:03 +01:00
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2008-08-09 14:55:32 +02:00
|
|
|
validate_constant_blob (GTypelib *typelib,
|
2008-02-08 16:31:03 +01:00
|
|
|
guint32 offset,
|
|
|
|
GError **error)
|
|
|
|
{
|
2008-10-22 16:31:58 +02:00
|
|
|
guint value_size[] = {
|
2008-10-12 01:19:59 +02:00
|
|
|
0, /* VOID */
|
|
|
|
4, /* BOOLEAN */
|
|
|
|
1, /* INT8 */
|
|
|
|
1, /* UINT8 */
|
|
|
|
2, /* INT16 */
|
|
|
|
2, /* UINT16 */
|
|
|
|
4, /* INT32 */
|
|
|
|
4, /* UINT32 */
|
|
|
|
8, /* INT64 */
|
|
|
|
8, /* UINT64 */
|
2009-06-20 01:53:03 +02:00
|
|
|
sizeof (gshort),
|
|
|
|
sizeof (gushort),
|
2008-10-12 01:19:59 +02:00
|
|
|
sizeof (gint),
|
|
|
|
sizeof (guint),
|
|
|
|
sizeof (glong),
|
|
|
|
sizeof (gulong),
|
|
|
|
sizeof (gssize),
|
|
|
|
sizeof (gsize),
|
|
|
|
sizeof (gfloat),
|
|
|
|
sizeof (gdouble),
|
|
|
|
sizeof (time_t),
|
|
|
|
0, /* GTYPE */
|
|
|
|
0, /* UTF8 */
|
|
|
|
0, /* FILENAME */
|
|
|
|
0, /* ARRAY */
|
|
|
|
0, /* INTERFACE */
|
|
|
|
0, /* GLIST */
|
|
|
|
0, /* GSLIST */
|
|
|
|
0, /* GHASH */
|
|
|
|
0, /* ERROR */
|
|
|
|
};
|
2008-02-08 16:31:03 +01:00
|
|
|
ConstantBlob *blob;
|
|
|
|
SimpleTypeBlob *type;
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
if (typelib->len < offset + sizeof (ConstantBlob))
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID,
|
2008-02-08 16:31:03 +01:00
|
|
|
"The buffer is too short");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
blob = (ConstantBlob*) &typelib->data[offset];
|
2008-02-08 16:31:03 +01:00
|
|
|
|
|
|
|
if (blob->blob_type != BLOB_TYPE_CONSTANT)
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Wrong blob type");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-08-21 18:15:55 +02:00
|
|
|
if (!validate_name (typelib, "constant", typelib->data, blob->name, error))
|
|
|
|
return FALSE;
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
if (!validate_type_blob (typelib, offset + G_STRUCT_OFFSET (ConstantBlob, type),
|
2008-02-08 16:31:03 +01:00
|
|
|
0, FALSE, error))
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
if (!is_aligned (blob->offset))
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Misaligned constant value");
|
|
|
|
return FALSE;
|
|
|
|
}
|
Revert revisions 157,149-148,136-129 and 120. Move back to using
2008-04-22 Johan Dahlin <johan@gnome.org>
* girepository/ginfo.c (g_info_from_entry), (g_type_info_new),
(g_type_info_is_pointer), (g_type_info_get_tag),
(g_type_info_get_param_type), (g_type_info_get_interface),
(g_type_info_get_array_length), (g_type_info_is_zero_terminated),
(g_type_info_get_n_error_domains), (g_type_info_get_error_domain),
(g_error_domain_info_get_codes), (g_enum_info_get_value),
(g_object_info_get_interface), (g_object_info_get_field),
(g_interface_info_get_prerequisite),
(g_signal_info_get_class_closure), (g_constant_info_get_value):
* girepository/ginvoke.c (get_ffi_type):
* girepository/girepository.h:
* girepository/gmetadata.c (g_metadata_get_dir_entry),
(g_metadata_check_sanity), (validate_header),
(validate_array_type_blob), (validate_iface_type_blob),
(validate_param_type_blob), (validate_error_type_blob),
(validate_type_blob), (validate_constant_blob),
(validate_struct_blob), (validate_enum_blob):
* girepository/gmetadata.h:
* tests/Makefile.am:
* tests/invoke/Makefile.am:
* tests/invoke/invoke.c (main):
* tests/roundtrips.sh:
* tools/Makefile.am:
* tools/compiler.c (format_output), (write_out_metadata), (main):
* tools/generate.c (write_type_name), (write_type_info),
(write_constant_value), (write_enum_info), (load_metadata), (main):
* tools/gidlcompilercontext.c:
* tools/gidlcompilercontext.h:
* tools/gidlcompilerentrynode.c:
* tools/gidlcompilerentrynode.h:
* tools/gidlcompilertypenode.c:
* tools/gidlcompilertypenode.h:
* tools/gidlmodule.c (g_idl_module_build_metadata):
* tools/gidlmodule.h:
* tools/gidlnode.c (init_stats), (dump_stats),
(g_idl_node_get_size), (g_idl_node_get_full_size),
(g_idl_node_cmp), (g_idl_node_can_have_member),
(g_idl_node_add_member), (g_idl_node_param_direction_string),
(parse_int_value), (parse_uint_value), (parse_float_value),
(parse_boolean_value), (find_entry_node), (find_entry),
(serialize_type), (g_idl_node_build_metadata), (write_string):
* tools/gidlnode.h:
* tools/gidlparser.c (parse_type_internal):
* tools/quote-file.sh:
Revert revisions 157,149-148,136-129 and 120.
Move back to using g-idl-generate to generate the metadata and
avoids dependency on a c compiler.
svn path=/trunk/; revision=214
2008-04-23 00:48:16 +02:00
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
type = (SimpleTypeBlob *)&typelib->data[offset + G_STRUCT_OFFSET (ConstantBlob, type)];
|
2009-06-24 23:52:05 +02:00
|
|
|
if (type->flags.reserved == 0 && type->flags.reserved2 == 0)
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
2009-06-24 23:52:05 +02:00
|
|
|
if (type->flags.tag == 0)
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Constant value type void");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2009-06-24 23:52:05 +02:00
|
|
|
if (value_size[type->flags.tag] != 0 &&
|
|
|
|
blob->size != value_size[type->flags.tag])
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Constant value size mismatch");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
/* FIXME check string values */
|
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2008-08-09 14:55:32 +02:00
|
|
|
validate_value_blob (GTypelib *typelib,
|
2008-02-08 16:31:03 +01:00
|
|
|
guint32 offset,
|
|
|
|
GError **error)
|
|
|
|
{
|
|
|
|
ValueBlob *blob;
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
if (typelib->len < offset + sizeof (ValueBlob))
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID,
|
2008-02-08 16:31:03 +01:00
|
|
|
"The buffer is too short");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
blob = (ValueBlob*) &typelib->data[offset];
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-21 18:15:55 +02:00
|
|
|
if (!validate_name (typelib, "value", typelib->data, blob->name, error))
|
|
|
|
return FALSE;
|
2008-02-08 16:31:03 +01:00
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2009-11-09 19:17:23 +01:00
|
|
|
validate_field_blob (ValidateContext *ctx,
|
2008-02-08 16:31:03 +01:00
|
|
|
guint32 offset,
|
|
|
|
GError **error)
|
|
|
|
{
|
2009-11-09 19:17:23 +01:00
|
|
|
GTypelib *typelib = ctx->typelib;
|
|
|
|
Header *header = (Header *)typelib->data;
|
2008-02-08 16:31:03 +01:00
|
|
|
FieldBlob *blob;
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
if (typelib->len < offset + sizeof (FieldBlob))
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID,
|
2008-02-08 16:31:03 +01:00
|
|
|
"The buffer is too short");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
blob = (FieldBlob*) &typelib->data[offset];
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-21 18:15:55 +02:00
|
|
|
if (!validate_name (typelib, "field", typelib->data, blob->name, error))
|
|
|
|
return FALSE;
|
2009-11-09 19:17:23 +01:00
|
|
|
|
|
|
|
if (blob->has_embedded_type)
|
|
|
|
{
|
|
|
|
if (!validate_callback_blob (ctx, offset + header->field_blob_size, error))
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
else if (!validate_type_blob (typelib,
|
|
|
|
offset + G_STRUCT_OFFSET (FieldBlob, type),
|
|
|
|
0, FALSE, error))
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2008-08-09 14:55:32 +02:00
|
|
|
validate_property_blob (GTypelib *typelib,
|
2008-02-08 16:31:03 +01:00
|
|
|
guint32 offset,
|
|
|
|
GError **error)
|
|
|
|
{
|
|
|
|
PropertyBlob *blob;
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
if (typelib->len < offset + sizeof (PropertyBlob))
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID,
|
2008-02-08 16:31:03 +01:00
|
|
|
"The buffer is too short");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
blob = (PropertyBlob*) &typelib->data[offset];
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-21 18:15:55 +02:00
|
|
|
if (!validate_name (typelib, "property", typelib->data, blob->name, error))
|
|
|
|
return FALSE;
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
if (!validate_type_blob (typelib,
|
2008-02-08 16:31:03 +01:00
|
|
|
offset + G_STRUCT_OFFSET (PropertyBlob, type),
|
|
|
|
0, FALSE, error))
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2008-08-09 14:55:32 +02:00
|
|
|
validate_signal_blob (GTypelib *typelib,
|
2008-02-08 16:31:03 +01:00
|
|
|
guint32 offset,
|
|
|
|
guint32 container_offset,
|
|
|
|
GError **error)
|
|
|
|
{
|
|
|
|
SignalBlob *blob;
|
|
|
|
gint n_signals;
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
if (typelib->len < offset + sizeof (SignalBlob))
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID,
|
2008-02-08 16:31:03 +01:00
|
|
|
"The buffer is too short");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
blob = (SignalBlob*) &typelib->data[offset];
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-21 18:15:55 +02:00
|
|
|
if (!validate_name (typelib, "signal", typelib->data, blob->name, error))
|
|
|
|
return FALSE;
|
2008-02-08 16:31:03 +01:00
|
|
|
|
|
|
|
if ((blob->run_first != 0) +
|
|
|
|
(blob->run_last != 0) +
|
|
|
|
(blob->run_cleanup != 0) != 1)
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Invalid signal run flags");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (blob->has_class_closure)
|
|
|
|
{
|
2008-08-09 14:55:32 +02:00
|
|
|
if (((CommonBlob*)&typelib->data[container_offset])->blob_type == BLOB_TYPE_OBJECT)
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
ObjectBlob *object;
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
object = (ObjectBlob*)&typelib->data[container_offset];
|
2008-02-08 16:31:03 +01:00
|
|
|
|
|
|
|
n_signals = object->n_signals;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
InterfaceBlob *iface;
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
iface = (InterfaceBlob*)&typelib->data[container_offset];
|
2008-02-08 16:31:03 +01:00
|
|
|
|
|
|
|
n_signals = iface->n_signals;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (blob->class_closure >= n_signals)
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Invalid class closure index");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
if (!validate_signature_blob (typelib, blob->signature, error))
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2008-08-09 14:55:32 +02:00
|
|
|
validate_vfunc_blob (GTypelib *typelib,
|
2008-02-08 16:31:03 +01:00
|
|
|
guint32 offset,
|
|
|
|
guint32 container_offset,
|
|
|
|
GError **error)
|
|
|
|
{
|
|
|
|
VFuncBlob *blob;
|
|
|
|
gint n_vfuncs;
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
if (typelib->len < offset + sizeof (VFuncBlob))
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID,
|
2008-02-08 16:31:03 +01:00
|
|
|
"The buffer is too short");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
blob = (VFuncBlob*) &typelib->data[offset];
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-21 18:15:55 +02:00
|
|
|
if (!validate_name (typelib, "vfunc", typelib->data, blob->name, error))
|
|
|
|
return FALSE;
|
2008-02-08 16:31:03 +01:00
|
|
|
|
|
|
|
if (blob->class_closure)
|
|
|
|
{
|
2008-08-09 14:55:32 +02:00
|
|
|
if (((CommonBlob*)&typelib->data[container_offset])->blob_type == BLOB_TYPE_OBJECT)
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
ObjectBlob *object;
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
object = (ObjectBlob*)&typelib->data[container_offset];
|
2008-02-08 16:31:03 +01:00
|
|
|
|
|
|
|
n_vfuncs = object->n_vfuncs;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
InterfaceBlob *iface;
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
iface = (InterfaceBlob*)&typelib->data[container_offset];
|
2008-02-08 16:31:03 +01:00
|
|
|
|
|
|
|
n_vfuncs = iface->n_vfuncs;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (blob->class_closure >= n_vfuncs)
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Invalid class closure index");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
if (!validate_signature_blob (typelib, blob->signature, error))
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2008-08-24 18:51:43 +02:00
|
|
|
validate_struct_blob (ValidateContext *ctx,
|
2008-02-08 16:31:03 +01:00
|
|
|
guint32 offset,
|
|
|
|
guint16 blob_type,
|
|
|
|
GError **error)
|
|
|
|
{
|
2008-08-24 18:51:43 +02:00
|
|
|
GTypelib *typelib = ctx->typelib;
|
2008-02-08 16:31:03 +01:00
|
|
|
StructBlob *blob;
|
|
|
|
gint i;
|
2009-11-09 19:17:23 +01:00
|
|
|
guint32 field_offset;
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
if (typelib->len < offset + sizeof (StructBlob))
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID,
|
2008-02-08 16:31:03 +01:00
|
|
|
"The buffer is too short");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
blob = (StructBlob*) &typelib->data[offset];
|
2008-02-08 16:31:03 +01:00
|
|
|
|
|
|
|
if (blob->blob_type != blob_type)
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Wrong blob type");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-08-21 18:15:55 +02:00
|
|
|
if (!validate_name (typelib, "struct", typelib->data, blob->name, error))
|
|
|
|
return FALSE;
|
2008-08-24 18:51:43 +02:00
|
|
|
|
|
|
|
push_context (ctx, get_string_nofail (typelib, blob->name));
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-09-06 22:33:51 +02:00
|
|
|
if (!blob->unregistered)
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
2008-08-21 18:15:55 +02:00
|
|
|
if (!validate_name (typelib, "boxed", typelib->data, blob->gtype_name, error))
|
|
|
|
return FALSE;
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-21 18:15:55 +02:00
|
|
|
if (!validate_name (typelib, "boxed", typelib->data, blob->gtype_init, error))
|
|
|
|
return FALSE;
|
2008-02-08 16:31:03 +01:00
|
|
|
}
|
Revert revisions 157,149-148,136-129 and 120. Move back to using
2008-04-22 Johan Dahlin <johan@gnome.org>
* girepository/ginfo.c (g_info_from_entry), (g_type_info_new),
(g_type_info_is_pointer), (g_type_info_get_tag),
(g_type_info_get_param_type), (g_type_info_get_interface),
(g_type_info_get_array_length), (g_type_info_is_zero_terminated),
(g_type_info_get_n_error_domains), (g_type_info_get_error_domain),
(g_error_domain_info_get_codes), (g_enum_info_get_value),
(g_object_info_get_interface), (g_object_info_get_field),
(g_interface_info_get_prerequisite),
(g_signal_info_get_class_closure), (g_constant_info_get_value):
* girepository/ginvoke.c (get_ffi_type):
* girepository/girepository.h:
* girepository/gmetadata.c (g_metadata_get_dir_entry),
(g_metadata_check_sanity), (validate_header),
(validate_array_type_blob), (validate_iface_type_blob),
(validate_param_type_blob), (validate_error_type_blob),
(validate_type_blob), (validate_constant_blob),
(validate_struct_blob), (validate_enum_blob):
* girepository/gmetadata.h:
* tests/Makefile.am:
* tests/invoke/Makefile.am:
* tests/invoke/invoke.c (main):
* tests/roundtrips.sh:
* tools/Makefile.am:
* tools/compiler.c (format_output), (write_out_metadata), (main):
* tools/generate.c (write_type_name), (write_type_info),
(write_constant_value), (write_enum_info), (load_metadata), (main):
* tools/gidlcompilercontext.c:
* tools/gidlcompilercontext.h:
* tools/gidlcompilerentrynode.c:
* tools/gidlcompilerentrynode.h:
* tools/gidlcompilertypenode.c:
* tools/gidlcompilertypenode.h:
* tools/gidlmodule.c (g_idl_module_build_metadata):
* tools/gidlmodule.h:
* tools/gidlnode.c (init_stats), (dump_stats),
(g_idl_node_get_size), (g_idl_node_get_full_size),
(g_idl_node_cmp), (g_idl_node_can_have_member),
(g_idl_node_add_member), (g_idl_node_param_direction_string),
(parse_int_value), (parse_uint_value), (parse_float_value),
(parse_boolean_value), (find_entry_node), (find_entry),
(serialize_type), (g_idl_node_build_metadata), (write_string):
* tools/gidlnode.h:
* tools/gidlparser.c (parse_type_internal):
* tools/quote-file.sh:
Revert revisions 157,149-148,136-129 and 120.
Move back to using g-idl-generate to generate the metadata and
avoids dependency on a c compiler.
svn path=/trunk/; revision=214
2008-04-23 00:48:16 +02:00
|
|
|
else
|
|
|
|
{
|
|
|
|
if (blob->gtype_name || blob->gtype_init)
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
Revert revisions 157,149-148,136-129 and 120. Move back to using
2008-04-22 Johan Dahlin <johan@gnome.org>
* girepository/ginfo.c (g_info_from_entry), (g_type_info_new),
(g_type_info_is_pointer), (g_type_info_get_tag),
(g_type_info_get_param_type), (g_type_info_get_interface),
(g_type_info_get_array_length), (g_type_info_is_zero_terminated),
(g_type_info_get_n_error_domains), (g_type_info_get_error_domain),
(g_error_domain_info_get_codes), (g_enum_info_get_value),
(g_object_info_get_interface), (g_object_info_get_field),
(g_interface_info_get_prerequisite),
(g_signal_info_get_class_closure), (g_constant_info_get_value):
* girepository/ginvoke.c (get_ffi_type):
* girepository/girepository.h:
* girepository/gmetadata.c (g_metadata_get_dir_entry),
(g_metadata_check_sanity), (validate_header),
(validate_array_type_blob), (validate_iface_type_blob),
(validate_param_type_blob), (validate_error_type_blob),
(validate_type_blob), (validate_constant_blob),
(validate_struct_blob), (validate_enum_blob):
* girepository/gmetadata.h:
* tests/Makefile.am:
* tests/invoke/Makefile.am:
* tests/invoke/invoke.c (main):
* tests/roundtrips.sh:
* tools/Makefile.am:
* tools/compiler.c (format_output), (write_out_metadata), (main):
* tools/generate.c (write_type_name), (write_type_info),
(write_constant_value), (write_enum_info), (load_metadata), (main):
* tools/gidlcompilercontext.c:
* tools/gidlcompilercontext.h:
* tools/gidlcompilerentrynode.c:
* tools/gidlcompilerentrynode.h:
* tools/gidlcompilertypenode.c:
* tools/gidlcompilertypenode.h:
* tools/gidlmodule.c (g_idl_module_build_metadata):
* tools/gidlmodule.h:
* tools/gidlnode.c (init_stats), (dump_stats),
(g_idl_node_get_size), (g_idl_node_get_full_size),
(g_idl_node_cmp), (g_idl_node_can_have_member),
(g_idl_node_add_member), (g_idl_node_param_direction_string),
(parse_int_value), (parse_uint_value), (parse_float_value),
(parse_boolean_value), (find_entry_node), (find_entry),
(serialize_type), (g_idl_node_build_metadata), (write_string):
* tools/gidlnode.h:
* tools/gidlparser.c (parse_type_internal):
* tools/quote-file.sh:
Revert revisions 157,149-148,136-129 and 120.
Move back to using g-idl-generate to generate the metadata and
avoids dependency on a c compiler.
svn path=/trunk/; revision=214
2008-04-23 00:48:16 +02:00
|
|
|
"Gtype data in struct");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
if (typelib->len < offset + sizeof (StructBlob) +
|
2008-02-08 16:31:03 +01:00
|
|
|
blob->n_fields * sizeof (FieldBlob) +
|
|
|
|
blob->n_methods * sizeof (FunctionBlob))
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID,
|
2008-02-08 16:31:03 +01:00
|
|
|
"The buffer is too short");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2009-11-09 19:17:23 +01:00
|
|
|
field_offset = offset + sizeof (StructBlob);
|
2008-02-08 16:31:03 +01:00
|
|
|
for (i = 0; i < blob->n_fields; i++)
|
|
|
|
{
|
2009-11-09 19:17:23 +01:00
|
|
|
FieldBlob *blob = (FieldBlob*) &typelib->data[field_offset];
|
|
|
|
|
|
|
|
if (!validate_field_blob (ctx,
|
|
|
|
field_offset,
|
2008-02-08 16:31:03 +01:00
|
|
|
error))
|
|
|
|
return FALSE;
|
2009-11-09 19:17:23 +01:00
|
|
|
|
|
|
|
field_offset += sizeof (FieldBlob);
|
|
|
|
if (blob->has_embedded_type)
|
|
|
|
field_offset += sizeof (CallbackBlob);
|
2008-02-08 16:31:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < blob->n_methods; i++)
|
|
|
|
{
|
2008-08-24 18:51:43 +02:00
|
|
|
if (!validate_function_blob (ctx,
|
2009-11-09 19:17:23 +01:00
|
|
|
field_offset +
|
2008-02-08 16:31:03 +01:00
|
|
|
i * sizeof (FunctionBlob),
|
|
|
|
blob_type,
|
|
|
|
error))
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-08-24 18:51:43 +02:00
|
|
|
pop_context (ctx);
|
|
|
|
|
2008-02-08 16:31:03 +01:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2008-08-29 20:49:22 +02:00
|
|
|
validate_enum_blob (ValidateContext *ctx,
|
2008-02-08 16:31:03 +01:00
|
|
|
guint32 offset,
|
|
|
|
guint16 blob_type,
|
|
|
|
GError **error)
|
|
|
|
{
|
2008-08-29 20:49:22 +02:00
|
|
|
GTypelib *typelib = ctx->typelib;
|
2008-02-08 16:31:03 +01:00
|
|
|
EnumBlob *blob;
|
Bug 556543 – reduce compiler warnings
2008-10-16 Tommi Komulainen <tommi.komulainen@iki.fi>
Bug 556543 – reduce compiler warnings
* girepository/ginfo.c:
* girepository/girepository.c (register_internal,
count_interfaces, find_interface, find_namespace_version,
parse_version, g_irepository_require):
* girepository/girmodule.c (g_ir_module_build_typelib):
* girepository/girnode.c (init_stats, dump_stats,
_g_irnode_init_stats, _g_irnode_dump_stats,
g_ir_node_can_have_member):
* girepository/girparser.c (firstpass_end_element_handler,
locate_gir, parse_basic, parse_type_internal, resolve_aliases,
start_alias, start_type, end_type_top, parse_include, cleanup,
post_filter):
* girepository/gtypelib.c (validate_function_blob, validate_enum_blob):
* giscanner/giscannermodule.c (directive_get_options,
type_get_child_list):
* giscanner/scannerlexer.l (parse_gtkdoc):
* giscanner/scannerparser.y (ctype_free):
* giscanner/sourcescanner.c:
* giscanner/sourcescanner.h (gi_source_scanner_parse_macros):
* tests/types/gitesttypes.c:
* tools/compiler.c (main):
* tools/generate.c (write_repository): Remove unused variables
and code, add missing includes, declarations and case
statements.
svn path=/trunk/; revision=730
2008-10-16 19:07:05 +02:00
|
|
|
gint i;
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
if (typelib->len < offset + sizeof (EnumBlob))
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID,
|
2008-02-08 16:31:03 +01:00
|
|
|
"The buffer is too short");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
blob = (EnumBlob*) &typelib->data[offset];
|
2008-02-08 16:31:03 +01:00
|
|
|
|
|
|
|
if (blob->blob_type != blob_type)
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Wrong blob type");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!blob->unregistered)
|
|
|
|
{
|
2008-08-21 18:15:55 +02:00
|
|
|
if (!validate_name (typelib, "enum", typelib->data, blob->gtype_name, error))
|
|
|
|
return FALSE;
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-21 18:15:55 +02:00
|
|
|
if (!validate_name (typelib, "enum", typelib->data, blob->gtype_init, error))
|
|
|
|
return FALSE;
|
2008-02-08 16:31:03 +01:00
|
|
|
}
|
Revert revisions 157,149-148,136-129 and 120. Move back to using
2008-04-22 Johan Dahlin <johan@gnome.org>
* girepository/ginfo.c (g_info_from_entry), (g_type_info_new),
(g_type_info_is_pointer), (g_type_info_get_tag),
(g_type_info_get_param_type), (g_type_info_get_interface),
(g_type_info_get_array_length), (g_type_info_is_zero_terminated),
(g_type_info_get_n_error_domains), (g_type_info_get_error_domain),
(g_error_domain_info_get_codes), (g_enum_info_get_value),
(g_object_info_get_interface), (g_object_info_get_field),
(g_interface_info_get_prerequisite),
(g_signal_info_get_class_closure), (g_constant_info_get_value):
* girepository/ginvoke.c (get_ffi_type):
* girepository/girepository.h:
* girepository/gmetadata.c (g_metadata_get_dir_entry),
(g_metadata_check_sanity), (validate_header),
(validate_array_type_blob), (validate_iface_type_blob),
(validate_param_type_blob), (validate_error_type_blob),
(validate_type_blob), (validate_constant_blob),
(validate_struct_blob), (validate_enum_blob):
* girepository/gmetadata.h:
* tests/Makefile.am:
* tests/invoke/Makefile.am:
* tests/invoke/invoke.c (main):
* tests/roundtrips.sh:
* tools/Makefile.am:
* tools/compiler.c (format_output), (write_out_metadata), (main):
* tools/generate.c (write_type_name), (write_type_info),
(write_constant_value), (write_enum_info), (load_metadata), (main):
* tools/gidlcompilercontext.c:
* tools/gidlcompilercontext.h:
* tools/gidlcompilerentrynode.c:
* tools/gidlcompilerentrynode.h:
* tools/gidlcompilertypenode.c:
* tools/gidlcompilertypenode.h:
* tools/gidlmodule.c (g_idl_module_build_metadata):
* tools/gidlmodule.h:
* tools/gidlnode.c (init_stats), (dump_stats),
(g_idl_node_get_size), (g_idl_node_get_full_size),
(g_idl_node_cmp), (g_idl_node_can_have_member),
(g_idl_node_add_member), (g_idl_node_param_direction_string),
(parse_int_value), (parse_uint_value), (parse_float_value),
(parse_boolean_value), (find_entry_node), (find_entry),
(serialize_type), (g_idl_node_build_metadata), (write_string):
* tools/gidlnode.h:
* tools/gidlparser.c (parse_type_internal):
* tools/quote-file.sh:
Revert revisions 157,149-148,136-129 and 120.
Move back to using g-idl-generate to generate the metadata and
avoids dependency on a c compiler.
svn path=/trunk/; revision=214
2008-04-23 00:48:16 +02:00
|
|
|
else
|
|
|
|
{
|
|
|
|
if (blob->gtype_name || blob->gtype_init)
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
Revert revisions 157,149-148,136-129 and 120. Move back to using
2008-04-22 Johan Dahlin <johan@gnome.org>
* girepository/ginfo.c (g_info_from_entry), (g_type_info_new),
(g_type_info_is_pointer), (g_type_info_get_tag),
(g_type_info_get_param_type), (g_type_info_get_interface),
(g_type_info_get_array_length), (g_type_info_is_zero_terminated),
(g_type_info_get_n_error_domains), (g_type_info_get_error_domain),
(g_error_domain_info_get_codes), (g_enum_info_get_value),
(g_object_info_get_interface), (g_object_info_get_field),
(g_interface_info_get_prerequisite),
(g_signal_info_get_class_closure), (g_constant_info_get_value):
* girepository/ginvoke.c (get_ffi_type):
* girepository/girepository.h:
* girepository/gmetadata.c (g_metadata_get_dir_entry),
(g_metadata_check_sanity), (validate_header),
(validate_array_type_blob), (validate_iface_type_blob),
(validate_param_type_blob), (validate_error_type_blob),
(validate_type_blob), (validate_constant_blob),
(validate_struct_blob), (validate_enum_blob):
* girepository/gmetadata.h:
* tests/Makefile.am:
* tests/invoke/Makefile.am:
* tests/invoke/invoke.c (main):
* tests/roundtrips.sh:
* tools/Makefile.am:
* tools/compiler.c (format_output), (write_out_metadata), (main):
* tools/generate.c (write_type_name), (write_type_info),
(write_constant_value), (write_enum_info), (load_metadata), (main):
* tools/gidlcompilercontext.c:
* tools/gidlcompilercontext.h:
* tools/gidlcompilerentrynode.c:
* tools/gidlcompilerentrynode.h:
* tools/gidlcompilertypenode.c:
* tools/gidlcompilertypenode.h:
* tools/gidlmodule.c (g_idl_module_build_metadata):
* tools/gidlmodule.h:
* tools/gidlnode.c (init_stats), (dump_stats),
(g_idl_node_get_size), (g_idl_node_get_full_size),
(g_idl_node_cmp), (g_idl_node_can_have_member),
(g_idl_node_add_member), (g_idl_node_param_direction_string),
(parse_int_value), (parse_uint_value), (parse_float_value),
(parse_boolean_value), (find_entry_node), (find_entry),
(serialize_type), (g_idl_node_build_metadata), (write_string):
* tools/gidlnode.h:
* tools/gidlparser.c (parse_type_internal):
* tools/quote-file.sh:
Revert revisions 157,149-148,136-129 and 120.
Move back to using g-idl-generate to generate the metadata and
avoids dependency on a c compiler.
svn path=/trunk/; revision=214
2008-04-23 00:48:16 +02:00
|
|
|
"Gtype data in unregistered enum");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-21 18:15:55 +02:00
|
|
|
if (!validate_name (typelib, "enum", typelib->data, blob->name, error))
|
|
|
|
return FALSE;
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
if (typelib->len < offset + sizeof (EnumBlob) +
|
2008-02-08 16:31:03 +01:00
|
|
|
blob->n_values * sizeof (ValueBlob))
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID,
|
2008-02-08 16:31:03 +01:00
|
|
|
"The buffer is too short");
|
|
|
|
return FALSE;
|
|
|
|
}
|
2008-08-29 20:49:22 +02:00
|
|
|
|
|
|
|
push_context (ctx, get_string_nofail (typelib, blob->name));
|
2008-02-08 16:31:03 +01:00
|
|
|
|
|
|
|
for (i = 0; i < blob->n_values; i++)
|
|
|
|
{
|
2008-08-09 14:55:32 +02:00
|
|
|
if (!validate_value_blob (typelib,
|
2008-02-08 16:31:03 +01:00
|
|
|
offset + sizeof (EnumBlob) +
|
|
|
|
i * sizeof (ValueBlob),
|
|
|
|
error))
|
|
|
|
return FALSE;
|
|
|
|
|
2008-08-17 00:26:55 +02:00
|
|
|
#if 0
|
2008-08-09 14:55:32 +02:00
|
|
|
v1 = (ValueBlob *)&typelib->data[offset + sizeof (EnumBlob) +
|
2008-02-08 16:31:03 +01:00
|
|
|
i * sizeof (ValueBlob)];
|
|
|
|
for (j = 0; j < i; j++)
|
|
|
|
{
|
2008-08-09 14:55:32 +02:00
|
|
|
v2 = (ValueBlob *)&typelib->data[offset + sizeof (EnumBlob) +
|
2008-02-08 16:31:03 +01:00
|
|
|
j * sizeof (ValueBlob)];
|
|
|
|
|
|
|
|
if (v1->value == v2->value)
|
|
|
|
{
|
2008-08-17 00:26:55 +02:00
|
|
|
|
2008-02-08 16:31:03 +01:00
|
|
|
/* FIXME should this be an error ? */
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Duplicate enum value");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
2008-08-17 00:26:55 +02:00
|
|
|
#endif
|
2008-02-08 16:31:03 +01:00
|
|
|
}
|
2008-08-29 20:49:22 +02:00
|
|
|
|
|
|
|
pop_context (ctx);
|
2008-02-08 16:31:03 +01:00
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2008-08-24 18:51:43 +02:00
|
|
|
validate_object_blob (ValidateContext *ctx,
|
2008-02-08 16:31:03 +01:00
|
|
|
guint32 offset,
|
|
|
|
GError **error)
|
|
|
|
{
|
2008-08-24 18:51:43 +02:00
|
|
|
GTypelib *typelib = ctx->typelib;
|
2008-02-08 16:31:03 +01:00
|
|
|
Header *header;
|
|
|
|
ObjectBlob *blob;
|
|
|
|
gint i;
|
|
|
|
guint32 offset2;
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
header = (Header *)typelib->data;
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
if (typelib->len < offset + sizeof (ObjectBlob))
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID,
|
2008-02-08 16:31:03 +01:00
|
|
|
"The buffer is too short");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
blob = (ObjectBlob*) &typelib->data[offset];
|
2008-02-08 16:31:03 +01:00
|
|
|
|
|
|
|
if (blob->blob_type != BLOB_TYPE_OBJECT)
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Wrong blob type");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-08-21 18:15:55 +02:00
|
|
|
if (!validate_name (typelib, "object", typelib->data, blob->gtype_name, error))
|
|
|
|
return FALSE;
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-21 18:15:55 +02:00
|
|
|
if (!validate_name (typelib, "object", typelib->data, blob->gtype_init, error))
|
|
|
|
return FALSE;
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-21 18:15:55 +02:00
|
|
|
if (!validate_name (typelib, "object", typelib->data, blob->name, error))
|
|
|
|
return FALSE;
|
2008-08-29 20:49:22 +02:00
|
|
|
|
2008-02-08 16:31:03 +01:00
|
|
|
if (blob->parent > header->n_entries)
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Invalid parent index");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (blob->parent != 0)
|
|
|
|
{
|
|
|
|
DirEntry *entry;
|
|
|
|
|
2009-02-06 19:37:13 +01:00
|
|
|
entry = get_dir_entry_checked (typelib, blob->parent, error);
|
|
|
|
if (!entry)
|
|
|
|
return FALSE;
|
2008-02-08 16:31:03 +01:00
|
|
|
if (entry->blob_type != BLOB_TYPE_OBJECT &&
|
|
|
|
(entry->local || entry->blob_type != 0))
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Parent not object");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-02-20 23:34:20 +01:00
|
|
|
if (blob->gtype_struct != 0)
|
2009-02-06 19:37:13 +01:00
|
|
|
{
|
|
|
|
DirEntry *entry;
|
|
|
|
|
2009-02-20 23:34:20 +01:00
|
|
|
entry = get_dir_entry_checked (typelib, blob->gtype_struct, error);
|
2009-02-06 19:37:13 +01:00
|
|
|
if (!entry)
|
|
|
|
return FALSE;
|
|
|
|
if (entry->blob_type != BLOB_TYPE_STRUCT && entry->local)
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
|
|
|
"Class struct invalid type or not local");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
if (typelib->len < offset + sizeof (ObjectBlob) +
|
2008-02-08 16:31:03 +01:00
|
|
|
(blob->n_interfaces + blob->n_interfaces % 2) * 2 +
|
|
|
|
blob->n_fields * sizeof (FieldBlob) +
|
|
|
|
blob->n_properties * sizeof (PropertyBlob) +
|
|
|
|
blob->n_methods * sizeof (FunctionBlob) +
|
|
|
|
blob->n_signals * sizeof (SignalBlob) +
|
|
|
|
blob->n_vfuncs * sizeof (VFuncBlob) +
|
|
|
|
blob->n_constants * sizeof (ConstantBlob))
|
|
|
|
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID,
|
2008-02-08 16:31:03 +01:00
|
|
|
"The buffer is too short");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
offset2 = offset + sizeof (ObjectBlob);
|
|
|
|
|
|
|
|
for (i = 0; i < blob->n_interfaces; i++, offset2 += 2)
|
|
|
|
{
|
|
|
|
guint16 iface;
|
|
|
|
DirEntry *entry;
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
iface = *(guint16*)&typelib->data[offset2];
|
2008-02-08 16:31:03 +01:00
|
|
|
if (iface == 0 || iface > header->n_entries)
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Invalid interface index");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2009-02-06 19:37:13 +01:00
|
|
|
entry = get_dir_entry_checked (typelib, iface, error);
|
|
|
|
if (!entry)
|
|
|
|
return FALSE;
|
2008-02-08 16:31:03 +01:00
|
|
|
|
|
|
|
if (entry->blob_type != BLOB_TYPE_INTERFACE &&
|
|
|
|
(entry->local || entry->blob_type != 0))
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Not an interface");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
offset2 += 2 * (blob->n_interfaces %2);
|
|
|
|
|
2008-08-29 20:49:22 +02:00
|
|
|
push_context (ctx, get_string_nofail (typelib, blob->name));
|
|
|
|
|
2008-02-08 16:31:03 +01:00
|
|
|
for (i = 0; i < blob->n_fields; i++, offset2 += sizeof (FieldBlob))
|
|
|
|
{
|
2009-11-09 19:17:23 +01:00
|
|
|
if (!validate_field_blob (ctx, offset2, error))
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < blob->n_properties; i++, offset2 += sizeof (PropertyBlob))
|
|
|
|
{
|
2008-08-09 14:55:32 +02:00
|
|
|
if (!validate_property_blob (typelib, offset2, error))
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < blob->n_methods; i++, offset2 += sizeof (FunctionBlob))
|
|
|
|
{
|
2008-08-24 18:51:43 +02:00
|
|
|
if (!validate_function_blob (ctx, offset2, BLOB_TYPE_OBJECT, error))
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < blob->n_signals; i++, offset2 += sizeof (SignalBlob))
|
|
|
|
{
|
2008-08-09 14:55:32 +02:00
|
|
|
if (!validate_signal_blob (typelib, offset2, offset, error))
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < blob->n_vfuncs; i++, offset2 += sizeof (VFuncBlob))
|
|
|
|
{
|
2008-08-09 14:55:32 +02:00
|
|
|
if (!validate_vfunc_blob (typelib, offset2, offset, error))
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < blob->n_constants; i++, offset2 += sizeof (ConstantBlob))
|
|
|
|
{
|
2008-08-09 14:55:32 +02:00
|
|
|
if (!validate_constant_blob (typelib, offset2, error))
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-08-29 20:49:22 +02:00
|
|
|
pop_context (ctx);
|
|
|
|
|
2008-02-08 16:31:03 +01:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2008-08-24 18:51:43 +02:00
|
|
|
validate_interface_blob (ValidateContext *ctx,
|
2008-02-08 16:31:03 +01:00
|
|
|
guint32 offset,
|
|
|
|
GError **error)
|
|
|
|
{
|
2008-08-24 18:51:43 +02:00
|
|
|
GTypelib *typelib = ctx->typelib;
|
2008-02-08 16:31:03 +01:00
|
|
|
Header *header;
|
|
|
|
InterfaceBlob *blob;
|
|
|
|
gint i;
|
|
|
|
guint32 offset2;
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
header = (Header *)typelib->data;
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
if (typelib->len < offset + sizeof (InterfaceBlob))
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID,
|
2008-02-08 16:31:03 +01:00
|
|
|
"The buffer is too short");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
blob = (InterfaceBlob*) &typelib->data[offset];
|
2008-02-08 16:31:03 +01:00
|
|
|
|
|
|
|
if (blob->blob_type != BLOB_TYPE_INTERFACE)
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
2008-08-23 23:30:09 +02:00
|
|
|
"Wrong blob type; expected interface, got %d", blob->blob_type);
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-08-21 18:15:55 +02:00
|
|
|
if (!validate_name (typelib, "interface", typelib->data, blob->gtype_name, error))
|
|
|
|
return FALSE;
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-21 18:15:55 +02:00
|
|
|
if (!validate_name (typelib, "interface", typelib->data, blob->gtype_init, error))
|
|
|
|
return FALSE;
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-21 18:15:55 +02:00
|
|
|
if (!validate_name (typelib, "interface", typelib->data, blob->name, error))
|
|
|
|
return FALSE;
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
if (typelib->len < offset + sizeof (InterfaceBlob) +
|
2008-02-08 16:31:03 +01:00
|
|
|
(blob->n_prerequisites + blob->n_prerequisites % 2) * 2 +
|
|
|
|
blob->n_properties * sizeof (PropertyBlob) +
|
|
|
|
blob->n_methods * sizeof (FunctionBlob) +
|
|
|
|
blob->n_signals * sizeof (SignalBlob) +
|
|
|
|
blob->n_vfuncs * sizeof (VFuncBlob) +
|
|
|
|
blob->n_constants * sizeof (ConstantBlob))
|
|
|
|
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID,
|
2008-02-08 16:31:03 +01:00
|
|
|
"The buffer is too short");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
offset2 = offset + sizeof (InterfaceBlob);
|
|
|
|
|
|
|
|
for (i = 0; i < blob->n_prerequisites; i++, offset2 += 2)
|
|
|
|
{
|
|
|
|
DirEntry *entry;
|
|
|
|
guint16 req;
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
req = *(guint16*)&typelib->data[offset2];
|
2008-02-08 16:31:03 +01:00
|
|
|
if (req == 0 || req > header->n_entries)
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Invalid prerequisite index");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
entry = g_typelib_get_dir_entry (typelib, req);
|
2008-02-08 16:31:03 +01:00
|
|
|
if (entry->blob_type != BLOB_TYPE_INTERFACE &&
|
|
|
|
entry->blob_type != BLOB_TYPE_OBJECT &&
|
|
|
|
(entry->local || entry->blob_type != 0))
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_BLOB,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Not an interface or object");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
offset2 += 2 * (blob->n_prerequisites % 2);
|
|
|
|
|
2008-08-29 20:49:22 +02:00
|
|
|
push_context (ctx, get_string_nofail (typelib, blob->name));
|
|
|
|
|
2008-02-08 16:31:03 +01:00
|
|
|
for (i = 0; i < blob->n_properties; i++, offset2 += sizeof (PropertyBlob))
|
|
|
|
{
|
2008-08-09 14:55:32 +02:00
|
|
|
if (!validate_property_blob (typelib, offset2, error))
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < blob->n_methods; i++, offset2 += sizeof (FunctionBlob))
|
|
|
|
{
|
2008-08-24 18:51:43 +02:00
|
|
|
if (!validate_function_blob (ctx, offset2, BLOB_TYPE_INTERFACE, error))
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < blob->n_signals; i++, offset2 += sizeof (SignalBlob))
|
|
|
|
{
|
2008-08-09 14:55:32 +02:00
|
|
|
if (!validate_signal_blob (typelib, offset2, offset, error))
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < blob->n_vfuncs; i++, offset2 += sizeof (VFuncBlob))
|
|
|
|
{
|
2008-08-09 14:55:32 +02:00
|
|
|
if (!validate_vfunc_blob (typelib, offset2, offset, error))
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < blob->n_constants; i++, offset2 += sizeof (ConstantBlob))
|
|
|
|
{
|
2008-08-09 14:55:32 +02:00
|
|
|
if (!validate_constant_blob (typelib, offset2, error))
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-08-29 20:49:22 +02:00
|
|
|
pop_context (ctx);
|
|
|
|
|
2008-02-08 16:31:03 +01:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2008-08-09 14:55:32 +02:00
|
|
|
validate_errordomain_blob (GTypelib *typelib,
|
2008-02-08 16:31:03 +01:00
|
|
|
guint32 offset,
|
|
|
|
GError **error)
|
|
|
|
{
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2008-08-09 14:55:32 +02:00
|
|
|
validate_union_blob (GTypelib *typelib,
|
2008-02-08 16:31:03 +01:00
|
|
|
guint32 offset,
|
|
|
|
GError **error)
|
|
|
|
{
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2008-08-24 18:51:43 +02:00
|
|
|
validate_blob (ValidateContext *ctx,
|
|
|
|
guint32 offset,
|
|
|
|
GError **error)
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
2008-08-24 18:51:43 +02:00
|
|
|
GTypelib *typelib = ctx->typelib;
|
2008-02-08 16:31:03 +01:00
|
|
|
CommonBlob *common;
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
if (typelib->len < offset + sizeof (CommonBlob))
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID,
|
2008-02-08 16:31:03 +01:00
|
|
|
"The buffer is too short");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
common = (CommonBlob*)&typelib->data[offset];
|
2008-02-08 16:31:03 +01:00
|
|
|
|
|
|
|
switch (common->blob_type)
|
|
|
|
{
|
|
|
|
case BLOB_TYPE_FUNCTION:
|
2008-08-24 18:51:43 +02:00
|
|
|
if (!validate_function_blob (ctx, offset, 0, error))
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
break;
|
|
|
|
case BLOB_TYPE_CALLBACK:
|
2008-08-24 18:51:43 +02:00
|
|
|
if (!validate_callback_blob (ctx, offset, error))
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
break;
|
|
|
|
case BLOB_TYPE_STRUCT:
|
|
|
|
case BLOB_TYPE_BOXED:
|
2008-08-24 18:51:43 +02:00
|
|
|
if (!validate_struct_blob (ctx, offset, common->blob_type, error))
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
break;
|
|
|
|
case BLOB_TYPE_ENUM:
|
|
|
|
case BLOB_TYPE_FLAGS:
|
2008-08-29 20:49:22 +02:00
|
|
|
if (!validate_enum_blob (ctx, offset, common->blob_type, error))
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
break;
|
|
|
|
case BLOB_TYPE_OBJECT:
|
2008-08-24 18:51:43 +02:00
|
|
|
if (!validate_object_blob (ctx, offset, error))
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
break;
|
|
|
|
case BLOB_TYPE_INTERFACE:
|
2008-08-24 18:51:43 +02:00
|
|
|
if (!validate_interface_blob (ctx, offset, error))
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
break;
|
|
|
|
case BLOB_TYPE_CONSTANT:
|
2008-08-09 14:55:32 +02:00
|
|
|
if (!validate_constant_blob (typelib, offset, error))
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
break;
|
|
|
|
case BLOB_TYPE_ERROR_DOMAIN:
|
2008-08-09 14:55:32 +02:00
|
|
|
if (!validate_errordomain_blob (typelib, offset, error))
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
break;
|
|
|
|
case BLOB_TYPE_UNION:
|
2008-08-09 14:55:32 +02:00
|
|
|
if (!validate_union_blob (typelib, offset, error))
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_ENTRY,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Invalid blob type");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2008-08-24 18:51:43 +02:00
|
|
|
validate_directory (ValidateContext *ctx,
|
|
|
|
GError **error)
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
2008-08-24 18:51:43 +02:00
|
|
|
GTypelib *typelib = ctx->typelib;
|
2008-08-09 14:55:32 +02:00
|
|
|
Header *header = (Header *)typelib->data;
|
2008-02-08 16:31:03 +01:00
|
|
|
DirEntry *entry;
|
|
|
|
gint i;
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
if (typelib->len < header->directory + header->n_entries * sizeof (DirEntry))
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID,
|
2008-02-08 16:31:03 +01:00
|
|
|
"The buffer is too short");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < header->n_entries; i++)
|
|
|
|
{
|
2008-08-09 14:55:32 +02:00
|
|
|
entry = g_typelib_get_dir_entry (typelib, i + 1);
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-21 18:15:55 +02:00
|
|
|
if (!validate_name (typelib, "entry", typelib->data, entry->name, error))
|
|
|
|
return FALSE;
|
2008-02-08 16:31:03 +01:00
|
|
|
|
|
|
|
if ((entry->local && entry->blob_type == BLOB_TYPE_INVALID) ||
|
|
|
|
entry->blob_type > BLOB_TYPE_UNION)
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_DIRECTORY,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Invalid entry type");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (i < header->n_local_entries)
|
|
|
|
{
|
|
|
|
if (!entry->local)
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_DIRECTORY,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Too few local directory entries");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!is_aligned (entry->offset))
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_DIRECTORY,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Misaligned entry");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-08-24 18:51:43 +02:00
|
|
|
if (!validate_blob (ctx, entry->offset, error))
|
2008-02-08 16:31:03 +01:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (entry->local)
|
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID_DIRECTORY,
|
2008-02-08 16:31:03 +01:00
|
|
|
"Too many local directory entries");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2008-08-21 18:15:55 +02:00
|
|
|
if (!validate_name (typelib, "namespace", typelib->data, entry->offset, error))
|
|
|
|
return FALSE;
|
2008-02-08 16:31:03 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2009-02-20 03:48:51 +01:00
|
|
|
validate_attributes (ValidateContext *ctx,
|
|
|
|
GError **error)
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
2008-08-24 18:51:43 +02:00
|
|
|
GTypelib *typelib = ctx->typelib;
|
2008-08-09 14:55:32 +02:00
|
|
|
Header *header = (Header *)typelib->data;
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2009-02-20 03:48:51 +01:00
|
|
|
if (header->size < header->attributes + header->n_attributes * sizeof (AttributeBlob))
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
g_set_error (error,
|
2008-06-08 16:37:30 +02:00
|
|
|
G_TYPELIB_ERROR,
|
|
|
|
G_TYPELIB_ERROR_INVALID,
|
2008-02-08 16:31:03 +01:00
|
|
|
"The buffer is too short");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2008-08-24 18:51:43 +02:00
|
|
|
static void
|
|
|
|
prefix_with_context (GError **error,
|
|
|
|
const char *section,
|
|
|
|
ValidateContext *ctx)
|
|
|
|
{
|
|
|
|
GString *str = g_string_new (NULL);
|
|
|
|
GSList *link;
|
|
|
|
char *buf;
|
|
|
|
|
|
|
|
link = ctx->context_stack;
|
|
|
|
if (!link)
|
|
|
|
{
|
|
|
|
g_prefix_error (error, "In %s:", section);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (; link; link = link->next)
|
|
|
|
{
|
|
|
|
g_string_append (str, link->data);
|
|
|
|
if (link->next)
|
|
|
|
g_string_append_c (str, '/');
|
|
|
|
}
|
|
|
|
g_string_append_c (str, ')');
|
|
|
|
buf = g_string_free (str, FALSE);
|
|
|
|
g_prefix_error (error, "In %s (Context: %s): ", section, buf);
|
|
|
|
g_free (buf);
|
|
|
|
}
|
|
|
|
|
2008-02-08 16:31:03 +01:00
|
|
|
gboolean
|
2008-08-09 14:55:32 +02:00
|
|
|
g_typelib_validate (GTypelib *typelib,
|
2008-02-08 16:31:03 +01:00
|
|
|
GError **error)
|
|
|
|
{
|
2008-08-24 18:51:43 +02:00
|
|
|
ValidateContext ctx;
|
|
|
|
ctx.typelib = typelib;
|
|
|
|
ctx.context_stack = NULL;
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-24 18:51:43 +02:00
|
|
|
if (!validate_header (&ctx, error))
|
|
|
|
{
|
|
|
|
prefix_with_context (error, "In header", &ctx);
|
|
|
|
return FALSE;
|
|
|
|
}
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-08-24 18:51:43 +02:00
|
|
|
if (!validate_directory (&ctx, error))
|
|
|
|
{
|
|
|
|
prefix_with_context (error, "directory", &ctx);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2009-02-20 03:48:51 +01:00
|
|
|
if (!validate_attributes (&ctx, error))
|
2008-08-24 18:51:43 +02:00
|
|
|
{
|
2009-02-20 03:48:51 +01:00
|
|
|
prefix_with_context (error, "attributes", &ctx);
|
2008-08-24 18:51:43 +02:00
|
|
|
return FALSE;
|
|
|
|
}
|
2008-02-08 16:31:03 +01:00
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
GQuark
|
2008-06-08 16:37:30 +02:00
|
|
|
g_typelib_error_quark (void)
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
static GQuark quark = 0;
|
|
|
|
if (quark == 0)
|
2008-08-09 14:55:32 +02:00
|
|
|
quark = g_quark_from_static_string ("g-typelib-error-quark");
|
2008-02-08 16:31:03 +01:00
|
|
|
return quark;
|
|
|
|
}
|
|
|
|
|
2009-08-18 16:23:09 +02:00
|
|
|
static void
|
|
|
|
_g_typelib_do_dlopen (GTypelib *typelib)
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
|
|
|
Header *header;
|
2009-08-18 16:23:09 +02:00
|
|
|
const char *shlib_str;
|
|
|
|
|
2008-08-09 14:55:32 +02:00
|
|
|
header = (Header *) typelib->data;
|
2009-08-18 16:23:09 +02:00
|
|
|
/* note that NULL shlib means to open the main app, which is allowed */
|
2008-02-08 16:31:03 +01:00
|
|
|
if (header->shared_library)
|
2009-08-18 16:23:09 +02:00
|
|
|
shlib_str = g_typelib_get_string (typelib, header->shared_library);
|
|
|
|
else
|
|
|
|
shlib_str = NULL;
|
|
|
|
|
|
|
|
if (shlib_str != NULL && shlib_str[0] != '\0')
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
2009-08-18 16:23:09 +02:00
|
|
|
gchar **shlibs;
|
|
|
|
gint i;
|
2008-04-23 03:04:43 +02:00
|
|
|
|
2009-08-18 16:23:09 +02:00
|
|
|
/* shared-library is a comma-separated list of libraries */
|
|
|
|
shlibs = g_strsplit (shlib_str, ",", 0);
|
2008-04-23 03:17:24 +02:00
|
|
|
|
2009-08-18 16:23:09 +02:00
|
|
|
/* We load all passed libs unconditionally as if the same library is loaded
|
|
|
|
* again with dlopen(), the same file handle will be returned. See bug:
|
|
|
|
* http://bugzilla.gnome.org/show_bug.cgi?id=555294
|
|
|
|
*/
|
|
|
|
for (i = 0; shlibs[i]; i++)
|
2008-04-23 03:17:24 +02:00
|
|
|
{
|
2009-08-18 16:23:09 +02:00
|
|
|
GModule *module;
|
|
|
|
|
|
|
|
/* Glade's autoconnect feature and OpenGL's extension mechanism
|
|
|
|
* as used by Clutter rely on dlopen(NULL) to work as a means of
|
|
|
|
* accessing the app's symbols. This keeps us from using
|
|
|
|
* G_MODULE_BIND_LOCAL. BIND_LOCAL may have other issues as well;
|
|
|
|
* in general libraries are not expecting multiple copies of
|
|
|
|
* themselves and are not expecting to be unloaded. So we just
|
|
|
|
* load modules globally for now.
|
|
|
|
*/
|
2008-10-07 23:25:01 +02:00
|
|
|
|
2009-08-18 16:23:09 +02:00
|
|
|
module = g_module_open (shlibs[i], G_MODULE_BIND_LAZY);
|
2008-10-07 23:25:01 +02:00
|
|
|
|
2009-08-18 16:23:09 +02:00
|
|
|
if (module == NULL)
|
2008-04-23 03:17:24 +02:00
|
|
|
{
|
2009-08-18 16:23:09 +02:00
|
|
|
GString *shlib_full = g_string_new (shlibs[i]);
|
|
|
|
|
|
|
|
/* Prefix with "lib", try both .la and .so */
|
|
|
|
if (!g_str_has_prefix (shlib_full->str, "lib"))
|
|
|
|
g_string_prepend (shlib_full, "lib");
|
|
|
|
g_string_append (shlib_full, ".la");
|
|
|
|
module = g_module_open (shlib_full->str, G_MODULE_BIND_LAZY);
|
|
|
|
if (module == NULL)
|
2008-04-23 03:17:24 +02:00
|
|
|
{
|
2009-08-18 16:23:09 +02:00
|
|
|
g_string_overwrite (shlib_full, strlen (shlib_full->str)-2, SHLIB_SUFFIX);
|
|
|
|
module = g_module_open (shlib_full->str, G_MODULE_BIND_LAZY);
|
2008-04-23 03:17:24 +02:00
|
|
|
}
|
2008-08-21 16:21:00 +02:00
|
|
|
|
2009-08-18 16:23:09 +02:00
|
|
|
g_string_free (shlib_full, TRUE);
|
|
|
|
}
|
2008-10-07 23:25:01 +02:00
|
|
|
|
2009-08-18 16:23:09 +02:00
|
|
|
if (module == NULL)
|
|
|
|
{
|
|
|
|
g_warning ("Failed to load shared library '%s' referenced by the typelib: %s",
|
|
|
|
shlibs[i], g_module_error ());
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
typelib->modules = g_list_append (typelib->modules, module);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
g_strfreev (shlibs);
|
2008-02-08 16:31:03 +01:00
|
|
|
}
|
2009-08-18 16:23:09 +02:00
|
|
|
else
|
|
|
|
{
|
|
|
|
/* If there's no shared-library entry for this module, assume that
|
|
|
|
* the module is for the application. Some of the hand-written .gir files
|
|
|
|
* in gobject-introspection don't have shared-library entries, but no one
|
|
|
|
* is really going to be calling g_module_symbol on them either.
|
|
|
|
*/
|
|
|
|
GModule *module = g_module_open (NULL, 0);
|
|
|
|
if (module == NULL)
|
|
|
|
g_warning ("gtypelib.c: Failed to g_module_open (NULL): %s", g_module_error ());
|
|
|
|
else
|
|
|
|
typelib->modules = g_list_prepend (typelib->modules, module);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void
|
|
|
|
_g_typelib_ensure_open (GTypelib *typelib)
|
|
|
|
{
|
|
|
|
if (typelib->open_attempted)
|
|
|
|
return;
|
|
|
|
typelib->open_attempted = TRUE;
|
|
|
|
_g_typelib_do_dlopen (typelib);
|
2008-02-08 16:31:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2008-06-08 16:37:30 +02:00
|
|
|
* g_typelib_new_from_memory:
|
2008-08-09 14:55:32 +02:00
|
|
|
* @memory: address of memory chunk containing the typelib
|
|
|
|
* @len: length of memory chunk containing the typelib
|
2008-02-08 16:31:03 +01:00
|
|
|
*
|
2008-06-08 16:37:30 +02:00
|
|
|
* Creates a new #GTypelib from a memory location. The memory block
|
2008-08-09 14:55:32 +02:00
|
|
|
* pointed to by @typelib will be automatically g_free()d when the
|
2008-02-08 16:31:03 +01:00
|
|
|
* repository is destroyed.
|
|
|
|
*
|
2008-06-08 16:37:30 +02:00
|
|
|
* Return value: the new #GTypelib
|
2008-02-08 16:31:03 +01:00
|
|
|
**/
|
2008-06-08 16:37:30 +02:00
|
|
|
GTypelib *
|
|
|
|
g_typelib_new_from_memory (guchar *memory, gsize len)
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
2008-06-08 16:37:30 +02:00
|
|
|
GTypelib *meta;
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-06-08 16:37:30 +02:00
|
|
|
meta = g_new0 (GTypelib, 1);
|
2008-02-08 16:31:03 +01:00
|
|
|
meta->data = memory;
|
|
|
|
meta->len = len;
|
|
|
|
meta->owns_memory = TRUE;
|
2008-10-07 23:25:01 +02:00
|
|
|
meta->modules = NULL;
|
2009-08-18 16:23:09 +02:00
|
|
|
|
2008-02-08 16:31:03 +01:00
|
|
|
return meta;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2008-06-08 16:37:30 +02:00
|
|
|
* g_typelib_new_from_const_memory:
|
2008-08-09 14:55:32 +02:00
|
|
|
* @memory: address of memory chunk containing the typelib
|
|
|
|
* @len: length of memory chunk containing the typelib
|
2008-02-08 16:31:03 +01:00
|
|
|
*
|
2008-06-08 16:37:30 +02:00
|
|
|
* Creates a new #GTypelib from a memory location.
|
2008-02-08 16:31:03 +01:00
|
|
|
*
|
2008-06-08 16:37:30 +02:00
|
|
|
* Return value: the new #GTypelib
|
2008-02-08 16:31:03 +01:00
|
|
|
**/
|
2008-06-08 16:37:30 +02:00
|
|
|
GTypelib *
|
|
|
|
g_typelib_new_from_const_memory (const guchar *memory, gsize len)
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
2008-06-08 16:37:30 +02:00
|
|
|
GTypelib *meta;
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-06-08 16:37:30 +02:00
|
|
|
meta = g_new0 (GTypelib, 1);
|
2008-02-08 16:31:03 +01:00
|
|
|
meta->data = (guchar *) memory;
|
|
|
|
meta->len = len;
|
|
|
|
meta->owns_memory = FALSE;
|
2008-10-07 23:25:01 +02:00
|
|
|
meta->modules = NULL;
|
2009-08-18 16:23:09 +02:00
|
|
|
|
2008-02-08 16:31:03 +01:00
|
|
|
return meta;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2008-06-08 16:37:30 +02:00
|
|
|
* g_typelib_new_from_mapped_file:
|
2008-02-08 16:31:03 +01:00
|
|
|
* @mfile: a #GMappedFile, that will be free'd when the repository is destroyed
|
|
|
|
*
|
2008-06-08 16:37:30 +02:00
|
|
|
* Creates a new #GTypelib from a #GMappedFile.
|
2008-02-08 16:31:03 +01:00
|
|
|
*
|
2008-06-08 16:37:30 +02:00
|
|
|
* Return value: the new #GTypelib
|
2008-02-08 16:31:03 +01:00
|
|
|
**/
|
2008-06-08 16:37:30 +02:00
|
|
|
GTypelib *
|
|
|
|
g_typelib_new_from_mapped_file (GMappedFile *mfile)
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
2008-06-08 16:37:30 +02:00
|
|
|
GTypelib *meta;
|
2008-02-08 16:31:03 +01:00
|
|
|
|
2008-06-08 16:37:30 +02:00
|
|
|
meta = g_new0 (GTypelib, 1);
|
2008-02-08 16:31:03 +01:00
|
|
|
meta->mfile = mfile;
|
|
|
|
meta->owns_memory = FALSE;
|
|
|
|
meta->data = (guchar *) g_mapped_file_get_contents (mfile);
|
|
|
|
meta->len = g_mapped_file_get_length (mfile);
|
2009-08-18 16:23:09 +02:00
|
|
|
|
2008-02-08 16:31:03 +01:00
|
|
|
return meta;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2008-06-08 16:37:30 +02:00
|
|
|
* g_typelib_free:
|
2008-08-09 14:55:32 +02:00
|
|
|
* @typelib: a #GTypelib
|
2008-02-08 16:31:03 +01:00
|
|
|
*
|
2008-06-08 16:37:30 +02:00
|
|
|
* Free a #GTypelib.
|
2008-02-08 16:31:03 +01:00
|
|
|
**/
|
|
|
|
void
|
2008-08-09 14:55:32 +02:00
|
|
|
g_typelib_free (GTypelib *typelib)
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
2008-08-09 14:55:32 +02:00
|
|
|
if (typelib->mfile)
|
|
|
|
g_mapped_file_free (typelib->mfile);
|
2008-02-08 16:31:03 +01:00
|
|
|
else
|
2008-08-09 14:55:32 +02:00
|
|
|
if (typelib->owns_memory)
|
|
|
|
g_free (typelib->data);
|
2008-10-07 23:25:01 +02:00
|
|
|
if (typelib->modules)
|
|
|
|
{
|
|
|
|
g_list_foreach (typelib->modules, (GFunc) g_module_close, NULL);
|
|
|
|
g_list_free (typelib->modules);
|
|
|
|
}
|
2008-08-09 14:55:32 +02:00
|
|
|
g_free (typelib);
|
2008-02-08 16:31:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
const gchar *
|
2008-10-09 18:44:11 +02:00
|
|
|
g_typelib_get_namespace (GTypelib *typelib)
|
2008-02-08 16:31:03 +01:00
|
|
|
{
|
2008-08-09 14:55:32 +02:00
|
|
|
return g_typelib_get_string (typelib, ((Header *) typelib->data)->namespace);
|
2008-02-08 16:31:03 +01:00
|
|
|
}
|
2008-10-07 23:25:01 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* g_typelib_symbol:
|
2009-02-12 04:32:25 +01:00
|
|
|
* @typelib: the typelib
|
2008-10-07 23:25:01 +02:00
|
|
|
* @symbol_name: name of symbol to be loaded
|
|
|
|
* @symbol: returns a pointer to the symbol value
|
|
|
|
*
|
|
|
|
* Loads a symbol from #GTypelib.
|
|
|
|
*
|
|
|
|
* Return value: #TRUE on success
|
|
|
|
**/
|
|
|
|
gboolean
|
2008-10-09 18:44:11 +02:00
|
|
|
g_typelib_symbol (GTypelib *typelib, const char *symbol_name, gpointer *symbol)
|
2008-10-07 23:25:01 +02:00
|
|
|
{
|
|
|
|
GList *l;
|
2009-08-18 16:23:09 +02:00
|
|
|
|
|
|
|
_g_typelib_ensure_open (typelib);
|
2008-10-07 23:25:01 +02:00
|
|
|
|
|
|
|
/*
|
2009-08-18 16:23:09 +02:00
|
|
|
* The reason for having multiple modules dates from gir-repository
|
|
|
|
* when it was desired to inject code (accessors, etc.) into an
|
|
|
|
* existing library. In that situation, the first module listed
|
|
|
|
* will be the custom one, which overrides the main one. A bit
|
|
|
|
* inefficient, but the problem will go away when gir-repository
|
|
|
|
* does.
|
|
|
|
*
|
|
|
|
* For modules with no shared library, we dlopen'd the current
|
|
|
|
* process above.
|
2008-10-07 23:25:01 +02:00
|
|
|
*/
|
|
|
|
for (l = typelib->modules; l; l = l->next)
|
|
|
|
{
|
|
|
|
GModule *module = l->data;
|
|
|
|
|
|
|
|
if (g_module_symbol (module, symbol_name, symbol))
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|