summaryrefslogtreecommitdiff
path: root/gi/arg.h
blob: 1f82b77c974ed935b5887a4a059d89f82e3c930a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/* -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
// SPDX-License-Identifier: MIT OR LGPL-2.0-or-later
// SPDX-FileCopyrightText: 2008 litl, LLC

#ifndef GI_ARG_H_
#define GI_ARG_H_

#include <config.h>

#include <stddef.h>  // for size_t
#include <stdint.h>

#include <girepository.h>
#include <glib-object.h>

#include <js/RootingAPI.h>
#include <js/TypeDecls.h>

#include "gjs/macros.h"

// Different roles for a GIArgument; currently used only in exception and debug
// messages.
typedef enum {
    GJS_ARGUMENT_ARGUMENT,
    GJS_ARGUMENT_RETURN_VALUE,
    GJS_ARGUMENT_FIELD,
    GJS_ARGUMENT_LIST_ELEMENT,
    GJS_ARGUMENT_HASH_ELEMENT,
    GJS_ARGUMENT_ARRAY_ELEMENT
} GjsArgumentType;

enum class GjsArgumentFlags : uint8_t {
    NONE = 0,
    MAY_BE_NULL = 1 << 0,
    CALLER_ALLOCATES = 1 << 1,
    SKIP_IN = 1 << 2,
    SKIP_OUT = 1 << 3,
    SKIP_ALL = SKIP_IN | SKIP_OUT,
    ARG_IN = 1 << 4,
    ARG_OUT = 1 << 5,
    ARG_INOUT = ARG_IN | ARG_OUT,
};

[[nodiscard]] char* gjs_argument_display_name(const char* arg_name,
                                              GjsArgumentType arg_type);

GJS_JSAPI_RETURN_CONVENTION
bool gjs_value_to_callback_out_arg(JSContext* context, JS::HandleValue value,
                                   GIArgInfo* arg_info, GIArgument* arg);

GJS_JSAPI_RETURN_CONVENTION
bool gjs_array_to_explicit_array(JSContext* cx, JS::HandleValue value,
                                 GITypeInfo* type_info, const char* arg_name,
                                 GjsArgumentType arg_type, GITransfer transfer,
                                 GjsArgumentFlags flags, void** contents,
                                 size_t* length_p);

size_t gjs_array_get_element_size(GITypeTag element_type);

void gjs_gi_argument_init_default(GITypeInfo* type_info, GIArgument* arg);

GJS_JSAPI_RETURN_CONVENTION
bool gjs_value_to_g_argument(JSContext* cx, JS::HandleValue value,
                             GITypeInfo* type_info, const char* arg_name,
                             GjsArgumentType argument_type, GITransfer transfer,
                             GjsArgumentFlags flags, GIArgument* arg);

GJS_JSAPI_RETURN_CONVENTION
bool inline gjs_value_to_g_argument(JSContext* cx, JS::HandleValue value,
                                    GITypeInfo* type_info,
                                    GjsArgumentType argument_type,
                                    GITransfer transfer, GIArgument* arg) {
    return gjs_value_to_g_argument(cx, value, type_info, nullptr /* arg_name */,
                                   argument_type, transfer,
                                   GjsArgumentFlags::NONE, arg);
}

GJS_JSAPI_RETURN_CONVENTION
bool gjs_value_from_g_argument(JSContext             *context,
                               JS::MutableHandleValue value_p,
                               GITypeInfo            *type_info,
                               GIArgument            *arg,
                               bool                   copy_structs);

GJS_JSAPI_RETURN_CONVENTION
bool gjs_value_from_explicit_array(JSContext             *context,
                                   JS::MutableHandleValue value_p,
                                   GITypeInfo            *type_info,
                                   GIArgument            *arg,
                                   int                    length);

GJS_JSAPI_RETURN_CONVENTION
bool gjs_g_argument_release(JSContext*, GITransfer, GITypeInfo*,
                            GjsArgumentFlags, GIArgument*);
GJS_JSAPI_RETURN_CONVENTION
inline bool gjs_g_argument_release(JSContext* cx, GITransfer transfer,
                                   GITypeInfo* type_info, GIArgument* arg) {
    return gjs_g_argument_release(cx, transfer, type_info,
                                  GjsArgumentFlags::NONE, arg);
}
GJS_JSAPI_RETURN_CONVENTION
bool gjs_g_argument_release_out_array(JSContext* cx, GITransfer transfer,
                                      GITypeInfo* type_info, unsigned length,
                                      GIArgument* arg);
GJS_JSAPI_RETURN_CONVENTION
bool gjs_g_argument_release_in_array(JSContext* cx, GITransfer transfer,
                                     GITypeInfo* type_info, unsigned length,
                                     GIArgument* arg);
GJS_JSAPI_RETURN_CONVENTION
bool gjs_g_argument_release_in_arg(JSContext*, GITransfer, GITypeInfo*,
                                   GjsArgumentFlags, GIArgument*);
GJS_JSAPI_RETURN_CONVENTION
inline bool gjs_g_argument_release_in_arg(JSContext* cx, GITransfer transfer,
                                          GITypeInfo* type_info,
                                          GIArgument* arg) {
    return gjs_g_argument_release_in_arg(cx, transfer, type_info,
                                         GjsArgumentFlags::ARG_IN, arg);
}

GJS_JSAPI_RETURN_CONVENTION
bool _gjs_flags_value_is_valid(JSContext* cx, GType gtype, int64_t value);

[[nodiscard]] int64_t _gjs_enum_from_int(GIEnumInfo* enum_info, int int_value);

GJS_JSAPI_RETURN_CONVENTION
bool gjs_array_from_strv(JSContext             *context,
                         JS::MutableHandleValue value_p,
                         const char           **strv);

GJS_JSAPI_RETURN_CONVENTION
bool gjs_array_to_strv (JSContext   *context,
                        JS::Value    array_value,
                        unsigned int length,
                        void       **arr_p);

GJS_JSAPI_RETURN_CONVENTION
bool gjs_array_from_g_value_array(JSContext* cx, JS::MutableHandleValue value_p,
                                  GITypeInfo* param_info, const GValue* gvalue);

#endif  // GI_ARG_H_