/* * params-cm.h - source for TpTestsParamConnectionManager * * Copyright © 2007-2009 Collabora Ltd. * Copyright © 2007-2009 Nokia Corporation * * 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.1 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "params-cm.h" #include #include #include G_DEFINE_TYPE (TpTestsParamConnectionManager, tp_tests_param_connection_manager, TP_TYPE_BASE_CONNECTION_MANAGER) struct _TpTestsParamConnectionManagerPrivate { int dummy; }; static void tp_tests_param_connection_manager_init ( TpTestsParamConnectionManager *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, TP_TESTS_TYPE_PARAM_CONNECTION_MANAGER, TpTestsParamConnectionManagerPrivate); } enum { TP_TESTS_PARAM_STRING, TP_TESTS_PARAM_INT16, TP_TESTS_PARAM_INT32, TP_TESTS_PARAM_UINT16, TP_TESTS_PARAM_UINT32, TP_TESTS_PARAM_INT64, TP_TESTS_PARAM_UINT64, TP_TESTS_PARAM_BOOLEAN, TP_TESTS_PARAM_DOUBLE, TP_TESTS_PARAM_ARRAY_STRINGS, TP_TESTS_PARAM_ARRAY_BYTES, TP_TESTS_PARAM_OBJECT_PATH, TP_TESTS_PARAM_LC_STRING, TP_TESTS_PARAM_UC_STRING, NUM_PARAM }; static gboolean filter_string_ascii_case (const TpCMParamSpec *param_spec, GValue *value, GError **error) { const gchar *s = g_value_get_string (value); guint i; for (i = 0; s[i] != '\0'; i++) { int c = s[i]; /* just to avoid -Wtype-limits */ if (c < 0 || c > 127) /* char might be signed or unsigned */ { g_set_error (error, TP_ERRORS, TP_ERROR_INVALID_ARGUMENT, "%s must be ASCII", param_spec->name); return FALSE; } } if (GINT_TO_POINTER (param_spec->filter_data)) g_value_take_string (value, g_ascii_strup (s, -1)); else g_value_take_string (value, g_ascii_strdown (s, -1)); return TRUE; } static TpCMParamSpec param_example_params[] = { { "a-string", "s", G_TYPE_STRING, TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT, "the default string", G_STRUCT_OFFSET (TpTestsCMParams, a_string), NULL, NULL, NULL }, { "a-int16", "n", G_TYPE_INT, TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT, GINT_TO_POINTER (42), G_STRUCT_OFFSET (TpTestsCMParams, a_int16), NULL, NULL, NULL }, { "a-int32", "i", G_TYPE_INT, TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT, GINT_TO_POINTER (42), G_STRUCT_OFFSET (TpTestsCMParams, a_int32), NULL, NULL, NULL }, { "a-uint16", "q", G_TYPE_UINT, 0, NULL, G_STRUCT_OFFSET (TpTestsCMParams, a_uint16), NULL, NULL, NULL }, { "a-uint32", "u", G_TYPE_UINT, 0, NULL, G_STRUCT_OFFSET (TpTestsCMParams, a_uint32), NULL, NULL, NULL }, { "a-int64", "x", G_TYPE_INT64, 0, NULL, G_STRUCT_OFFSET (TpTestsCMParams, a_int64), NULL, NULL, NULL }, { "a-uint64", "t", G_TYPE_UINT64, 0, NULL, G_STRUCT_OFFSET (TpTestsCMParams, a_uint64), NULL, NULL, NULL }, { "a-boolean", "b", G_TYPE_BOOLEAN, TP_CONN_MGR_PARAM_FLAG_REQUIRED, NULL, G_STRUCT_OFFSET (TpTestsCMParams, a_boolean), NULL, NULL, NULL }, { "a-double", "d", G_TYPE_DOUBLE, 0, NULL, G_STRUCT_OFFSET (TpTestsCMParams, a_double), NULL, NULL, NULL }, { "a-array-of-strings", "as", 0, 0, NULL, G_STRUCT_OFFSET (TpTestsCMParams, a_array_of_strings), NULL, NULL, NULL }, { "a-array-of-bytes", "ay", 0, 0, NULL, G_STRUCT_OFFSET (TpTestsCMParams, a_array_of_bytes), NULL, NULL, NULL }, { "a-object-path", "o", 0, 0, NULL, G_STRUCT_OFFSET (TpTestsCMParams, a_object_path), NULL, NULL, NULL }, /* demo of a filter */ { "lc-string", "s", G_TYPE_STRING, 0, NULL, G_STRUCT_OFFSET (TpTestsCMParams, lc_string), filter_string_ascii_case, GINT_TO_POINTER (FALSE), NULL }, { "uc-string", "s", G_TYPE_STRING, 0, NULL, G_STRUCT_OFFSET (TpTestsCMParams, uc_string), filter_string_ascii_case, GINT_TO_POINTER (TRUE), NULL }, { NULL } }; static TpTestsCMParams *params = NULL; static gpointer alloc_params (void) { params = g_slice_new0 (TpTestsCMParams); return params; } static void free_params (gpointer p) { /* CM user is responsible to free params so he can check their values */ params = (TpTestsCMParams *) p; params->would_have_been_freed = TRUE; } static const TpCMProtocolSpec example_protocols[] = { { "example", param_example_params, alloc_params, free_params }, { NULL, NULL } }; static TpBaseConnection * new_connection (TpBaseConnectionManager *self, const gchar *proto, TpIntset *params_present, gpointer parsed_params, GError **error) { g_set_error (error, TP_ERRORS, TP_ERROR_NOT_IMPLEMENTED, "No connection for you"); return NULL; } static void tp_tests_param_connection_manager_class_init ( TpTestsParamConnectionManagerClass *klass) { TpBaseConnectionManagerClass *base_class = (TpBaseConnectionManagerClass *) klass; g_type_class_add_private (klass, sizeof (TpTestsParamConnectionManagerPrivate)); param_example_params[TP_TESTS_PARAM_ARRAY_STRINGS].gtype = G_TYPE_STRV; param_example_params[TP_TESTS_PARAM_ARRAY_BYTES].gtype = DBUS_TYPE_G_UCHAR_ARRAY; param_example_params[TP_TESTS_PARAM_OBJECT_PATH].gtype = DBUS_TYPE_G_OBJECT_PATH; base_class->new_connection = new_connection; base_class->cm_dbus_name = "params_cm"; base_class->protocol_params = example_protocols; } TpTestsCMParams * tp_tests_param_connection_manager_steal_params_last_conn (void) { TpTestsCMParams *p = params; params = NULL; return p; } void tp_tests_param_connection_manager_free_params (TpTestsCMParams *p) { g_free (p->a_string); g_strfreev (p->a_array_of_strings); if (p->a_array_of_bytes != NULL) g_array_free (p->a_array_of_bytes, TRUE); g_free (p->a_object_path); g_slice_free (TpTestsCMParams, p); }