Branch data Line data Source code
1 : : /* -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
2 : : // SPDX-License-Identifier: MIT OR LGPL-2.0-or-later
3 : : // SPDX-FileCopyrightText: 2008 litl, LLC
4 : :
5 : : #ifndef GI_ARG_H_
6 : : #define GI_ARG_H_
7 : :
8 : : #include <config.h>
9 : :
10 : : #include <stddef.h> // for size_t
11 : : #include <stdint.h>
12 : :
13 : : #include <girepository.h>
14 : : #include <glib-object.h>
15 : : #include <glib.h> // for GHashTable
16 : :
17 : : #include <js/RootingAPI.h>
18 : : #include <js/TypeDecls.h>
19 : :
20 : : #include "gjs/macros.h"
21 : :
22 : : // Different roles for a GIArgument; currently used only in exception and debug
23 : : // messages.
24 : : typedef enum {
25 : : GJS_ARGUMENT_ARGUMENT,
26 : : GJS_ARGUMENT_RETURN_VALUE,
27 : : GJS_ARGUMENT_FIELD,
28 : : GJS_ARGUMENT_LIST_ELEMENT,
29 : : GJS_ARGUMENT_HASH_ELEMENT,
30 : : GJS_ARGUMENT_ARRAY_ELEMENT
31 : : } GjsArgumentType;
32 : :
33 : : enum class GjsArgumentFlags : uint8_t {
34 : : NONE = 0,
35 : : MAY_BE_NULL = 1 << 0,
36 : : CALLER_ALLOCATES = 1 << 1,
37 : : SKIP_IN = 1 << 2,
38 : : SKIP_OUT = 1 << 3,
39 : : SKIP_ALL = SKIP_IN | SKIP_OUT,
40 : : ARG_IN = 1 << 4,
41 : : ARG_OUT = 1 << 5,
42 : : ARG_INOUT = ARG_IN | ARG_OUT,
43 : : };
44 : :
45 : : // Overload operator| so that Visual Studio won't complain
46 : : // when converting unsigned char to GjsArgumentFlags
47 : : GjsArgumentFlags operator|(GjsArgumentFlags const& v1, GjsArgumentFlags const& v2);
48 : :
49 : : [[nodiscard]] char* gjs_argument_display_name(const char* arg_name,
50 : : GjsArgumentType arg_type);
51 : :
52 : : GJS_JSAPI_RETURN_CONVENTION
53 : : bool gjs_value_to_callback_out_arg(JSContext* context, JS::HandleValue value,
54 : : GIArgInfo* arg_info, GIArgument* arg);
55 : :
56 : : GJS_JSAPI_RETURN_CONVENTION
57 : : bool gjs_array_to_explicit_array(JSContext* cx, JS::HandleValue value,
58 : : GITypeInfo* type_info, const char* arg_name,
59 : : GjsArgumentType arg_type, GITransfer transfer,
60 : : GjsArgumentFlags flags, void** contents,
61 : : size_t* length_p);
62 : :
63 : : size_t gjs_type_get_element_size(GITypeTag element_type, GITypeInfo* type_info);
64 : :
65 : : void gjs_gi_argument_init_default(GITypeInfo* type_info, GIArgument* arg);
66 : :
67 : : GJS_JSAPI_RETURN_CONVENTION
68 : : bool gjs_value_to_gi_argument(JSContext*, JS::HandleValue, GITypeInfo*,
69 : : const char* arg_name, GjsArgumentType, GITransfer,
70 : : GjsArgumentFlags, GIArgument*);
71 : :
72 : : GJS_JSAPI_RETURN_CONVENTION
73 : 395 : bool inline gjs_value_to_gi_argument(JSContext* cx, JS::HandleValue value,
74 : : GITypeInfo* type_info,
75 : : GjsArgumentType argument_type,
76 : : GITransfer transfer, GIArgument* arg) {
77 : 395 : return gjs_value_to_gi_argument(cx, value, type_info,
78 : : nullptr /* arg_name */, argument_type,
79 : 395 : transfer, GjsArgumentFlags::NONE, arg);
80 : : }
81 : :
82 : : GJS_JSAPI_RETURN_CONVENTION
83 : : bool gjs_value_from_gi_argument(JSContext*, JS::MutableHandleValue, GITypeInfo*,
84 : : GjsArgumentType, GITransfer, GIArgument*);
85 : :
86 : : GJS_JSAPI_RETURN_CONVENTION
87 : 24721 : inline bool gjs_value_from_gi_argument(JSContext* cx,
88 : : JS::MutableHandleValue value_p,
89 : : GITypeInfo* type_info, GIArgument* arg,
90 : : bool copy_structs) {
91 [ + + ]: 24721 : return gjs_value_from_gi_argument(
92 : : cx, value_p, type_info, GJS_ARGUMENT_ARGUMENT,
93 : 24721 : copy_structs ? GI_TRANSFER_EVERYTHING : GI_TRANSFER_NOTHING, arg);
94 : : }
95 : :
96 : : GJS_JSAPI_RETURN_CONVENTION
97 : : bool gjs_value_from_explicit_array(JSContext* context,
98 : : JS::MutableHandleValue value_p,
99 : : GITypeInfo* type_info, GITransfer transfer,
100 : : GIArgument* arg, int length);
101 : :
102 : : GJS_JSAPI_RETURN_CONVENTION
103 : 2 : inline bool gjs_value_from_explicit_array(JSContext* context,
104 : : JS::MutableHandleValue value_p,
105 : : GITypeInfo* type_info,
106 : : GIArgument* arg, int length) {
107 : 2 : return gjs_value_from_explicit_array(context, value_p, type_info,
108 : 2 : GI_TRANSFER_EVERYTHING, arg, length);
109 : : }
110 : :
111 : : GJS_JSAPI_RETURN_CONVENTION
112 : : bool gjs_gi_argument_release(JSContext*, GITransfer, GITypeInfo*,
113 : : GjsArgumentFlags, GIArgument*);
114 : : GJS_JSAPI_RETURN_CONVENTION
115 : 21577 : inline bool gjs_gi_argument_release(JSContext* cx, GITransfer transfer,
116 : : GITypeInfo* type_info, GIArgument* arg) {
117 : 21577 : return gjs_gi_argument_release(cx, transfer, type_info,
118 : 21577 : GjsArgumentFlags::NONE, arg);
119 : : }
120 : : GJS_JSAPI_RETURN_CONVENTION
121 : : bool gjs_gi_argument_release_out_array(JSContext*, GITransfer, GITypeInfo*,
122 : : unsigned length, GIArgument*);
123 : : GJS_JSAPI_RETURN_CONVENTION
124 : : bool gjs_gi_argument_release_out_array(JSContext*, GITransfer, GITypeInfo*,
125 : : GIArgument*);
126 : : GJS_JSAPI_RETURN_CONVENTION
127 : : bool gjs_gi_argument_release_in_array(JSContext*, GITransfer, GITypeInfo*,
128 : : unsigned length, GIArgument*);
129 : : GJS_JSAPI_RETURN_CONVENTION
130 : : bool gjs_gi_argument_release_in_array(JSContext*, GITransfer, GITypeInfo*,
131 : : GIArgument*);
132 : : GJS_JSAPI_RETURN_CONVENTION
133 : : bool gjs_gi_argument_release_in_arg(JSContext*, GITransfer, GITypeInfo*,
134 : : GjsArgumentFlags, GIArgument*);
135 : : GJS_JSAPI_RETURN_CONVENTION
136 : 49 : inline bool gjs_gi_argument_release_in_arg(JSContext* cx, GITransfer transfer,
137 : : GITypeInfo* type_info,
138 : : GIArgument* arg) {
139 : 49 : return gjs_gi_argument_release_in_arg(cx, transfer, type_info,
140 : 49 : GjsArgumentFlags::ARG_IN, arg);
141 : : }
142 : :
143 : : GJS_JSAPI_RETURN_CONVENTION
144 : : bool _gjs_flags_value_is_valid(JSContext* cx, GType gtype, int64_t value);
145 : :
146 : : [[nodiscard]] int64_t _gjs_enum_from_int(GIEnumInfo* enum_info, int int_value);
147 : :
148 : : GJS_JSAPI_RETURN_CONVENTION
149 : : bool gjs_array_from_strv(JSContext *context,
150 : : JS::MutableHandleValue value_p,
151 : : const char **strv);
152 : :
153 : : GJS_JSAPI_RETURN_CONVENTION
154 : : bool gjs_array_to_strv (JSContext *context,
155 : : JS::Value array_value,
156 : : unsigned int length,
157 : : void **arr_p);
158 : :
159 : : GJS_JSAPI_RETURN_CONVENTION
160 : : bool gjs_array_from_g_value_array(JSContext* cx, JS::MutableHandleValue value_p,
161 : : GITypeInfo* param_info, GITransfer,
162 : : const GValue* gvalue);
163 : :
164 : : GJS_JSAPI_RETURN_CONVENTION
165 : : bool gjs_object_from_g_hash(JSContext* cx, JS::MutableHandleValue,
166 : : GITypeInfo* key_param_info,
167 : : GITypeInfo* val_param_info, GITransfer transfer,
168 : : GHashTable* hash);
169 : :
170 : : #endif // GI_ARG_H_
|