Blame shared/nm-utils/nm-vpn-editor-plugin-call.h

Packit Service d328f3
/* NetworkManager -- Network link manager
Packit Service d328f3
 *
Packit Service d328f3
 * This program is free software; you can redistribute it and/or modify
Packit Service d328f3
 * it under the terms of the GNU General Public License as published by
Packit Service d328f3
 * the Free Software Foundation; either version 2 of the License, or
Packit Service d328f3
 * (at your option) any later version.
Packit Service d328f3
 *
Packit Service d328f3
 * This program is distributed in the hope that it will be useful,
Packit Service d328f3
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service d328f3
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service d328f3
 * GNU General Public License for more details.
Packit Service d328f3
 *
Packit Service d328f3
 * You should have received a copy of the GNU General Public License along
Packit Service d328f3
 * with this program; if not, write to the Free Software Foundation, Inc.,
Packit Service d328f3
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Packit Service d328f3
 *
Packit Service d328f3
 * Copyright (C) 2016 Red Hat, Inc.
Packit Service d328f3
 */
Packit Service d328f3
Packit Service d328f3
#ifndef __NM_VPN_EDITOR_PLUGIN_CALL_H__
Packit Service d328f3
#define __NM_VPN_EDITOR_PLUGIN_CALL_H__
Packit Service d328f3
Packit Service d328f3
/* This header is an internal, header-only file that can be copied to
Packit Service d328f3
 * other projects to call well-known service functions on VPN plugins.
Packit Service d328f3
 *
Packit Service d328f3
 * This uses the NMVpnEditorPluginVT and allows a user (nm-applet)
Packit Service d328f3
 * to directly communicate with a VPN plugin using API that is newer
Packit Service d328f3
 * then the current libnm version. That is, it allows to call to a VPN
Packit Service d328f3
 * plugin bypassing libnm. */
Packit Service d328f3
Packit Service d328f3
#include <NetworkManager.h>
Packit Service d328f3
Packit Service d328f3
/* we make use of other internal header files, you need those too. */
Packit Service d328f3
#include "nm-macros-internal.h"
Packit Service d328f3
Packit Service d328f3
/*****************************************************************************/
Packit Service d328f3
Packit Service d328f3
/**
Packit Service d328f3
 * NMVpnEditorPluginServiceFlags:
Packit Service d328f3
 * @NM_VPN_EDITOR_PLUGIN_SERVICE_FLAGS_NONE: no flags
Packit Service d328f3
 * @NM_VPN_EDITOR_PLUGIN_SERVICE_FLAGS_CAN_ADD: whether the plugin can
Packit Service d328f3
 *   add a new connection for the given service-type.
Packit Service d328f3
 **/
Packit Service d328f3
typedef enum { /*< skip >*/
Packit Service d328f3
	NM_VPN_EDITOR_PLUGIN_SERVICE_FLAGS_NONE     = 0x00,
Packit Service d328f3
	NM_VPN_EDITOR_PLUGIN_SERVICE_FLAGS_CAN_ADD  = 0x01,
Packit Service d328f3
} NMVpnEditorPluginServiceFlags;
Packit Service d328f3
Packit Service d328f3
struct _NMVpnEditorPluginVT {
Packit Service d328f3
	gboolean (*fcn_get_service_info) (NMVpnEditorPlugin *plugin,
Packit Service d328f3
	                                  const char *service_type,
Packit Service d328f3
	                                  char **out_short_name,
Packit Service d328f3
	                                  char **out_pretty_name,
Packit Service d328f3
	                                  char **out_description,
Packit Service d328f3
	                                  NMVpnEditorPluginServiceFlags *out_flags);
Packit Service d328f3
	char **(*fcn_get_service_add_details) (NMVpnEditorPlugin *plugin,
Packit Service d328f3
	                                       const char *service_name);
Packit Service d328f3
	gboolean (*fcn_get_service_add_detail) (NMVpnEditorPlugin *plugin,
Packit Service d328f3
	                                        const char *service_type,
Packit Service d328f3
	                                        const char *add_detail,
Packit Service d328f3
	                                        char **out_pretty_name,
Packit Service d328f3
	                                        char **out_description,
Packit Service d328f3
	                                        char **out_add_detail_key,
Packit Service d328f3
	                                        char **out_add_detail_val,
Packit Service d328f3
	                                        guint *out_flags);
Packit Service d328f3
};
Packit Service d328f3
Packit Service d328f3
/*****************************************************************************
Packit Service d328f3
 * Call
Packit Service d328f3
 *
Packit Service d328f3
 * The following wrap the calling of generic functions for a VPN plugin.
Packit Service d328f3
 * They are used by callers (for example nm-connection-editor).
Packit Service d328f3
 *****************************************************************************/
Packit Service d328f3
Packit Service d328f3
static inline gboolean
Packit Service d328f3
nm_vpn_editor_plugin_get_service_info (NMVpnEditorPlugin *plugin,
Packit Service d328f3
                                       const char *service_type,
Packit Service d328f3
                                       char **out_short_name,
Packit Service d328f3
                                       char **out_pretty_name,
Packit Service d328f3
                                       char **out_description,
Packit Service d328f3
                                       NMVpnEditorPluginServiceFlags *out_flags)
Packit Service d328f3
{
Packit Service d328f3
	NMVpnEditorPluginVT vt;
Packit Service d328f3
	gs_free char *short_name_local = NULL;
Packit Service d328f3
	gs_free char *pretty_name_local = NULL;
Packit Service d328f3
	gs_free char *description_local = NULL;
Packit Service d328f3
	guint flags_local = 0;
Packit Service d328f3
Packit Service d328f3
	g_return_val_if_fail (NM_IS_VPN_EDITOR_PLUGIN (plugin), FALSE);
Packit Service d328f3
	g_return_val_if_fail (service_type, FALSE);
Packit Service d328f3
Packit Service d328f3
	nm_vpn_editor_plugin_get_vt (plugin, &vt, sizeof (vt));
Packit Service d328f3
	if (   !vt.fcn_get_service_info
Packit Service d328f3
	    || !vt.fcn_get_service_info (plugin,
Packit Service d328f3
	                                 service_type,
Packit Service d328f3
	                                 out_short_name  ? &short_name_local : NULL,
Packit Service d328f3
	                                 out_pretty_name ? &pretty_name_local : NULL,
Packit Service d328f3
	                                 out_description ? &description_local : NULL,
Packit Service d328f3
	                                 out_flags       ? &flags_local : NULL))
Packit Service d328f3
		return FALSE;
Packit Service d328f3
	NM_SET_OUT (out_short_name, g_steal_pointer (&short_name_local));
Packit Service d328f3
	NM_SET_OUT (out_pretty_name, g_steal_pointer (&pretty_name_local));
Packit Service d328f3
	NM_SET_OUT (out_description, g_steal_pointer (&description_local));
Packit Service d328f3
	NM_SET_OUT (out_flags, flags_local);
Packit Service d328f3
	return TRUE;
Packit Service d328f3
}
Packit Service d328f3
Packit Service d328f3
static inline char **
Packit Service d328f3
nm_vpn_editor_plugin_get_service_add_details (NMVpnEditorPlugin *plugin,
Packit Service d328f3
                                              const char *service_name)
Packit Service d328f3
{
Packit Service d328f3
	NMVpnEditorPluginVT vt;
Packit Service d328f3
	char **details = NULL;
Packit Service d328f3
Packit Service d328f3
	g_return_val_if_fail (NM_IS_VPN_EDITOR_PLUGIN (plugin), NULL);
Packit Service d328f3
	g_return_val_if_fail (service_name, NULL);
Packit Service d328f3
Packit Service d328f3
	nm_vpn_editor_plugin_get_vt (plugin, &vt, sizeof (vt));
Packit Service d328f3
	if (vt.fcn_get_service_add_details)
Packit Service d328f3
		details = vt.fcn_get_service_add_details (plugin, service_name);
Packit Service d328f3
	if (!details)
Packit Service d328f3
		return g_new0 (char *, 1);
Packit Service d328f3
	return details;
Packit Service d328f3
}
Packit Service d328f3
Packit Service d328f3
static inline gboolean
Packit Service d328f3
nm_vpn_editor_plugin_get_service_add_detail (NMVpnEditorPlugin *plugin,
Packit Service d328f3
                                             const char *service_type,
Packit Service d328f3
                                             const char *add_detail,
Packit Service d328f3
                                             char **out_pretty_name,
Packit Service d328f3
                                             char **out_description,
Packit Service d328f3
                                             char **out_add_detail_key,
Packit Service d328f3
                                             char **out_add_detail_val,
Packit Service d328f3
                                             guint *out_flags)
Packit Service d328f3
{
Packit Service d328f3
	NMVpnEditorPluginVT vt;
Packit Service d328f3
	gs_free char *pretty_name_local = NULL;
Packit Service d328f3
	gs_free char *description_local = NULL;
Packit Service d328f3
	gs_free char *add_detail_key_local = NULL;
Packit Service d328f3
	gs_free char *add_detail_val_local = NULL;
Packit Service d328f3
	guint flags_local = 0;
Packit Service d328f3
Packit Service d328f3
	g_return_val_if_fail (NM_IS_VPN_EDITOR_PLUGIN (plugin), FALSE);
Packit Service d328f3
	g_return_val_if_fail (service_type, FALSE);
Packit Service d328f3
	g_return_val_if_fail (add_detail, FALSE);
Packit Service d328f3
Packit Service d328f3
	nm_vpn_editor_plugin_get_vt (plugin, &vt, sizeof (vt));
Packit Service d328f3
	if (   !vt.fcn_get_service_add_detail
Packit Service d328f3
	    || !vt.fcn_get_service_add_detail (plugin,
Packit Service d328f3
	                                       service_type,
Packit Service d328f3
	                                       add_detail,
Packit Service d328f3
	                                       out_pretty_name    ? &pretty_name_local : NULL,
Packit Service d328f3
	                                       out_description    ? &description_local : NULL,
Packit Service d328f3
	                                       out_add_detail_key ? &add_detail_key_local : NULL,
Packit Service d328f3
	                                       out_add_detail_val ? &add_detail_val_local : NULL,
Packit Service d328f3
	                                       out_flags          ? &flags_local : NULL))
Packit Service d328f3
		return FALSE;
Packit Service d328f3
	NM_SET_OUT (out_pretty_name, g_steal_pointer (&pretty_name_local));
Packit Service d328f3
	NM_SET_OUT (out_description, g_steal_pointer (&description_local));
Packit Service d328f3
	NM_SET_OUT (out_add_detail_key, g_steal_pointer (&add_detail_key_local));
Packit Service d328f3
	NM_SET_OUT (out_add_detail_val, g_steal_pointer (&add_detail_val_local));
Packit Service d328f3
	NM_SET_OUT (out_flags, flags_local);
Packit Service d328f3
	return TRUE;
Packit Service d328f3
}
Packit Service d328f3
Packit Service d328f3
/*****************************************************************************
Packit Service d328f3
 * Implementation
Packit Service d328f3
 *
Packit Service d328f3
 * The following glue code can be used to implement calls in a VPN plugin.
Packit Service d328f3
 *****************************************************************************/
Packit Service d328f3
Packit Service d328f3
#define NM_VPN_EDITOR_PLUGIN_VT_DEFINE(vt_name, get_vt, ...) \
Packit Service d328f3
static const NMVpnEditorPluginVT vt_name = { \
Packit Service d328f3
		__VA_ARGS__ \
Packit Service d328f3
	}; \
Packit Service d328f3
static const NMVpnEditorPluginVT * \
Packit Service d328f3
get_vt (NMVpnEditorPlugin *plugin, \
Packit Service d328f3
        gsize *out_vt_size) \
Packit Service d328f3
{ \
Packit Service d328f3
	nm_assert (NM_IS_VPN_EDITOR_PLUGIN (plugin)); \
Packit Service d328f3
	nm_assert (out_vt_size); \
Packit Service d328f3
	\
Packit Service d328f3
	*out_vt_size = sizeof (vt_name); \
Packit Service d328f3
	return &vt_name; \
Packit Service d328f3
}
Packit Service d328f3
Packit Service d328f3
#endif /* __NM_VPN_EDITOR_PLUGIN_CALL_H__ */