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