diff --git a/.gitignore b/.gitignore index e50d552..79e5df2 100644 --- a/.gitignore +++ b/.gitignore @@ -37,6 +37,7 @@ Makefile.in /INSTALL /ChangeLog /src/matrix-version.h +/src/matrix-enumtypes.[ch] /src/matrix-marshalers.[ch] /src/stamp-matrix-marshalers /docs/valadoc/gtk-doc/gtk-doc diff --git a/configure.ac b/configure.ac index b688fe7..343f3db 100644 --- a/configure.ac +++ b/configure.ac @@ -194,6 +194,7 @@ AC_SUBST([MATRIX_GLIB_MICRO_VERSION], matrix_glib_micro_version) AC_SUBST([MATRIX_GLIB_API_VERSION], matrix_glib_api_version) AC_PATH_PROG([GLIB_GENMARSHAL], [glib-genmarshal]) +AC_PATH_PROG([GLIB_MKENUMS], [glib-mkenums]) AC_CONFIG_FILES([ Makefile diff --git a/src/Makefile.am b/src/Makefile.am index 3aa7894..9cefb0a 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -114,19 +114,27 @@ $(libmatrix_glib_0_0_la_VALA_SOURCES:.vala=.c): vala-stamp bin_PROGRAMS = test-api-client test-client INST_H_SRC_FILES = \ + matrix-c-types.h \ $(NULL) INST_H_BUILT_FILES = \ matrix-version.h \ + matrix-enumtypes.h \ matrix-marshalers.h \ $(NULL) +matrix_enum_headers = \ + matrix-c-types.h \ + $(NULL) + libmatrix_glib_0_0_la_SOURCES = \ $(INST_H_BUILT_FILES) \ matrix-marshalers.c \ $(libmatrix_glib_0_0_la_VALA_SOURCES:.vala=.c) \ matrix-event-types.c \ matrix-version.c \ + matrix-c-types.c \ + matrix-enumtypes.c \ $(INST_H_SRC_FILES) \ $(NULL) @@ -157,6 +165,8 @@ dist_vapi_DATA = \ $(NULL) BUILT_SOURCES += \ + matrix-enumtypes.c \ + matrix-enumtypes.h \ matrix-marshalers.c \ matrix-marshalers.h \ $(NULL) @@ -177,10 +187,22 @@ test_client_LDADD = \ CLEANFILES += $(BUILT_SOURCES) EXTRA_DIST += \ + matrix-enumtypes.h.template \ + matrix-enumtypes.c.template \ matrix-marshalers.list \ $(INST_H_SRC_FILES) \ $(NULL) +matrix-enumtypes.h: $(matrix_enum_headers) matrix-enumtypes.h.template + $(AM_V_GEN) $(GLIB_MKENUMS) --template $(filter %.template,$^) \ + $(filter-out %.template,$^) > $@.tmp \ + && mv $@.tmp $@ + +matrix-enumtypes.c: $(matrix_enum_headers) matrix-enumtypes.h matrix-enumtypes.c.template + $(AM_V_GEN) $(GLIB_MKENUMS) --template $(filter %.template,$^) \ + $(filter-out %.template,$^) > $@.tmp \ + && mv $@.tmp $@ + matrix-marshalers.h: stamp-matrix-marshalers @true diff --git a/src/matrix-c-types.c b/src/matrix-c-types.c new file mode 100644 index 0000000..f1fe360 --- /dev/null +++ b/src/matrix-c-types.c @@ -0,0 +1,91 @@ +/* + * This file is part of matrix-glib-sdk + * + * matrix-glib-sdk 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 3 of the License, or (at your option) any later version. + * + * matrix-glib-sdk 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 matrix-glib-sdk. If not, see + * . + */ + +#include "matrix-c-types.h" + +/** + * SECTION:matrix-types + * @title: Generic types + * @short_description: Generic types for Matrix GLib SDK calls + * + * These are the generic types used by many SDK calls for communication with the homeserver. + */ + +/** + * MatrixError: + * @MATRIX_ERROR_NONE: no error. You should never see this. + * @MATRIX_ERROR_COMMUNICATION_ERROR: there was a problem in communication (e.g. connection error) + * @MATRIX_ERROR_INCOMPLETE: the passed/generated data is incomplete + * @MATRIX_ERROR_BAD_REQUEST: the request is invalid + * @MATRIX_ERROR_BAD_RESPONSE: malformed response, or the response is not a JSON object + * @MATRIX_ERROR_INVALID_ROOM_ID: the provided string doesn’t contain a valid room ID + * @MATRIX_ERROR_UNKNOWN_VALUE: the response from the Matrix.org server contains a value unknown + * to this library. These should be reported to the Matrix GLib SDK developers + * @MATRIX_ERROR_INVALID_TYPE: the provided type is invalid + * @MATRIX_ERROR_UNSUPPORTED: the operation is unsupported + * @MATRIX_ERROR_INVALID_FORMAT: the format of the JSON node is invalid (e.g. it is an array instead of an object) + * @MATRIX_ERROR_UNAVAILABLE: the requested data is not cached yet. Clients getting this message + * may go online by some means to get the data + * @MATRIX_ERROR_NOT_FOUND: the requested data (e.g. member of a room) can not be found + * @MATRIX_ERROR_ALREADY_EXISTS: the data to create (e.g. when adding a new member to a Room + * object) already exists + * @MATRIX_ERROR_M_MISSING_TOKEN: authorization token is missing from the request + * @MATRIX_ERROR_M_FORBIDDEN: access was forbidden (e.g. due to a missing/invalid token, or using + * a bad password during login) + * @MATRIX_ERROR_M_UNKNOWN: an error unknown to the Matrix homeserver + * @MATRIX_ERROR_M_UNKNOWN_TOKEN: the token provided is not known for the homeserver + * @MATRIX_ERROR_M_NOT_JSON: illegal request, the content is not valid JSON + * @MATRIX_ERROR_M_UNRECOGNIZED: the homeserver didn't understand the request + * @MATRIX_ERROR_M_UNAUTHORIZED: the request is unauthorized + * @MATRIX_ERROR_M_BAD_JSON: the JSON data is not in the required format + * @MATRIX_ERROR_M_USER_IN_USE: the specified username is in use + * @MATRIX_ERROR_M_ROOM_IN_USE: the specified room is in use + * @MATRIX_ERROR_M_BAD_PAGINATION: invalid pagination parameters + * @MATRIX_ERROR_M_BAD_STATE: invalid state event + * @MATRIX_ERROR_M_NOT_FOUND: the requested resource is not found + * @MATRIX_ERROR_M_GUEST_ACCESS_FORBIDDEN: guest access was requested, but ( it is forbidden + * @MATRIX_ERROR_M_LIMIT_EXCEEDED: the request was rate limited + * @MATRIX_ERROR_M_CAPTCHA_NEEDED: a captcha is needed to continue + * @MATRIX_ERROR_M_CAPTCHA_INVALID: the provided captcha is invalid + * @MATRIX_ERROR_M_MISSING_PARAM: a parameter is missing from the request + * @MATRIX_ERROR_M_TOO_LARGE: the request data is too large + * @MATRIX_ERROR_M_EXCLUSIVE: the desired user ID is in an exclusive namespace claimed by an + * application server + * @MATRIX_ERROR_M_THREEPID_AUTH_FAILED: 3rd party authentication failed + * @MATRIX_ERROR_M_THREEPID_IN_USE: the provided 3rd party ID is already in use + * @MATRIX_ERROR_M_INVALID_USERNAME: the given username is invalid + * @MATRIX_ERROR_UNSPECIFIED: no error code was sent by the homeserver. If you see this error, + * that usually indicates a homeserver bug + * @MATRIX_ERROR_UNKNOWN_ERROR: an error unknown to this library + * + * Matrix SDK error codes. The SDK maps most known error codes from homeservers, too; these are + * the MATRIX_ERROR_M_* codes. + */ + +/** + * MATRIX_ERROR: + * + * Error domain for Matrix GLib SDK. See #GError for more information on error domains. + */ + +/** + * matrix_error_quark: + * + * Gets the Matrix error #GQuark + */ +G_DEFINE_QUARK(matrix-error-quark, matrix_error); diff --git a/src/matrix-c-types.h b/src/matrix-c-types.h new file mode 100644 index 0000000..405e77c --- /dev/null +++ b/src/matrix-c-types.h @@ -0,0 +1,77 @@ +/* + * This file is part of matrix-glib-sdk + * + * matrix-glib-sdk 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 3 of the License, or (at your option) any later version. + * + * matrix-glib-sdk 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 matrix-glib-sdk. If not, see + * . + */ + +#ifndef __MATRIX_TYPE_H__ +# define __MATRIX_TYPE_H__ + +# include + +typedef enum { + MATRIX_ERROR_NONE, + MATRIX_ERROR_COMMUNICATION_ERROR, + MATRIX_ERROR_INCOMPLETE, + MATRIX_ERROR_BAD_REQUEST, + MATRIX_ERROR_BAD_RESPONSE, + MATRIX_ERROR_INVALID_ROOM_ID, + MATRIX_ERROR_UNKNOWN_VALUE, + MATRIX_ERROR_INVALID_TYPE, + MATRIX_ERROR_UNSUPPORTED, + MATRIX_ERROR_INVALID_FORMAT, + MATRIX_ERROR_UNAVAILABLE, + MATRIX_ERROR_NOT_FOUND, + MATRIX_ERROR_ALREADY_EXISTS, + + /* Add Matrix-defined error codes under here, prefixing them with + * `MATRIX_ERROR_`, i.e. `M_FORBIDDEN` => + * `MATRIX_ERROR_M_FORBIDDEN` */ + + MATRIX_ERROR_M_MISSING_TOKEN = 500, + MATRIX_ERROR_M_FORBIDDEN, + MATRIX_ERROR_M_UNKNOWN, + MATRIX_ERROR_M_UNKNOWN_TOKEN, + MATRIX_ERROR_M_NOT_JSON, + MATRIX_ERROR_M_UNRECOGNIZED, + MATRIX_ERROR_M_UNAUTHORIZED, + MATRIX_ERROR_M_BAD_JSON, + MATRIX_ERROR_M_USER_IN_USE, + MATRIX_ERROR_M_ROOM_IN_USE, + MATRIX_ERROR_M_BAD_PAGINATION, + MATRIX_ERROR_M_BAD_STATE, + MATRIX_ERROR_M_NOT_FOUND, + MATRIX_ERROR_M_GUEST_ACCESS_FORBIDDEN, + MATRIX_ERROR_M_LIMIT_EXCEEDED, + MATRIX_ERROR_M_CAPTCHA_NEEDED, + MATRIX_ERROR_M_CAPTCHA_INVALID, + MATRIX_ERROR_M_MISSING_PARAM, + MATRIX_ERROR_M_TOO_LARGE, + MATRIX_ERROR_M_EXCLUSIVE, + MATRIX_ERROR_M_THREEPID_AUTH_FAILED, + MATRIX_ERROR_M_THREEPID_IN_USE, + MATRIX_ERROR_M_INVALID_USERNAME, + + /* Allow for a lot of Matrix.org defined codes. Do not define + * Matrix-specific error codes after this! */ + + MATRIX_ERROR_UNSPECIFIED = 16383, + MATRIX_ERROR_UNKNOWN_ERROR +} MatrixError; + +# define MATRIX_ERROR matrix_error_quark() +GQuark matrix_error_quark(void); + +#endif /* __MATRIX_TYPE_H__ */ diff --git a/src/matrix-enumtypes.c.template b/src/matrix-enumtypes.c.template new file mode 100644 index 0000000..82f02a8 --- /dev/null +++ b/src/matrix-enumtypes.c.template @@ -0,0 +1,59 @@ +/*** BEGIN file-header ***/ +/* + * This file is part of matrix-glib-sdk + * + * matrix-glib-sdk 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 3 of the License, or (at your option) any later version. + * + * matrix-glib-sdk 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 matrix-glib-sdk. If not, see + * . + */ + +#include "matrix-enumtypes.h" +/*** END file-header ***/ + +/*** BEGIN file-production ***/ + +/* enumerations from @filename@ */ +/*** END file-production ***/ + +/*** BEGIN value-header ***/ + +GType +@enum_name@_get_type(void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter(&g_define_type_id__volatile)) { + static const G@Type@Value values[] = { +/*** END value-header ***/ + +/*** BEGIN value-production ***/ + { + @VALUENAME@, + "@VALUENAME@", + "@valuenick@" + }, +/*** END value-production ***/ + +/*** BEGIN value-tail ***/ + {0, NULL, NULL} + }; + + GType g_define_type_id = g_@type@_register_static( + g_intern_static_string("@EnumName@"), + values); + g_once_init_leave(&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} +/*** END value-tail ***/ diff --git a/src/matrix-enumtypes.h.template b/src/matrix-enumtypes.h.template new file mode 100644 index 0000000..0327afa --- /dev/null +++ b/src/matrix-enumtypes.h.template @@ -0,0 +1,42 @@ +/*** BEGIN file-header ***/ +/* + * This file is part of matrix-glib-sdk + * + * matrix-glib-sdk 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 3 of the License, or (at your option) any later version. + * + * matrix-glib-sdk 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 matrix-glib-sdk. If not, see + * . + */ + +#ifndef __MATRIX_ENUMTYPES_H__ +#define __MATRIX_ENUMTYPES_H__ + +#include + +/*** END file-header ***/ + +/*** BEGIN file-production ***/ +/* enumerations from "@filename@" */ + +#include "@filename@" +/*** END file-production ***/ + +/*** BEGIN value-header ***/ + +GType @enum_name@_get_type(void); +#define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (@enum_name@_get_type()) +/*** END value-header ***/ + +/*** BEGIN file-tail ***/ + +#endif /* __MATRIX_ENUMTYPES_H__ */ +/*** END file-tail ***/ diff --git a/src/matrix-types.vala b/src/matrix-types.vala index aced833..bc4d934 100644 --- a/src/matrix-types.vala +++ b/src/matrix-types.vala @@ -17,220 +17,6 @@ */ namespace Matrix { - public errordomain Error { - /** - * no error. You should never see this. - */ - NONE, - - /** - * there was a problem in communication (e.g. connection - * error) - */ - COMMUNICATION_ERROR, - - /** - * the passed/generated data is incomplete - */ - INCOMPLETE, - - /** - * the request is invalid - */ - BAD_REQUEST, - - /** - * malformed response, or the response is not a JSON object - */ - BAD_RESPONSE, - - /** - * the provided string doesn’t contain a valid room ID - */ - INVALID_ROOM_ID, - - /** - * the response from the Matrix.org server contains a value - * unknown to this library. These should be reported to the - * Matrix GLib SDK developers - */ - UNKNOWN_VALUE, - - /** - * the provided type is invalid - */ - INVALID_TYPE, - - /** - * the operation is unsupported - */ - UNSUPPORTED, - - /** - * the format of the JSON node is invalid (e.g. it is an array - * instead of an object) - */ - INVALID_FORMAT, - - /** - * the requested data is not cached yet. Clients getting this - * message may go online by some means to get the data - */ - UNAVAILABLE, - - /** - * the requested data (e.g. member of a room) can not be found - */ - NOT_FOUND, - - /** - * the data to create (e.g. when adding a new member to a Room - * object) already exists - */ - ALREADY_EXISTS, - - /* Add Matrix-defined error codes under here, prefixing them with - * `MATRIX_ERROR_`, i.e. `M_FORBIDDEN` => - * `MATRIX_ERROR_M_FORBIDDEN` */ - - /** - * authorization token is missing from the request - */ - M_MISSING_TOKEN = 500, - - /** - * access was forbidden (e.g. due to a missing/invalid token, - * or using a bad password during login) - */ - M_FORBIDDEN, - - /** - * an error unknown to the Matrix homeserver - */ - M_UNKNOWN, - - /** - * the token provided is not known for the homeserver - */ - M_UNKNOWN_TOKEN, - - /** - * illegal request, the content is not valid JSON - */ - M_NOT_JSON, - - /** - * the homeserver didn't understand the request - */ - M_UNRECOGNIZED, - - /** - * the request is unauthorized - */ - M_UNAUTHORIZED, - - /** - * the JSON data is not in the required format - */ - M_BAD_JSON, - - /** - * the specified username is in use - */ - M_USER_IN_USE, - - /** - * the specified room is in use - */ - M_ROOM_IN_USE, - - /** - * invalid pagination parameters - */ - M_BAD_PAGINATION, - - /** - * invalid state event - */ - M_BAD_STATE, - - /** - * the requested resource is not found - */ - M_NOT_FOUND, - - /** - * guest access was requested, but ( it is forbidden - */ - M_GUEST_ACCESS_FORBIDDEN, - - /** - * the request was rate limited - */ - M_LIMIT_EXCEEDED, - - /** - * a captcha is needed to continue - */ - M_CAPTCHA_NEEDED, - - /** - * the provided captcha is invalid - */ - M_CAPTCHA_INVALID, - - /** - * a parameter is missing from the request - */ - M_MISSING_PARAM, - - /** - * the request data is too large - */ - M_TOO_LARGE, - - /** - * the desired user ID is in an exclusive namespace claimed by - * an application server - */ - M_EXCLUSIVE, - - /** - * 3rd party authentication failed - */ - M_THREEPID_AUTH_FAILED, - - /** - * the provided 3rd party ID is already in use - */ - M_THREEPID_IN_USE, - - /** - * the given username is invalid - */ - M_INVALID_USERNAME, - - /* Allow for a lot of Matrix.org defined codes. Do not define - * Matrix-specific error codes after this! */ - - /** - * no error code was sent by the homeserver. If you see this - * error, that usually indicates a homeserver bug - */ - UNSPECIFIED = 16383, - - /** - * an error unknown to this library - */ - UNKNOWN_ERROR; - - public static GLib.Quark - quark () - { - return Quark.from_string("matrix-error-quark"); - } - } - /** * User account types. */ diff --git a/vapi/c-api.vapi b/vapi/c-api.vapi index ddc01f6..a09b23f 100644 --- a/vapi/c-api.vapi +++ b/vapi/c-api.vapi @@ -18,6 +18,50 @@ [CCode (cprefix = "Matrix", gir_namespace = "Matrix", gir_version = "0.0", lower_case_cprefix = "matrix_")] namespace Matrix { + [CCode (cheader_filename = "matrix-enumtypes.h", cprefix = "MATRIX_ERROR_")] + public errordomain Error { + NONE, + COMMUNICATION_ERROR, + INCOMPLETE, + BAD_REQUEST, + BAD_RESPONSE, + INVALID_ROOM_ID, + UNKNOWN_VALUE, + INVALID_TYPE, + UNSUPPORTED, + INVALID_FORMAT, + UNAVAILABLE, + NOT_FOUND, + ALREADY_EXISTS, + M_MISSING_TOKEN, + M_FORBIDDEN, + M_UNKNOWN, + M_UNKNOWN_TOKEN, + M_NOT_JSON, + M_UNRECOGNIZED, + M_UNAUTHORIZED, + M_BAD_JSON, + M_USER_IN_USE, + M_ROOM_IN_USE, + M_BAD_PAGINATION, + M_BAD_STATE, + M_NOT_FOUND, + M_GUEST_ACCESS_FORBIDDEN, + M_LIMIT_EXCEEDED, + M_CAPTCHA_NEEDED, + M_CAPTCHA_INVALID, + M_MISSING_PARAM, + M_TOO_LARGE, + M_EXCLUSIVE, + M_THREEPID_AUTH_FAILED, + M_THREEPID_IN_USE, + M_INVALID_USERNAME, + UNSPECIFIED, + UNKNOWN_ERROR; + + public static GLib.Quark quark (); + } + /** * The major version number of the Matrix.org GLib SDK. */