all: reformat all with new clang-format style

Run:

    ./contrib/scripts/nm-code-format.sh -i
    ./contrib/scripts/nm-code-format.sh -i

Yes, it needs to run twice because the first run doesn't yet produce the
final result.

Signed-off-by: Antonio Cardace <acardace@redhat.com>
This commit is contained in:
Antonio Cardace 2020-09-28 16:03:33 +02:00
parent b4d8e69cd4
commit 328fb90f3e
No known key found for this signature in database
GPG key ID: 6BF80ABD43E377D3
859 changed files with 325292 additions and 312497 deletions

View file

@ -17,17 +17,16 @@
#include "nm-polkit-listener.h"
static void
usage (void)
usage(void)
{
g_printerr (_("Usage: nmcli agent { COMMAND | help }\n\n"
"COMMAND := { secret | polkit | all }\n\n"
));
g_printerr(_("Usage: nmcli agent { COMMAND | help }\n\n"
"COMMAND := { secret | polkit | all }\n\n"));
}
static void
usage_agent_secret (void)
usage_agent_secret(void)
{
g_printerr (_("Usage: nmcli agent secret { help }\n"
g_printerr(_("Usage: nmcli agent secret { help }\n"
"\n"
"Runs nmcli as NetworkManager secret agent. When NetworkManager requires\n"
"a password it asks registered agents for it. This command keeps nmcli running\n"
@ -35,9 +34,9 @@ usage_agent_secret (void)
}
static void
usage_agent_polkit (void)
usage_agent_polkit(void)
{
g_printerr (_("Usage: nmcli agent polkit { help }\n"
g_printerr(_("Usage: nmcli agent polkit { help }\n"
"\n"
"Registers nmcli as a polkit action for the user session.\n"
"When a polkit daemon requires an authorization, nmcli asks the user and gives\n"
@ -45,9 +44,9 @@ usage_agent_polkit (void)
}
static void
usage_agent_all (void)
usage_agent_all(void)
{
g_printerr (_("Usage: nmcli agent all { help }\n"
g_printerr(_("Usage: nmcli agent all { help }\n"
"\n"
"Runs nmcli as both NetworkManager secret and a polkit agent.\n\n"));
}
@ -55,11 +54,11 @@ usage_agent_all (void)
/* for pre-filling a string to readline prompt */
static char *pre_input_deftext;
static int
set_deftext (void)
set_deftext(void)
{
if (pre_input_deftext && rl_startup_hook) {
rl_insert_text (pre_input_deftext);
g_free (pre_input_deftext);
rl_insert_text(pre_input_deftext);
g_free(pre_input_deftext);
pre_input_deftext = NULL;
rl_startup_hook = NULL;
}
@ -67,125 +66,120 @@ set_deftext (void)
}
static gboolean
get_secrets_from_user (const NmcConfig *nmc_config,
const char *request_id,
const char *title,
const char *msg,
GPtrArray *secrets)
get_secrets_from_user(const NmcConfig *nmc_config,
const char * request_id,
const char * title,
const char * msg,
GPtrArray * secrets)
{
int i;
for (i = 0; i < secrets->len; i++) {
NMSecretAgentSimpleSecret *secret = secrets->pdata[i];
char *pwd = NULL;
char * pwd = NULL;
/* Ask user for the password */
if (msg)
g_print ("%s\n", msg);
g_print("%s\n", msg);
if (secret->value) {
/* Prefill the password if we have it. */
rl_startup_hook = set_deftext;
pre_input_deftext = g_strdup (secret->value);
pre_input_deftext = g_strdup(secret->value);
}
if (secret->no_prompt_entry_id)
pwd = nmc_readline (nmc_config, "%s: ", secret->pretty_name);
pwd = nmc_readline(nmc_config, "%s: ", secret->pretty_name);
else
pwd = nmc_readline (nmc_config, "%s (%s): ", secret->pretty_name, secret->entry_id);
pwd = nmc_readline(nmc_config, "%s (%s): ", secret->pretty_name, secret->entry_id);
/* No password provided, cancel the secrets. */
if (!pwd)
return FALSE;
g_free (secret->value);
g_free(secret->value);
secret->value = pwd;
}
return TRUE;
}
static void
secrets_requested (NMSecretAgentSimple *agent,
const char *request_id,
const char *title,
const char *msg,
GPtrArray *secrets,
secrets_requested(NMSecretAgentSimple *agent,
const char * request_id,
const char * title,
const char * msg,
GPtrArray * secrets,
gpointer user_data)
{
NmCli *nmc = user_data;
NmCli * nmc = user_data;
gboolean success;
if (nmc->nmc_config.print_output == NMC_PRINT_PRETTY)
nmc_terminal_erase_line ();
nmc_terminal_erase_line();
success = get_secrets_from_user (&nmc->nmc_config, request_id, title, msg, secrets);
nm_secret_agent_simple_response (agent,
request_id,
success ? secrets : NULL);
success = get_secrets_from_user(&nmc->nmc_config, request_id, title, msg, secrets);
nm_secret_agent_simple_response(agent, request_id, success ? secrets : NULL);
}
static void
do_agent_secret (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv)
do_agent_secret(const NMCCommand *cmd, NmCli *nmc, int argc, const char *const *argv)
{
next_arg (nmc, &argc, &argv, NULL);
next_arg(nmc, &argc, &argv, NULL);
if (nmc->complete)
return;
/* Create secret agent */
nmc->secret_agent = nm_secret_agent_simple_new ("nmcli-agent");
nmc->secret_agent = nm_secret_agent_simple_new("nmcli-agent");
if (nmc->secret_agent) {
/* We keep running */
nmc->should_wait++;
nm_secret_agent_simple_enable (nmc->secret_agent, NULL);
g_signal_connect (nmc->secret_agent,
nm_secret_agent_simple_enable(nmc->secret_agent, NULL);
g_signal_connect(nmc->secret_agent,
NM_SECRET_AGENT_SIMPLE_REQUEST_SECRETS,
G_CALLBACK (secrets_requested),
G_CALLBACK(secrets_requested),
nmc);
g_print (_("nmcli successfully registered as a NetworkManager's secret agent.\n"));
g_print(_("nmcli successfully registered as a NetworkManager's secret agent.\n"));
} else {
g_string_printf (nmc->return_text, _("Error: secret agent initialization failed"));
g_string_printf(nmc->return_text, _("Error: secret agent initialization failed"));
nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
}
}
static void
polkit_registered (gpointer instance,
gpointer user_data)
polkit_registered(gpointer instance, gpointer user_data)
{
g_print (_("nmcli successfully registered as a polkit agent.\n"));
g_print(_("nmcli successfully registered as a polkit agent.\n"));
}
static void
polkit_error (gpointer instance,
const char *error,
gpointer user_data)
polkit_error(gpointer instance, const char *error, gpointer user_data)
{
g_main_loop_quit (loop);
g_main_loop_quit(loop);
}
static void
do_agent_polkit (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv)
do_agent_polkit(const NMCCommand *cmd, NmCli *nmc, int argc, const char *const *argv)
{
gs_free_error GError *error = NULL;
next_arg (nmc, &argc, &argv, NULL);
next_arg(nmc, &argc, &argv, NULL);
if (nmc->complete)
return;
if (!nmc_polkit_agent_init (nmc, TRUE, &error)) {
g_dbus_error_strip_remote_error (error);
g_string_printf (nmc->return_text,
if (!nmc_polkit_agent_init(nmc, TRUE, &error)) {
g_dbus_error_strip_remote_error(error);
g_string_printf(nmc->return_text,
_("Error: polkit agent initialization failed: %s"),
error->message);
nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
} else {
/* We keep running */
nmc->should_wait++;
g_signal_connect (nmc->pk_listener,
g_signal_connect(nmc->pk_listener,
NM_POLKIT_LISTENER_SIGNAL_ERROR,
G_CALLBACK (polkit_error),
G_CALLBACK(polkit_error),
NULL);
g_signal_connect (nmc->pk_listener,
g_signal_connect(nmc->pk_listener,
NM_POLKIT_LISTENER_SIGNAL_REGISTERED,
G_CALLBACK (polkit_registered),
G_CALLBACK(polkit_registered),
NULL);
/* keep running */
@ -194,27 +188,27 @@ do_agent_polkit (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*
}
static void
do_agent_all (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv)
do_agent_all(const NMCCommand *cmd, NmCli *nmc, int argc, const char *const *argv)
{
NMCResultCode r;
next_arg (nmc, &argc, &argv, NULL);
next_arg(nmc, &argc, &argv, NULL);
if (nmc->complete)
return;
/* Run both secret and polkit agent */
do_agent_secret (cmd, nmc, argc, argv);
do_agent_secret(cmd, nmc, argc, argv);
r = nmc->return_value;
if (r != NMC_RESULT_SUCCESS) {
g_printerr ("%s\n", nmc->return_text->str);
g_string_truncate (nmc->return_text, 0);
g_printerr("%s\n", nmc->return_text->str);
g_string_truncate(nmc->return_text, 0);
nmc->return_value = NMC_RESULT_SUCCESS;
}
do_agent_polkit (cmd, nmc, argc, argv);
do_agent_polkit(cmd, nmc, argc, argv);
if (nmc->return_value != NMC_RESULT_SUCCESS) {
g_printerr ("%s\n", nmc->return_text->str);
g_string_truncate (nmc->return_text, 0);
g_printerr("%s\n", nmc->return_text->str);
g_string_truncate(nmc->return_text, 0);
}
if (r != NMC_RESULT_SUCCESS)
@ -222,15 +216,15 @@ do_agent_all (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*arg
}
void
nmc_command_func_agent (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv)
nmc_command_func_agent(const NMCCommand *cmd, NmCli *nmc, int argc, const char *const *argv)
{
static const NMCCommand cmds[] = {
{ "secret", do_agent_secret, usage_agent_secret, TRUE, TRUE },
{ "polkit", do_agent_polkit, usage_agent_polkit, TRUE, TRUE },
{ "all", do_agent_all, usage_agent_all, TRUE, TRUE },
{ NULL, do_agent_all, usage, TRUE, TRUE },
{"secret", do_agent_secret, usage_agent_secret, TRUE, TRUE},
{"polkit", do_agent_polkit, usage_agent_polkit, TRUE, TRUE},
{"all", do_agent_all, usage_agent_all, TRUE, TRUE},
{NULL, do_agent_all, usage, TRUE, TRUE},
};
next_arg (nmc, &argc, &argv, NULL);
nmc_do_cmd (nmc, cmds, *argv, argc, argv);
next_arg(nmc, &argc, &argv, NULL);
nmc_do_cmd(nmc, cmds, *argv, argc, argv);
}

File diff suppressed because it is too large Load diff

View file

@ -9,81 +9,77 @@
#include "nmcli.h"
#include "nm-secret-agent-simple.h"
gboolean print_ip_config (NMIPConfig *cfg,
gboolean print_ip_config(NMIPConfig * cfg,
int addr_family,
const NmcConfig *nmc_config,
const char *one_field);
const char * one_field);
gboolean print_dhcp_config (NMDhcpConfig *dhcp,
gboolean print_dhcp_config(NMDhcpConfig * dhcp,
int addr_family,
const NmcConfig *nmc_config,
const char *one_field);
const char * one_field);
NMConnection *nmc_find_connection (const GPtrArray *connections,
const char *filter_type,
const char *filter_val,
GPtrArray **out_result,
NMConnection *nmc_find_connection(const GPtrArray *connections,
const char * filter_type,
const char * filter_val,
GPtrArray ** out_result,
gboolean complete);
NMActiveConnection *nmc_find_active_connection (const GPtrArray *active_cons,
const char *filter_type,
const char *filter_val,
GPtrArray **out_result,
NMActiveConnection *nmc_find_active_connection(const GPtrArray *active_cons,
const char * filter_type,
const char * filter_val,
GPtrArray ** out_result,
gboolean complete);
void nmc_secrets_requested (NMSecretAgentSimple *agent,
const char *request_id,
const char *title,
const char *msg,
GPtrArray *secrets,
void nmc_secrets_requested(NMSecretAgentSimple *agent,
const char * request_id,
const char * title,
const char * msg,
GPtrArray * secrets,
gpointer user_data);
char *nmc_unique_connection_name (const GPtrArray *connections,
const char *try_name);
char *nmc_unique_connection_name(const GPtrArray *connections, const char *try_name);
void nmc_cleanup_readline (void);
char *nmc_readline (const NmcConfig *nmc_config,
const char *prompt_fmt,
...) G_GNUC_PRINTF (2, 3);
char *nmc_readline_echo (const NmcConfig *nmc_config,
gboolean echo_on,
const char *prompt_fmt,
...) G_GNUC_PRINTF (3, 4);
NmcCompEntryFunc nmc_rl_compentry_func_wrap (const char *const*values);
char *nmc_rl_gen_func_basic (const char *text, int state, const char *const*words);
char *nmc_rl_gen_func_ifnames (const char *text, int state);
gboolean nmc_get_in_readline (void);
void nmc_set_in_readline (gboolean in_readline);
void nmc_cleanup_readline(void);
char *nmc_readline(const NmcConfig *nmc_config, const char *prompt_fmt, ...) G_GNUC_PRINTF(2, 3);
char *nmc_readline_echo(const NmcConfig *nmc_config, gboolean echo_on, const char *prompt_fmt, ...)
G_GNUC_PRINTF(3, 4);
NmcCompEntryFunc nmc_rl_compentry_func_wrap(const char *const *values);
char * nmc_rl_gen_func_basic(const char *text, int state, const char *const *words);
char * nmc_rl_gen_func_ifnames(const char *text, int state);
gboolean nmc_get_in_readline(void);
void nmc_set_in_readline(gboolean in_readline);
/* for pre-filling a string to readline prompt */
extern char *nmc_rl_pre_input_deftext;
int nmc_rl_set_deftext (void);
int nmc_rl_set_deftext(void);
char *nmc_parse_lldp_capabilities (guint value);
char *nmc_parse_lldp_capabilities(guint value);
void nmc_do_cmd (NmCli *nmc, const NMCCommand cmds[], const char *cmd, int argc, const char *const*argv);
void
nmc_do_cmd(NmCli *nmc, const NMCCommand cmds[], const char *cmd, int argc, const char *const *argv);
void nmc_complete_strv (const char *prefix, gssize nargs, const char *const*args);
void nmc_complete_strv(const char *prefix, gssize nargs, const char *const *args);
#define nmc_complete_strings(prefix, ...) nmc_complete_strv ((prefix), NM_NARG (__VA_ARGS__), (const char *const[]) { __VA_ARGS__ })
#define nmc_complete_strings(prefix, ...) \
nmc_complete_strv((prefix), NM_NARG(__VA_ARGS__), (const char *const[]){__VA_ARGS__})
void nmc_complete_bool (const char *prefix);
void nmc_complete_bool(const char *prefix);
const char *nmc_error_get_simple_message (GError *error);
const char *nmc_error_get_simple_message(GError *error);
extern const NmcMetaGenericInfo *const metagen_ip4_config[];
extern const NmcMetaGenericInfo *const metagen_ip6_config[];
extern const NmcMetaGenericInfo *const metagen_dhcp_config[];
const char *nm_connectivity_to_string (NMConnectivityState connectivity);
const char *nm_connectivity_to_string(NMConnectivityState connectivity);
GVariant *nmc_dbus_call_sync (NmCli *nmc,
const char *object_path,
const char *interface_name,
const char *method_name,
GVariant *parameters,
GVariant *nmc_dbus_call_sync(NmCli * nmc,
const char * object_path,
const char * interface_name,
const char * method_name,
GVariant * parameters,
const GVariantType *reply_type,
GError **error);
GError ** error);
#endif /* NMC_COMMON_H */

File diff suppressed because it is too large Load diff

View file

@ -8,19 +8,18 @@
#include "nmcli.h"
void monitor_connections (NmCli *nmc);
void monitor_connections(NmCli *nmc);
gboolean
nmc_process_connection_properties (NmCli *nmc,
NMConnection *connection,
int *argc,
const char *const**argv,
gboolean nmc_process_connection_properties(NmCli * nmc,
NMConnection * connection,
int * argc,
const char *const **argv,
gboolean allow_remove_setting,
GError **error);
GError ** error);
NMMetaColor nmc_active_connection_state_to_color (NMActiveConnection *ac);
NMMetaColor nmc_active_connection_state_to_color(NMActiveConnection *ac);
int nmc_active_connection_cmp (NMActiveConnection *ac_a, NMActiveConnection *ac_b);
int nmc_active_connection_cmp(NMActiveConnection *ac_a, NMActiveConnection *ac_b);
extern const NmcMetaGenericInfo *const metagen_con_show[];
extern const NmcMetaGenericInfo *const metagen_con_active_general[];

File diff suppressed because it is too large Load diff

View file

@ -8,15 +8,15 @@
#include "nmcli.h"
void nmc_complete_device (NMClient *client, const char *prefix, gboolean wifi_only);
void nmc_complete_device(NMClient *client, const char *prefix, gboolean wifi_only);
void nmc_complete_bssid (NMClient *client, const char *ifname, const char *bssid_prefix);
void nmc_complete_bssid(NMClient *client, const char *ifname, const char *bssid_prefix);
void monitor_devices (NmCli *nmc);
void monitor_devices(NmCli *nmc);
NMDevice ** nmc_get_devices_sorted (NMClient *client);
NMDevice **nmc_get_devices_sorted(NMClient *client);
NMMetaColor nmc_device_state_to_color (NMDevice *device);
NMMetaColor nmc_device_state_to_color(NMDevice *device);
extern const NmcMetaGenericInfo *const metagen_device_status[];
extern const NmcMetaGenericInfo *const metagen_device_detail_general[];

File diff suppressed because it is too large Load diff

View file

@ -7,58 +7,65 @@
#define INDENT 4
static char *
_xml_escape_attribute (const char *value)
_xml_escape_attribute(const char *value)
{
gs_free char *s = NULL;
s = g_markup_escape_text (value, -1);
return g_strdup_printf ("\"%s\"", s);
s = g_markup_escape_text(value, -1);
return g_strdup_printf("\"%s\"", s);
}
static const char *
_indent_level (guint num_spaces)
_indent_level(guint num_spaces)
{
static const char spaces[] = " ";
nm_assert (num_spaces < G_N_ELEMENTS (spaces));
return &spaces[G_N_ELEMENTS (spaces) - num_spaces - 1];
nm_assert(num_spaces < G_N_ELEMENTS(spaces));
return &spaces[G_N_ELEMENTS(spaces) - num_spaces - 1];
}
int
main (int argc, char *argv[])
main(int argc, char *argv[])
{
int i_sett_infos;
int i_property;
g_print ("<nm-setting-docs>\n");
for (i_sett_infos = 0; i_sett_infos < G_N_ELEMENTS (nm_meta_setting_infos_editor); i_sett_infos++) {
g_print("<nm-setting-docs>\n");
for (i_sett_infos = 0; i_sett_infos < G_N_ELEMENTS(nm_meta_setting_infos_editor);
i_sett_infos++) {
const NMMetaSettingInfoEditor *sett_info = &nm_meta_setting_infos_editor[i_sett_infos];
gs_free char *tmp_s1 = NULL;
gs_free char *tmp_s2 = NULL;
gs_free char * tmp_s1 = NULL;
gs_free char * tmp_s2 = NULL;
g_print ("%s<setting", _indent_level (INDENT));
g_print (" name=%s", tmp_s1 = _xml_escape_attribute (sett_info->general->setting_name));
g_print("%s<setting", _indent_level(INDENT));
g_print(" name=%s", tmp_s1 = _xml_escape_attribute(sett_info->general->setting_name));
if (sett_info->alias)
g_print ("\n%salias=%s", _indent_level (INDENT + 9), tmp_s2 = _xml_escape_attribute (sett_info->alias));
g_print (" >\n");
g_print("\n%salias=%s",
_indent_level(INDENT + 9),
tmp_s2 = _xml_escape_attribute(sett_info->alias));
g_print(" >\n");
for (i_property = 0; i_property < sett_info->properties_num; i_property++) {
const NMMetaPropertyInfo *prop_info = sett_info->properties[i_property];
gs_free char *tmp2 = NULL;
gs_free char *tmp3 = NULL;
gs_free char *tmp4 = NULL;
gs_free char * tmp2 = NULL;
gs_free char * tmp3 = NULL;
gs_free char * tmp4 = NULL;
g_print ("%s<property", _indent_level (2*INDENT));
g_print (" name=%s", tmp2 = _xml_escape_attribute (prop_info->property_name));
g_print("%s<property", _indent_level(2 * INDENT));
g_print(" name=%s", tmp2 = _xml_escape_attribute(prop_info->property_name));
if (prop_info->property_alias)
g_print ("\n%salias=%s", _indent_level (2*INDENT + 10), tmp3 = _xml_escape_attribute (prop_info->property_alias));
g_print("\n%salias=%s",
_indent_level(2 * INDENT + 10),
tmp3 = _xml_escape_attribute(prop_info->property_alias));
if (prop_info->describe_doc)
g_print ("\n%sdescription=%s", _indent_level (2*INDENT + 10), tmp4 = _xml_escape_attribute (prop_info->describe_doc));
g_print (" />\n");
g_print("\n%sdescription=%s",
_indent_level(2 * INDENT + 10),
tmp4 = _xml_escape_attribute(prop_info->describe_doc));
g_print(" />\n");
}
g_print ("%s</setting>\n", _indent_level (INDENT));
g_print("%s</setting>\n", _indent_level(INDENT));
}
g_print ("</nm-setting-docs>\n");
g_print("</nm-setting-docs>\n");
return 0;
}

File diff suppressed because it is too large Load diff

View file

@ -11,7 +11,7 @@
struct _NMPolkitListener;
typedef char *(*NmcCompEntryFunc) (const char *, int);
typedef char *(*NmcCompEntryFunc)(const char *, int);
/* nmcli exit codes */
typedef enum {
@ -52,16 +52,12 @@ typedef enum {
NMC_RESULT_COMPLETE_FILE = 65,
} NMCResultCode;
typedef enum {
NMC_PRINT_TERSE = 0,
NMC_PRINT_NORMAL = 1,
NMC_PRINT_PRETTY = 2
} NMCPrintOutput;
typedef enum { NMC_PRINT_TERSE = 0, NMC_PRINT_NORMAL = 1, NMC_PRINT_PRETTY = 2 } NMCPrintOutput;
static inline NMMetaAccessorGetType
nmc_print_output_to_accessor_get_type (NMCPrintOutput print_output)
nmc_print_output_to_accessor_get_type(NMCPrintOutput print_output)
{
return NM_IN_SET (print_output, NMC_PRINT_NORMAL, NMC_PRINT_PRETTY)
return NM_IN_SET(print_output, NMC_PRINT_NORMAL, NMC_PRINT_PRETTY)
? NM_META_ACCESSOR_GET_TYPE_PRETTY
: NM_META_ACCESSOR_GET_TYPE_PARSABLE;
}
@ -70,8 +66,10 @@ nmc_print_output_to_accessor_get_type (NMCPrintOutput print_output)
typedef enum {
NMC_OF_FLAG_FIELD_NAMES = 0x00000001, /* Print field names instead of values */
NMC_OF_FLAG_SECTION_PREFIX = 0x00000002, /* Use the first value as section prefix for the other field names - just in multiline */
NMC_OF_FLAG_MAIN_HEADER_ADD = 0x00000004, /* Print main header in addition to values/field names */
NMC_OF_FLAG_SECTION_PREFIX =
0x00000002, /* Use the first value as section prefix for the other field names - just in multiline */
NMC_OF_FLAG_MAIN_HEADER_ADD =
0x00000004, /* Print main header in addition to values/field names */
NMC_OF_FLAG_MAIN_HEADER_ONLY = 0x00000008, /* Print main header only */
} NmcOfFlags;
@ -83,7 +81,7 @@ typedef struct _NmcMetaGenericInfo NmcMetaGenericInfo;
struct _NmcOutputField {
const NMMetaAbstractInfo *info;
int width; /* Width in screen columns */
void *value; /* Value of current field - char* or char** (NULL-terminated array) */
void * value; /* Value of current field - char* or char** (NULL-terminated array) */
gboolean value_is_array; /* Whether value is char** instead of char* */
gboolean free_value; /* Whether to free the value */
NmcOfFlags flags; /* Flags - whether and how to print values/field names/headers */
@ -96,7 +94,8 @@ typedef struct _NmcConfig {
bool multiline_output; /* Multiline output instead of default tabular */
bool escape_values; /* Whether to escape ':' and '\' in terse tabular mode */
bool in_editor; /* Whether running the editor - nmcli con edit' */
bool show_secrets; /* Whether to display secrets (both input and output): option '--show-secrets' */
bool
show_secrets; /* Whether to display secrets (both input and output): option '--show-secrets' */
bool overview; /* Overview mode (hide default values) */
const char *palette[_NM_META_COLOR_NUM]; /* Color palette */
} NmcConfig;
@ -106,7 +105,8 @@ typedef struct {
} NmcPagerData;
typedef struct _NmcOutputData {
GPtrArray *output_data; /* GPtrArray of arrays of NmcOutputField structs - accumulates data for output */
GPtrArray *
output_data; /* GPtrArray of arrays of NmcOutputField structs - accumulates data for output */
} NmcOutputData;
/* NmCli - main structure */
@ -114,14 +114,14 @@ typedef struct _NmCli {
NMClient *client; /* Pointer to NMClient of libnm */
NMCResultCode return_value; /* Return code of nmcli */
GString *return_text; /* Reason text */
GString * return_text; /* Reason text */
NmcPagerData pager_data;
int timeout; /* Operation timeout */
NMSecretAgentSimple *secret_agent; /* Secret agent */
GHashTable *pwds_hash; /* Hash table with passwords in passwd-file */
NMSecretAgentSimple * secret_agent; /* Secret agent */
GHashTable * pwds_hash; /* Hash table with passwords in passwd-file */
struct _NMPolkitListener *pk_listener; /* polkit agent listener */
int should_wait; /* Semaphore indicating whether nmcli should not end or not yet */
@ -131,11 +131,12 @@ typedef struct _NmCli {
const NmcConfig nmc_config;
NmcConfig nmc_config_mutable;
};
char *required_fields; /* Required fields in output: '--fields' option */
char * required_fields; /* Required fields in output: '--fields' option */
gboolean ask; /* Ask for missing parameters: option '--ask' */
gboolean complete; /* Autocomplete the command line */
gboolean editor_status_line; /* Whether to display status line in connection editor */
gboolean editor_save_confirmation; /* Whether to ask for confirmation on saving connections with 'autoconnect=yes' */
gboolean
editor_save_confirmation; /* Whether to ask for confirmation on saving connections with 'autoconnect=yes' */
char *palette_buffer; /* Buffer with sequences for terminal-colors.d(5)-based coloring. */
} NmCli;
@ -143,25 +144,24 @@ typedef struct _NmCli {
extern const NmCli *const nm_cli_global_readline;
/* Error quark for GError domain */
#define NMCLI_ERROR (nmcli_error_quark ())
GQuark nmcli_error_quark (void);
#define NMCLI_ERROR (nmcli_error_quark())
GQuark nmcli_error_quark(void);
extern GMainLoop *loop;
gboolean nmc_seen_sigint (void);
void nmc_clear_sigint (void);
void nmc_set_sigquit_internal (void);
void nmc_exit (void);
gboolean nmc_seen_sigint(void);
void nmc_clear_sigint(void);
void nmc_set_sigquit_internal(void);
void nmc_exit(void);
void nm_cli_spawn_pager (const NmcConfig *nmc_config,
NmcPagerData *pager_data);
void nm_cli_spawn_pager(const NmcConfig *nmc_config, NmcPagerData *pager_data);
void nmc_empty_output_fields (NmcOutputData *output_data);
void nmc_empty_output_fields(NmcOutputData *output_data);
#define NMC_OUTPUT_DATA_DEFINE_SCOPED(out) \
gs_unref_array GArray *out##_indices = NULL; \
nm_auto (nmc_empty_output_fields) NmcOutputData out = { \
.output_data = g_ptr_array_new_full (20, g_free), \
gs_unref_array GArray * out##_indices = NULL; \
nm_auto(nmc_empty_output_fields) NmcOutputData out = { \
.output_data = g_ptr_array_new_full(20, g_free), \
}
/*****************************************************************************/
@ -170,20 +170,23 @@ struct _NMCCommand;
typedef struct _NMCCommand {
const char *cmd;
void (*func) (const struct _NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv);
void (*usage) (void);
void (*func)(const struct _NMCCommand *cmd, NmCli *nmc, int argc, const char *const *argv);
void (*usage)(void);
bool needs_client;
bool needs_nm_running;
} NMCCommand;
void nmc_command_func_agent (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv);
void nmc_command_func_general (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv);
void nmc_command_func_networking (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv);
void nmc_command_func_radio (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv);
void nmc_command_func_monitor (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv);
void nmc_command_func_overview (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv);
void nmc_command_func_connection (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv);
void nmc_command_func_device (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv);
void nmc_command_func_agent(const NMCCommand *cmd, NmCli *nmc, int argc, const char *const *argv);
void nmc_command_func_general(const NMCCommand *cmd, NmCli *nmc, int argc, const char *const *argv);
void
nmc_command_func_networking(const NMCCommand *cmd, NmCli *nmc, int argc, const char *const *argv);
void nmc_command_func_radio(const NMCCommand *cmd, NmCli *nmc, int argc, const char *const *argv);
void nmc_command_func_monitor(const NMCCommand *cmd, NmCli *nmc, int argc, const char *const *argv);
void
nmc_command_func_overview(const NMCCommand *cmd, NmCli *nmc, int argc, const char *const *argv);
void
nmc_command_func_connection(const NMCCommand *cmd, NmCli *nmc, int argc, const char *const *argv);
void nmc_command_func_device(const NMCCommand *cmd, NmCli *nmc, int argc, const char *const *argv);
/*****************************************************************************/

View file

@ -15,7 +15,7 @@
#include "common.h"
static char *
polkit_read_passwd (gpointer instance,
polkit_read_passwd(gpointer instance,
const char *action_id,
const char *message,
const char *user,
@ -23,71 +23,64 @@ polkit_read_passwd (gpointer instance,
{
NmCli *nmc = user_data;
g_print ("%s\n", message);
g_print ("(action_id: %s)\n", action_id);
g_print("%s\n", message);
g_print("(action_id: %s)\n", action_id);
/* Ask user for polkit authorization password */
if (user) {
return nmc_readline_echo (&nmc->nmc_config, FALSE, "password (%s): ", user);
return nmc_readline_echo(&nmc->nmc_config, FALSE, "password (%s): ", user);
}
return nmc_readline_echo (&nmc->nmc_config, FALSE, "password: ");
return nmc_readline_echo(&nmc->nmc_config, FALSE, "password: ");
}
static void
polkit_error (gpointer instance,
const char *error,
gpointer user_data)
polkit_error(gpointer instance, const char *error, gpointer user_data)
{
g_printerr (_("Error: polkit agent failed: %s\n"), error);
g_printerr(_("Error: polkit agent failed: %s\n"), error);
}
gboolean
nmc_polkit_agent_init (NmCli* nmc, gboolean for_session, GError **error)
nmc_polkit_agent_init(NmCli *nmc, gboolean for_session, GError **error)
{
NMPolkitListener *listener;
GDBusConnection *dbus_connection = NULL;
GDBusConnection * dbus_connection = NULL;
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
if (nmc->client && nm_client_get_dbus_connection (nmc->client)) {
dbus_connection = nm_client_get_dbus_connection (nmc->client);
listener = nm_polkit_listener_new (dbus_connection, for_session);
if (nmc->client && nm_client_get_dbus_connection(nmc->client)) {
dbus_connection = nm_client_get_dbus_connection(nmc->client);
listener = nm_polkit_listener_new(dbus_connection, for_session);
} else {
dbus_connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM,
NULL,
error);
dbus_connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, error);
if (!dbus_connection) {
return FALSE;
}
listener = nm_polkit_listener_new (dbus_connection, for_session);
g_object_unref (dbus_connection);
listener = nm_polkit_listener_new(dbus_connection, for_session);
g_object_unref(dbus_connection);
}
g_signal_connect (listener,
g_signal_connect(listener,
NM_POLKIT_LISTENER_SIGNAL_REQUEST_SYNC,
G_CALLBACK (polkit_read_passwd),
G_CALLBACK(polkit_read_passwd),
nmc);
g_signal_connect (listener,
NM_POLKIT_LISTENER_SIGNAL_ERROR,
G_CALLBACK (polkit_error),
NULL);
g_signal_connect(listener, NM_POLKIT_LISTENER_SIGNAL_ERROR, G_CALLBACK(polkit_error), NULL);
nmc->pk_listener = listener;
return TRUE;
}
void
nmc_polkit_agent_fini (NmCli* nmc)
nmc_polkit_agent_fini(NmCli *nmc)
{
if (nmc->pk_listener) {
g_clear_object (&nmc->pk_listener);
g_clear_object(&nmc->pk_listener);
}
}
gboolean
nmc_start_polkit_agent_start_try (NmCli *nmc)
nmc_start_polkit_agent_start_try(NmCli *nmc)
{
gs_free_error GError *error = NULL;
@ -95,9 +88,8 @@ nmc_start_polkit_agent_start_try (NmCli *nmc)
if (!nmc->ask)
return TRUE;
if (!nmc_polkit_agent_init (nmc, FALSE, &error)) {
g_printerr (_("Warning: polkit agent initialization failed: %s\n"),
error->message);
if (!nmc_polkit_agent_init(nmc, FALSE, &error)) {
g_printerr(_("Warning: polkit agent initialization failed: %s\n"), error->message);
return FALSE;
}
return TRUE;

View file

@ -8,9 +8,9 @@
#include "nmcli.h"
gboolean nmc_polkit_agent_init (NmCli *nmc, gboolean for_session, GError **error);
void nmc_polkit_agent_fini (NmCli* nmc);
gboolean nmc_polkit_agent_init(NmCli *nmc, gboolean for_session, GError **error);
void nmc_polkit_agent_fini(NmCli *nmc);
gboolean nmc_start_polkit_agent_start_try (NmCli *nmc);
gboolean nmc_start_polkit_agent_start_try(NmCli *nmc);
#endif /* __NMC_POLKIT_AGENT_H__ */

View file

@ -22,109 +22,122 @@
/*****************************************************************************/
static gboolean
get_answer (const char *prop, const char *value)
get_answer(const char *prop, const char *value)
{
char *tmp_str;
char *question;
char * tmp_str;
char * question;
gboolean answer = FALSE;
if (value)
question = g_strdup_printf (_("Do you also want to set '%s' to '%s'? [yes]: "), prop, value);
question = g_strdup_printf(_("Do you also want to set '%s' to '%s'? [yes]: "), prop, value);
else
question = g_strdup_printf (_("Do you also want to clear '%s'? [yes]: "), prop);
tmp_str = nmc_get_user_input (question);
if (!tmp_str || matches (tmp_str, "yes"))
question = g_strdup_printf(_("Do you also want to clear '%s'? [yes]: "), prop);
tmp_str = nmc_get_user_input(question);
if (!tmp_str || matches(tmp_str, "yes"))
answer = TRUE;
g_free (tmp_str);
g_free (question);
g_free(tmp_str);
g_free(question);
return answer;
}
static void ipv4_method_changed_cb (GObject *object, GParamSpec *pspec, gpointer user_data);
static void ipv6_method_changed_cb (GObject *object, GParamSpec *pspec, gpointer user_data);
static void ipv4_method_changed_cb(GObject *object, GParamSpec *pspec, gpointer user_data);
static void ipv6_method_changed_cb(GObject *object, GParamSpec *pspec, gpointer user_data);
static void
ipv4_addresses_changed_cb (GObject *object, GParamSpec *pspec, gpointer user_data)
ipv4_addresses_changed_cb(GObject *object, GParamSpec *pspec, gpointer user_data)
{
static gboolean answered = FALSE;
static gboolean answer = FALSE;
g_signal_handlers_block_by_func (object, G_CALLBACK (ipv4_method_changed_cb), NULL);
g_signal_handlers_block_by_func(object, G_CALLBACK(ipv4_method_changed_cb), NULL);
/* If we have some IP addresses set method to 'manual'.
* Else if the method was 'manual', change it back to 'auto'.
*/
if (nm_setting_ip_config_get_num_addresses (NM_SETTING_IP_CONFIG (object))) {
if (g_strcmp0 (nm_setting_ip_config_get_method (NM_SETTING_IP_CONFIG (object)), NM_SETTING_IP4_CONFIG_METHOD_MANUAL)) {
if (nm_setting_ip_config_get_num_addresses(NM_SETTING_IP_CONFIG(object))) {
if (g_strcmp0(nm_setting_ip_config_get_method(NM_SETTING_IP_CONFIG(object)),
NM_SETTING_IP4_CONFIG_METHOD_MANUAL)) {
if (!answered) {
answered = TRUE;
answer = get_answer ("ipv4.method", "manual");
answer = get_answer("ipv4.method", "manual");
}
if (answer)
g_object_set (object, NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_MANUAL, NULL);
g_object_set(object,
NM_SETTING_IP_CONFIG_METHOD,
NM_SETTING_IP4_CONFIG_METHOD_MANUAL,
NULL);
}
} else {
answered = FALSE;
if (!g_strcmp0 (nm_setting_ip_config_get_method (NM_SETTING_IP_CONFIG (object)), NM_SETTING_IP4_CONFIG_METHOD_MANUAL))
g_object_set (object, NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO, NULL);
if (!g_strcmp0(nm_setting_ip_config_get_method(NM_SETTING_IP_CONFIG(object)),
NM_SETTING_IP4_CONFIG_METHOD_MANUAL))
g_object_set(object,
NM_SETTING_IP_CONFIG_METHOD,
NM_SETTING_IP4_CONFIG_METHOD_AUTO,
NULL);
}
g_signal_handlers_unblock_by_func (object, G_CALLBACK (ipv4_method_changed_cb), NULL);
g_signal_handlers_unblock_by_func(object, G_CALLBACK(ipv4_method_changed_cb), NULL);
}
static void
ipv4_method_changed_cb (GObject *object, GParamSpec *pspec, gpointer user_data)
ipv4_method_changed_cb(GObject *object, GParamSpec *pspec, gpointer user_data)
{
static GPtrArray *old_value = NULL;
static gboolean answered = FALSE;
static gboolean answer = FALSE;
g_signal_handlers_block_by_func (object, G_CALLBACK (ipv4_addresses_changed_cb), NULL);
g_signal_handlers_block_by_func(object, G_CALLBACK(ipv4_addresses_changed_cb), NULL);
/* If method != manual, remove addresses (save them for restoring them later when method becomes 'manual' */
if (g_strcmp0 (nm_setting_ip_config_get_method (NM_SETTING_IP_CONFIG (object)), NM_SETTING_IP4_CONFIG_METHOD_MANUAL)) {
if (nm_setting_ip_config_get_num_addresses (NM_SETTING_IP_CONFIG (object))) {
if (g_strcmp0(nm_setting_ip_config_get_method(NM_SETTING_IP_CONFIG(object)),
NM_SETTING_IP4_CONFIG_METHOD_MANUAL)) {
if (nm_setting_ip_config_get_num_addresses(NM_SETTING_IP_CONFIG(object))) {
if (!answered) {
answered = TRUE;
answer = get_answer ("ipv4.addresses", NULL);
answer = get_answer("ipv4.addresses", NULL);
}
if (answer) {
nm_clear_pointer (&old_value, g_ptr_array_unref);
g_object_get (object, NM_SETTING_IP_CONFIG_ADDRESSES, &old_value, NULL);
g_object_set (object, NM_SETTING_IP_CONFIG_ADDRESSES, NULL, NULL);
nm_clear_pointer(&old_value, g_ptr_array_unref);
g_object_get(object, NM_SETTING_IP_CONFIG_ADDRESSES, &old_value, NULL);
g_object_set(object, NM_SETTING_IP_CONFIG_ADDRESSES, NULL, NULL);
}
}
} else {
answered = FALSE;
if (old_value) {
gs_unref_ptrarray GPtrArray *v = g_steal_pointer (&old_value);
gs_unref_ptrarray GPtrArray *v = g_steal_pointer(&old_value);
g_object_set (object, NM_SETTING_IP_CONFIG_ADDRESSES, v, NULL);
g_object_set(object, NM_SETTING_IP_CONFIG_ADDRESSES, v, NULL);
}
}
g_signal_handlers_unblock_by_func (object, G_CALLBACK (ipv4_addresses_changed_cb), NULL);
g_signal_handlers_unblock_by_func(object, G_CALLBACK(ipv4_addresses_changed_cb), NULL);
}
static void
ipv6_addresses_changed_cb (GObject *object, GParamSpec *pspec, gpointer user_data)
ipv6_addresses_changed_cb(GObject *object, GParamSpec *pspec, gpointer user_data)
{
static gboolean answered = FALSE;
static gboolean answer = FALSE;
g_signal_handlers_block_by_func (object, G_CALLBACK (ipv6_method_changed_cb), NULL);
g_signal_handlers_block_by_func(object, G_CALLBACK(ipv6_method_changed_cb), NULL);
/* If we have some IP addresses set method to 'manual'.
* Else if the method was 'manual', change it back to 'auto'.
*/
if (nm_setting_ip_config_get_num_addresses (NM_SETTING_IP_CONFIG (object))) {
if (g_strcmp0 (nm_setting_ip_config_get_method (NM_SETTING_IP_CONFIG (object)), NM_SETTING_IP6_CONFIG_METHOD_MANUAL)) {
if (nm_setting_ip_config_get_num_addresses(NM_SETTING_IP_CONFIG(object))) {
if (g_strcmp0(nm_setting_ip_config_get_method(NM_SETTING_IP_CONFIG(object)),
NM_SETTING_IP6_CONFIG_METHOD_MANUAL)) {
if (!answered) {
answered = TRUE;
answer = get_answer ("ipv6.method", "manual");
answer = get_answer("ipv6.method", "manual");
}
if (answer)
g_object_set (object, NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_MANUAL, NULL);
g_object_set(object,
NM_SETTING_IP_CONFIG_METHOD,
NM_SETTING_IP6_CONFIG_METHOD_MANUAL,
NULL);
}
} else {
answered = FALSE;
@ -147,225 +160,250 @@ ipv6_addresses_changed_cb (GObject *object, GParamSpec *pspec, gpointer user_dat
* That can be avoided by freezing/thawing the signals, but this solution
* here is ugly in general.
*/
if (!g_strcmp0 (nm_setting_ip_config_get_method (NM_SETTING_IP_CONFIG (object)), NM_SETTING_IP6_CONFIG_METHOD_MANUAL))
g_object_set (object, NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_AUTO, NULL);
if (!g_strcmp0(nm_setting_ip_config_get_method(NM_SETTING_IP_CONFIG(object)),
NM_SETTING_IP6_CONFIG_METHOD_MANUAL))
g_object_set(object,
NM_SETTING_IP_CONFIG_METHOD,
NM_SETTING_IP6_CONFIG_METHOD_AUTO,
NULL);
}
g_signal_handlers_unblock_by_func (object, G_CALLBACK (ipv6_method_changed_cb), NULL);
g_signal_handlers_unblock_by_func(object, G_CALLBACK(ipv6_method_changed_cb), NULL);
}
static void
ipv6_method_changed_cb (GObject *object, GParamSpec *pspec, gpointer user_data)
ipv6_method_changed_cb(GObject *object, GParamSpec *pspec, gpointer user_data)
{
static GPtrArray *old_value = NULL;
static gboolean answered = FALSE;
static gboolean answer = FALSE;
g_signal_handlers_block_by_func (object, G_CALLBACK (ipv6_addresses_changed_cb), NULL);
g_signal_handlers_block_by_func(object, G_CALLBACK(ipv6_addresses_changed_cb), NULL);
/* If method != manual, remove addresses (save them for restoring them later when method becomes 'manual' */
if (g_strcmp0 (nm_setting_ip_config_get_method (NM_SETTING_IP_CONFIG (object)), NM_SETTING_IP6_CONFIG_METHOD_MANUAL)) {
if (nm_setting_ip_config_get_num_addresses (NM_SETTING_IP_CONFIG (object))) {
if (g_strcmp0(nm_setting_ip_config_get_method(NM_SETTING_IP_CONFIG(object)),
NM_SETTING_IP6_CONFIG_METHOD_MANUAL)) {
if (nm_setting_ip_config_get_num_addresses(NM_SETTING_IP_CONFIG(object))) {
if (!answered) {
answered = TRUE;
answer = get_answer ("ipv6.addresses", NULL);
answer = get_answer("ipv6.addresses", NULL);
}
if (answer) {
nm_clear_pointer (&old_value, g_ptr_array_unref);
g_object_get (object, NM_SETTING_IP_CONFIG_ADDRESSES, &old_value, NULL);
g_object_set (object, NM_SETTING_IP_CONFIG_ADDRESSES, NULL, NULL);
nm_clear_pointer(&old_value, g_ptr_array_unref);
g_object_get(object, NM_SETTING_IP_CONFIG_ADDRESSES, &old_value, NULL);
g_object_set(object, NM_SETTING_IP_CONFIG_ADDRESSES, NULL, NULL);
}
}
} else {
answered = FALSE;
if (old_value) {
gs_unref_ptrarray GPtrArray *v = g_steal_pointer (&old_value);
gs_unref_ptrarray GPtrArray *v = g_steal_pointer(&old_value);
g_object_set (object, NM_SETTING_IP_CONFIG_ADDRESSES, v, NULL);
g_object_set(object, NM_SETTING_IP_CONFIG_ADDRESSES, v, NULL);
}
}
g_signal_handlers_unblock_by_func (object, G_CALLBACK (ipv6_addresses_changed_cb), NULL);
g_signal_handlers_unblock_by_func(object, G_CALLBACK(ipv6_addresses_changed_cb), NULL);
}
static void
proxy_method_changed_cb (GObject *object, GParamSpec *pspec, gpointer user_data)
proxy_method_changed_cb(GObject *object, GParamSpec *pspec, gpointer user_data)
{
NMSettingProxyMethod method;
method = nm_setting_proxy_get_method (NM_SETTING_PROXY (object));
method = nm_setting_proxy_get_method(NM_SETTING_PROXY(object));
if (method == NM_SETTING_PROXY_METHOD_NONE) {
g_object_set (object,
NM_SETTING_PROXY_PAC_URL, NULL,
NM_SETTING_PROXY_PAC_SCRIPT, NULL,
g_object_set(object,
NM_SETTING_PROXY_PAC_URL,
NULL,
NM_SETTING_PROXY_PAC_SCRIPT,
NULL,
NULL);
}
}
static void
wireless_band_channel_changed_cb (GObject *object, GParamSpec *pspec, gpointer user_data)
wireless_band_channel_changed_cb(GObject *object, GParamSpec *pspec, gpointer user_data)
{
const char *value = NULL, *mode;
const char * value = NULL, *mode;
char str[16];
NMSettingWireless *s_wireless = NM_SETTING_WIRELESS (object);
NMSettingWireless *s_wireless = NM_SETTING_WIRELESS(object);
if (strcmp (g_param_spec_get_name (pspec), NM_SETTING_WIRELESS_BAND) == 0) {
value = nm_setting_wireless_get_band (s_wireless);
if (strcmp(g_param_spec_get_name(pspec), NM_SETTING_WIRELESS_BAND) == 0) {
value = nm_setting_wireless_get_band(s_wireless);
if (!value)
return;
} else {
guint32 channel = nm_setting_wireless_get_channel (s_wireless);
guint32 channel = nm_setting_wireless_get_channel(s_wireless);
if (channel == 0)
return;
g_snprintf (str, sizeof (str), "%d", nm_setting_wireless_get_channel (s_wireless));
g_snprintf(str, sizeof(str), "%d", nm_setting_wireless_get_channel(s_wireless));
value = str;
}
mode = nm_setting_wireless_get_mode (NM_SETTING_WIRELESS (object));
if (!mode || !*mode || strcmp (mode, NM_SETTING_WIRELESS_MODE_INFRA) == 0) {
g_print (_("Warning: %s.%s set to '%s', but it might be ignored in infrastructure mode\n"),
nm_setting_get_name (NM_SETTING (s_wireless)), g_param_spec_get_name (pspec),
mode = nm_setting_wireless_get_mode(NM_SETTING_WIRELESS(object));
if (!mode || !*mode || strcmp(mode, NM_SETTING_WIRELESS_MODE_INFRA) == 0) {
g_print(_("Warning: %s.%s set to '%s', but it might be ignored in infrastructure mode\n"),
nm_setting_get_name(NM_SETTING(s_wireless)),
g_param_spec_get_name(pspec),
value);
}
}
static void
connection_master_changed_cb (GObject *object, GParamSpec *pspec, gpointer user_data)
connection_master_changed_cb(GObject *object, GParamSpec *pspec, gpointer user_data)
{
NMSettingConnection *s_con = NM_SETTING_CONNECTION (object);
NMConnection *connection = NM_CONNECTION (user_data);
NMSetting *s_ipv4, *s_ipv6;
const char *value, *tmp_str;
NMSettingConnection *s_con = NM_SETTING_CONNECTION(object);
NMConnection * connection = NM_CONNECTION(user_data);
NMSetting * s_ipv4, *s_ipv6;
const char * value, *tmp_str;
value = nm_setting_connection_get_master (s_con);
value = nm_setting_connection_get_master(s_con);
if (value) {
s_ipv4 = nm_connection_get_setting_by_name (connection, NM_SETTING_IP4_CONFIG_SETTING_NAME);
s_ipv6 = nm_connection_get_setting_by_name (connection, NM_SETTING_IP6_CONFIG_SETTING_NAME);
s_ipv4 = nm_connection_get_setting_by_name(connection, NM_SETTING_IP4_CONFIG_SETTING_NAME);
s_ipv6 = nm_connection_get_setting_by_name(connection, NM_SETTING_IP6_CONFIG_SETTING_NAME);
if (s_ipv4 || s_ipv6) {
g_print (_("Warning: setting %s.%s requires removing ipv4 and ipv6 settings\n"),
nm_setting_get_name (NM_SETTING (s_con)), g_param_spec_get_name (pspec));
tmp_str = nmc_get_user_input (_("Do you want to remove them? [yes] "));
if (!tmp_str || matches (tmp_str, "yes")) {
g_print(_("Warning: setting %s.%s requires removing ipv4 and ipv6 settings\n"),
nm_setting_get_name(NM_SETTING(s_con)),
g_param_spec_get_name(pspec));
tmp_str = nmc_get_user_input(_("Do you want to remove them? [yes] "));
if (!tmp_str || matches(tmp_str, "yes")) {
if (s_ipv4)
nm_connection_remove_setting (connection, G_OBJECT_TYPE (s_ipv4));
nm_connection_remove_setting(connection, G_OBJECT_TYPE(s_ipv4));
if (s_ipv6)
nm_connection_remove_setting (connection, G_OBJECT_TYPE (s_ipv6));
nm_connection_remove_setting(connection, G_OBJECT_TYPE(s_ipv6));
}
}
}
}
void
nmc_setting_ip4_connect_handlers (NMSettingIPConfig *setting)
nmc_setting_ip4_connect_handlers(NMSettingIPConfig *setting)
{
g_return_if_fail (NM_IS_SETTING_IP4_CONFIG (setting));
g_return_if_fail(NM_IS_SETTING_IP4_CONFIG(setting));
g_signal_connect (setting, "notify::" NM_SETTING_IP_CONFIG_ADDRESSES,
G_CALLBACK (ipv4_addresses_changed_cb), NULL);
g_signal_connect (setting, "notify::" NM_SETTING_IP_CONFIG_METHOD,
G_CALLBACK (ipv4_method_changed_cb), NULL);
g_signal_connect(setting,
"notify::" NM_SETTING_IP_CONFIG_ADDRESSES,
G_CALLBACK(ipv4_addresses_changed_cb),
NULL);
g_signal_connect(setting,
"notify::" NM_SETTING_IP_CONFIG_METHOD,
G_CALLBACK(ipv4_method_changed_cb),
NULL);
}
void
nmc_setting_ip6_connect_handlers (NMSettingIPConfig *setting)
nmc_setting_ip6_connect_handlers(NMSettingIPConfig *setting)
{
g_return_if_fail (NM_IS_SETTING_IP6_CONFIG (setting));
g_return_if_fail(NM_IS_SETTING_IP6_CONFIG(setting));
g_signal_connect (setting, "notify::" NM_SETTING_IP_CONFIG_ADDRESSES,
G_CALLBACK (ipv6_addresses_changed_cb), NULL);
g_signal_connect (setting, "notify::" NM_SETTING_IP_CONFIG_METHOD,
G_CALLBACK (ipv6_method_changed_cb), NULL);
g_signal_connect(setting,
"notify::" NM_SETTING_IP_CONFIG_ADDRESSES,
G_CALLBACK(ipv6_addresses_changed_cb),
NULL);
g_signal_connect(setting,
"notify::" NM_SETTING_IP_CONFIG_METHOD,
G_CALLBACK(ipv6_method_changed_cb),
NULL);
}
void
nmc_setting_proxy_connect_handlers (NMSettingProxy *setting)
nmc_setting_proxy_connect_handlers(NMSettingProxy *setting)
{
g_return_if_fail (NM_IS_SETTING_PROXY (setting));
g_return_if_fail(NM_IS_SETTING_PROXY(setting));
g_signal_connect (setting, "notify::" NM_SETTING_PROXY_METHOD,
G_CALLBACK (proxy_method_changed_cb), NULL);
g_signal_connect(setting,
"notify::" NM_SETTING_PROXY_METHOD,
G_CALLBACK(proxy_method_changed_cb),
NULL);
}
void
nmc_setting_wireless_connect_handlers (NMSettingWireless *setting)
nmc_setting_wireless_connect_handlers(NMSettingWireless *setting)
{
g_return_if_fail (NM_IS_SETTING_WIRELESS (setting));
g_return_if_fail(NM_IS_SETTING_WIRELESS(setting));
g_signal_connect (setting, "notify::" NM_SETTING_WIRELESS_BAND,
G_CALLBACK (wireless_band_channel_changed_cb), NULL);
g_signal_connect (setting, "notify::" NM_SETTING_WIRELESS_CHANNEL,
G_CALLBACK (wireless_band_channel_changed_cb), NULL);
g_signal_connect(setting,
"notify::" NM_SETTING_WIRELESS_BAND,
G_CALLBACK(wireless_band_channel_changed_cb),
NULL);
g_signal_connect(setting,
"notify::" NM_SETTING_WIRELESS_CHANNEL,
G_CALLBACK(wireless_band_channel_changed_cb),
NULL);
}
void
nmc_setting_connection_connect_handlers (NMSettingConnection *setting, NMConnection *connection)
nmc_setting_connection_connect_handlers(NMSettingConnection *setting, NMConnection *connection)
{
g_return_if_fail (NM_IS_SETTING_CONNECTION (setting));
g_return_if_fail(NM_IS_SETTING_CONNECTION(setting));
g_signal_connect (setting, "notify::" NM_SETTING_CONNECTION_MASTER,
G_CALLBACK (connection_master_changed_cb), connection);
g_signal_connect(setting,
"notify::" NM_SETTING_CONNECTION_MASTER,
G_CALLBACK(connection_master_changed_cb),
connection);
}
/*****************************************************************************/
static gboolean
_set_fcn_precheck_connection_secondaries (NMClient *client,
_set_fcn_precheck_connection_secondaries(NMClient * client,
const char *value,
char **value_coerced,
GError **error)
char ** value_coerced,
GError ** error)
{
const GPtrArray *connections;
NMConnection *con;
const GPtrArray * connections;
NMConnection * con;
gs_free const char **strv0 = NULL;
gs_strfreev char **strv = NULL;
char **iter;
gs_strfreev char ** strv = NULL;
char ** iter;
gboolean modified = FALSE;
strv0 = nm_utils_strsplit_set (value, " \t,");
strv0 = nm_utils_strsplit_set(value, " \t,");
if (!strv0)
return TRUE;
connections = nm_client_get_connections (client);
connections = nm_client_get_connections(client);
strv = g_strdupv ((char **) strv0);
strv = g_strdupv((char **) strv0);
for (iter = strv; *iter; iter++) {
if (nm_utils_is_uuid (*iter)) {
con = nmc_find_connection (connections, "uuid", *iter, NULL, FALSE);
if (!con){
g_print (_("Warning: %s is not an UUID of any existing connection profile\n"),
if (nm_utils_is_uuid(*iter)) {
con = nmc_find_connection(connections, "uuid", *iter, NULL, FALSE);
if (!con) {
g_print(_("Warning: %s is not an UUID of any existing connection profile\n"),
*iter);
} else {
/* Currently, NM only supports VPN connections as secondaries */
if (!nm_connection_is_type (con, NM_SETTING_VPN_SETTING_NAME)) {
g_set_error (error, 1, 0, _("'%s' is not a VPN connection profile"), *iter);
if (!nm_connection_is_type(con, NM_SETTING_VPN_SETTING_NAME)) {
g_set_error(error, 1, 0, _("'%s' is not a VPN connection profile"), *iter);
return FALSE;
}
}
} else {
con = nmc_find_connection (connections, "id", *iter, NULL, FALSE);
con = nmc_find_connection(connections, "id", *iter, NULL, FALSE);
if (!con) {
g_set_error (error, 1, 0, _("'%s' is not a name of any exiting profile"), *iter);
g_set_error(error, 1, 0, _("'%s' is not a name of any exiting profile"), *iter);
return FALSE;
}
/* Currently, NM only supports VPN connections as secondaries */
if (!nm_connection_is_type (con, NM_SETTING_VPN_SETTING_NAME)) {
g_set_error (error, 1, 0, _("'%s' is not a VPN connection profile"), *iter);
if (!nm_connection_is_type(con, NM_SETTING_VPN_SETTING_NAME)) {
g_set_error(error, 1, 0, _("'%s' is not a VPN connection profile"), *iter);
return FALSE;
}
/* translate id to uuid */
g_free (*iter);
*iter = g_strdup (nm_connection_get_uuid (con));
g_free(*iter);
*iter = g_strdup(nm_connection_get_uuid(con));
modified = TRUE;
}
}
if (modified)
*value_coerced = g_strjoinv (" ", strv);
*value_coerced = g_strjoinv(" ", strv);
return TRUE;
}
@ -373,105 +411,114 @@ _set_fcn_precheck_connection_secondaries (NMClient *client,
/*****************************************************************************/
static void
_env_warn_fcn_handle (const NMMetaEnvironment *environment,
_env_warn_fcn_handle(
const NMMetaEnvironment *environment,
gpointer environment_user_data,
NMMetaEnvWarnLevel warn_level,
const char *fmt_l10n, /* the untranslated format string, but it is marked for translation using N_(). */
const char *
fmt_l10n, /* the untranslated format string, but it is marked for translation using N_(). */
va_list ap)
{
NmCli *nmc = environment_user_data;
NmCli * nmc = environment_user_data;
gs_free char *m = NULL;
if (nmc->complete)
return;
NM_PRAGMA_WARNING_DISABLE("-Wformat-nonliteral")
m = g_strdup_vprintf (_(fmt_l10n), ap);
m = g_strdup_vprintf(_(fmt_l10n), ap);
NM_PRAGMA_WARNING_REENABLE
switch (warn_level) {
case NM_META_ENV_WARN_LEVEL_WARN:
g_print (_("Warning: %s\n"), m);
g_print(_("Warning: %s\n"), m);
return;
case NM_META_ENV_WARN_LEVEL_INFO:
g_print (_("Info: %s\n"), m);
g_print(_("Info: %s\n"), m);
return;
}
g_print (_("Error: %s\n"), m);
g_print(_("Error: %s\n"), m);
}
static NMDevice *const*
_env_get_nm_devices (const NMMetaEnvironment *environment,
static NMDevice *const *
_env_get_nm_devices(const NMMetaEnvironment *environment,
gpointer environment_user_data,
guint *out_len)
guint * out_len)
{
NmCli *nmc = environment_user_data;
NmCli * nmc = environment_user_data;
const GPtrArray *devices;
nm_assert (nmc);
nm_assert(nmc);
/* the returned list is *not* NULL terminated. Need to
* provide and honor the out_len argument. */
nm_assert (out_len);
nm_assert(out_len);
devices = nm_client_get_devices (nmc->client);
devices = nm_client_get_devices(nmc->client);
if (!devices) {
*out_len = 0;
return NULL;
}
*out_len = devices->len;
return (NMDevice *const*) devices->pdata;
return (NMDevice *const *) devices->pdata;
}
static NMRemoteConnection *const*
_env_get_nm_connections (const NMMetaEnvironment *environment,
static NMRemoteConnection *const *
_env_get_nm_connections(const NMMetaEnvironment *environment,
gpointer environment_user_data,
guint *out_len)
guint * out_len)
{
NmCli *nmc = environment_user_data;
NmCli * nmc = environment_user_data;
const GPtrArray *values;
nm_assert (nmc);
nm_assert(nmc);
/* the returned list is *not* NULL terminated. Need to
* provide and honor the out_len argument. */
nm_assert (out_len);
nm_assert(out_len);
values = nm_client_get_connections (nmc->client);
values = nm_client_get_connections(nmc->client);
if (!values) {
*out_len = 0;
return NULL;
}
*out_len = values->len;
return (NMRemoteConnection *const*) values->pdata;
return (NMRemoteConnection *const *) values->pdata;
}
/*****************************************************************************/
const NMMetaEnvironment *const nmc_meta_environment = &((NMMetaEnvironment) {
const NMMetaEnvironment *const nmc_meta_environment = &((NMMetaEnvironment){
.warn_fcn = _env_warn_fcn_handle,
.get_nm_devices = _env_get_nm_devices,
.get_nm_connections = _env_get_nm_connections,
});
static char *
get_property_val (NMSetting *setting, const char *prop, NMMetaAccessorGetType get_type, gboolean show_secrets, GError **error)
get_property_val(NMSetting * setting,
const char * prop,
NMMetaAccessorGetType get_type,
gboolean show_secrets,
GError ** error)
{
const NMMetaPropertyInfo *property_info;
g_return_val_if_fail (NM_IS_SETTING (setting), NULL);
g_return_val_if_fail (!error || !*error, NULL);
g_return_val_if_fail (NM_IN_SET (get_type, NM_META_ACCESSOR_GET_TYPE_PARSABLE, NM_META_ACCESSOR_GET_TYPE_PRETTY), NULL);
g_return_val_if_fail(NM_IS_SETTING(setting), NULL);
g_return_val_if_fail(!error || !*error, NULL);
g_return_val_if_fail(
NM_IN_SET(get_type, NM_META_ACCESSOR_GET_TYPE_PARSABLE, NM_META_ACCESSOR_GET_TYPE_PRETTY),
NULL);
if ((property_info = nm_meta_property_info_find_by_setting (setting, prop))) {
if ((property_info = nm_meta_property_info_find_by_setting(setting, prop))) {
if (property_info->property_type->get_fcn) {
NMMetaAccessorGetOutFlags out_flags = NM_META_ACCESSOR_GET_OUT_FLAGS_NONE;
char *to_free = NULL;
const char *value;
char * to_free = NULL;
const char * value;
value = property_info->property_type->get_fcn (property_info,
value = property_info->property_type->get_fcn(
property_info,
nmc_meta_environment,
(gpointer) nmc_meta_environment_arg,
setting,
@ -480,12 +527,12 @@ get_property_val (NMSetting *setting, const char *prop, NMMetaAccessorGetType ge
&out_flags,
NULL,
(gpointer *) &to_free);
nm_assert (!out_flags);
return to_free ?: g_strdup (value);
nm_assert(!out_flags);
return to_free ?: g_strdup(value);
}
}
g_set_error_literal (error, 1, 0, _("don't know how to get the property value"));
g_set_error_literal(error, 1, 0, _("don't know how to get the property value"));
return NULL;
}
@ -497,9 +544,9 @@ get_property_val (NMSetting *setting, const char *prop, NMMetaAccessorGetType ge
* Returns: current property value. The caller must free the returned string.
*/
char *
nmc_setting_get_property (NMSetting *setting, const char *prop, GError **error)
nmc_setting_get_property(NMSetting *setting, const char *prop, GError **error)
{
return get_property_val (setting, prop, NM_META_ACCESSOR_GET_TYPE_PRETTY, TRUE, error);
return get_property_val(setting, prop, NM_META_ACCESSOR_GET_TYPE_PRETTY, TRUE, error);
}
/*
@ -507,33 +554,37 @@ nmc_setting_get_property (NMSetting *setting, const char *prop, GError **error)
* format that can be parsed via nmc_setting_set_property().
*/
char *
nmc_setting_get_property_parsable (NMSetting *setting, const char *prop, GError **error)
nmc_setting_get_property_parsable(NMSetting *setting, const char *prop, GError **error)
{
return get_property_val (setting, prop, NM_META_ACCESSOR_GET_TYPE_PARSABLE, TRUE, error);
return get_property_val(setting, prop, NM_META_ACCESSOR_GET_TYPE_PARSABLE, TRUE, error);
}
gboolean
nmc_setting_set_property (NMClient *client,
NMSetting *setting,
const char *prop,
nmc_setting_set_property(NMClient * client,
NMSetting * setting,
const char * prop,
NMMetaAccessorModifier modifier,
const char *value,
GError **error)
const char * value,
GError ** error)
{
const NMMetaPropertyInfo *property_info;
gs_free char *value_to_free = NULL;
gs_free char * value_to_free = NULL;
gboolean success;
g_return_val_if_fail (NM_IS_SETTING (setting), FALSE);
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
g_return_val_if_fail (NM_IN_SET (modifier, NM_META_ACCESSOR_MODIFIER_SET, NM_META_ACCESSOR_MODIFIER_DEL, NM_META_ACCESSOR_MODIFIER_ADD), FALSE);
g_return_val_if_fail(NM_IS_SETTING(setting), FALSE);
g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
g_return_val_if_fail(NM_IN_SET(modifier,
NM_META_ACCESSOR_MODIFIER_SET,
NM_META_ACCESSOR_MODIFIER_DEL,
NM_META_ACCESSOR_MODIFIER_ADD),
FALSE);
if (!(property_info = nm_meta_property_info_find_by_setting (setting, prop)))
if (!(property_info = nm_meta_property_info_find_by_setting(setting, prop)))
goto out_fail_read_only;
if (!property_info->property_type->set_fcn)
goto out_fail_read_only;
if ( modifier == NM_META_ACCESSOR_MODIFIER_DEL
if (modifier == NM_META_ACCESSOR_MODIFIER_DEL
&& !property_info->property_type->set_supports_remove) {
/* The property is a plain property. It does not support '-'.
*
@ -544,8 +595,8 @@ nmc_setting_set_property (NMClient *client,
if (value) {
switch (property_info->setting_info->general->meta_type) {
case NM_META_SETTING_TYPE_CONNECTION:
if (nm_streq (property_info->property_name, NM_SETTING_CONNECTION_SECONDARIES)) {
if (!_set_fcn_precheck_connection_secondaries (client, value, &value_to_free, error))
if (nm_streq(property_info->property_name, NM_SETTING_CONNECTION_SECONDARIES)) {
if (!_set_fcn_precheck_connection_secondaries(client, value, &value_to_free, error))
return FALSE;
if (value_to_free)
value = value_to_free;
@ -556,26 +607,25 @@ nmc_setting_set_property (NMClient *client,
}
}
if ( NM_IN_SET (modifier, NM_META_ACCESSOR_MODIFIER_ADD, NM_META_ACCESSOR_MODIFIER_DEL)
&& ( !value
|| !value[0])) {
if (NM_IN_SET(modifier, NM_META_ACCESSOR_MODIFIER_ADD, NM_META_ACCESSOR_MODIFIER_DEL)
&& (!value || !value[0])) {
/* nothing to do. */
return TRUE;
}
g_object_freeze_notify (G_OBJECT (setting));
success = property_info->property_type->set_fcn (property_info,
g_object_freeze_notify(G_OBJECT(setting));
success = property_info->property_type->set_fcn(property_info,
nmc_meta_environment,
(gpointer) nmc_meta_environment_arg,
setting,
modifier,
value,
error);
g_object_thaw_notify (G_OBJECT (setting));
g_object_thaw_notify(G_OBJECT(setting));
return success;
out_fail_read_only:
nm_utils_error_set (error, NM_UTILS_ERROR_UNKNOWN, _("the property can't be changed"));
nm_utils_error_set(error, NM_UTILS_ERROR_UNKNOWN, _("the property can't be changed"));
return FALSE;
}
@ -586,39 +636,39 @@ out_fail_read_only:
* The returned value should be freed with g_strfreev()
*/
char **
nmc_setting_get_valid_properties (NMSetting *setting)
nmc_setting_get_valid_properties(NMSetting *setting)
{
const NMMetaSettingInfoEditor *setting_info;
char **valid_props;
char ** valid_props;
guint i, num;
setting_info = nm_meta_setting_info_editor_find_by_setting (setting);
setting_info = nm_meta_setting_info_editor_find_by_setting(setting);
num = setting_info ? setting_info->properties_num : 0;
valid_props = g_new (char *, num + 1);
valid_props = g_new(char *, num + 1);
for (i = 0; i < num; i++)
valid_props[i] = g_strdup (setting_info->properties[i]->property_name);
valid_props[i] = g_strdup(setting_info->properties[i]->property_name);
valid_props[num] = NULL;
return valid_props;
}
const char *const*
nmc_setting_get_property_allowed_values (NMSetting *setting, const char *prop, char ***out_to_free)
const char *const *
nmc_setting_get_property_allowed_values(NMSetting *setting, const char *prop, char ***out_to_free)
{
const NMMetaPropertyInfo *property_info;
g_return_val_if_fail (NM_IS_SETTING (setting), FALSE);
g_return_val_if_fail (out_to_free, FALSE);
g_return_val_if_fail(NM_IS_SETTING(setting), FALSE);
g_return_val_if_fail(out_to_free, FALSE);
*out_to_free = NULL;
if ((property_info = nm_meta_property_info_find_by_setting (setting, prop))) {
if ((property_info = nm_meta_property_info_find_by_setting(setting, prop))) {
if (property_info->property_type->values_fcn) {
return property_info->property_type->values_fcn (property_info,
out_to_free);
} else if (property_info->property_typ_data && property_info->property_typ_data->values_static)
return property_info->property_type->values_fcn(property_info, out_to_free);
} else if (property_info->property_typ_data
&& property_info->property_typ_data->values_static)
return property_info->property_typ_data->values_static;
}
@ -634,20 +684,20 @@ nmc_setting_get_property_allowed_values (NMSetting *setting, const char *prop, c
* Returns: property description or NULL on failure. The caller must free the string.
*/
char *
nmc_setting_get_property_desc (NMSetting *setting, const char *prop)
nmc_setting_get_property_desc(NMSetting *setting, const char *prop)
{
gs_free char *desc_to_free = NULL;
const char *setting_desc = NULL;
const char *setting_desc_title = "";
const char *nmcli_desc = NULL;
const char *nmcli_desc_title = "";
const char *nmcli_nl = "";
gs_free char * desc_to_free = NULL;
const char * setting_desc = NULL;
const char * setting_desc_title = "";
const char * nmcli_desc = NULL;
const char * nmcli_desc_title = "";
const char * nmcli_nl = "";
const NMMetaPropertyInfo *property_info;
const char *desc = NULL;
const char * desc = NULL;
g_return_val_if_fail (NM_IS_SETTING (setting), FALSE);
g_return_val_if_fail(NM_IS_SETTING(setting), FALSE);
property_info = nm_meta_property_info_find_by_setting (setting, prop);
property_info = nm_meta_property_info_find_by_setting(setting, prop);
if (!property_info)
return NULL;
@ -657,7 +707,7 @@ nmc_setting_get_property_desc (NMSetting *setting, const char *prop)
}
if (property_info->property_type->describe_fcn) {
desc = property_info->property_type->describe_fcn (property_info, &desc_to_free);
desc = property_info->property_type->describe_fcn(property_info, &desc_to_free);
} else
desc = _(property_info->describe_message);
@ -667,25 +717,27 @@ nmc_setting_get_property_desc (NMSetting *setting, const char *prop)
nmcli_nl = "\n";
}
return g_strdup_printf ("%s\n%s\n%s%s%s%s",
return g_strdup_printf("%s\n%s\n%s%s%s%s",
setting_desc_title,
setting_desc ?: "",
nmcli_nl, nmcli_desc_title, nmcli_nl,
nmcli_nl,
nmcli_desc_title,
nmcli_nl,
nmcli_desc ?: "");
}
/*****************************************************************************/
gboolean
setting_details (const NmcConfig *nmc_config, NMSetting *setting, const char *one_prop)
setting_details(const NmcConfig *nmc_config, NMSetting *setting, const char *one_prop)
{
const NMMetaSettingInfoEditor *setting_info;
gs_free_error GError *error = NULL;
gs_free char *fields_str = NULL;
gs_free char * fields_str = NULL;
g_return_val_if_fail (NM_IS_SETTING (setting), FALSE);
g_return_val_if_fail(NM_IS_SETTING(setting), FALSE);
setting_info = nm_meta_setting_info_editor_find_by_setting (setting);
setting_info = nm_meta_setting_info_editor_find_by_setting(setting);
if (!setting_info)
return FALSE;
@ -693,14 +745,15 @@ setting_details (const NmcConfig *nmc_config, NMSetting *setting, const char *on
/* hack around setting-details being called for one setting. Must prefix the
* property name with the setting name. Later we should remove setting_details()
* and merge it into the caller. */
fields_str = g_strdup_printf ("%s.%s", nm_setting_get_name (setting), one_prop);
fields_str = g_strdup_printf("%s.%s", nm_setting_get_name(setting), one_prop);
}
if (!nmc_print (nmc_config,
(gpointer[]) { setting, NULL },
if (!nmc_print(
nmc_config,
(gpointer[]){setting, NULL},
NULL,
NULL,
(const NMMetaAbstractInfo *const[]) { (const NMMetaAbstractInfo *) setting_info, NULL },
(const NMMetaAbstractInfo *const[]){(const NMMetaAbstractInfo *) setting_info, NULL},
fields_str,
&error))
return FALSE;

View file

@ -13,28 +13,26 @@
/*****************************************************************************/
void nmc_setting_ip4_connect_handlers (NMSettingIPConfig *setting);
void nmc_setting_ip6_connect_handlers (NMSettingIPConfig *setting);
void nmc_setting_proxy_connect_handlers (NMSettingProxy *setting);
void nmc_setting_wireless_connect_handlers (NMSettingWireless *setting);
void nmc_setting_connection_connect_handlers (NMSettingConnection *setting, NMConnection *connection);
void nmc_setting_ip4_connect_handlers(NMSettingIPConfig *setting);
void nmc_setting_ip6_connect_handlers(NMSettingIPConfig *setting);
void nmc_setting_proxy_connect_handlers(NMSettingProxy *setting);
void nmc_setting_wireless_connect_handlers(NMSettingWireless *setting);
void nmc_setting_connection_connect_handlers(NMSettingConnection *setting,
NMConnection * connection);
char **nmc_setting_get_valid_properties (NMSetting *setting);
char *nmc_setting_get_property_desc (NMSetting *setting, const char *prop);
const char *const*nmc_setting_get_property_allowed_values (NMSetting *setting, const char *prop, char ***out_to_free);
char *nmc_setting_get_property (NMSetting *setting,
const char *prop,
GError **error);
char *nmc_setting_get_property_parsable (NMSetting *setting,
const char *prop,
GError **error);
gboolean nmc_setting_set_property (NMClient *client,
NMSetting *setting,
const char *prop,
char **nmc_setting_get_valid_properties(NMSetting *setting);
char * nmc_setting_get_property_desc(NMSetting *setting, const char *prop);
const char *const *
nmc_setting_get_property_allowed_values(NMSetting *setting, const char *prop, char ***out_to_free);
char * nmc_setting_get_property(NMSetting *setting, const char *prop, GError **error);
char * nmc_setting_get_property_parsable(NMSetting *setting, const char *prop, GError **error);
gboolean nmc_setting_set_property(NMClient * client,
NMSetting * setting,
const char * prop,
NMMetaAccessorModifier modifier,
const char *val,
GError **error);
const char * val,
GError ** error);
gboolean setting_details (const NmcConfig *nmc_config, NMSetting *setting, const char *one_prop);
gboolean setting_details(const NmcConfig *nmc_config, NMSetting *setting, const char *one_prop);
#endif /* NMC_SETTINGS_H */

File diff suppressed because it is too large Load diff

View file

@ -11,7 +11,7 @@
/* === Types === */
typedef struct {
const char *name;
const char * name;
gboolean has_value;
const char **value;
gboolean mandatory;
@ -19,49 +19,57 @@ typedef struct {
} nmc_arg_t;
/* === Functions === */
int next_arg (NmCli *nmc, int *argc, const char *const**argv, ...);
gboolean nmc_arg_is_help (const char *arg);
gboolean nmc_arg_is_option (const char *arg, const char *opt_name);
gboolean nmc_parse_args (nmc_arg_t *arg_arr, gboolean last, int *argc, const char *const**argv, GError **error);
char *ssid_to_hex (const char *str, gsize len);
void nmc_terminal_erase_line (void);
void nmc_terminal_show_progress (const char *str);
pid_t nmc_terminal_spawn_pager (const NmcConfig *nmc_config);
char *nmc_colorize (const NmcConfig *nmc_config, NMMetaColor color, const char * fmt, ...) _nm_printf (3, 4);
void nmc_filter_out_colors_inplace (char *str);
char *nmc_filter_out_colors (const char *str);
char *nmc_get_user_input (const char *ask_str);
int nmc_string_to_arg_array (const char *line, const char *delim, gboolean unquote,
char ***argv, int *argc);
const char *nmc_string_is_valid (const char *input, const char **allowed, GError **error);
char * nmc_util_strv_for_display (const char *const*strv, gboolean brackets);
int nmc_string_screen_width (const char *start, const char *end);
void set_val_str (NmcOutputField fields_array[], guint32 index, char *value);
void set_val_strc (NmcOutputField fields_array[], guint32 index, const char *value);
void set_val_arr (NmcOutputField fields_array[], guint32 index, char **value);
void set_val_arrc (NmcOutputField fields_array[], guint32 index, const char **value);
void set_val_color_all (NmcOutputField fields_array[], NMMetaColor color);
void nmc_free_output_field_values (NmcOutputField fields_array[]);
int next_arg(NmCli *nmc, int *argc, const char *const **argv, ...);
gboolean nmc_arg_is_help(const char *arg);
gboolean nmc_arg_is_option(const char *arg, const char *opt_name);
gboolean nmc_parse_args(nmc_arg_t * arg_arr,
gboolean last,
int * argc,
const char *const **argv,
GError ** error);
char * ssid_to_hex(const char *str, gsize len);
void nmc_terminal_erase_line(void);
void nmc_terminal_show_progress(const char *str);
pid_t nmc_terminal_spawn_pager(const NmcConfig *nmc_config);
char * nmc_colorize(const NmcConfig *nmc_config, NMMetaColor color, const char *fmt, ...)
_nm_printf(3, 4);
void nmc_filter_out_colors_inplace(char *str);
char * nmc_filter_out_colors(const char *str);
char * nmc_get_user_input(const char *ask_str);
int nmc_string_to_arg_array(const char *line,
const char *delim,
gboolean unquote,
char *** argv,
int * argc);
const char *nmc_string_is_valid(const char *input, const char **allowed, GError **error);
char * nmc_util_strv_for_display(const char *const *strv, gboolean brackets);
int nmc_string_screen_width(const char *start, const char *end);
void set_val_str(NmcOutputField fields_array[], guint32 index, char *value);
void set_val_strc(NmcOutputField fields_array[], guint32 index, const char *value);
void set_val_arr(NmcOutputField fields_array[], guint32 index, char **value);
void set_val_arrc(NmcOutputField fields_array[], guint32 index, const char **value);
void set_val_color_all(NmcOutputField fields_array[], NMMetaColor color);
void nmc_free_output_field_values(NmcOutputField fields_array[]);
GArray *parse_output_fields (const char *fields_str,
const NMMetaAbstractInfo *const* fields_array,
GArray * parse_output_fields(const char * fields_str,
const NMMetaAbstractInfo *const *fields_array,
gboolean parse_groups,
GPtrArray **group_fields,
GError **error);
NmcOutputField *nmc_dup_fields_array (const NMMetaAbstractInfo *const*fields, NmcOfFlags flags);
void nmc_empty_output_fields (NmcOutputData *output_data);
void print_required_fields (const NmcConfig *nmc_config,
NmcPagerData *pager_data,
GPtrArray ** group_fields,
GError ** error);
NmcOutputField *nmc_dup_fields_array(const NMMetaAbstractInfo *const *fields, NmcOfFlags flags);
void nmc_empty_output_fields(NmcOutputData *output_data);
void print_required_fields(const NmcConfig * nmc_config,
NmcPagerData * pager_data,
NmcOfFlags of_flags,
const GArray *indices,
const char *header_name,
const GArray * indices,
const char * header_name,
int indent,
const NmcOutputField *field_values);
void print_data_prepare_width (GPtrArray *output_data);
void print_data (const NmcConfig *nmc_config,
NmcPagerData *pager_data,
const GArray *indices,
const char *header_name,
void print_data_prepare_width(GPtrArray *output_data);
void print_data(const NmcConfig * nmc_config,
NmcPagerData * pager_data,
const GArray * indices,
const char * header_name,
int indent,
const NmcOutputData *out);
@ -228,10 +236,12 @@ typedef enum {
} NmcGenericInfoType;
#define NMC_HANDLE_COLOR(color) \
G_STMT_START { \
G_STMT_START \
{ \
if (get_type == NM_META_ACCESSOR_GET_TYPE_COLOR) \
return GINT_TO_POINTER (color); \
} G_STMT_END
return GINT_TO_POINTER(color); \
} \
G_STMT_END
struct _NmcMetaGenericInfo {
union {
@ -239,57 +249,46 @@ struct _NmcMetaGenericInfo {
const NMMetaType *meta_type;
};
NmcGenericInfoType info_type;
const char *name;
const char *name_header;
const NmcMetaGenericInfo *const*nested;
const char * name;
const char * name_header;
const NmcMetaGenericInfo *const *nested;
#define NMC_META_GENERIC_INFO_GET_FCN_ARGS \
const NMMetaEnvironment *environment, \
gpointer environment_user_data, \
const NmcMetaGenericInfo *info, \
gpointer target, \
gpointer target_data, \
NMMetaAccessorGetType get_type, \
NMMetaAccessorGetFlags get_flags, \
NMMetaAccessorGetOutFlags *out_flags, \
gboolean *out_is_default, \
gpointer *out_to_free
const NMMetaEnvironment *environment, gpointer environment_user_data, \
const NmcMetaGenericInfo *info, gpointer target, gpointer target_data, \
NMMetaAccessorGetType get_type, NMMetaAccessorGetFlags get_flags, \
NMMetaAccessorGetOutFlags *out_flags, gboolean *out_is_default, gpointer *out_to_free
gconstpointer (*get_fcn) (NMC_META_GENERIC_INFO_GET_FCN_ARGS);
gconstpointer (*get_fcn)(NMC_META_GENERIC_INFO_GET_FCN_ARGS);
};
#define NMC_META_GENERIC(n, ...) \
(&((NmcMetaGenericInfo) { \
.meta_type = &nmc_meta_type_generic_info, \
.name = n, \
__VA_ARGS__ \
}))
(&((NmcMetaGenericInfo){.meta_type = &nmc_meta_type_generic_info, .name = n, __VA_ARGS__}))
#define NMC_META_GENERIC_WITH_NESTED(n, nest, ...) \
NMC_META_GENERIC (n, .nested = (nest), __VA_ARGS__)
NMC_META_GENERIC(n, .nested = (nest), __VA_ARGS__)
#define NMC_META_GENERIC_GROUP(_group_name, _nested, _name_header) \
((const NMMetaAbstractInfo *const*) ((const NmcMetaGenericInfo *const[]) { \
NMC_META_GENERIC_WITH_NESTED (_group_name,_nested, .name_header = _name_header), \
((const NMMetaAbstractInfo *const *) ((const NmcMetaGenericInfo *const[]){ \
NMC_META_GENERIC_WITH_NESTED(_group_name, _nested, .name_header = _name_header), \
NULL, \
}))
static inline const char *
nmc_meta_generic_get_str_i18n (const char *s, NMMetaAccessorGetType get_type)
nmc_meta_generic_get_str_i18n(const char *s, NMMetaAccessorGetType get_type)
{
if (!NM_IN_SET (get_type, NM_META_ACCESSOR_GET_TYPE_PRETTY,
NM_META_ACCESSOR_GET_TYPE_PARSABLE))
g_return_val_if_reached (NULL);
if (!NM_IN_SET(get_type, NM_META_ACCESSOR_GET_TYPE_PRETTY, NM_META_ACCESSOR_GET_TYPE_PARSABLE))
g_return_val_if_reached(NULL);
if (!s)
return NULL;
if (get_type == NM_META_ACCESSOR_GET_TYPE_PRETTY)
return gettext (s);
return gettext(s);
return s;
}
static inline const char *
nmc_meta_generic_get_str_i18n_null (const char *s, NMMetaAccessorGetType get_type)
nmc_meta_generic_get_str_i18n_null(const char *s, NMMetaAccessorGetType get_type)
{
if (get_type == NM_META_ACCESSOR_GET_TYPE_PARSABLE) {
/* in parsable mode, return NULL. That is useful if @s is a pretty string
@ -297,25 +296,25 @@ nmc_meta_generic_get_str_i18n_null (const char *s, NMMetaAccessorGetType get_typ
* that for parsable mode. */
return NULL;
}
return nmc_meta_generic_get_str_i18n (s, get_type);
return nmc_meta_generic_get_str_i18n(s, get_type);
}
static inline const char *
nmc_meta_generic_get_unknown (NMMetaAccessorGetType get_type)
nmc_meta_generic_get_unknown(NMMetaAccessorGetType get_type)
{
return nmc_meta_generic_get_str_i18n_null (N_("(unknown)"), get_type);
return nmc_meta_generic_get_str_i18n_null(N_("(unknown)"), get_type);
}
static inline const char *
nmc_meta_generic_get_bool (gboolean val, NMMetaAccessorGetType get_type)
nmc_meta_generic_get_bool(gboolean val, NMMetaAccessorGetType get_type)
{
return nmc_meta_generic_get_str_i18n (val ? N_("yes") : N_("no"), get_type);
return nmc_meta_generic_get_str_i18n(val ? N_("yes") : N_("no"), get_type);
}
static inline const char *
nmc_meta_generic_get_bool_onoff (gboolean val, NMMetaAccessorGetType get_type)
nmc_meta_generic_get_bool_onoff(gboolean val, NMMetaAccessorGetType get_type)
{
return nmc_meta_generic_get_str_i18n (val ? N_("on") : N_("off"), get_type);
return nmc_meta_generic_get_str_i18n(val ? N_("on") : N_("off"), get_type);
}
typedef enum {
@ -324,15 +323,17 @@ typedef enum {
} NmcMetaGenericGetEnumType;
static inline char *
nmc_meta_generic_get_enum_with_detail (NmcMetaGenericGetEnumType get_enum_type, gint64 enum_val, const char *str_val, NMMetaAccessorGetType get_type)
nmc_meta_generic_get_enum_with_detail(NmcMetaGenericGetEnumType get_enum_type,
gint64 enum_val,
const char * str_val,
NMMetaAccessorGetType get_type)
{
if (!NM_IN_SET (get_type, NM_META_ACCESSOR_GET_TYPE_PRETTY,
NM_META_ACCESSOR_GET_TYPE_PARSABLE))
g_return_val_if_reached (NULL);
if (!NM_IN_SET(get_type, NM_META_ACCESSOR_GET_TYPE_PRETTY, NM_META_ACCESSOR_GET_TYPE_PARSABLE))
g_return_val_if_reached(NULL);
if (!str_val) {
/* Pass %NULL for only printing the numeric value. */
return g_strdup_printf ("%lld", (long long) enum_val);
return g_strdup_printf("%lld", (long long) enum_val);
}
switch (get_enum_type) {
@ -341,28 +342,28 @@ nmc_meta_generic_get_enum_with_detail (NmcMetaGenericGetEnumType get_enum_type,
* mode. That might not be desired, but it's done for certain properties to preserve
* previous behavior. */
if (get_type == NM_META_ACCESSOR_GET_TYPE_PRETTY)
return g_strdup_printf (_("%lld (%s)"), (long long) enum_val, gettext (str_val));
return g_strdup_printf ("%lld (%s)", (long long) enum_val, str_val);
return g_strdup_printf(_("%lld (%s)"), (long long) enum_val, gettext(str_val));
return g_strdup_printf("%lld (%s)", (long long) enum_val, str_val);
case NMC_META_GENERIC_GET_ENUM_TYPE_DASH:
/* note that this function will always print "$NUM ($NICK)", also in PARSABLE
* mode. That might not be desired, but it's done for certain properties to preserve
* previous behavior. */
if (get_type == NM_META_ACCESSOR_GET_TYPE_PRETTY)
return g_strdup_printf (_("%lld - %s"), (long long) enum_val, gettext (str_val));
return g_strdup_printf ("%lld - %s", (long long) enum_val, str_val);
return g_strdup_printf(_("%lld - %s"), (long long) enum_val, gettext(str_val));
return g_strdup_printf("%lld - %s", (long long) enum_val, str_val);
}
g_return_val_if_reached (NULL);
g_return_val_if_reached(NULL);
}
/*****************************************************************************/
gboolean nmc_print (const NmcConfig *nmc_config,
gpointer const *targets,
gboolean nmc_print(const NmcConfig * nmc_config,
gpointer const * targets,
gpointer targets_data,
const char *header_name_no_l10n,
const NMMetaAbstractInfo *const*fields,
const char *fields_str,
GError **error);
const char * header_name_no_l10n,
const NMMetaAbstractInfo *const *fields,
const char * fields_str,
GError ** error);
/*****************************************************************************/

View file

@ -13,70 +13,67 @@
/*****************************************************************************/
typedef struct {
GMainLoop *main_loop;
GMainLoop * main_loop;
GCancellable *cancellable;
NMCSProvider *provider_result;
guint detect_count;
} ProviderDetectData;
static void
_provider_detect_cb (GObject *source,
GAsyncResult *result,
gpointer user_data)
_provider_detect_cb(GObject *source, GAsyncResult *result, gpointer user_data)
{
gs_unref_object NMCSProvider *provider = NMCS_PROVIDER (source);
gs_unref_object NMCSProvider *provider = NMCS_PROVIDER(source);
gs_free_error GError *error = NULL;
ProviderDetectData *dd;
ProviderDetectData * dd;
gboolean success;
success = nmcs_provider_detect_finish (provider, result, &error);
success = nmcs_provider_detect_finish(provider, result, &error);
nm_assert (success != (!!error));
nm_assert(success != (!!error));
if (nm_utils_error_is_cancelled (error))
if (nm_utils_error_is_cancelled(error))
return;
dd = user_data;
nm_assert (dd->detect_count > 0);
nm_assert(dd->detect_count > 0);
dd->detect_count--;
if (error) {
_LOGI ("provider %s not detected: %s", nmcs_provider_get_name (provider), error->message);
_LOGI("provider %s not detected: %s", nmcs_provider_get_name(provider), error->message);
if (dd->detect_count > 0) {
/* wait longer. */
return;
}
_LOGI ("no provider detected");
_LOGI("no provider detected");
goto done;
}
_LOGI ("provider %s detected", nmcs_provider_get_name (provider));
dd->provider_result = g_steal_pointer (&provider);
_LOGI("provider %s detected", nmcs_provider_get_name(provider));
dd->provider_result = g_steal_pointer(&provider);
done:
g_cancellable_cancel (dd->cancellable);
g_main_loop_quit (dd->main_loop);
g_cancellable_cancel(dd->cancellable);
g_main_loop_quit(dd->main_loop);
}
static void
_provider_detect_sigterm_cb (GCancellable *source,
gpointer user_data)
_provider_detect_sigterm_cb(GCancellable *source, gpointer user_data)
{
ProviderDetectData *dd = user_data;
g_cancellable_cancel (dd->cancellable);
g_clear_object (&dd->provider_result);
g_cancellable_cancel(dd->cancellable);
g_clear_object(&dd->provider_result);
dd->detect_count = 0;
g_main_loop_quit (dd->main_loop);
g_main_loop_quit(dd->main_loop);
}
static NMCSProvider *
_provider_detect (GCancellable *sigterm_cancellable)
_provider_detect(GCancellable *sigterm_cancellable)
{
nm_auto_unref_gmainloop GMainLoop *main_loop = g_main_loop_new (NULL, FALSE);
gs_unref_object GCancellable *cancellable = g_cancellable_new ();
nm_auto_unref_gmainloop GMainLoop *main_loop = g_main_loop_new(NULL, FALSE);
gs_unref_object GCancellable *cancellable = g_cancellable_new();
gs_unref_object NMHttpClient *http_client = NULL;
ProviderDetectData dd = {
.cancellable = cancellable,
@ -92,112 +89,106 @@ _provider_detect (GCancellable *sigterm_cancellable)
int i;
gulong cancellable_signal_id;
cancellable_signal_id = g_cancellable_connect (sigterm_cancellable,
G_CALLBACK (_provider_detect_sigterm_cb),
cancellable_signal_id = g_cancellable_connect(sigterm_cancellable,
G_CALLBACK(_provider_detect_sigterm_cb),
&dd,
NULL);
if (!cancellable_signal_id)
goto out;
http_client = nmcs_wait_for_objects_register (nm_http_client_new ());
http_client = nmcs_wait_for_objects_register(nm_http_client_new());
for (i = 0; i < G_N_ELEMENTS (gtypes); i++) {
for (i = 0; i < G_N_ELEMENTS(gtypes); i++) {
NMCSProvider *provider;
provider = g_object_new (gtypes[i],
NMCS_PROVIDER_HTTP_CLIENT, http_client,
NULL);
nmcs_wait_for_objects_register (provider);
provider = g_object_new(gtypes[i], NMCS_PROVIDER_HTTP_CLIENT, http_client, NULL);
nmcs_wait_for_objects_register(provider);
_LOGD ("start detecting %s provider...", nmcs_provider_get_name (provider));
_LOGD("start detecting %s provider...", nmcs_provider_get_name(provider));
dd.detect_count++;
nmcs_provider_detect (provider,
cancellable,
_provider_detect_cb,
&dd);
nmcs_provider_detect(provider, cancellable, _provider_detect_cb, &dd);
}
if (dd.detect_count > 0)
g_main_loop_run (main_loop);
g_main_loop_run(main_loop);
out:
nm_clear_g_signal_handler (sigterm_cancellable, &cancellable_signal_id);
nm_clear_g_signal_handler(sigterm_cancellable, &cancellable_signal_id);
return dd.provider_result;
}
/*****************************************************************************/
static char **
_nmc_get_hwaddrs (NMClient *nmc)
_nmc_get_hwaddrs(NMClient *nmc)
{
gs_unref_ptrarray GPtrArray *hwaddrs = NULL;
const GPtrArray *devices;
char **hwaddrs_v;
gs_free char *str = NULL;
const GPtrArray * devices;
char ** hwaddrs_v;
gs_free char * str = NULL;
guint i;
devices = nm_client_get_devices (nmc);
devices = nm_client_get_devices(nmc);
for (i = 0; i < devices->len; i++) {
NMDevice *device = devices->pdata[i];
NMDevice * device = devices->pdata[i];
const char *hwaddr;
char *s;
char * s;
if (!NM_IS_DEVICE_ETHERNET (device))
if (!NM_IS_DEVICE_ETHERNET(device))
continue;
if (nm_device_get_state (device) < NM_DEVICE_STATE_UNAVAILABLE)
if (nm_device_get_state(device) < NM_DEVICE_STATE_UNAVAILABLE)
continue;
hwaddr = nm_device_ethernet_get_permanent_hw_address (NM_DEVICE_ETHERNET (device));
hwaddr = nm_device_ethernet_get_permanent_hw_address(NM_DEVICE_ETHERNET(device));
if (!hwaddr)
continue;
s = nmcs_utils_hwaddr_normalize (hwaddr, -1);
s = nmcs_utils_hwaddr_normalize(hwaddr, -1);
if (!s)
continue;
if (!hwaddrs)
hwaddrs = g_ptr_array_new_with_free_func (g_free);
g_ptr_array_add (hwaddrs, s);
hwaddrs = g_ptr_array_new_with_free_func(g_free);
g_ptr_array_add(hwaddrs, s);
}
if (!hwaddrs) {
_LOGD ("found interfaces: none");
_LOGD("found interfaces: none");
return NULL;
}
g_ptr_array_add (hwaddrs, NULL);
hwaddrs_v = (char **) g_ptr_array_free (g_steal_pointer (&hwaddrs), FALSE);
g_ptr_array_add(hwaddrs, NULL);
hwaddrs_v = (char **) g_ptr_array_free(g_steal_pointer(&hwaddrs), FALSE);
_LOGD ("found interfaces: %s", (str = g_strjoinv (", ", hwaddrs_v)));
_LOGD("found interfaces: %s", (str = g_strjoinv(", ", hwaddrs_v)));
return hwaddrs_v;
}
static NMDevice *
_nmc_get_device_by_hwaddr (NMClient *nmc,
const char *hwaddr)
_nmc_get_device_by_hwaddr(NMClient *nmc, const char *hwaddr)
{
const GPtrArray *devices;
guint i;
devices = nm_client_get_devices (nmc);
devices = nm_client_get_devices(nmc);
for (i = 0; i < devices->len; i++) {
NMDevice *device = devices->pdata[i];
const char *hwaddr_dev;
NMDevice * device = devices->pdata[i];
const char * hwaddr_dev;
gs_free char *s = NULL;
if (!NM_IS_DEVICE_ETHERNET (device))
if (!NM_IS_DEVICE_ETHERNET(device))
continue;
hwaddr_dev = nm_device_ethernet_get_permanent_hw_address (NM_DEVICE_ETHERNET (device));
hwaddr_dev = nm_device_ethernet_get_permanent_hw_address(NM_DEVICE_ETHERNET(device));
if (!hwaddr_dev)
continue;
s = nmcs_utils_hwaddr_normalize (hwaddr_dev, -1);
if (s && nm_streq (s, hwaddr))
s = nmcs_utils_hwaddr_normalize(hwaddr_dev, -1);
if (s && nm_streq(s, hwaddr))
return device;
}
@ -207,52 +198,48 @@ _nmc_get_device_by_hwaddr (NMClient *nmc,
/*****************************************************************************/
typedef struct {
GMainLoop *main_loop;
GMainLoop * main_loop;
GHashTable *config_dict;
} GetConfigData;
static void
_get_config_cb (GObject *source,
GAsyncResult *result,
gpointer user_data)
_get_config_cb(GObject *source, GAsyncResult *result, gpointer user_data)
{
GetConfigData *data = user_data;
GetConfigData * data = user_data;
gs_unref_hashtable GHashTable *config_dict = NULL;
gs_free_error GError *error = NULL;
config_dict = nmcs_provider_get_config_finish (NMCS_PROVIDER (source), result, &error);
config_dict = nmcs_provider_get_config_finish(NMCS_PROVIDER(source), result, &error);
if (!config_dict) {
if (!nm_utils_error_is_cancelled (error))
_LOGI ("failure to get meta data: %s", error->message);
if (!nm_utils_error_is_cancelled(error))
_LOGI("failure to get meta data: %s", error->message);
} else
_LOGD ("meta data received");
_LOGD("meta data received");
data->config_dict = g_steal_pointer (&config_dict);
g_main_loop_quit (data->main_loop);
data->config_dict = g_steal_pointer(&config_dict);
g_main_loop_quit(data->main_loop);
}
static GHashTable *
_get_config (GCancellable *sigterm_cancellable,
NMCSProvider *provider,
NMClient *nmc)
_get_config(GCancellable *sigterm_cancellable, NMCSProvider *provider, NMClient *nmc)
{
nm_auto_unref_gmainloop GMainLoop *main_loop = g_main_loop_new (NULL, FALSE);
nm_auto_unref_gmainloop GMainLoop *main_loop = g_main_loop_new(NULL, FALSE);
GetConfigData data = {
.main_loop = main_loop,
};
gs_strfreev char **hwaddrs = NULL;
hwaddrs = _nmc_get_hwaddrs (nmc);
hwaddrs = _nmc_get_hwaddrs(nmc);
nmcs_provider_get_config (provider,
nmcs_provider_get_config(provider,
TRUE,
(const char *const*) hwaddrs,
(const char *const *) hwaddrs,
sigterm_cancellable,
_get_config_cb,
&data);
g_main_loop_run (main_loop);
g_main_loop_run(main_loop);
return data.config_dict;
}
@ -260,35 +247,35 @@ _get_config (GCancellable *sigterm_cancellable,
/*****************************************************************************/
static gboolean
_nmc_skip_connection (NMConnection *connection)
_nmc_skip_connection(NMConnection *connection)
{
NMSettingUser *s_user;
const char *v;
const char * v;
s_user = NM_SETTING_USER (nm_connection_get_setting (connection, NM_TYPE_SETTING_USER));
s_user = NM_SETTING_USER(nm_connection_get_setting(connection, NM_TYPE_SETTING_USER));
if (!s_user)
return FALSE;
#define USER_TAG_SKIP "org.freedesktop.nm-cloud-setup.skip"
nm_assert (nm_setting_user_check_key (USER_TAG_SKIP, NULL));
nm_assert(nm_setting_user_check_key(USER_TAG_SKIP, NULL));
v = nm_setting_user_get_data (s_user, USER_TAG_SKIP);
return _nm_utils_ascii_str_to_bool (v, FALSE);
v = nm_setting_user_get_data(s_user, USER_TAG_SKIP);
return _nm_utils_ascii_str_to_bool(v, FALSE);
}
static gboolean
_nmc_mangle_connection (NMDevice *device,
NMConnection *connection,
_nmc_mangle_connection(NMDevice * device,
NMConnection * connection,
const NMCSProviderGetConfigIfaceData *config_data,
gboolean *out_changed)
gboolean * out_changed)
{
NMSettingIPConfig *s_ip;
gsize i;
in_addr_t gateway;
gint64 rt_metric;
guint32 rt_table;
NMIPRoute *route_entry;
NMIPRoute * route_entry;
gboolean addrs_changed = FALSE;
gboolean rules_changed = FALSE;
gboolean routes_changed = FALSE;
@ -296,100 +283,93 @@ _nmc_mangle_connection (NMDevice *device,
gs_unref_ptrarray GPtrArray *rules_new = NULL;
gs_unref_ptrarray GPtrArray *routes_new = NULL;
if (!nm_streq0 (nm_connection_get_connection_type (connection), NM_SETTING_WIRED_SETTING_NAME))
if (!nm_streq0(nm_connection_get_connection_type(connection), NM_SETTING_WIRED_SETTING_NAME))
return FALSE;
s_ip = nm_connection_get_setting_ip4_config (connection);
s_ip = nm_connection_get_setting_ip4_config(connection);
if (!s_ip)
return FALSE;
addrs_new = g_ptr_array_new_full (config_data->ipv4s_len,
(GDestroyNotify) nm_ip_address_unref);
rules_new = g_ptr_array_new_full (config_data->ipv4s_len,
(GDestroyNotify) nm_ip_routing_rule_unref);
routes_new = g_ptr_array_new_full (config_data->iproutes_len + !!config_data->ipv4s_len,
addrs_new = g_ptr_array_new_full(config_data->ipv4s_len, (GDestroyNotify) nm_ip_address_unref);
rules_new =
g_ptr_array_new_full(config_data->ipv4s_len, (GDestroyNotify) nm_ip_routing_rule_unref);
routes_new = g_ptr_array_new_full(config_data->iproutes_len + !!config_data->ipv4s_len,
(GDestroyNotify) nm_ip_route_unref);
if ( config_data->has_ipv4s
&& config_data->has_cidr) {
if (config_data->has_ipv4s && config_data->has_cidr) {
for (i = 0; i < config_data->ipv4s_len; i++) {
NMIPAddress *entry;
entry = nm_ip_address_new_binary (AF_INET,
entry = nm_ip_address_new_binary(AF_INET,
&config_data->ipv4s_arr[i],
config_data->cidr_prefix,
NULL);
if (entry)
g_ptr_array_add (addrs_new, entry);
g_ptr_array_add(addrs_new, entry);
}
gateway = nm_utils_ip4_address_clear_host_address (config_data->cidr_addr, config_data->cidr_prefix);
gateway = nm_utils_ip4_address_clear_host_address(config_data->cidr_addr,
config_data->cidr_prefix);
((guint8 *) &gateway)[3] += 1;
rt_metric = 10;
rt_table = 30400 + config_data->iface_idx;
route_entry = nm_ip_route_new_binary (AF_INET,
&nm_ip_addr_zero,
0,
&gateway,
rt_metric,
NULL);
nm_ip_route_set_attribute (route_entry,
route_entry =
nm_ip_route_new_binary(AF_INET, &nm_ip_addr_zero, 0, &gateway, rt_metric, NULL);
nm_ip_route_set_attribute(route_entry,
NM_IP_ROUTE_ATTRIBUTE_TABLE,
g_variant_new_uint32 (rt_table));
g_ptr_array_add (routes_new, route_entry);
g_variant_new_uint32(rt_table));
g_ptr_array_add(routes_new, route_entry);
for (i = 0; i < config_data->ipv4s_len; i++) {
NMIPRoutingRule *entry;
char sbuf[NM_UTILS_INET_ADDRSTRLEN];
entry = nm_ip_routing_rule_new (AF_INET);
nm_ip_routing_rule_set_priority (entry, rt_table);
nm_ip_routing_rule_set_from (entry,
_nm_utils_inet4_ntop (config_data->ipv4s_arr[i], sbuf),
entry = nm_ip_routing_rule_new(AF_INET);
nm_ip_routing_rule_set_priority(entry, rt_table);
nm_ip_routing_rule_set_from(entry,
_nm_utils_inet4_ntop(config_data->ipv4s_arr[i], sbuf),
32);
nm_ip_routing_rule_set_table (entry, rt_table);
nm_ip_routing_rule_set_table(entry, rt_table);
nm_assert (nm_ip_routing_rule_validate (entry, NULL));
nm_assert(nm_ip_routing_rule_validate(entry, NULL));
g_ptr_array_add (rules_new, entry);
g_ptr_array_add(rules_new, entry);
}
}
for (i = 0; i < config_data->iproutes_len; ++i)
g_ptr_array_add (routes_new, config_data->iproutes_arr[i]);
g_ptr_array_add(routes_new, config_data->iproutes_arr[i]);
addrs_changed = nmcs_setting_ip_replace_ipv4_addresses (s_ip,
addrs_changed = nmcs_setting_ip_replace_ipv4_addresses(s_ip,
(NMIPAddress **) addrs_new->pdata,
addrs_new->len);
routes_changed = nmcs_setting_ip_replace_ipv4_routes (s_ip,
routes_changed = nmcs_setting_ip_replace_ipv4_routes(s_ip,
(NMIPRoute **) routes_new->pdata,
routes_new->len);
rules_changed = nmcs_setting_ip_replace_ipv4_rules (s_ip,
rules_changed = nmcs_setting_ip_replace_ipv4_rules(s_ip,
(NMIPRoutingRule **) rules_new->pdata,
rules_new->len);
NM_SET_OUT (out_changed, addrs_changed
|| routes_changed
|| rules_changed);
NM_SET_OUT(out_changed, addrs_changed || routes_changed || rules_changed);
return TRUE;
}
/*****************************************************************************/
static guint
_config_data_get_num_valid (GHashTable *config_dict)
_config_data_get_num_valid(GHashTable *config_dict)
{
const NMCSProviderGetConfigIfaceData *config_data;
GHashTableIter h_iter;
guint n = 0;
g_hash_table_iter_init (&h_iter, config_dict);
while (g_hash_table_iter_next (&h_iter, NULL, (gpointer *) &config_data)) {
if (nmcs_provider_get_config_iface_data_is_valid (config_data))
g_hash_table_iter_init(&h_iter, config_dict);
while (g_hash_table_iter_next(&h_iter, NULL, (gpointer *) &config_data)) {
if (nmcs_provider_get_config_iface_data_is_valid(config_data))
n++;
}
@ -397,10 +377,10 @@ _config_data_get_num_valid (GHashTable *config_dict)
}
static gboolean
_config_one (GCancellable *sigterm_cancellable,
NMClient *nmc,
_config_one(GCancellable * sigterm_cancellable,
NMClient * nmc,
gboolean is_single_nic,
const char *hwaddr,
const char * hwaddr,
const NMCSProviderGetConfigIfaceData *config_data)
{
gs_unref_object NMDevice *device = NULL;
@ -412,120 +392,117 @@ _config_one (GCancellable *sigterm_cancellable,
guint try_count;
gboolean any_changes = FALSE;
g_main_context_iteration (NULL, FALSE);
g_main_context_iteration(NULL, FALSE);
if (g_cancellable_is_cancelled (sigterm_cancellable))
if (g_cancellable_is_cancelled(sigterm_cancellable))
return FALSE;
device = nm_g_object_ref (_nmc_get_device_by_hwaddr (nmc, hwaddr));
device = nm_g_object_ref(_nmc_get_device_by_hwaddr(nmc, hwaddr));
if (!device) {
_LOGD ("config device %s: skip because device not found", hwaddr);
_LOGD("config device %s: skip because device not found", hwaddr);
return FALSE;
}
if (!nmcs_provider_get_config_iface_data_is_valid (config_data)) {
_LOGD ("config device %s: skip because meta data not successfully fetched", hwaddr);
if (!nmcs_provider_get_config_iface_data_is_valid(config_data)) {
_LOGD("config device %s: skip because meta data not successfully fetched", hwaddr);
return FALSE;
}
_LOGD ("config device %s: configuring \"%s\" (%s)...",
_LOGD("config device %s: configuring \"%s\" (%s)...",
hwaddr,
nm_device_get_iface (device) ?: "/unknown/",
nm_object_get_path (NM_OBJECT (device)));
nm_device_get_iface(device) ?: "/unknown/",
nm_object_get_path(NM_OBJECT(device)));
try_count = 0;
try_again:
applied_connection = nmcs_device_get_applied_connection (device,
applied_connection = nmcs_device_get_applied_connection(device,
sigterm_cancellable,
&applied_version_id,
&error);
if (!applied_connection) {
if (!nm_utils_error_is_cancelled (error))
_LOGD ("config device %s: device has no applied connection (%s). Skip", hwaddr, error->message);
if (!nm_utils_error_is_cancelled(error))
_LOGD("config device %s: device has no applied connection (%s). Skip",
hwaddr,
error->message);
return any_changes;
}
if (_nmc_skip_connection (applied_connection)) {
_LOGD ("config device %s: skip applied connection due to user data %s", hwaddr, USER_TAG_SKIP);
if (_nmc_skip_connection(applied_connection)) {
_LOGD("config device %s: skip applied connection due to user data %s",
hwaddr,
USER_TAG_SKIP);
return any_changes;
}
if (!_nmc_mangle_connection (device,
applied_connection,
config_data,
&changed)) {
_LOGD ("config device %s: device has no suitable applied connection. Skip", hwaddr);
if (!_nmc_mangle_connection(device, applied_connection, config_data, &changed)) {
_LOGD("config device %s: device has no suitable applied connection. Skip", hwaddr);
return any_changes;
}
if (!changed) {
_LOGD ("config device %s: device needs no update to applied connection \"%s\" (%s). Skip",
_LOGD("config device %s: device needs no update to applied connection \"%s\" (%s). Skip",
hwaddr,
nm_connection_get_id (applied_connection),
nm_connection_get_uuid (applied_connection));
nm_connection_get_id(applied_connection),
nm_connection_get_uuid(applied_connection));
return any_changes;
}
_LOGD ("config device %s: reapply connection \"%s\" (%s)",
_LOGD("config device %s: reapply connection \"%s\" (%s)",
hwaddr,
nm_connection_get_id (applied_connection),
nm_connection_get_uuid (applied_connection));
nm_connection_get_id(applied_connection),
nm_connection_get_uuid(applied_connection));
/* we are about to call Reapply(). If if that fails, it counts as if we changed something. */
any_changes = TRUE;
if (!nmcs_device_reapply (device,
if (!nmcs_device_reapply(device,
sigterm_cancellable,
applied_connection,
applied_version_id,
&version_id_changed,
&error)) {
if ( version_id_changed
&& try_count < 5) {
_LOGD ("config device %s: applied connection changed in the meantime. Retry...",
hwaddr);
g_clear_object (&applied_connection);
g_clear_error (&error);
if (version_id_changed && try_count < 5) {
_LOGD("config device %s: applied connection changed in the meantime. Retry...", hwaddr);
g_clear_object(&applied_connection);
g_clear_error(&error);
try_count++;
goto try_again;
}
if (!nm_utils_error_is_cancelled (error)) {
_LOGD ("config device %s: failure to reapply connection \"%s\" (%s): %s",
if (!nm_utils_error_is_cancelled(error)) {
_LOGD("config device %s: failure to reapply connection \"%s\" (%s): %s",
hwaddr,
nm_connection_get_id (applied_connection),
nm_connection_get_uuid (applied_connection),
nm_connection_get_id(applied_connection),
nm_connection_get_uuid(applied_connection),
error->message);
}
return any_changes;
}
_LOGD ("config device %s: connection \"%s\" (%s) reapplied",
_LOGD("config device %s: connection \"%s\" (%s) reapplied",
hwaddr,
nm_connection_get_id (applied_connection),
nm_connection_get_uuid (applied_connection));
nm_connection_get_id(applied_connection),
nm_connection_get_uuid(applied_connection));
return any_changes;
}
static gboolean
_config_all (GCancellable *sigterm_cancellable,
NMClient *nmc,
GHashTable *config_dict)
_config_all(GCancellable *sigterm_cancellable, NMClient *nmc, GHashTable *config_dict)
{
GHashTableIter h_iter;
const NMCSProviderGetConfigIfaceData *c_config_data;
const char *c_hwaddr;
const char * c_hwaddr;
gboolean is_single_nic;
gboolean any_changes = FALSE;
is_single_nic = (_config_data_get_num_valid (config_dict) <= 1);
is_single_nic = (_config_data_get_num_valid(config_dict) <= 1);
g_hash_table_iter_init (&h_iter, config_dict);
while (g_hash_table_iter_next (&h_iter, (gpointer *) &c_hwaddr, (gpointer *) &c_config_data)) {
if (_config_one (sigterm_cancellable, nmc, is_single_nic, c_hwaddr, c_config_data))
g_hash_table_iter_init(&h_iter, config_dict);
while (g_hash_table_iter_next(&h_iter, (gpointer *) &c_hwaddr, (gpointer *) &c_config_data)) {
if (_config_one(sigterm_cancellable, nmc, is_single_nic, c_hwaddr, c_config_data))
any_changes = TRUE;
}
@ -535,93 +512,94 @@ _config_all (GCancellable *sigterm_cancellable,
/*****************************************************************************/
static gboolean
sigterm_handler (gpointer user_data)
sigterm_handler(gpointer user_data)
{
GCancellable *sigterm_cancellable = user_data;
if (!g_cancellable_is_cancelled (sigterm_cancellable)) {
_LOGD ("SIGTERM received");
g_cancellable_cancel (user_data);
if (!g_cancellable_is_cancelled(sigterm_cancellable)) {
_LOGD("SIGTERM received");
g_cancellable_cancel(user_data);
} else
_LOGD ("SIGTERM received (again)");
_LOGD("SIGTERM received (again)");
return G_SOURCE_CONTINUE;
}
/*****************************************************************************/
int
main (int argc, const char *const*argv)
main(int argc, const char *const *argv)
{
gs_unref_object GCancellable *sigterm_cancellable = NULL;
gs_unref_object GCancellable * sigterm_cancellable = NULL;
nm_auto_destroy_and_unref_gsource GSource *sigterm_source = NULL;
gs_unref_object NMCSProvider *provider = NULL;
gs_unref_object NMClient *nmc = NULL;
gs_unref_hashtable GHashTable *config_dict = NULL;
gs_free_error GError *error = NULL;
_nm_logging_enabled_init (g_getenv (NMCS_ENV_VARIABLE ("NM_CLOUD_SETUP_LOG")));
_nm_logging_enabled_init(g_getenv(NMCS_ENV_VARIABLE("NM_CLOUD_SETUP_LOG")));
_LOGD ("nm-cloud-setup %s starting...", NM_DIST_VERSION);
_LOGD("nm-cloud-setup %s starting...", NM_DIST_VERSION);
if (argc != 1) {
g_printerr ("%s: no command line arguments supported\n", argv[0]);
g_printerr("%s: no command line arguments supported\n", argv[0]);
return EXIT_FAILURE;
}
sigterm_cancellable = g_cancellable_new ();
sigterm_cancellable = g_cancellable_new();
sigterm_source = nm_g_source_attach (nm_g_unix_signal_source_new (SIGTERM,
sigterm_source = nm_g_source_attach(nm_g_unix_signal_source_new(SIGTERM,
G_PRIORITY_DEFAULT,
sigterm_handler,
sigterm_cancellable,
NULL),
NULL);
provider = _provider_detect (sigterm_cancellable);
provider = _provider_detect(sigterm_cancellable);
if (!provider)
goto done;
nmc_client_new_waitsync (sigterm_cancellable,
nmc_client_new_waitsync(sigterm_cancellable,
&nmc,
&error,
NM_CLIENT_INSTANCE_FLAGS, (guint) NM_CLIENT_INSTANCE_FLAGS_NO_AUTO_FETCH_PERMISSIONS,
NM_CLIENT_INSTANCE_FLAGS,
(guint) NM_CLIENT_INSTANCE_FLAGS_NO_AUTO_FETCH_PERMISSIONS,
NULL);
nmcs_wait_for_objects_register (nmc);
nmcs_wait_for_objects_register (nm_client_get_context_busy_watcher (nmc));
nmcs_wait_for_objects_register(nmc);
nmcs_wait_for_objects_register(nm_client_get_context_busy_watcher(nmc));
if (error) {
if (!nm_utils_error_is_cancelled (error))
_LOGI ("failure to talk to NetworkManager: %s", error->message);
if (!nm_utils_error_is_cancelled(error))
_LOGI("failure to talk to NetworkManager: %s", error->message);
goto done;
}
if (!nm_client_get_nm_running (nmc)) {
_LOGI ("NetworkManager is not running");
if (!nm_client_get_nm_running(nmc)) {
_LOGI("NetworkManager is not running");
goto done;
}
config_dict = _get_config (sigterm_cancellable, provider, nmc);
config_dict = _get_config(sigterm_cancellable, provider, nmc);
if (!config_dict)
goto done;
if (_config_all (sigterm_cancellable, nmc, config_dict))
_LOGI ("some changes were applied for provider %s", nmcs_provider_get_name (provider));
if (_config_all(sigterm_cancellable, nmc, config_dict))
_LOGI("some changes were applied for provider %s", nmcs_provider_get_name(provider));
else
_LOGD ("no changes were applied for provider %s", nmcs_provider_get_name (provider));
_LOGD("no changes were applied for provider %s", nmcs_provider_get_name(provider));
done:
nm_clear_pointer (&config_dict, g_hash_table_unref);
g_clear_object (&nmc);
g_clear_object (&provider);
nm_clear_pointer(&config_dict, g_hash_table_unref);
g_clear_object(&nmc);
g_clear_object(&provider);
if (!nmcs_wait_for_objects_iterate_until_done (NULL, 2000)) {
_LOGE ("shutdown: timeout waiting to application to quit. This is a bug");
nm_assert_not_reached ();
if (!nmcs_wait_for_objects_iterate_until_done(NULL, 2000)) {
_LOGE("shutdown: timeout waiting to application to quit. This is a bug");
nm_assert_not_reached();
}
nm_clear_g_source_inst (&sigterm_source);
g_clear_object (&sigterm_cancellable);
nm_clear_g_source_inst(&sigterm_source);
g_clear_object(&sigterm_cancellable);
return 0;
}

View file

@ -13,11 +13,11 @@
volatile NMLogLevel _nm_logging_configured_level = LOGL_TRACE;
void
_nm_logging_enabled_init (const char *level_str)
_nm_logging_enabled_init(const char *level_str)
{
NMLogLevel level;
if (!_nm_log_parse_level (level_str, &level))
if (!_nm_log_parse_level(level_str, &level))
level = LOGL_WARN;
else if (level == _LOGL_KEEP)
level = LOGL_WARN;
@ -26,33 +26,39 @@ _nm_logging_enabled_init (const char *level_str)
}
void
_nm_log_impl_cs (NMLogLevel level,
const char *fmt,
...)
_nm_log_impl_cs(NMLogLevel level, const char *fmt, ...)
{
gs_free char *msg = NULL;
va_list ap;
const char *level_str;
const char * level_str;
gint64 ts;
va_start (ap, fmt);
msg = g_strdup_vprintf (fmt, ap);
va_end (ap);
va_start(ap, fmt);
msg = g_strdup_vprintf(fmt, ap);
va_end(ap);
switch (level) {
case LOGL_TRACE: level_str = "<trace>"; break;
case LOGL_DEBUG: level_str = "<debug>"; break;
case LOGL_INFO: level_str = "<info> "; break;
case LOGL_WARN: level_str = "<warn> "; break;
case LOGL_TRACE:
level_str = "<trace>";
break;
case LOGL_DEBUG:
level_str = "<debug>";
break;
case LOGL_INFO:
level_str = "<info> ";
break;
case LOGL_WARN:
level_str = "<warn> ";
break;
default:
nm_assert (level == LOGL_ERR);
nm_assert(level == LOGL_ERR);
level_str = "<error>";
break;
}
ts = nm_utils_clock_gettime_nsec (CLOCK_BOOTTIME);
ts = nm_utils_clock_gettime_nsec(CLOCK_BOOTTIME);
g_print ("[%"G_GINT64_FORMAT".%05"G_GINT64_FORMAT"] %s %s\n",
g_print("[%" G_GINT64_FORMAT ".%05" G_GINT64_FORMAT "] %s %s\n",
ts / NM_UTILS_NSEC_PER_SEC,
(ts / (NM_UTILS_NSEC_PER_SEC / 10000)) % 10000,
level_str,
@ -60,38 +66,36 @@ _nm_log_impl_cs (NMLogLevel level,
}
void
_nm_utils_monotonic_timestamp_initialized (const struct timespec *tp,
_nm_utils_monotonic_timestamp_initialized(const struct timespec *tp,
gint64 offset_sec,
gboolean is_boottime)
{
}
{}
/*****************************************************************************/
G_LOCK_DEFINE_STATIC (_wait_for_objects_lock);
G_LOCK_DEFINE_STATIC(_wait_for_objects_lock);
static GSList *_wait_for_objects_list;
static GSList *_wait_for_objects_iterate_loops;
static void
_wait_for_objects_maybe_quit_mainloops_with_lock (void)
_wait_for_objects_maybe_quit_mainloops_with_lock(void)
{
GSList *iter;
if (!_wait_for_objects_list) {
for (iter = _wait_for_objects_iterate_loops; iter; iter = iter->next)
g_main_loop_quit (iter->data);
g_main_loop_quit(iter->data);
}
}
static void
_wait_for_objects_weak_cb (gpointer data,
GObject *where_the_object_was)
_wait_for_objects_weak_cb(gpointer data, GObject *where_the_object_was)
{
G_LOCK (_wait_for_objects_lock);
nm_assert (g_slist_find (_wait_for_objects_list, where_the_object_was));
_wait_for_objects_list = g_slist_remove (_wait_for_objects_list, where_the_object_was);
_wait_for_objects_maybe_quit_mainloops_with_lock ();
G_UNLOCK (_wait_for_objects_lock);
G_LOCK(_wait_for_objects_lock);
nm_assert(g_slist_find(_wait_for_objects_list, where_the_object_was));
_wait_for_objects_list = g_slist_remove(_wait_for_objects_list, where_the_object_was);
_wait_for_objects_maybe_quit_mainloops_with_lock();
G_UNLOCK(_wait_for_objects_lock);
}
/**
@ -103,17 +107,15 @@ _wait_for_objects_weak_cb (gpointer data,
* @target gets destroyed, which means that it gets completely unreferenced.
*/
gpointer
nmcs_wait_for_objects_register (gpointer target)
nmcs_wait_for_objects_register(gpointer target)
{
g_return_val_if_fail (G_IS_OBJECT (target), NULL);
g_return_val_if_fail(G_IS_OBJECT(target), NULL);
G_LOCK (_wait_for_objects_lock);
_wait_for_objects_list = g_slist_prepend (_wait_for_objects_list, target);
G_UNLOCK (_wait_for_objects_lock);
G_LOCK(_wait_for_objects_lock);
_wait_for_objects_list = g_slist_prepend(_wait_for_objects_list, target);
G_UNLOCK(_wait_for_objects_lock);
g_object_weak_ref (target,
_wait_for_objects_weak_cb,
NULL);
g_object_weak_ref(target, _wait_for_objects_weak_cb, NULL);
return target;
}
@ -123,17 +125,17 @@ typedef struct {
} WaitForObjectsData;
static gboolean
_wait_for_objects_iterate_until_done_timeout_cb (gpointer user_data)
_wait_for_objects_iterate_until_done_timeout_cb(gpointer user_data)
{
WaitForObjectsData *data = user_data;
data->got_timeout = TRUE;
g_main_loop_quit (data->loop);
g_main_loop_quit(data->loop);
return G_SOURCE_CONTINUE;
}
static gboolean
_wait_for_objects_iterate_until_done_idle_cb (gpointer user_data)
_wait_for_objects_iterate_until_done_idle_cb(gpointer user_data)
{
/* This avoids a race where:
*
@ -148,9 +150,9 @@ _wait_for_objects_iterate_until_done_idle_cb (gpointer user_data)
* Avoid this, by checking once again after we start running the mainloop.
*/
G_LOCK (_wait_for_objects_lock);
_wait_for_objects_maybe_quit_mainloops_with_lock ();
G_UNLOCK (_wait_for_objects_lock);
G_LOCK(_wait_for_objects_lock);
_wait_for_objects_maybe_quit_mainloops_with_lock();
G_UNLOCK(_wait_for_objects_lock);
return G_SOURCE_REMOVE;
}
@ -169,29 +171,29 @@ _wait_for_objects_iterate_until_done_idle_cb (gpointer user_data)
* Returns: %FALSE on timeout or %TRUE if all objects destroyed before timeout.
*/
gboolean
nmcs_wait_for_objects_iterate_until_done (GMainContext *context,
int timeout_msec)
nmcs_wait_for_objects_iterate_until_done(GMainContext *context, int timeout_msec)
{
nm_auto_unref_gmainloop GMainLoop *loop = g_main_loop_new (context, FALSE);
nm_auto_unref_gmainloop GMainLoop *loop = g_main_loop_new(context, FALSE);
nm_auto_destroy_and_unref_gsource GSource *timeout_source = NULL;
WaitForObjectsData data;
gboolean has_more_objects;
G_LOCK (_wait_for_objects_lock);
G_LOCK(_wait_for_objects_lock);
if (!_wait_for_objects_list) {
G_UNLOCK (_wait_for_objects_lock);
G_UNLOCK(_wait_for_objects_lock);
return TRUE;
}
_wait_for_objects_iterate_loops = g_slist_prepend (_wait_for_objects_iterate_loops, loop);
G_UNLOCK (_wait_for_objects_lock);
_wait_for_objects_iterate_loops = g_slist_prepend(_wait_for_objects_iterate_loops, loop);
G_UNLOCK(_wait_for_objects_lock);
data = (WaitForObjectsData) {
data = (WaitForObjectsData){
.loop = loop,
.got_timeout = FALSE,
};
if (timeout_msec >= 0) {
timeout_source = nm_g_source_attach (nm_g_timeout_source_new (timeout_msec,
timeout_source = nm_g_source_attach(
nm_g_timeout_source_new(timeout_msec,
G_PRIORITY_DEFAULT,
_wait_for_objects_iterate_until_done_timeout_cb,
&data,
@ -200,24 +202,23 @@ nmcs_wait_for_objects_iterate_until_done (GMainContext *context,
}
has_more_objects = TRUE;
while ( has_more_objects
&& !data.got_timeout) {
while (has_more_objects && !data.got_timeout) {
nm_auto_destroy_and_unref_gsource GSource *idle_source = NULL;
idle_source = nm_g_source_attach (nm_g_idle_source_new (G_PRIORITY_DEFAULT,
idle_source =
nm_g_source_attach(nm_g_idle_source_new(G_PRIORITY_DEFAULT,
_wait_for_objects_iterate_until_done_idle_cb,
&data,
NULL),
context);
g_main_loop_run (loop);
g_main_loop_run(loop);
G_LOCK (_wait_for_objects_lock);
G_LOCK(_wait_for_objects_lock);
has_more_objects = (!!_wait_for_objects_list);
if ( data.got_timeout
|| !has_more_objects)
_wait_for_objects_iterate_loops = g_slist_remove (_wait_for_objects_iterate_loops, loop);
G_UNLOCK (_wait_for_objects_lock);
if (data.got_timeout || !has_more_objects)
_wait_for_objects_iterate_loops = g_slist_remove(_wait_for_objects_iterate_loops, loop);
G_UNLOCK(_wait_for_objects_lock);
}
return !data.got_timeout;
@ -226,11 +227,11 @@ nmcs_wait_for_objects_iterate_until_done (GMainContext *context,
/*****************************************************************************/
typedef struct {
GTask *task;
GSource *source_timeout;
GSource *source_next_poll;
GMainContext *context;
GCancellable *internal_cancellable;
GTask * task;
GSource * source_timeout;
GSource * source_next_poll;
GMainContext * context;
GCancellable * internal_cancellable;
NMCSUtilsPollProbeStartFcn probe_start_fcn;
NMCSUtilsPollProbeFinishFcn probe_finish_fcn;
gpointer probe_user_data;
@ -238,82 +239,79 @@ typedef struct {
gint64 last_poll_start_ms;
int sleep_timeout_ms;
int ratelimit_timeout_ms;
bool completed:1;
bool completed : 1;
} PollTaskData;
static void
_poll_task_data_free (gpointer data)
_poll_task_data_free(gpointer data)
{
PollTaskData *poll_task_data = data;
nm_assert (G_IS_TASK (poll_task_data->task));
nm_assert (!poll_task_data->source_next_poll);
nm_assert (!poll_task_data->source_timeout);
nm_assert (poll_task_data->cancellable_id == 0);
nm_assert(G_IS_TASK(poll_task_data->task));
nm_assert(!poll_task_data->source_next_poll);
nm_assert(!poll_task_data->source_timeout);
nm_assert(poll_task_data->cancellable_id == 0);
g_main_context_unref (poll_task_data->context);
g_main_context_unref(poll_task_data->context);
nm_g_slice_free (poll_task_data);
nm_g_slice_free(poll_task_data);
}
static void
_poll_return (PollTaskData *poll_task_data,
GError *error_take)
_poll_return(PollTaskData *poll_task_data, GError *error_take)
{
nm_clear_g_source_inst (&poll_task_data->source_next_poll);
nm_clear_g_source_inst (&poll_task_data->source_timeout);
nm_clear_g_cancellable_disconnect (g_task_get_cancellable (poll_task_data->task),
nm_clear_g_source_inst(&poll_task_data->source_next_poll);
nm_clear_g_source_inst(&poll_task_data->source_timeout);
nm_clear_g_cancellable_disconnect(g_task_get_cancellable(poll_task_data->task),
&poll_task_data->cancellable_id);
nm_clear_g_cancellable (&poll_task_data->internal_cancellable);
nm_clear_g_cancellable(&poll_task_data->internal_cancellable);
if (error_take)
g_task_return_error (poll_task_data->task, g_steal_pointer (&error_take));
g_task_return_error(poll_task_data->task, g_steal_pointer(&error_take));
else
g_task_return_boolean (poll_task_data->task, TRUE);
g_task_return_boolean(poll_task_data->task, TRUE);
g_object_unref (poll_task_data->task);
g_object_unref(poll_task_data->task);
}
static gboolean _poll_start_cb (gpointer user_data);
static gboolean _poll_start_cb(gpointer user_data);
static void
_poll_done_cb (GObject *source,
GAsyncResult *result,
gpointer user_data)
_poll_done_cb(GObject *source, GAsyncResult *result, gpointer user_data)
{
PollTaskData *poll_task_data = user_data;
_nm_unused gs_unref_object GTask *task = poll_task_data->task; /* balance ref from _poll_start_cb() */
PollTaskData * poll_task_data = user_data;
_nm_unused gs_unref_object GTask *task =
poll_task_data->task; /* balance ref from _poll_start_cb() */
gs_free_error GError *error = NULL;
gint64 now_ms;
gint64 wait_ms;
gboolean is_finished;
is_finished = poll_task_data->probe_finish_fcn (source,
result,
poll_task_data->probe_user_data,
&error);
is_finished =
poll_task_data->probe_finish_fcn(source, result, poll_task_data->probe_user_data, &error);
if (nm_utils_error_is_cancelled (error)) {
if (nm_utils_error_is_cancelled(error)) {
/* we already handle this differently. Nothing to do. */
return;
}
if ( error
|| is_finished) {
_poll_return (poll_task_data, g_steal_pointer (&error));
if (error || is_finished) {
_poll_return(poll_task_data, g_steal_pointer(&error));
return;
}
now_ms = nm_utils_get_monotonic_timestamp_msec ();
now_ms = nm_utils_get_monotonic_timestamp_msec();
if (poll_task_data->ratelimit_timeout_ms > 0)
wait_ms = (poll_task_data->last_poll_start_ms + poll_task_data->ratelimit_timeout_ms) - now_ms;
wait_ms =
(poll_task_data->last_poll_start_ms + poll_task_data->ratelimit_timeout_ms) - now_ms;
else
wait_ms = 0;
if (poll_task_data->sleep_timeout_ms > 0)
wait_ms = MAX (wait_ms, poll_task_data->sleep_timeout_ms);
wait_ms = MAX(wait_ms, poll_task_data->sleep_timeout_ms);
poll_task_data->source_next_poll = nm_g_source_attach (nm_g_timeout_source_new (MAX (1, wait_ms),
poll_task_data->source_next_poll =
nm_g_source_attach(nm_g_timeout_source_new(MAX(1, wait_ms),
G_PRIORITY_DEFAULT,
_poll_start_cb,
poll_task_data,
@ -322,17 +320,17 @@ _poll_done_cb (GObject *source,
}
static gboolean
_poll_start_cb (gpointer user_data)
_poll_start_cb(gpointer user_data)
{
PollTaskData *poll_task_data = user_data;
nm_clear_g_source_inst (&poll_task_data->source_next_poll);
nm_clear_g_source_inst(&poll_task_data->source_next_poll);
poll_task_data->last_poll_start_ms = nm_utils_get_monotonic_timestamp_msec ();
poll_task_data->last_poll_start_ms = nm_utils_get_monotonic_timestamp_msec();
g_object_ref (poll_task_data->task); /* balanced by _poll_done_cb() */
g_object_ref(poll_task_data->task); /* balanced by _poll_done_cb() */
poll_task_data->probe_start_fcn (poll_task_data->internal_cancellable,
poll_task_data->probe_start_fcn(poll_task_data->internal_cancellable,
poll_task_data->probe_user_data,
_poll_done_cb,
poll_task_data);
@ -341,25 +339,24 @@ _poll_start_cb (gpointer user_data)
}
static gboolean
_poll_timeout_cb (gpointer user_data)
_poll_timeout_cb(gpointer user_data)
{
PollTaskData *poll_task_data = user_data;
_poll_return (poll_task_data, nm_utils_error_new (NM_UTILS_ERROR_UNKNOWN,
"timeout expired"));
_poll_return(poll_task_data, nm_utils_error_new(NM_UTILS_ERROR_UNKNOWN, "timeout expired"));
return G_SOURCE_CONTINUE;
}
static void
_poll_cancelled_cb (GObject *object, gpointer user_data)
_poll_cancelled_cb(GObject *object, gpointer user_data)
{
PollTaskData *poll_task_data = user_data;
GError *error = NULL;
GError * error = NULL;
nm_clear_g_signal_handler (g_task_get_cancellable (poll_task_data->task),
nm_clear_g_signal_handler(g_task_get_cancellable(poll_task_data->task),
&poll_task_data->cancellable_id);
nm_utils_error_set_cancelled (&error, FALSE, NULL);
_poll_return (poll_task_data, error);
nm_utils_error_set_cancelled(&error, FALSE, NULL);
_poll_return(poll_task_data, error);
}
/**
@ -387,37 +384,38 @@ _poll_cancelled_cb (GObject *object, gpointer user_data)
* actions.
*/
void
nmcs_utils_poll (int poll_timeout_ms,
nmcs_utils_poll(int poll_timeout_ms,
int ratelimit_timeout_ms,
int sleep_timeout_ms,
NMCSUtilsPollProbeStartFcn probe_start_fcn,
NMCSUtilsPollProbeFinishFcn probe_finish_fcn,
gpointer probe_user_data,
GCancellable *cancellable,
GCancellable * cancellable,
GAsyncReadyCallback callback,
gpointer user_data)
{
PollTaskData *poll_task_data;
poll_task_data = g_slice_new (PollTaskData);
*poll_task_data = (PollTaskData) {
.task = nm_g_task_new (NULL, cancellable, nmcs_utils_poll, callback, user_data),
poll_task_data = g_slice_new(PollTaskData);
*poll_task_data = (PollTaskData){
.task = nm_g_task_new(NULL, cancellable, nmcs_utils_poll, callback, user_data),
.probe_start_fcn = probe_start_fcn,
.probe_finish_fcn = probe_finish_fcn,
.probe_user_data = probe_user_data,
.completed = FALSE,
.context = g_main_context_ref_thread_default (),
.context = g_main_context_ref_thread_default(),
.sleep_timeout_ms = sleep_timeout_ms,
.ratelimit_timeout_ms = ratelimit_timeout_ms,
.internal_cancellable = g_cancellable_new (),
.internal_cancellable = g_cancellable_new(),
};
nmcs_wait_for_objects_register (poll_task_data->task);
nmcs_wait_for_objects_register(poll_task_data->task);
g_task_set_task_data (poll_task_data->task, poll_task_data, _poll_task_data_free);
g_task_set_task_data(poll_task_data->task, poll_task_data, _poll_task_data_free);
if (poll_timeout_ms >= 0) {
poll_task_data->source_timeout = nm_g_source_attach (nm_g_timeout_source_new (poll_timeout_ms,
poll_task_data->source_timeout =
nm_g_source_attach(nm_g_timeout_source_new(poll_timeout_ms,
G_PRIORITY_DEFAULT,
_poll_timeout_cb,
poll_task_data,
@ -425,17 +423,15 @@ nmcs_utils_poll (int poll_timeout_ms,
poll_task_data->context);
}
poll_task_data->source_next_poll = nm_g_source_attach (nm_g_idle_source_new (G_PRIORITY_DEFAULT,
_poll_start_cb,
poll_task_data,
NULL),
poll_task_data->source_next_poll = nm_g_source_attach(
nm_g_idle_source_new(G_PRIORITY_DEFAULT, _poll_start_cb, poll_task_data, NULL),
poll_task_data->context);
if (cancellable) {
gulong signal_id;
signal_id = g_cancellable_connect (cancellable,
G_CALLBACK (_poll_cancelled_cb),
signal_id = g_cancellable_connect(cancellable,
G_CALLBACK(_poll_cancelled_cb),
poll_task_data,
NULL);
if (signal_id == 0) {
@ -462,35 +458,33 @@ nmcs_utils_poll (int poll_timeout_ms,
* Error is always set if (and only if) the function returns %FALSE.
*/
gboolean
nmcs_utils_poll_finish (GAsyncResult *result,
gpointer *probe_user_data,
GError **error)
nmcs_utils_poll_finish(GAsyncResult *result, gpointer *probe_user_data, GError **error)
{
GTask *task;
GTask * task;
PollTaskData *poll_task_data;
g_return_val_if_fail (nm_g_task_is_valid (result, NULL, nmcs_utils_poll), FALSE);
g_return_val_if_fail (!error || !*error, FALSE);
g_return_val_if_fail(nm_g_task_is_valid(result, NULL, nmcs_utils_poll), FALSE);
g_return_val_if_fail(!error || !*error, FALSE);
task = G_TASK (result);
task = G_TASK(result);
if (probe_user_data) {
poll_task_data = g_task_get_task_data (task);
NM_SET_OUT (probe_user_data, poll_task_data->probe_user_data);
poll_task_data = g_task_get_task_data(task);
NM_SET_OUT(probe_user_data, poll_task_data->probe_user_data);
}
return g_task_propagate_boolean (task, error);
return g_task_propagate_boolean(task, error);
}
/*****************************************************************************/
char *
nmcs_utils_hwaddr_normalize (const char *hwaddr, gssize len)
nmcs_utils_hwaddr_normalize(const char *hwaddr, gssize len)
{
gs_free char *hwaddr_clone = NULL;
guint8 buf[ETH_ALEN];
nm_assert (len >= -1);
nm_assert(len >= -1);
if (len < 0) {
if (!hwaddr)
@ -498,34 +492,42 @@ nmcs_utils_hwaddr_normalize (const char *hwaddr, gssize len)
} else {
if (len == 0)
return NULL;
nm_assert (hwaddr);
hwaddr = nm_strndup_a (300, hwaddr, len, &hwaddr_clone);
nm_assert(hwaddr);
hwaddr = nm_strndup_a(300, hwaddr, len, &hwaddr_clone);
}
/* we cannot use _nm_utils_hwaddr_aton() because that requires a delimiter.
* Azure exposes MAC addresses without delimiter, so accept that too. */
if (!nm_utils_hexstr2bin_full (hwaddr, FALSE, FALSE, FALSE, ":-", sizeof (buf), buf, sizeof (buf), NULL))
if (!nm_utils_hexstr2bin_full(hwaddr,
FALSE,
FALSE,
FALSE,
":-",
sizeof(buf),
buf,
sizeof(buf),
NULL))
return NULL;
return nm_utils_hwaddr_ntoa (buf, sizeof (buf));
return nm_utils_hwaddr_ntoa(buf, sizeof(buf));
}
/*****************************************************************************/
const char *
nmcs_utils_parse_memmem (GBytes *mem, const char *needle)
nmcs_utils_parse_memmem(GBytes *mem, const char *needle)
{
const char *mem_data;
gsize mem_size;
g_return_val_if_fail (mem, NULL);
g_return_val_if_fail (needle, NULL);
g_return_val_if_fail(mem, NULL);
g_return_val_if_fail(needle, NULL);
mem_data = g_bytes_get_data (mem, &mem_size);
return memmem (mem_data, mem_size, needle, strlen (needle));
mem_data = g_bytes_get_data(mem, &mem_size);
return memmem(mem_data, mem_size, needle, strlen(needle));
}
const char *
nmcs_utils_parse_get_full_line (GBytes *mem, const char *needle)
nmcs_utils_parse_get_full_line(GBytes *mem, const char *needle)
{
const char *mem_data;
gsize mem_size;
@ -534,24 +536,22 @@ nmcs_utils_parse_get_full_line (GBytes *mem, const char *needle)
const char *line;
line = nmcs_utils_parse_memmem (mem, needle);
line = nmcs_utils_parse_memmem(mem, needle);
if (!line)
return NULL;
mem_data = g_bytes_get_data (mem, &mem_size);
mem_data = g_bytes_get_data(mem, &mem_size);
if ( line != mem_data
&& line[-1] != '\n') {
if (line != mem_data && line[-1] != '\n') {
/* the line must be preceeded either by the begin of the data or
* by a newline. */
return NULL;
}
c = mem_size - (line - mem_data);
l = strlen (needle);
l = strlen(needle);
if ( c != l
&& line[l] != '\n') {
if (c != l && line[l] != '\n') {
/* the end of the needle must be either a newline or the end of the buffer. */
return NULL;
}
@ -562,45 +562,41 @@ nmcs_utils_parse_get_full_line (GBytes *mem, const char *needle)
/*****************************************************************************/
char *
nmcs_utils_uri_build_concat_v (const char *base,
const char **components,
gsize n_components)
nmcs_utils_uri_build_concat_v(const char *base, const char **components, gsize n_components)
{
NMStrBuf strbuf = NM_STR_BUF_INIT (NM_UTILS_GET_NEXT_REALLOC_SIZE_104, FALSE);
NMStrBuf strbuf = NM_STR_BUF_INIT(NM_UTILS_GET_NEXT_REALLOC_SIZE_104, FALSE);
nm_assert (base);
nm_assert (base[0]);
nm_assert (!NM_STR_HAS_SUFFIX (base, "/"));
nm_assert(base);
nm_assert(base[0]);
nm_assert(!NM_STR_HAS_SUFFIX(base, "/"));
nm_str_buf_append (&strbuf, base);
nm_str_buf_append(&strbuf, base);
if ( n_components > 0
&& components[0]
&& components[0][0] == '/') {
if (n_components > 0 && components[0] && components[0][0] == '/') {
/* the first component starts with a slash. We allow that, and don't add a duplicate
* slash. Otherwise, we add a separator after base.
*
* We only do that for the first component. */
} else
nm_str_buf_append_c (&strbuf, '/');
nm_str_buf_append_c(&strbuf, '/');
while (n_components > 0) {
if (!components[0]) {
/* we allow NULL, to indicate nothing to append */
} else
nm_str_buf_append (&strbuf, components[0]);
nm_str_buf_append(&strbuf, components[0]);
components++;
n_components--;
}
return nm_str_buf_finalize (&strbuf, NULL);
return nm_str_buf_finalize(&strbuf, NULL);
}
/*****************************************************************************/
gboolean
nmcs_setting_ip_replace_ipv4_addresses (NMSettingIPConfig *s_ip,
NMIPAddress **entries_arr,
nmcs_setting_ip_replace_ipv4_addresses(NMSettingIPConfig *s_ip,
NMIPAddress ** entries_arr,
guint entries_len)
{
gboolean any_changes = FALSE;
@ -608,7 +604,7 @@ nmcs_setting_ip_replace_ipv4_addresses (NMSettingIPConfig *s_ip,
guint num;
guint i;
num = nm_setting_ip_config_get_num_addresses (s_ip);
num = nm_setting_ip_config_get_num_addresses(s_ip);
i_next = 0;
@ -617,26 +613,27 @@ nmcs_setting_ip_replace_ipv4_addresses (NMSettingIPConfig *s_ip,
if (!any_changes) {
if (i_next < num) {
if (nm_ip_address_cmp_full (entry,
nm_setting_ip_config_get_address (s_ip, i_next),
NM_IP_ADDRESS_CMP_FLAGS_WITH_ATTRS) == 0) {
if (nm_ip_address_cmp_full(entry,
nm_setting_ip_config_get_address(s_ip, i_next),
NM_IP_ADDRESS_CMP_FLAGS_WITH_ATTRS)
== 0) {
i_next++;
continue;
}
}
while (i_next < num)
nm_setting_ip_config_remove_address (s_ip, --num);
nm_setting_ip_config_remove_address(s_ip, --num);
any_changes = TRUE;
}
if (!nm_setting_ip_config_add_address (s_ip, entry))
if (!nm_setting_ip_config_add_address(s_ip, entry))
continue;
i_next++;
}
if (any_changes) {
while (i_next < num) {
nm_setting_ip_config_remove_address (s_ip, --num);
nm_setting_ip_config_remove_address(s_ip, --num);
any_changes = TRUE;
}
}
@ -645,8 +642,8 @@ nmcs_setting_ip_replace_ipv4_addresses (NMSettingIPConfig *s_ip,
}
gboolean
nmcs_setting_ip_replace_ipv4_routes (NMSettingIPConfig *s_ip,
NMIPRoute **entries_arr,
nmcs_setting_ip_replace_ipv4_routes(NMSettingIPConfig *s_ip,
NMIPRoute ** entries_arr,
guint entries_len)
{
gboolean any_changes = FALSE;
@ -654,7 +651,7 @@ nmcs_setting_ip_replace_ipv4_routes (NMSettingIPConfig *s_ip,
guint num;
guint i;
num = nm_setting_ip_config_get_num_routes (s_ip);
num = nm_setting_ip_config_get_num_routes(s_ip);
i_next = 0;
@ -663,26 +660,26 @@ nmcs_setting_ip_replace_ipv4_routes (NMSettingIPConfig *s_ip,
if (!any_changes) {
if (i_next < num) {
if (nm_ip_route_equal_full (entry,
nm_setting_ip_config_get_route (s_ip, i_next),
if (nm_ip_route_equal_full(entry,
nm_setting_ip_config_get_route(s_ip, i_next),
NM_IP_ROUTE_EQUAL_CMP_FLAGS_WITH_ATTRS)) {
i_next++;
continue;
}
}
while (i_next < num)
nm_setting_ip_config_remove_route (s_ip, --num);
nm_setting_ip_config_remove_route(s_ip, --num);
any_changes = TRUE;
}
if (!nm_setting_ip_config_add_route (s_ip, entry))
if (!nm_setting_ip_config_add_route(s_ip, entry))
continue;
i_next++;
}
if (!any_changes) {
while (i_next < num) {
nm_setting_ip_config_remove_route (s_ip, --num);
nm_setting_ip_config_remove_route(s_ip, --num);
any_changes = TRUE;
}
}
@ -691,8 +688,8 @@ nmcs_setting_ip_replace_ipv4_routes (NMSettingIPConfig *s_ip,
}
gboolean
nmcs_setting_ip_replace_ipv4_rules (NMSettingIPConfig *s_ip,
NMIPRoutingRule **entries_arr,
nmcs_setting_ip_replace_ipv4_rules(NMSettingIPConfig *s_ip,
NMIPRoutingRule ** entries_arr,
guint entries_len)
{
gboolean any_changes = FALSE;
@ -700,7 +697,7 @@ nmcs_setting_ip_replace_ipv4_rules (NMSettingIPConfig *s_ip,
guint num;
guint i;
num = nm_setting_ip_config_get_num_routing_rules (s_ip);
num = nm_setting_ip_config_get_num_routing_rules(s_ip);
i_next = 0;
@ -709,23 +706,24 @@ nmcs_setting_ip_replace_ipv4_rules (NMSettingIPConfig *s_ip,
if (!any_changes) {
if (i_next < num) {
if (nm_ip_routing_rule_cmp (entry,
nm_setting_ip_config_get_routing_rule (s_ip, i_next)) == 0) {
if (nm_ip_routing_rule_cmp(entry,
nm_setting_ip_config_get_routing_rule(s_ip, i_next))
== 0) {
i_next++;
continue;
}
}
while (i_next < num)
nm_setting_ip_config_remove_routing_rule (s_ip, --num);
nm_setting_ip_config_remove_routing_rule(s_ip, --num);
any_changes = TRUE;
}
nm_setting_ip_config_add_routing_rule (s_ip, entry);
nm_setting_ip_config_add_routing_rule(s_ip, entry);
i_next++;
}
if (!any_changes) {
while (i_next < num) {
nm_setting_ip_config_remove_routing_rule (s_ip, --num);
nm_setting_ip_config_remove_routing_rule(s_ip, --num);
any_changes = TRUE;
}
}
@ -736,48 +734,46 @@ nmcs_setting_ip_replace_ipv4_rules (NMSettingIPConfig *s_ip,
/*****************************************************************************/
typedef struct {
GMainLoop *main_loop;
GMainLoop * main_loop;
NMConnection *connection;
GError *error;
GError * error;
guint64 version_id;
} DeviceGetAppliedConnectionData;
static void
_nmcs_device_get_applied_connection_cb (GObject *source,
GAsyncResult *result,
gpointer user_data)
_nmcs_device_get_applied_connection_cb(GObject *source, GAsyncResult *result, gpointer user_data)
{
DeviceGetAppliedConnectionData *data = user_data;
data->connection = nm_device_get_applied_connection_finish (NM_DEVICE (source),
data->connection = nm_device_get_applied_connection_finish(NM_DEVICE(source),
result,
&data->version_id,
&data->error);
g_main_loop_quit (data->main_loop);
g_main_loop_quit(data->main_loop);
}
NMConnection *
nmcs_device_get_applied_connection (NMDevice *device,
nmcs_device_get_applied_connection(NMDevice * device,
GCancellable *cancellable,
guint64 *version_id,
GError **error)
guint64 * version_id,
GError ** error)
{
nm_auto_unref_gmainloop GMainLoop *main_loop = g_main_loop_new (NULL, FALSE);
nm_auto_unref_gmainloop GMainLoop *main_loop = g_main_loop_new(NULL, FALSE);
DeviceGetAppliedConnectionData data = {
.main_loop = main_loop,
};
nm_device_get_applied_connection_async (device,
nm_device_get_applied_connection_async(device,
0,
cancellable,
_nmcs_device_get_applied_connection_cb,
&data);
g_main_loop_run (main_loop);
g_main_loop_run(main_loop);
if (data.error)
g_propagate_error (error, data.error);
NM_SET_OUT (version_id, data.version_id);
g_propagate_error(error, data.error);
NM_SET_OUT(version_id, data.version_id);
return data.connection;
}
@ -785,36 +781,32 @@ nmcs_device_get_applied_connection (NMDevice *device,
typedef struct {
GMainLoop *main_loop;
GError *error;
GError * error;
} DeviceReapplyData;
static void
_nmcs_device_reapply_cb (GObject *source,
GAsyncResult *result,
gpointer user_data)
_nmcs_device_reapply_cb(GObject *source, GAsyncResult *result, gpointer user_data)
{
DeviceReapplyData *data = user_data;
nm_device_reapply_finish (NM_DEVICE (source),
result,
&data->error);
g_main_loop_quit (data->main_loop);
nm_device_reapply_finish(NM_DEVICE(source), result, &data->error);
g_main_loop_quit(data->main_loop);
}
gboolean
nmcs_device_reapply (NMDevice *device,
nmcs_device_reapply(NMDevice * device,
GCancellable *sigterm_cancellable,
NMConnection *connection,
guint64 version_id,
gboolean *out_version_id_changed,
GError **error)
gboolean * out_version_id_changed,
GError ** error)
{
nm_auto_unref_gmainloop GMainLoop *main_loop = g_main_loop_new (NULL, FALSE);
nm_auto_unref_gmainloop GMainLoop *main_loop = g_main_loop_new(NULL, FALSE);
DeviceReapplyData data = {
.main_loop = main_loop,
};
nm_device_reapply_async (device,
nm_device_reapply_async(device,
connection,
version_id,
0,
@ -822,14 +814,16 @@ nmcs_device_reapply (NMDevice *device,
_nmcs_device_reapply_cb,
&data);
g_main_loop_run (main_loop);
g_main_loop_run(main_loop);
if (data.error) {
NM_SET_OUT (out_version_id_changed, g_error_matches (data.error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_VERSION_ID_MISMATCH));
g_propagate_error (error, data.error);
NM_SET_OUT(
out_version_id_changed,
g_error_matches(data.error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_VERSION_ID_MISMATCH));
g_propagate_error(error, data.error);
return FALSE;
}
NM_SET_OUT (out_version_id_changed, FALSE);
NM_SET_OUT(out_version_id_changed, FALSE);
return TRUE;
}

View file

@ -9,119 +9,114 @@
/* mark names for variables that can be used as configuration. Search
* for NMCS_ENV_VARIABLE() to find all honored environment variables. */
#define NMCS_ENV_VARIABLE(var) ""var""
#define NMCS_ENV_VARIABLE(var) "" var ""
/*****************************************************************************/
extern volatile NMLogLevel _nm_logging_configured_level;
static inline gboolean
nm_logging_enabled (NMLogLevel level)
nm_logging_enabled(NMLogLevel level)
{
return level >= _nm_logging_configured_level;
}
void _nm_logging_enabled_init (const char *level_str);
void _nm_logging_enabled_init(const char *level_str);
void _nm_log_impl_cs (NMLogLevel level,
const char *fmt,
...) _nm_printf (2, 3);
void _nm_log_impl_cs(NMLogLevel level, const char *fmt, ...) _nm_printf(2, 3);
#define _nm_log(level, ...) \
_nm_log_impl_cs ((level), __VA_ARGS__);
#define _nm_log(level, ...) _nm_log_impl_cs((level), __VA_ARGS__);
#define _NMLOG(level, ...) \
G_STMT_START { \
G_STMT_START \
{ \
const NMLogLevel _level = (level); \
\
if (nm_logging_enabled (_level)) { \
_nm_log (_level, __VA_ARGS__); \
if (nm_logging_enabled(_level)) { \
_nm_log(_level, __VA_ARGS__); \
} \
} G_STMT_END
} \
G_STMT_END
/*****************************************************************************/
#ifndef NM_DIST_VERSION
#define NM_DIST_VERSION VERSION
#define NM_DIST_VERSION VERSION
#endif
/*****************************************************************************/
gpointer nmcs_wait_for_objects_register (gpointer target);
gpointer nmcs_wait_for_objects_register(gpointer target);
gboolean nmcs_wait_for_objects_iterate_until_done (GMainContext *context,
int timeout_msec);
gboolean nmcs_wait_for_objects_iterate_until_done(GMainContext *context, int timeout_msec);
/*****************************************************************************/
typedef void (*NMCSUtilsPollProbeStartFcn) (GCancellable *cancellable,
typedef void (*NMCSUtilsPollProbeStartFcn)(GCancellable * cancellable,
gpointer probe_user_data,
GAsyncReadyCallback callback,
gpointer user_data);
typedef gboolean (*NMCSUtilsPollProbeFinishFcn) (GObject *source,
typedef gboolean (*NMCSUtilsPollProbeFinishFcn)(GObject * source,
GAsyncResult *result,
gpointer probe_user_data,
GError **error);
GError ** error);
void nmcs_utils_poll (int poll_timeout_ms,
void nmcs_utils_poll(int poll_timeout_ms,
int ratelimit_timeout_ms,
int sleep_timeout_ms,
NMCSUtilsPollProbeStartFcn probe_start_fcn,
NMCSUtilsPollProbeFinishFcn probe_finish_fcn,
gpointer probe_user_data,
GCancellable *cancellable,
GCancellable * cancellable,
GAsyncReadyCallback callback,
gpointer user_data);
gboolean nmcs_utils_poll_finish (GAsyncResult *result,
gpointer *probe_user_data,
GError **error);
gboolean nmcs_utils_poll_finish(GAsyncResult *result, gpointer *probe_user_data, GError **error);
/*****************************************************************************/
char *nmcs_utils_hwaddr_normalize (const char *hwaddr, gssize len);
char *nmcs_utils_hwaddr_normalize(const char *hwaddr, gssize len);
/*****************************************************************************/
const char *nmcs_utils_parse_memmem (GBytes *mem, const char *needle);
const char *nmcs_utils_parse_memmem(GBytes *mem, const char *needle);
const char *nmcs_utils_parse_get_full_line (GBytes *mem, const char *needle);
const char *nmcs_utils_parse_get_full_line(GBytes *mem, const char *needle);
/*****************************************************************************/
char *nmcs_utils_uri_build_concat_v (const char *base,
const char **components,
gsize n_components);
char *nmcs_utils_uri_build_concat_v(const char *base, const char **components, gsize n_components);
#define nmcs_utils_uri_build_concat(base, ...) nmcs_utils_uri_build_concat_v (base, ((const char *[]) { __VA_ARGS__ }), NM_NARG (__VA_ARGS__))
#define nmcs_utils_uri_build_concat(base, ...) \
nmcs_utils_uri_build_concat_v(base, ((const char *[]){__VA_ARGS__}), NM_NARG(__VA_ARGS__))
/*****************************************************************************/
gboolean nmcs_setting_ip_replace_ipv4_addresses (NMSettingIPConfig *s_ip,
NMIPAddress **entries_arr,
gboolean nmcs_setting_ip_replace_ipv4_addresses(NMSettingIPConfig *s_ip,
NMIPAddress ** entries_arr,
guint entries_len);
gboolean nmcs_setting_ip_replace_ipv4_routes (NMSettingIPConfig *s_ip,
NMIPRoute **entries_arr,
gboolean nmcs_setting_ip_replace_ipv4_routes(NMSettingIPConfig *s_ip,
NMIPRoute ** entries_arr,
guint entries_len);
gboolean nmcs_setting_ip_replace_ipv4_rules (NMSettingIPConfig *s_ip,
NMIPRoutingRule **entries_arr,
gboolean nmcs_setting_ip_replace_ipv4_rules(NMSettingIPConfig *s_ip,
NMIPRoutingRule ** entries_arr,
guint entries_len);
/*****************************************************************************/
NMConnection *nmcs_device_get_applied_connection (NMDevice *device,
NMConnection *nmcs_device_get_applied_connection(NMDevice * device,
GCancellable *cancellable,
guint64 *version_id,
GError **error);
guint64 * version_id,
GError ** error);
gboolean nmcs_device_reapply (NMDevice *device,
gboolean nmcs_device_reapply(NMDevice * device,
GCancellable *sigterm_cancellable,
NMConnection *connection,
guint64 version_id,
gboolean *out_version_id_changed,
GError **error);
gboolean * out_version_id_changed,
GError ** error);
#endif /* __NM_CLOUD_SETUP_UTILS_H__ */

File diff suppressed because it is too large Load diff

View file

@ -8,61 +8,63 @@
typedef struct _NMHttpClient NMHttpClient;
typedef struct _NMHttpClientClass NMHttpClientClass;
#define NM_TYPE_HTTP_CLIENT (nm_http_client_get_type ())
#define NM_HTTP_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_HTTP_CLIENT, NMHttpClient))
#define NM_HTTP_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_HTTP_CLIENT, NMHttpClientClass))
#define NM_IS_HTTP_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_HTTP_CLIENT))
#define NM_IS_HTTP_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_HTTP_CLIENT))
#define NM_HTTP_CLIENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_HTTP_CLIENT, NMHttpClientClass))
#define NM_TYPE_HTTP_CLIENT (nm_http_client_get_type())
#define NM_HTTP_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), NM_TYPE_HTTP_CLIENT, NMHttpClient))
#define NM_HTTP_CLIENT_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), NM_TYPE_HTTP_CLIENT, NMHttpClientClass))
#define NM_IS_HTTP_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), NM_TYPE_HTTP_CLIENT))
#define NM_IS_HTTP_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NM_TYPE_HTTP_CLIENT))
#define NM_HTTP_CLIENT_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), NM_TYPE_HTTP_CLIENT, NMHttpClientClass))
GType nm_http_client_get_type (void);
GType nm_http_client_get_type(void);
NMHttpClient *nm_http_client_new (void);
NMHttpClient *nm_http_client_new(void);
/*****************************************************************************/
GMainContext *nm_http_client_get_main_context (NMHttpClient *self);
GMainContext *nm_http_client_get_main_context(NMHttpClient *self);
/*****************************************************************************/
void nm_http_client_get (NMHttpClient *self,
const char *uri,
void nm_http_client_get(NMHttpClient * self,
const char * uri,
int timeout_msec,
gssize max_data,
const char *const *http_headers,
GCancellable *cancellable,
const char *const * http_headers,
GCancellable * cancellable,
GAsyncReadyCallback callback,
gpointer user_data);
gboolean nm_http_client_get_finish (NMHttpClient *self,
gboolean nm_http_client_get_finish(NMHttpClient *self,
GAsyncResult *result,
long *out_response_code,
GBytes **out_response_data,
GError **error);
long * out_response_code,
GBytes ** out_response_data,
GError ** error);
typedef gboolean (*NMHttpClientPollGetCheckFcn) (long response_code,
GBytes *response_data,
typedef gboolean (*NMHttpClientPollGetCheckFcn)(long response_code,
GBytes * response_data,
gpointer check_user_data,
GError **error);
void nm_http_client_poll_get (NMHttpClient *self,
const char *uri,
void nm_http_client_poll_get(NMHttpClient * self,
const char * uri,
int request_timeout_ms,
gssize request_max_data,
int poll_timeout_ms,
int ratelimit_timeout_ms,
const char *const *http_headers,
GCancellable *cancellable,
const char *const * http_headers,
GCancellable * cancellable,
NMHttpClientPollGetCheckFcn check_fcn,
gpointer check_user_data,
GAsyncReadyCallback callback,
gpointer user_data);
gboolean nm_http_client_poll_get_finish (NMHttpClient *self,
gboolean nm_http_client_poll_get_finish(NMHttpClient *self,
GAsyncResult *result,
long *out_response_code,
GBytes **out_response_data,
GError **error);
long * out_response_code,
GBytes ** out_response_data,
GError ** error);
/*****************************************************************************/

View file

@ -14,10 +14,12 @@
#define NM_AZURE_HOST "169.254.169.254"
#define NM_AZURE_BASE "http://" NM_AZURE_HOST
#define NM_AZURE_API_VERSION "?format=text&api-version=2017-04-02"
#define NM_AZURE_METADATA_URL_BASE /* $NM_AZURE_BASE/$NM_AZURE_API_VERSION */ "/metadata/instance/network/interface/"
#define NM_AZURE_METADATA_URL_BASE /* $NM_AZURE_BASE/$NM_AZURE_API_VERSION */ \
"/metadata/instance/network/interface/"
#define _azure_uri_concat(...) nmcs_utils_uri_build_concat (NM_AZURE_BASE, __VA_ARGS__, NM_AZURE_API_VERSION)
#define _azure_uri_interfaces(...) _azure_uri_concat (NM_AZURE_METADATA_URL_BASE, ##__VA_ARGS__)
#define _azure_uri_concat(...) \
nmcs_utils_uri_build_concat(NM_AZURE_BASE, __VA_ARGS__, NM_AZURE_API_VERSION)
#define _azure_uri_interfaces(...) _azure_uri_concat(NM_AZURE_METADATA_URL_BASE, ##__VA_ARGS__)
/*****************************************************************************/
@ -29,68 +31,60 @@ struct _NMCSProviderAzureClass {
NMCSProviderClass parent;
};
G_DEFINE_TYPE (NMCSProviderAzure, nmcs_provider_azure, NMCS_TYPE_PROVIDER);
G_DEFINE_TYPE(NMCSProviderAzure, nmcs_provider_azure, NMCS_TYPE_PROVIDER);
/*****************************************************************************/
static void
_detect_get_meta_data_done_cb (GObject *source,
GAsyncResult *result,
gpointer user_data)
_detect_get_meta_data_done_cb(GObject *source, GAsyncResult *result, gpointer user_data)
{
gs_unref_object GTask *task = user_data;
gs_free_error GError *get_error = NULL;
gs_free_error GError *error = NULL;
gboolean success;
success = nm_http_client_poll_get_finish (NM_HTTP_CLIENT (source),
result,
NULL,
NULL,
&get_error);
success =
nm_http_client_poll_get_finish(NM_HTTP_CLIENT(source), result, NULL, NULL, &get_error);
if (nm_utils_error_is_cancelled (get_error)) {
g_task_return_error (task, g_steal_pointer (&get_error));
if (nm_utils_error_is_cancelled(get_error)) {
g_task_return_error(task, g_steal_pointer(&get_error));
return;
}
if (get_error) {
nm_utils_error_set (&error,
nm_utils_error_set(&error,
NM_UTILS_ERROR_UNKNOWN,
"failure to get Azure metadata: %s",
get_error->message);
g_task_return_error (task, g_steal_pointer (&error));
g_task_return_error(task, g_steal_pointer(&error));
return;
}
if (!success) {
nm_utils_error_set (&error,
NM_UTILS_ERROR_UNKNOWN,
"failure to detect azure metadata");
g_task_return_error (task, g_steal_pointer (&error));
nm_utils_error_set(&error, NM_UTILS_ERROR_UNKNOWN, "failure to detect azure metadata");
g_task_return_error(task, g_steal_pointer(&error));
return;
}
g_task_return_boolean (task, TRUE);
g_task_return_boolean(task, TRUE);
}
static void
detect (NMCSProvider *provider,
GTask *task)
detect(NMCSProvider *provider, GTask *task)
{
NMHttpClient *http_client;
gs_free char *uri = NULL;
http_client = nmcs_provider_get_http_client (provider);
http_client = nmcs_provider_get_http_client(provider);
nm_http_client_poll_get (http_client,
(uri = _azure_uri_concat ("/metadata/instance")),
nm_http_client_poll_get(http_client,
(uri = _azure_uri_concat("/metadata/instance")),
HTTP_TIMEOUT_MS,
256*1024,
256 * 1024,
7000,
1000,
NM_MAKE_STRV (NM_AZURE_METADATA_HEADER),
g_task_get_cancellable (task),
NM_MAKE_STRV(NM_AZURE_METADATA_HEADER),
g_task_get_cancellable(task),
NULL,
NULL,
_detect_get_meta_data_done_cb,
@ -102,120 +96,112 @@ detect (NMCSProvider *provider,
typedef struct {
NMCSProviderGetConfigTaskData *config_data;
guint n_ifaces_pending;
GError *error;
GError * error;
} AzureData;
typedef struct {
NMCSProviderGetConfigIfaceData *iface_get_config;
AzureData *azure_data;
AzureData * azure_data;
gssize iface_idx;
guint n_ips_prefix_pending;
char *hwaddr;
char * hwaddr;
} AzureIfaceData;
static void
_azure_iface_data_free (AzureIfaceData *iface_data)
_azure_iface_data_free(AzureIfaceData *iface_data)
{
g_free(iface_data->hwaddr);
nm_g_slice_free (iface_data);
nm_g_slice_free(iface_data);
}
static void
_get_config_maybe_task_return (AzureData *azure_data,
GError *error_take)
_get_config_maybe_task_return(AzureData *azure_data, GError *error_take)
{
NMCSProviderGetConfigTaskData *config_data = azure_data->config_data;
if (error_take) {
if (!azure_data->error)
azure_data->error = error_take;
else if ( !nm_utils_error_is_cancelled (azure_data->error)
&& nm_utils_error_is_cancelled (error_take)) {
nm_clear_error (&azure_data->error);
else if (!nm_utils_error_is_cancelled(azure_data->error)
&& nm_utils_error_is_cancelled(error_take)) {
nm_clear_error(&azure_data->error);
azure_data->error = error_take;
} else
g_error_free (error_take);
g_error_free(error_take);
}
if (azure_data->n_ifaces_pending > 0)
return;
if (azure_data->error) {
if (nm_utils_error_is_cancelled (azure_data->error))
_LOGD ("get-config: cancelled");
if (nm_utils_error_is_cancelled(azure_data->error))
_LOGD("get-config: cancelled");
else
_LOGD ("get-config: failed: %s", azure_data->error->message);
g_task_return_error (config_data->task, g_steal_pointer (&azure_data->error));
_LOGD("get-config: failed: %s", azure_data->error->message);
g_task_return_error(config_data->task, g_steal_pointer(&azure_data->error));
} else {
_LOGD ("get-config: success");
g_task_return_pointer (config_data->task,
g_hash_table_ref (config_data->result_dict),
_LOGD("get-config: success");
g_task_return_pointer(config_data->task,
g_hash_table_ref(config_data->result_dict),
(GDestroyNotify) g_hash_table_unref);
}
nm_g_slice_free (azure_data);
g_object_unref (config_data->task);
nm_g_slice_free(azure_data);
g_object_unref(config_data->task);
}
static void
_get_config_fetch_done_cb (NMHttpClient *http_client,
_get_config_fetch_done_cb(NMHttpClient *http_client,
GAsyncResult *result,
gpointer user_data,
gboolean is_ipv4)
{
NMCSProviderGetConfigIfaceData *iface_get_config;
gs_unref_bytes GBytes *response = NULL;
AzureIfaceData *iface_data = user_data;
AzureIfaceData * iface_data = user_data;
gs_free_error GError *error = NULL;
const char *fip_str = NULL;
AzureData *azure_data;
const char * fip_str = NULL;
AzureData * azure_data;
azure_data = iface_data->azure_data;
nm_http_client_poll_get_finish (http_client,
result,
NULL,
&response,
&error);
nm_http_client_poll_get_finish(http_client, result, NULL, &response, &error);
if (error)
goto done;
if(!error){
if (!error) {
in_addr_t tmp_addr;
int tmp_prefix;
fip_str = g_bytes_get_data (response, NULL);
iface_data->iface_get_config = g_hash_table_lookup (azure_data->config_data->result_dict,
iface_data->hwaddr);
fip_str = g_bytes_get_data(response, NULL);
iface_data->iface_get_config =
g_hash_table_lookup(azure_data->config_data->result_dict, iface_data->hwaddr);
iface_get_config = iface_data->iface_get_config;
iface_get_config->iface_idx = iface_data->iface_idx;
if (is_ipv4) {
if (!nm_utils_parse_inaddr_bin (AF_INET,
fip_str,
NULL,
&tmp_addr)) {
error = nm_utils_error_new (NM_UTILS_ERROR_UNKNOWN,
if (!nm_utils_parse_inaddr_bin(AF_INET, fip_str, NULL, &tmp_addr)) {
error = nm_utils_error_new(NM_UTILS_ERROR_UNKNOWN,
"ip is not a valid private ip address");
goto done;
}
_LOGD ("interface[%"G_GSSIZE_FORMAT"]: adding private ip %s",
_LOGD("interface[%" G_GSSIZE_FORMAT "]: adding private ip %s",
iface_data->iface_idx,
fip_str);
iface_get_config->ipv4s_arr[iface_get_config->ipv4s_len] = tmp_addr;
iface_get_config->has_ipv4s = TRUE;
iface_get_config->ipv4s_len++;
} else {
tmp_prefix = (_nm_utils_ascii_str_to_int64 (fip_str, 10, 0, 32, -1));
tmp_prefix = (_nm_utils_ascii_str_to_int64(fip_str, 10, 0, 32, -1));
if (tmp_prefix == -1) {
_LOGD ("interface[%"G_GSSIZE_FORMAT"]: invalid prefix %d",
_LOGD("interface[%" G_GSSIZE_FORMAT "]: invalid prefix %d",
iface_data->iface_idx,
tmp_prefix);
goto done;
}
_LOGD ("interface[%"G_GSSIZE_FORMAT"]: adding prefix %d",
_LOGD("interface[%" G_GSSIZE_FORMAT "]: adding prefix %d",
iface_data->iface_idx,
tmp_prefix);
iface_get_config->cidr_prefix = tmp_prefix;
@ -226,64 +212,53 @@ _get_config_fetch_done_cb (NMHttpClient *http_client,
done:
--iface_data->n_ips_prefix_pending;
if (iface_data->n_ips_prefix_pending == 0) {
_azure_iface_data_free (iface_data);
_azure_iface_data_free(iface_data);
--azure_data->n_ifaces_pending;
_get_config_maybe_task_return (azure_data, g_steal_pointer (&error));
_get_config_maybe_task_return(azure_data, g_steal_pointer(&error));
}
}
static void
_get_config_fetch_done_cb_private_ipv4s (GObject *source,
GAsyncResult *result,
gpointer user_data)
_get_config_fetch_done_cb_private_ipv4s(GObject *source, GAsyncResult *result, gpointer user_data)
{
_get_config_fetch_done_cb (NM_HTTP_CLIENT (source), result, user_data, TRUE);
_get_config_fetch_done_cb(NM_HTTP_CLIENT(source), result, user_data, TRUE);
}
static void
_get_config_fetch_done_cb_subnet_cidr_prefix (GObject *source,
_get_config_fetch_done_cb_subnet_cidr_prefix(GObject * source,
GAsyncResult *result,
gpointer user_data)
{
_get_config_fetch_done_cb (NM_HTTP_CLIENT (source), result, user_data, FALSE);
_get_config_fetch_done_cb(NM_HTTP_CLIENT(source), result, user_data, FALSE);
}
static void
_get_config_ips_prefix_list_cb (GObject *source,
GAsyncResult *result,
gpointer user_data)
_get_config_ips_prefix_list_cb(GObject *source, GAsyncResult *result, gpointer user_data)
{
gs_unref_bytes GBytes *response = NULL;
AzureIfaceData *iface_data = user_data;
AzureIfaceData * iface_data = user_data;
gs_free_error GError *error = NULL;
const char *response_str = NULL;
const char * response_str = NULL;
gsize response_len;
AzureData *azure_data;
const char *line;
AzureData * azure_data;
const char * line;
gsize line_len;
azure_data = iface_data->azure_data;
nm_http_client_poll_get_finish (NM_HTTP_CLIENT (source),
result,
NULL,
&response,
&error);
nm_http_client_poll_get_finish(NM_HTTP_CLIENT(source), result, NULL, &response, &error);
if (error)
goto done;
response_str = g_bytes_get_data (response, &response_len);
response_str = g_bytes_get_data(response, &response_len);
/* NMHttpClient guarantees that there is a trailing NUL after the data. */
nm_assert (response_str[response_len] == 0);
nm_assert(response_str[response_len] == 0);
nm_assert (!iface_data->iface_get_config->has_ipv4s);
nm_assert (!iface_data->iface_get_config->ipv4s_arr);
nm_assert (!iface_data->iface_get_config->has_cidr);
nm_assert(!iface_data->iface_get_config->has_ipv4s);
nm_assert(!iface_data->iface_get_config->ipv4s_arr);
nm_assert(!iface_data->iface_get_config->has_cidr);
while (nm_utils_parse_next_line (&response_str,
&response_len,
&line,
&line_len)) {
while (nm_utils_parse_next_line(&response_str, &response_len, &line, &line_len)) {
gint64 ips_prefix_idx;
if (line_len == 0)
@ -295,7 +270,7 @@ _get_config_ips_prefix_list_cb (GObject *source,
if (line[line_len - 1] == '/')
((char *) line)[--line_len] = '\0';
ips_prefix_idx = _nm_utils_ascii_str_to_int64 (line, 10, 0, G_MAXINT64, -1);
ips_prefix_idx = _nm_utils_ascii_str_to_int64(line, 10, 0, G_MAXINT64, -1);
if (ips_prefix_idx < 0)
continue;
@ -306,16 +281,19 @@ _get_config_ips_prefix_list_cb (GObject *source,
iface_data->n_ips_prefix_pending++;
nm_http_client_poll_get (NM_HTTP_CLIENT (source),
(uri = _azure_uri_interfaces (nm_sprintf_buf (buf,"%"G_GSSIZE_FORMAT"/ipv4/ipAddress/%"G_GINT64_FORMAT"/privateIpAddress",
nm_http_client_poll_get(
NM_HTTP_CLIENT(source),
(uri = _azure_uri_interfaces(nm_sprintf_buf(
buf,
"%" G_GSSIZE_FORMAT "/ipv4/ipAddress/%" G_GINT64_FORMAT "/privateIpAddress",
iface_data->iface_idx,
ips_prefix_idx))),
HTTP_TIMEOUT_MS,
512*1024,
512 * 1024,
10000,
1000,
NM_MAKE_STRV (NM_AZURE_METADATA_HEADER),
g_task_get_cancellable (azure_data->config_data->task),
NM_MAKE_STRV(NM_AZURE_METADATA_HEADER),
g_task_get_cancellable(azure_data->config_data->task),
NULL,
NULL,
_get_config_fetch_done_cb_private_ipv4s,
@ -324,23 +302,24 @@ _get_config_ips_prefix_list_cb (GObject *source,
}
iface_data->iface_get_config->ipv4s_len = 0;
iface_data->iface_get_config->ipv4s_arr =
g_new (in_addr_t , iface_data->n_ips_prefix_pending);
iface_data->iface_get_config->ipv4s_arr = g_new(in_addr_t, iface_data->n_ips_prefix_pending);
{
gs_free const char *uri = NULL;
char buf[30];
iface_data->n_ips_prefix_pending++;
nm_http_client_poll_get (NM_HTTP_CLIENT (source),
(uri = _azure_uri_interfaces (nm_sprintf_buf (buf, "%"G_GSSIZE_FORMAT, iface_data->iface_idx),
nm_http_client_poll_get(
NM_HTTP_CLIENT(source),
(uri = _azure_uri_interfaces(
nm_sprintf_buf(buf, "%" G_GSSIZE_FORMAT, iface_data->iface_idx),
"/ipv4/subnet/0/prefix/")),
HTTP_TIMEOUT_MS,
512*1024,
512 * 1024,
10000,
1000,
NM_MAKE_STRV (NM_AZURE_METADATA_HEADER),
g_task_get_cancellable (azure_data->config_data->task),
NM_MAKE_STRV(NM_AZURE_METADATA_HEADER),
g_task_get_cancellable(azure_data->config_data->task),
NULL,
NULL,
_get_config_fetch_done_cb_subnet_cidr_prefix,
@ -349,70 +328,64 @@ _get_config_ips_prefix_list_cb (GObject *source,
return;
done:
_azure_iface_data_free (iface_data);
_azure_iface_data_free(iface_data);
--azure_data->n_ifaces_pending;
_get_config_maybe_task_return (azure_data, g_steal_pointer (&error));
_get_config_maybe_task_return(azure_data, g_steal_pointer(&error));
}
static void
_get_config_iface_cb (GObject *source,
GAsyncResult *result,
gpointer user_data)
_get_config_iface_cb(GObject *source, GAsyncResult *result, gpointer user_data)
{
gs_unref_bytes GBytes *response = NULL;
AzureIfaceData *iface_data = user_data;
AzureIfaceData * iface_data = user_data;
gs_free_error GError *error = NULL;
gs_free const char *uri = NULL;
gs_free const char * uri = NULL;
char buf[100];
AzureData *azure_data;
AzureData * azure_data;
azure_data = iface_data->azure_data;
nm_http_client_poll_get_finish (NM_HTTP_CLIENT (source),
result,
NULL,
&response,
&error);
nm_http_client_poll_get_finish(NM_HTTP_CLIENT(source), result, NULL, &response, &error);
if (error)
goto done;
iface_data->hwaddr = nmcs_utils_hwaddr_normalize (g_bytes_get_data (response, NULL), -1);
iface_data->hwaddr = nmcs_utils_hwaddr_normalize(g_bytes_get_data(response, NULL), -1);
if (!iface_data->hwaddr) {
goto done;
}
iface_data->iface_get_config = g_hash_table_lookup (azure_data->config_data->result_dict,
iface_data->hwaddr);
iface_data->iface_get_config =
g_hash_table_lookup(azure_data->config_data->result_dict, iface_data->hwaddr);
if (!iface_data->iface_get_config) {
if (!iface_data->azure_data->config_data->any) {
_LOGD ("interface[%"G_GSSIZE_FORMAT"]: ignore hwaddr %s",
_LOGD("interface[%" G_GSSIZE_FORMAT "]: ignore hwaddr %s",
iface_data->iface_idx,
iface_data->hwaddr);
goto done;
}
iface_data->iface_get_config = nmcs_provider_get_config_iface_data_new (FALSE);
g_hash_table_insert (azure_data->config_data->result_dict,
g_strdup (iface_data->hwaddr),
iface_data->iface_get_config = nmcs_provider_get_config_iface_data_new(FALSE);
g_hash_table_insert(azure_data->config_data->result_dict,
g_strdup(iface_data->hwaddr),
iface_data->iface_get_config);
}
_LOGD ("interface[%"G_GSSIZE_FORMAT"]: found a matching device with hwaddr %s",
_LOGD("interface[%" G_GSSIZE_FORMAT "]: found a matching device with hwaddr %s",
iface_data->iface_idx,
iface_data->hwaddr);
nm_sprintf_buf (buf, "%"G_GSSIZE_FORMAT"/ipv4/ipAddress/", iface_data->iface_idx);
nm_sprintf_buf(buf, "%" G_GSSIZE_FORMAT "/ipv4/ipAddress/", iface_data->iface_idx);
nm_http_client_poll_get (NM_HTTP_CLIENT (source),
(uri = _azure_uri_interfaces (buf)),
nm_http_client_poll_get(NM_HTTP_CLIENT(source),
(uri = _azure_uri_interfaces(buf)),
HTTP_TIMEOUT_MS,
512*1024,
512 * 1024,
10000,
1000,
NM_MAKE_STRV (NM_AZURE_METADATA_HEADER),
g_task_get_cancellable (azure_data->config_data->task),
NM_MAKE_STRV(NM_AZURE_METADATA_HEADER),
g_task_get_cancellable(azure_data->config_data->task),
NULL,
NULL,
_get_config_ips_prefix_list_cb,
@ -420,47 +393,38 @@ _get_config_iface_cb (GObject *source,
return;
done:
nm_g_slice_free (iface_data);
nm_g_slice_free(iface_data);
--azure_data->n_ifaces_pending;
_get_config_maybe_task_return (azure_data, g_steal_pointer (&error));
_get_config_maybe_task_return(azure_data, g_steal_pointer(&error));
}
static void
_get_net_ifaces_list_cb (GObject *source,
GAsyncResult *result,
gpointer user_data)
_get_net_ifaces_list_cb(GObject *source, GAsyncResult *result, gpointer user_data)
{
gs_unref_ptrarray GPtrArray *ifaces_arr = NULL;
gs_unref_bytes GBytes *response = NULL;
gs_free_error GError *error = NULL;
AzureData *azure_data = user_data;
const char *response_str;
AzureData * azure_data = user_data;
const char * response_str;
gsize response_len;
const char *line;
const char * line;
gsize line_len;
guint i;
nm_http_client_poll_get_finish (NM_HTTP_CLIENT (source),
result,
NULL,
&response,
&error);
nm_http_client_poll_get_finish(NM_HTTP_CLIENT(source), result, NULL, &response, &error);
if (error) {
_get_config_maybe_task_return (azure_data, g_steal_pointer (&error));
_get_config_maybe_task_return(azure_data, g_steal_pointer(&error));
return;
}
response_str = g_bytes_get_data (response, &response_len);
response_str = g_bytes_get_data(response, &response_len);
/* NMHttpClient guarantees that there is a trailing NUL after the data. */
nm_assert (response_str[response_len] == 0);
nm_assert(response_str[response_len] == 0);
ifaces_arr = g_ptr_array_new ();
ifaces_arr = g_ptr_array_new();
while (nm_utils_parse_next_line (&response_str,
&response_len,
&line,
&line_len)) {
while (nm_utils_parse_next_line(&response_str, &response_len, &line, &line_len)) {
AzureIfaceData *iface_data;
gssize iface_idx;
@ -474,49 +438,47 @@ _get_net_ifaces_list_cb (GObject *source,
if (line[line_len - 1] == '/' && line_len != 0)
((char *) line)[--line_len] = '\0';
iface_idx = _nm_utils_ascii_str_to_int64 (line, 10, 0, G_MAXSSIZE, -1);
iface_idx = _nm_utils_ascii_str_to_int64(line, 10, 0, G_MAXSSIZE, -1);
if (iface_idx < 0)
continue;
iface_data = g_slice_new (AzureIfaceData);
*iface_data = (AzureIfaceData) {
iface_data = g_slice_new(AzureIfaceData);
*iface_data = (AzureIfaceData){
.iface_get_config = NULL,
.azure_data = azure_data,
.iface_idx = iface_idx,
.n_ips_prefix_pending = 0,
.hwaddr = NULL,
};
g_ptr_array_add (ifaces_arr, iface_data);
g_ptr_array_add(ifaces_arr, iface_data);
}
_LOGD ("found azure interfaces: %u", ifaces_arr->len);
_LOGD("found azure interfaces: %u", ifaces_arr->len);
if (ifaces_arr->len == 0) {
error = nm_utils_error_new (NM_UTILS_ERROR_UNKNOWN,
"no Azure interfaces found");
_get_config_maybe_task_return (azure_data, g_steal_pointer (&error));
error = nm_utils_error_new(NM_UTILS_ERROR_UNKNOWN, "no Azure interfaces found");
_get_config_maybe_task_return(azure_data, g_steal_pointer(&error));
return;
}
for (i = 0; i < ifaces_arr->len; ++i) {
AzureIfaceData *data = ifaces_arr->pdata[i];
AzureIfaceData * data = ifaces_arr->pdata[i];
gs_free const char *uri = NULL;
char buf[100];
_LOGD ("azure interface[%"G_GSSIZE_FORMAT"]: retrieving configuration",
data->iface_idx);
_LOGD("azure interface[%" G_GSSIZE_FORMAT "]: retrieving configuration", data->iface_idx);
nm_sprintf_buf (buf, "%"G_GSSIZE_FORMAT"/macAddress", data->iface_idx);
nm_sprintf_buf(buf, "%" G_GSSIZE_FORMAT "/macAddress", data->iface_idx);
azure_data->n_ifaces_pending++;
nm_http_client_poll_get (NM_HTTP_CLIENT (source),
(uri = _azure_uri_interfaces (buf)),
nm_http_client_poll_get(NM_HTTP_CLIENT(source),
(uri = _azure_uri_interfaces(buf)),
HTTP_TIMEOUT_MS,
512*1024,
512 * 1024,
10000,
1000,
NM_MAKE_STRV (NM_AZURE_METADATA_HEADER),
g_task_get_cancellable (azure_data->config_data->task),
NM_MAKE_STRV(NM_AZURE_METADATA_HEADER),
g_task_get_cancellable(azure_data->config_data->task),
NULL,
NULL,
_get_config_iface_cb,
@ -525,26 +487,25 @@ _get_net_ifaces_list_cb (GObject *source,
}
static void
get_config (NMCSProvider *provider,
NMCSProviderGetConfigTaskData *get_config_data)
get_config(NMCSProvider *provider, NMCSProviderGetConfigTaskData *get_config_data)
{
gs_free const char *uri = NULL;
AzureData *azure_data;
AzureData * azure_data;
azure_data = g_slice_new (AzureData);
*azure_data = (AzureData) {
azure_data = g_slice_new(AzureData);
*azure_data = (AzureData){
.config_data = get_config_data,
.n_ifaces_pending = 0,
};
nm_http_client_poll_get (nmcs_provider_get_http_client (provider),
(uri = _azure_uri_interfaces ()),
nm_http_client_poll_get(nmcs_provider_get_http_client(provider),
(uri = _azure_uri_interfaces()),
HTTP_TIMEOUT_MS,
256 * 1024,
15000,
1000,
NM_MAKE_STRV (NM_AZURE_METADATA_HEADER),
g_task_get_cancellable (get_config_data->task),
NM_MAKE_STRV(NM_AZURE_METADATA_HEADER),
g_task_get_cancellable(get_config_data->task),
NULL,
NULL,
_get_net_ifaces_list_cb,
@ -554,17 +515,16 @@ get_config (NMCSProvider *provider,
/*****************************************************************************/
static void
nmcs_provider_azure_init (NMCSProviderAzure *self)
{
}
nmcs_provider_azure_init(NMCSProviderAzure *self)
{}
static void
nmcs_provider_azure_class_init (NMCSProviderAzureClass *klass)
nmcs_provider_azure_class_init(NMCSProviderAzureClass *klass)
{
NMCSProviderClass *provider_class = NMCS_PROVIDER_CLASS (klass);
NMCSProviderClass *provider_class = NMCS_PROVIDER_CLASS(klass);
provider_class->_name = "azure";
provider_class->_env_provider_enabled = NMCS_ENV_VARIABLE ("NM_CLOUD_SETUP_AZURE");
provider_class->_env_provider_enabled = NMCS_ENV_VARIABLE("NM_CLOUD_SETUP_AZURE");
provider_class->detect = detect;
provider_class->get_config = get_config;
}

View file

@ -10,16 +10,19 @@
typedef struct _NMCSProviderAzure NMCSProviderAzure;
typedef struct _NMCSProviderAzureClass NMCSProviderAzureClass;
#define NMCS_TYPE_PROVIDER_AZURE (nmcs_provider_azure_get_type ())
#define NMCS_PROVIDER_AZURE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMCS_TYPE_PROVIDER_AZURE, NMCSProviderAzure))
#define NMCS_PROVIDER_AZURE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NMCS_TYPE_PROVIDER_AZURE, NMCSProviderAzureClass))
#define NMCS_IS_PROVIDER_AZURE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NMCS_TYPE_PROVIDER_AZURE))
#define NMCS_IS_PROVIDER_AZURE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NMCS_TYPE_PROVIDER_AZURE))
#define NMCS_PROVIDER_AZURE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NMCS_TYPE_PROVIDER_AZURE, NMCSProviderAzureClass))
#define NMCS_TYPE_PROVIDER_AZURE (nmcs_provider_azure_get_type())
#define NMCS_PROVIDER_AZURE(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), NMCS_TYPE_PROVIDER_AZURE, NMCSProviderAzure))
#define NMCS_PROVIDER_AZURE_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), NMCS_TYPE_PROVIDER_AZURE, NMCSProviderAzureClass))
#define NMCS_IS_PROVIDER_AZURE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), NMCS_TYPE_PROVIDER_AZURE))
#define NMCS_IS_PROVIDER_AZURE_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass), NMCS_TYPE_PROVIDER_AZURE))
#define NMCS_PROVIDER_AZURE_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), NMCS_TYPE_PROVIDER_AZURE, NMCSProviderAzureClass))
GType nmcs_provider_azure_get_type (void);
GType nmcs_provider_azure_get_type(void);
/*****************************************************************************/
#endif /* __NMCS_PROVIDER_AZURE_H__ */

View file

@ -13,50 +13,48 @@
#define NM_EC2_HOST "169.254.169.254"
#define NM_EC2_BASE "http://" NM_EC2_HOST
#define NM_EC2_API_VERSION "2018-09-24"
#define NM_EC2_METADATA_URL_BASE /* $NM_EC2_BASE/$NM_EC2_API_VERSION */ "/meta-data/network/interfaces/macs/"
#define NM_EC2_METADATA_URL_BASE /* $NM_EC2_BASE/$NM_EC2_API_VERSION */ \
"/meta-data/network/interfaces/macs/"
static const char *
_ec2_base (void)
_ec2_base(void)
{
static const char *base_cached = NULL;
const char *base;
const char * base;
again:
base = g_atomic_pointer_get (&base_cached);
if (G_UNLIKELY (!base)) {
base = g_atomic_pointer_get(&base_cached);
if (G_UNLIKELY(!base)) {
/* The base URI can be set via environment variable.
* This is mainly for testing, it's not usually supposed to be configured.
* Consider this private API! */
base = g_getenv (NMCS_ENV_VARIABLE ("NM_CLOUD_SETUP_EC2_HOST"));
base = g_getenv(NMCS_ENV_VARIABLE("NM_CLOUD_SETUP_EC2_HOST"));
if ( base
&& base[0]
&& !strchr (base, '/')) {
if ( NM_STR_HAS_PREFIX (base, "http://")
|| NM_STR_HAS_PREFIX (base, "https://"))
base = g_intern_string (base);
if (base && base[0] && !strchr(base, '/')) {
if (NM_STR_HAS_PREFIX(base, "http://") || NM_STR_HAS_PREFIX(base, "https://"))
base = g_intern_string(base);
else {
gs_free char *s = NULL;
s = g_strconcat ("http://", base, NULL);
base = g_intern_string (s);
s = g_strconcat("http://", base, NULL);
base = g_intern_string(s);
}
}
if (!base)
base = NM_EC2_BASE;
nm_assert (!NM_STR_HAS_SUFFIX (base, "/"));
nm_assert(!NM_STR_HAS_SUFFIX(base, "/"));
if (!g_atomic_pointer_compare_and_exchange (&base_cached, NULL, base))
if (!g_atomic_pointer_compare_and_exchange(&base_cached, NULL, base))
goto again;
}
return base;
}
#define _ec2_uri_concat(...) nmcs_utils_uri_build_concat (_ec2_base (), __VA_ARGS__)
#define _ec2_uri_interfaces(...) _ec2_uri_concat (NM_EC2_API_VERSION, NM_EC2_METADATA_URL_BASE, ##__VA_ARGS__)
#define _ec2_uri_concat(...) nmcs_utils_uri_build_concat(_ec2_base(), __VA_ARGS__)
#define _ec2_uri_interfaces(...) \
_ec2_uri_concat(NM_EC2_API_VERSION, NM_EC2_METADATA_URL_BASE, ##__VA_ARGS__)
/*****************************************************************************/
@ -68,69 +66,61 @@ struct _NMCSProviderEC2Class {
NMCSProviderClass parent;
};
G_DEFINE_TYPE (NMCSProviderEC2, nmcs_provider_ec2, NMCS_TYPE_PROVIDER);
G_DEFINE_TYPE(NMCSProviderEC2, nmcs_provider_ec2, NMCS_TYPE_PROVIDER);
/*****************************************************************************/
static gboolean
_detect_get_meta_data_check_cb (long response_code,
GBytes *response_data,
_detect_get_meta_data_check_cb(long response_code,
GBytes * response_data,
gpointer check_user_data,
GError **error)
{
return response_code == 200
&& nmcs_utils_parse_get_full_line (response_data, "ami-id");
return response_code == 200 && nmcs_utils_parse_get_full_line(response_data, "ami-id");
}
static void
_detect_get_meta_data_done_cb (GObject *source,
GAsyncResult *result,
gpointer user_data)
_detect_get_meta_data_done_cb(GObject *source, GAsyncResult *result, gpointer user_data)
{
gs_unref_object GTask *task = user_data;
gs_free_error GError *get_error = NULL;
gs_free_error GError *error = NULL;
nm_http_client_poll_get_finish (NM_HTTP_CLIENT (source),
result,
NULL,
NULL,
&get_error);
nm_http_client_poll_get_finish(NM_HTTP_CLIENT(source), result, NULL, NULL, &get_error);
if (nm_utils_error_is_cancelled (get_error)) {
g_task_return_error (task, g_steal_pointer (&get_error));
if (nm_utils_error_is_cancelled(get_error)) {
g_task_return_error(task, g_steal_pointer(&get_error));
return;
}
if (get_error) {
nm_utils_error_set (&error,
nm_utils_error_set(&error,
NM_UTILS_ERROR_UNKNOWN,
"failure to get EC2 metadata: %s",
get_error->message);
g_task_return_error (task, g_steal_pointer (&error));
g_task_return_error(task, g_steal_pointer(&error));
return;
}
g_task_return_boolean (task, TRUE);
g_task_return_boolean(task, TRUE);
}
static void
detect (NMCSProvider *provider,
GTask *task)
detect(NMCSProvider *provider, GTask *task)
{
NMHttpClient *http_client;
gs_free char *uri = NULL;
http_client = nmcs_provider_get_http_client (provider);
http_client = nmcs_provider_get_http_client(provider);
nm_http_client_poll_get (http_client,
(uri = _ec2_uri_concat ("latest/meta-data/")),
nm_http_client_poll_get(http_client,
(uri = _ec2_uri_concat("latest/meta-data/")),
HTTP_TIMEOUT_MS,
256*1024,
256 * 1024,
7000,
1000,
NULL,
g_task_get_cancellable (task),
g_task_get_cancellable(task),
_detect_get_meta_data_check_cb,
NULL,
_detect_get_meta_data_done_cb,
@ -141,109 +131,103 @@ detect (NMCSProvider *provider,
typedef struct {
NMCSProviderGetConfigTaskData *get_config_data;
GError *error;
GCancellable *cancellable;
GError * error;
GCancellable * cancellable;
gulong cancelled_id;
guint n_pending;
} GetConfigIfaceData;
static void
_get_config_task_maybe_return (GetConfigIfaceData *iface_data,
GError *error_take)
_get_config_task_maybe_return(GetConfigIfaceData *iface_data, GError *error_take)
{
NMCSProviderGetConfigTaskData *get_config_data = iface_data->get_config_data;
if (error_take) {
if (!iface_data->error)
iface_data->error = error_take;
else if ( !nm_utils_error_is_cancelled (iface_data->error)
&& nm_utils_error_is_cancelled (error_take)) {
nm_clear_error (&iface_data->error);
else if (!nm_utils_error_is_cancelled(iface_data->error)
&& nm_utils_error_is_cancelled(error_take)) {
nm_clear_error(&iface_data->error);
iface_data->error = error_take;
} else
g_error_free (error_take);
g_error_free(error_take);
}
if (iface_data->n_pending > 0)
return;
nm_clear_g_cancellable_disconnect (g_task_get_cancellable (get_config_data->task),
nm_clear_g_cancellable_disconnect(g_task_get_cancellable(get_config_data->task),
&iface_data->cancelled_id);
nm_clear_g_cancellable (&iface_data->cancellable);
nm_clear_g_cancellable(&iface_data->cancellable);
if (iface_data->error) {
if (nm_utils_error_is_cancelled (iface_data->error))
_LOGD ("get-config: cancelled");
if (nm_utils_error_is_cancelled(iface_data->error))
_LOGD("get-config: cancelled");
else
_LOGD ("get-config: failed: %s", iface_data->error->message);
g_task_return_error (get_config_data->task, g_steal_pointer (&iface_data->error));
_LOGD("get-config: failed: %s", iface_data->error->message);
g_task_return_error(get_config_data->task, g_steal_pointer(&iface_data->error));
} else {
_LOGD ("get-config: success");
g_task_return_pointer (get_config_data->task,
g_hash_table_ref (get_config_data->result_dict),
_LOGD("get-config: success");
g_task_return_pointer(get_config_data->task,
g_hash_table_ref(get_config_data->result_dict),
(GDestroyNotify) g_hash_table_unref);
}
nm_g_slice_free (iface_data);
g_object_unref (get_config_data->task);
nm_g_slice_free(iface_data);
g_object_unref(get_config_data->task);
}
static void
_get_config_fetch_done_cb (NMHttpClient *http_client,
_get_config_fetch_done_cb(NMHttpClient *http_client,
GAsyncResult *result,
gpointer user_data,
gboolean is_local_ipv4)
{
GetConfigIfaceData *iface_data;
const char *hwaddr = NULL;
const char * hwaddr = NULL;
gs_unref_bytes GBytes *response_data = NULL;
gs_free_error GError *error = NULL;
nm_utils_user_data_unpack (user_data, &iface_data, &hwaddr);
nm_utils_user_data_unpack(user_data, &iface_data, &hwaddr);
nm_http_client_poll_get_finish (http_client,
result,
NULL,
&response_data,
&error);
nm_http_client_poll_get_finish(http_client, result, NULL, &response_data, &error);
if (!error) {
NMCSProviderGetConfigIfaceData *config_iface_data;
in_addr_t tmp_addr;
int tmp_prefix;
config_iface_data = g_hash_table_lookup (iface_data->get_config_data->result_dict, hwaddr);
config_iface_data = g_hash_table_lookup(iface_data->get_config_data->result_dict, hwaddr);
if (is_local_ipv4) {
gs_free const char **s_addrs = NULL;
gsize i, len;
s_addrs = nm_utils_strsplit_set_full (g_bytes_get_data (response_data, NULL), "\n", NM_UTILS_STRSPLIT_SET_FLAGS_STRSTRIP);
len = NM_PTRARRAY_LEN (s_addrs);
s_addrs = nm_utils_strsplit_set_full(g_bytes_get_data(response_data, NULL),
"\n",
NM_UTILS_STRSPLIT_SET_FLAGS_STRSTRIP);
len = NM_PTRARRAY_LEN(s_addrs);
nm_assert (!config_iface_data->has_ipv4s);
nm_assert (!config_iface_data->ipv4s_arr);
nm_assert(!config_iface_data->has_ipv4s);
nm_assert(!config_iface_data->ipv4s_arr);
config_iface_data->has_ipv4s = TRUE;
config_iface_data->ipv4s_len = 0;
if (len > 0) {
config_iface_data->ipv4s_arr = g_new (in_addr_t, len);
config_iface_data->ipv4s_arr = g_new(in_addr_t, len);
for (i = 0; i < len; i++) {
if (nm_utils_parse_inaddr_bin (AF_INET,
s_addrs[i],
NULL,
&tmp_addr))
if (nm_utils_parse_inaddr_bin(AF_INET, s_addrs[i], NULL, &tmp_addr))
config_iface_data->ipv4s_arr[config_iface_data->ipv4s_len++] = tmp_addr;
}
}
} else {
if (nm_utils_parse_inaddr_prefix_bin (AF_INET,
g_bytes_get_data (response_data, NULL),
if (nm_utils_parse_inaddr_prefix_bin(AF_INET,
g_bytes_get_data(response_data, NULL),
NULL,
&tmp_addr,
&tmp_prefix)) {
nm_assert (!config_iface_data->has_cidr);
nm_assert(!config_iface_data->has_cidr);
config_iface_data->has_cidr = TRUE;
config_iface_data->cidr_prefix = tmp_prefix;
config_iface_data->cidr_addr = tmp_addr;
@ -252,42 +236,39 @@ _get_config_fetch_done_cb (NMHttpClient *http_client,
}
iface_data->n_pending--;
_get_config_task_maybe_return (iface_data, g_steal_pointer (&error));
_get_config_task_maybe_return(iface_data, g_steal_pointer(&error));
}
static void
_get_config_fetch_done_cb_subnet_ipv4_cidr_block (GObject *source,
_get_config_fetch_done_cb_subnet_ipv4_cidr_block(GObject * source,
GAsyncResult *result,
gpointer user_data)
{
_get_config_fetch_done_cb (NM_HTTP_CLIENT (source), result, user_data, FALSE);
_get_config_fetch_done_cb(NM_HTTP_CLIENT(source), result, user_data, FALSE);
}
static void
_get_config_fetch_done_cb_local_ipv4s (GObject *source,
GAsyncResult *result,
gpointer user_data)
_get_config_fetch_done_cb_local_ipv4s(GObject *source, GAsyncResult *result, gpointer user_data)
{
_get_config_fetch_done_cb (NM_HTTP_CLIENT (source), result, user_data, TRUE);
_get_config_fetch_done_cb(NM_HTTP_CLIENT(source), result, user_data, TRUE);
}
static void
_get_config_fetch_cancelled_cb (GObject *object, gpointer user_data)
_get_config_fetch_cancelled_cb(GObject *object, gpointer user_data)
{
GetConfigIfaceData *iface_data = user_data;
if (iface_data->cancelled_id == 0)
return;
nm_clear_g_signal_handler (g_task_get_cancellable (iface_data->get_config_data->task),
nm_clear_g_signal_handler(g_task_get_cancellable(iface_data->get_config_data->task),
&iface_data->cancelled_id);
_get_config_task_maybe_return (iface_data,
nm_utils_error_new_cancelled (FALSE, NULL));
_get_config_task_maybe_return(iface_data, nm_utils_error_new_cancelled(FALSE, NULL));
}
typedef struct {
NMCSProviderGetConfigTaskData *get_config_data;
GHashTable *response_parsed;
GHashTable * response_parsed;
} GetConfigMetadataData;
typedef struct {
@ -296,102 +277,103 @@ typedef struct {
} GetConfigMetadataMac;
static void
_get_config_metadata_ready_cb (GObject *source,
GAsyncResult *result,
gpointer user_data)
_get_config_metadata_ready_cb(GObject *source, GAsyncResult *result, gpointer user_data)
{
GetConfigMetadataData *metadata_data = user_data;
GetConfigIfaceData *iface_data;
GetConfigMetadataData * metadata_data = user_data;
GetConfigIfaceData * iface_data;
NMCSProviderGetConfigTaskData *get_config_data = metadata_data->get_config_data;
gs_unref_hashtable GHashTable *response_parsed = g_steal_pointer (&metadata_data->response_parsed);
gs_unref_hashtable GHashTable *response_parsed =
g_steal_pointer(&metadata_data->response_parsed);
gs_free_error GError *error = NULL;
GCancellable *cancellable;
GCancellable * cancellable;
GetConfigMetadataMac *v_mac_data;
const char *v_hwaddr;
const char * v_hwaddr;
GHashTableIter h_iter;
NMHttpClient *http_client;
NMHttpClient * http_client;
nm_g_slice_free (metadata_data);
nm_g_slice_free(metadata_data);
nm_http_client_poll_get_finish (NM_HTTP_CLIENT (source),
result,
NULL,
NULL,
&error);
nm_http_client_poll_get_finish(NM_HTTP_CLIENT(source), result, NULL, NULL, &error);
iface_data = g_slice_new (GetConfigIfaceData);
*iface_data = (GetConfigIfaceData) {
iface_data = g_slice_new(GetConfigIfaceData);
*iface_data = (GetConfigIfaceData){
.get_config_data = get_config_data,
.n_pending = 0,
};
if (nm_utils_error_is_cancelled (error)) {
_get_config_task_maybe_return (iface_data, g_steal_pointer (&error));
if (nm_utils_error_is_cancelled(error)) {
_get_config_task_maybe_return(iface_data, g_steal_pointer(&error));
return;
}
/* We ignore errors. Only if we got no response at all, it's a problem.
* Otherwise, we proceed with whatever we could fetch. */
if (!response_parsed) {
_get_config_task_maybe_return (iface_data,
nm_utils_error_new (NM_UTILS_ERROR_UNKNOWN,
"meta data for interfaces not found"));
_get_config_task_maybe_return(
iface_data,
nm_utils_error_new(NM_UTILS_ERROR_UNKNOWN, "meta data for interfaces not found"));
return;
}
cancellable = g_task_get_cancellable (get_config_data->task);
cancellable = g_task_get_cancellable(get_config_data->task);
if (cancellable) {
gulong cancelled_id;
cancelled_id = g_cancellable_connect (cancellable,
G_CALLBACK (_get_config_fetch_cancelled_cb),
cancelled_id = g_cancellable_connect(cancellable,
G_CALLBACK(_get_config_fetch_cancelled_cb),
iface_data,
NULL);
if (cancelled_id == 0) {
_get_config_task_maybe_return (iface_data,
nm_utils_error_new_cancelled (FALSE, NULL));
_get_config_task_maybe_return(iface_data, nm_utils_error_new_cancelled(FALSE, NULL));
return;
}
iface_data->cancelled_id = cancelled_id;
}
iface_data->cancellable = g_cancellable_new ();
iface_data->cancellable = g_cancellable_new();
http_client = nmcs_provider_get_http_client (g_task_get_source_object (get_config_data->task));
http_client = nmcs_provider_get_http_client(g_task_get_source_object(get_config_data->task));
g_hash_table_iter_init (&h_iter, response_parsed);
while (g_hash_table_iter_next (&h_iter, (gpointer *) &v_hwaddr, (gpointer *) &v_mac_data)) {
g_hash_table_iter_init(&h_iter, response_parsed);
while (g_hash_table_iter_next(&h_iter, (gpointer *) &v_hwaddr, (gpointer *) &v_mac_data)) {
NMCSProviderGetConfigIfaceData *config_iface_data;
gs_free char *uri1 = NULL;
gs_free char *uri2 = NULL;
const char *hwaddr;
gs_free char * uri1 = NULL;
gs_free char * uri2 = NULL;
const char * hwaddr;
if (!g_hash_table_lookup_extended (get_config_data->result_dict, v_hwaddr, (gpointer *) &hwaddr, (gpointer *) &config_iface_data)) {
if (!g_hash_table_lookup_extended(get_config_data->result_dict,
v_hwaddr,
(gpointer *) &hwaddr,
(gpointer *) &config_iface_data)) {
if (!get_config_data->any) {
_LOGD ("get-config: skip fetching meta data for %s (%s)", v_hwaddr, v_mac_data->path);
_LOGD("get-config: skip fetching meta data for %s (%s)",
v_hwaddr,
v_mac_data->path);
continue;
}
config_iface_data = nmcs_provider_get_config_iface_data_new (FALSE);
g_hash_table_insert (get_config_data->result_dict,
(char *) (hwaddr = g_strdup (v_hwaddr)),
config_iface_data = nmcs_provider_get_config_iface_data_new(FALSE);
g_hash_table_insert(get_config_data->result_dict,
(char *) (hwaddr = g_strdup(v_hwaddr)),
config_iface_data);
}
nm_assert (config_iface_data->iface_idx == -1);
nm_assert(config_iface_data->iface_idx == -1);
config_iface_data->iface_idx = v_mac_data->iface_idx;
_LOGD ("get-config: start fetching meta data for #%"G_GSSIZE_FORMAT", %s (%s)", config_iface_data->iface_idx, hwaddr, v_mac_data->path);
_LOGD("get-config: start fetching meta data for #%" G_GSSIZE_FORMAT ", %s (%s)",
config_iface_data->iface_idx,
hwaddr,
v_mac_data->path);
iface_data->n_pending++;
nm_http_client_poll_get (http_client,
(uri1 = _ec2_uri_interfaces (v_mac_data->path,
NM_STR_HAS_SUFFIX (v_mac_data->path, "/")
? ""
: "/",
nm_http_client_poll_get(
http_client,
(uri1 = _ec2_uri_interfaces(v_mac_data->path,
NM_STR_HAS_SUFFIX(v_mac_data->path, "/") ? "" : "/",
"subnet-ipv4-cidr-block")),
HTTP_TIMEOUT_MS,
512*1024,
512 * 1024,
10000,
1000,
NULL,
@ -399,17 +381,16 @@ _get_config_metadata_ready_cb (GObject *source,
NULL,
NULL,
_get_config_fetch_done_cb_subnet_ipv4_cidr_block,
nm_utils_user_data_pack (iface_data, hwaddr));
nm_utils_user_data_pack(iface_data, hwaddr));
iface_data->n_pending++;
nm_http_client_poll_get (http_client,
(uri2 = _ec2_uri_interfaces (v_mac_data->path,
NM_STR_HAS_SUFFIX (v_mac_data->path, "/")
? ""
: "/",
nm_http_client_poll_get(
http_client,
(uri2 = _ec2_uri_interfaces(v_mac_data->path,
NM_STR_HAS_SUFFIX(v_mac_data->path, "/") ? "" : "/",
"local-ipv4s")),
HTTP_TIMEOUT_MS,
512*1024,
512 * 1024,
10000,
1000,
NULL,
@ -417,42 +398,41 @@ _get_config_metadata_ready_cb (GObject *source,
NULL,
NULL,
_get_config_fetch_done_cb_local_ipv4s,
nm_utils_user_data_pack (iface_data, hwaddr));
nm_utils_user_data_pack(iface_data, hwaddr));
}
_get_config_task_maybe_return (iface_data, NULL);
_get_config_task_maybe_return(iface_data, NULL);
}
static gboolean
_get_config_metadata_ready_check (long response_code,
GBytes *response_data,
_get_config_metadata_ready_check(long response_code,
GBytes * response_data,
gpointer check_user_data,
GError **error)
{
GetConfigMetadataData *metadata_data = check_user_data;
gs_unref_hashtable GHashTable *response_parsed = NULL;
const guint8 *r_data;
const char *cur_line;
const guint8 * r_data;
const char * cur_line;
gsize r_len;
gsize cur_line_len;
GHashTableIter h_iter;
gboolean has_all;
const char *c_hwaddr;
const char * c_hwaddr;
gssize iface_idx_counter = 0;
if ( response_code != 200
|| !response_data) {
if (response_code != 200 || !response_data) {
/* we wait longer. */
return FALSE;
}
r_data = g_bytes_get_data (response_data, &r_len);
r_data = g_bytes_get_data(response_data, &r_len);
/* NMHttpClient guarantees that there is a trailing NUL after the data. */
nm_assert (r_data[r_len] == 0);
nm_assert(r_data[r_len] == 0);
while (nm_utils_parse_next_line ((const char **) &r_data, &r_len, &cur_line, &cur_line_len)) {
while (nm_utils_parse_next_line((const char **) &r_data, &r_len, &cur_line, &cur_line_len)) {
GetConfigMetadataMac *mac_data;
char *hwaddr;
char * hwaddr;
if (cur_line_len == 0)
continue;
@ -461,47 +441,44 @@ _get_config_metadata_ready_check (long response_code,
* extra NUL character after the buffer. */
((char *) cur_line)[cur_line_len] = '\0';
hwaddr = nmcs_utils_hwaddr_normalize (cur_line,
cur_line[cur_line_len - 1u] == '/'
? (gssize) (cur_line_len - 1u)
: -1);
hwaddr = nmcs_utils_hwaddr_normalize(
cur_line,
cur_line[cur_line_len - 1u] == '/' ? (gssize)(cur_line_len - 1u) : -1);
if (!hwaddr)
continue;
if (!response_parsed)
response_parsed = g_hash_table_new_full (nm_str_hash, g_str_equal, g_free, g_free);
response_parsed = g_hash_table_new_full(nm_str_hash, g_str_equal, g_free, g_free);
mac_data = g_malloc (sizeof (GetConfigMetadataMac) + 1u + cur_line_len);
mac_data = g_malloc(sizeof(GetConfigMetadataMac) + 1u + cur_line_len);
mac_data->iface_idx = iface_idx_counter++;
memcpy (mac_data->path, cur_line, cur_line_len + 1u);
memcpy(mac_data->path, cur_line, cur_line_len + 1u);
g_hash_table_insert (response_parsed, hwaddr, mac_data);
g_hash_table_insert(response_parsed, hwaddr, mac_data);
}
has_all = TRUE;
g_hash_table_iter_init (&h_iter, metadata_data->get_config_data->result_dict);
while (g_hash_table_iter_next (&h_iter, (gpointer *) &c_hwaddr, NULL)) {
if ( !response_parsed
|| !g_hash_table_contains (response_parsed, c_hwaddr)) {
g_hash_table_iter_init(&h_iter, metadata_data->get_config_data->result_dict);
while (g_hash_table_iter_next(&h_iter, (gpointer *) &c_hwaddr, NULL)) {
if (!response_parsed || !g_hash_table_contains(response_parsed, c_hwaddr)) {
has_all = FALSE;
break;
}
}
nm_clear_pointer (&metadata_data->response_parsed, g_hash_table_unref);
metadata_data->response_parsed = g_steal_pointer (&response_parsed);
nm_clear_pointer(&metadata_data->response_parsed, g_hash_table_unref);
metadata_data->response_parsed = g_steal_pointer(&response_parsed);
return has_all;
}
static void
get_config (NMCSProvider *provider,
NMCSProviderGetConfigTaskData *get_config_data)
get_config(NMCSProvider *provider, NMCSProviderGetConfigTaskData *get_config_data)
{
gs_free char *uri = NULL;
gs_free char * uri = NULL;
GetConfigMetadataData *metadata_data;
metadata_data = g_slice_new (GetConfigMetadataData);
*metadata_data = (GetConfigMetadataData) {
metadata_data = g_slice_new(GetConfigMetadataData);
*metadata_data = (GetConfigMetadataData){
.get_config_data = get_config_data,
};
@ -509,14 +486,14 @@ get_config (NMCSProvider *provider,
* MAC addresses, then we poll until we see them. They might not yet be
* around from the start...
*/
nm_http_client_poll_get (nmcs_provider_get_http_client (provider),
(uri = _ec2_uri_interfaces ()),
nm_http_client_poll_get(nmcs_provider_get_http_client(provider),
(uri = _ec2_uri_interfaces()),
HTTP_TIMEOUT_MS,
256 * 1024,
15000,
1000,
NULL,
g_task_get_cancellable (get_config_data->task),
g_task_get_cancellable(get_config_data->task),
_get_config_metadata_ready_check,
metadata_data,
_get_config_metadata_ready_cb,
@ -526,17 +503,16 @@ get_config (NMCSProvider *provider,
/*****************************************************************************/
static void
nmcs_provider_ec2_init (NMCSProviderEC2 *self)
{
}
nmcs_provider_ec2_init(NMCSProviderEC2 *self)
{}
static void
nmcs_provider_ec2_class_init (NMCSProviderEC2Class *klass)
nmcs_provider_ec2_class_init(NMCSProviderEC2Class *klass)
{
NMCSProviderClass *provider_class = NMCS_PROVIDER_CLASS (klass);
NMCSProviderClass *provider_class = NMCS_PROVIDER_CLASS(klass);
provider_class->_name = "ec2";
provider_class->_env_provider_enabled = NMCS_ENV_VARIABLE ("NM_CLOUD_SETUP_EC2");
provider_class->_env_provider_enabled = NMCS_ENV_VARIABLE("NM_CLOUD_SETUP_EC2");
provider_class->detect = detect;
provider_class->get_config = get_config;
}

View file

@ -10,14 +10,17 @@
typedef struct _NMCSProviderEC2 NMCSProviderEC2;
typedef struct _NMCSProviderEC2Class NMCSProviderEC2Class;
#define NMCS_TYPE_PROVIDER_EC2 (nmcs_provider_ec2_get_type ())
#define NMCS_PROVIDER_EC2(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMCS_TYPE_PROVIDER_EC2, NMCSProviderEC2))
#define NMCS_PROVIDER_EC2_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NMCS_TYPE_PROVIDER_EC2, NMCSProviderEC2Class))
#define NMCS_IS_PROVIDER_EC2(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NMCS_TYPE_PROVIDER_EC2))
#define NMCS_IS_PROVIDER_EC2_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NMCS_TYPE_PROVIDER_EC2))
#define NMCS_PROVIDER_EC2_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NMCS_TYPE_PROVIDER_EC2, NMCSProviderEC2Class))
#define NMCS_TYPE_PROVIDER_EC2 (nmcs_provider_ec2_get_type())
#define NMCS_PROVIDER_EC2(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), NMCS_TYPE_PROVIDER_EC2, NMCSProviderEC2))
#define NMCS_PROVIDER_EC2_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), NMCS_TYPE_PROVIDER_EC2, NMCSProviderEC2Class))
#define NMCS_IS_PROVIDER_EC2(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), NMCS_TYPE_PROVIDER_EC2))
#define NMCS_IS_PROVIDER_EC2_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NMCS_TYPE_PROVIDER_EC2))
#define NMCS_PROVIDER_EC2_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), NMCS_TYPE_PROVIDER_EC2, NMCSProviderEC2Class))
GType nmcs_provider_ec2_get_type (void);
GType nmcs_provider_ec2_get_type(void);
/*****************************************************************************/

View file

@ -9,7 +9,7 @@
/*****************************************************************************/
#define HTTP_TIMEOUT_MS 3000
#define HTTP_REQ_MAX_DATA 512*1024
#define HTTP_REQ_MAX_DATA 512 * 1024
#define HTTP_POLL_TIMEOUT_MS 10000
#define HTTP_RATE_LIMIT_MS 1000
@ -21,8 +21,8 @@
#define NM_GCP_METADATA_HEADER "Metadata-Flavor: Google"
#define _gcp_uri_concat(...) nmcs_utils_uri_build_concat (NM_GCP_METADATA_URL_BASE, __VA_ARGS__)
#define _gcp_uri_interfaces(...) _gcp_uri_concat (NM_GCP_METADATA_URL_NET, ##__VA_ARGS__)
#define _gcp_uri_concat(...) nmcs_utils_uri_build_concat(NM_GCP_METADATA_URL_BASE, __VA_ARGS__)
#define _gcp_uri_interfaces(...) _gcp_uri_concat(NM_GCP_METADATA_URL_NET, ##__VA_ARGS__)
/*****************************************************************************/
@ -34,59 +34,52 @@ struct _NMCSProviderGCPClass {
NMCSProviderClass parent;
};
G_DEFINE_TYPE (NMCSProviderGCP, nmcs_provider_gcp, NMCS_TYPE_PROVIDER);
G_DEFINE_TYPE(NMCSProviderGCP, nmcs_provider_gcp, NMCS_TYPE_PROVIDER);
/*****************************************************************************/
static void
_detect_get_meta_data_done_cb (GObject *source,
GAsyncResult *result,
gpointer user_data)
_detect_get_meta_data_done_cb(GObject *source, GAsyncResult *result, gpointer user_data)
{
gs_unref_object GTask *task = user_data;
gs_free_error GError *get_error = NULL;
gs_free_error GError *error = NULL;
nm_http_client_poll_get_finish (NM_HTTP_CLIENT (source),
result,
NULL,
NULL,
&get_error);
nm_http_client_poll_get_finish(NM_HTTP_CLIENT(source), result, NULL, NULL, &get_error);
if (nm_utils_error_is_cancelled (get_error)) {
g_task_return_error (task, g_steal_pointer (&get_error));
if (nm_utils_error_is_cancelled(get_error)) {
g_task_return_error(task, g_steal_pointer(&get_error));
return;
}
if (get_error) {
nm_utils_error_set (&error,
nm_utils_error_set(&error,
NM_UTILS_ERROR_UNKNOWN,
"failure to get GCP metadata: %s",
get_error->message);
g_task_return_error (task, g_steal_pointer (&error));
g_task_return_error(task, g_steal_pointer(&error));
return;
}
g_task_return_boolean (task, TRUE);
g_task_return_boolean(task, TRUE);
}
static void
detect (NMCSProvider *provider,
GTask *task)
detect(NMCSProvider *provider, GTask *task)
{
NMHttpClient *http_client;
gs_free char *uri = NULL;
http_client = nmcs_provider_get_http_client (provider);
http_client = nmcs_provider_get_http_client(provider);
nm_http_client_poll_get (http_client,
(uri = _gcp_uri_concat ("id")),
nm_http_client_poll_get(http_client,
(uri = _gcp_uri_concat("id")),
HTTP_TIMEOUT_MS,
256*1024,
256 * 1024,
7000,
1000,
NM_MAKE_STRV (NM_GCP_METADATA_HEADER),
g_task_get_cancellable (task),
NM_MAKE_STRV(NM_GCP_METADATA_HEADER),
g_task_get_cancellable(task),
NULL,
NULL,
_detect_get_meta_data_done_cb,
@ -98,86 +91,79 @@ detect (NMCSProvider *provider,
typedef struct {
NMCSProviderGetConfigTaskData *config_data;
guint n_ifaces_pending;
GError *error;
GError * error;
} GCPData;
typedef struct {
NMCSProviderGetConfigIfaceData *iface_get_config;
GCPData *gcp_data;
GCPData * gcp_data;
gssize iface_idx;
guint n_fips_pending;
} GCPIfaceData;
static void
_get_config_maybe_task_return (GCPData *gcp_data,
GError *error_take)
_get_config_maybe_task_return(GCPData *gcp_data, GError *error_take)
{
NMCSProviderGetConfigTaskData *config_data = gcp_data->config_data;
if (error_take) {
if (!gcp_data->error)
gcp_data->error = error_take;
else if ( !nm_utils_error_is_cancelled (gcp_data->error)
&& nm_utils_error_is_cancelled (error_take)) {
nm_clear_error (&gcp_data->error);
else if (!nm_utils_error_is_cancelled(gcp_data->error)
&& nm_utils_error_is_cancelled(error_take)) {
nm_clear_error(&gcp_data->error);
gcp_data->error = error_take;
} else
g_error_free (error_take);
g_error_free(error_take);
}
if (gcp_data->n_ifaces_pending > 0)
return;
if (gcp_data->error) {
if (nm_utils_error_is_cancelled (gcp_data->error))
_LOGD ("get-config: cancelled");
if (nm_utils_error_is_cancelled(gcp_data->error))
_LOGD("get-config: cancelled");
else
_LOGD ("get-config: failed: %s", gcp_data->error->message);
g_task_return_error (config_data->task, g_steal_pointer (&gcp_data->error));
_LOGD("get-config: failed: %s", gcp_data->error->message);
g_task_return_error(config_data->task, g_steal_pointer(&gcp_data->error));
} else {
_LOGD ("get-config: success");
g_task_return_pointer (config_data->task,
g_hash_table_ref (config_data->result_dict),
_LOGD("get-config: success");
g_task_return_pointer(config_data->task,
g_hash_table_ref(config_data->result_dict),
(GDestroyNotify) g_hash_table_unref);
}
nm_g_slice_free (gcp_data);
g_object_unref (config_data->task);
nm_g_slice_free(gcp_data);
g_object_unref(config_data->task);
}
static void
_get_config_fip_cb (GObject *source,
GAsyncResult *result,
gpointer user_data)
_get_config_fip_cb(GObject *source, GAsyncResult *result, gpointer user_data)
{
NMCSProviderGetConfigIfaceData *iface_get_config;
gs_unref_bytes GBytes *response = NULL;
GCPIfaceData *iface_data = user_data;
GCPIfaceData * iface_data = user_data;
gs_free_error GError *error = NULL;
const char *fip_str = NULL;
NMIPRoute **routes_arr;
NMIPRoute *route_new;
GCPData *gcp_data;
const char * fip_str = NULL;
NMIPRoute ** routes_arr;
NMIPRoute * route_new;
GCPData * gcp_data;
gcp_data = iface_data->gcp_data;
nm_http_client_poll_get_finish (NM_HTTP_CLIENT (source),
result,
NULL,
&response,
&error);
nm_http_client_poll_get_finish(NM_HTTP_CLIENT(source), result, NULL, &response, &error);
if (error)
goto iface_done;
fip_str = g_bytes_get_data (response, NULL);
if (!nm_utils_ipaddr_valid (AF_INET, fip_str)) {
error = nm_utils_error_new (NM_UTILS_ERROR_UNKNOWN,
"forwarded-ip is not a valid ip address");
fip_str = g_bytes_get_data(response, NULL);
if (!nm_utils_ipaddr_valid(AF_INET, fip_str)) {
error =
nm_utils_error_new(NM_UTILS_ERROR_UNKNOWN, "forwarded-ip is not a valid ip address");
goto iface_done;
}
_LOGI ("GCP interface[%"G_GSSIZE_FORMAT"]: adding forwarded-ip %s",
_LOGI("GCP interface[%" G_GSSIZE_FORMAT "]: adding forwarded-ip %s",
iface_data->iface_idx,
fip_str);
@ -185,110 +171,92 @@ _get_config_fip_cb (GObject *source,
iface_get_config->iface_idx = iface_data->iface_idx;
routes_arr = iface_get_config->iproutes_arr;
route_new = nm_ip_route_new (AF_INET,
fip_str,
32,
NULL,
100,
&error);
route_new = nm_ip_route_new(AF_INET, fip_str, 32, NULL, 100, &error);
if (error)
goto iface_done;
nm_ip_route_set_attribute (route_new,
NM_IP_ROUTE_ATTRIBUTE_TYPE,
g_variant_new_string ("local"));
nm_ip_route_set_attribute(route_new, NM_IP_ROUTE_ATTRIBUTE_TYPE, g_variant_new_string("local"));
routes_arr[iface_get_config->iproutes_len] = route_new;
++iface_get_config->iproutes_len;
iface_done:
--iface_data->n_fips_pending;
if (iface_data->n_fips_pending == 0) {
nm_g_slice_free (iface_data);
nm_g_slice_free(iface_data);
--gcp_data->n_ifaces_pending;
}
_get_config_maybe_task_return (gcp_data, g_steal_pointer (&error));
_get_config_maybe_task_return(gcp_data, g_steal_pointer(&error));
}
static void
_get_config_ips_list_cb (GObject *source,
GAsyncResult *result,
gpointer user_data)
_get_config_ips_list_cb(GObject *source, GAsyncResult *result, gpointer user_data)
{
gs_unref_ptrarray GPtrArray *uri_arr = NULL;
gs_unref_bytes GBytes *response = NULL;
GCPIfaceData *iface_data = user_data;
GCPIfaceData * iface_data = user_data;
gs_free_error GError *error = NULL;
const char *response_str = NULL;
const char * response_str = NULL;
gsize response_len;
GCPData *gcp_data;
const char *line;
GCPData * gcp_data;
const char * line;
gsize line_len;
guint i;
gcp_data = iface_data->gcp_data;
nm_http_client_poll_get_finish (NM_HTTP_CLIENT (source),
result,
NULL,
&response,
&error);
nm_http_client_poll_get_finish(NM_HTTP_CLIENT(source), result, NULL, &response, &error);
if (error)
goto fips_error;
response_str = g_bytes_get_data (response, &response_len);
response_str = g_bytes_get_data(response, &response_len);
/* NMHttpClient guarantees that there is a trailing NUL after the data. */
nm_assert (response_str[response_len] == 0);
nm_assert(response_str[response_len] == 0);
uri_arr = g_ptr_array_new_with_free_func (g_free);
while (nm_utils_parse_next_line (&response_str,
&response_len,
&line,
&line_len)) {
uri_arr = g_ptr_array_new_with_free_func(g_free);
while (nm_utils_parse_next_line(&response_str, &response_len, &line, &line_len)) {
gint64 fip_index;
/* Truncate the string. It's safe to do, because we own @response_data an it has an
* extra NUL character after the buffer. */
((char *) line)[line_len] = '\0';
fip_index = _nm_utils_ascii_str_to_int64 (line, 10, 0, G_MAXINT64, -1);
fip_index = _nm_utils_ascii_str_to_int64(line, 10, 0, G_MAXINT64, -1);
if (fip_index < 0)
continue;
g_ptr_array_add (uri_arr,
g_strdup_printf ("%"G_GSSIZE_FORMAT"/forwarded-ips/%"G_GINT64_FORMAT,
g_ptr_array_add(uri_arr,
g_strdup_printf("%" G_GSSIZE_FORMAT "/forwarded-ips/%" G_GINT64_FORMAT,
iface_data->iface_idx,
fip_index));
}
iface_data->n_fips_pending = uri_arr->len;
_LOGI ("GCP interface[%"G_GSSIZE_FORMAT"]: found %u forwarded ips",
_LOGI("GCP interface[%" G_GSSIZE_FORMAT "]: found %u forwarded ips",
iface_data->iface_idx,
iface_data->n_fips_pending);
if (iface_data->n_fips_pending == 0) {
error = nm_utils_error_new (NM_UTILS_ERROR_UNKNOWN,
"found no forwarded ip");
error = nm_utils_error_new(NM_UTILS_ERROR_UNKNOWN, "found no forwarded ip");
goto fips_error;
}
iface_data->iface_get_config->iproutes_arr =
g_new (NMIPRoute *, iface_data->n_fips_pending);
iface_data->iface_get_config->iproutes_arr = g_new(NMIPRoute *, iface_data->n_fips_pending);
for (i = 0; i < uri_arr->len; ++i) {
const char *str = uri_arr->pdata[i];
const char * str = uri_arr->pdata[i];
gs_free const char *uri = NULL;
nm_http_client_poll_get (NM_HTTP_CLIENT (source),
(uri = _gcp_uri_interfaces (str)),
nm_http_client_poll_get(NM_HTTP_CLIENT(source),
(uri = _gcp_uri_interfaces(str)),
HTTP_TIMEOUT_MS,
HTTP_REQ_MAX_DATA,
HTTP_POLL_TIMEOUT_MS,
HTTP_RATE_LIMIT_MS,
NM_MAKE_STRV (NM_GCP_METADATA_HEADER),
g_task_get_cancellable (gcp_data->config_data->task),
NM_MAKE_STRV(NM_GCP_METADATA_HEADER),
g_task_get_cancellable(gcp_data->config_data->task),
NULL,
NULL,
_get_config_fip_cb,
@ -297,60 +265,53 @@ _get_config_ips_list_cb (GObject *source,
return;
fips_error:
nm_g_slice_free (iface_data);
nm_g_slice_free(iface_data);
--gcp_data->n_ifaces_pending;
_get_config_maybe_task_return (gcp_data, g_steal_pointer (&error));
_get_config_maybe_task_return(gcp_data, g_steal_pointer(&error));
}
static void
_get_config_iface_cb (GObject *source,
GAsyncResult *result,
gpointer user_data)
_get_config_iface_cb(GObject *source, GAsyncResult *result, gpointer user_data)
{
gs_unref_bytes GBytes *response = NULL;
GCPIfaceData *iface_data = user_data;
GCPIfaceData * iface_data = user_data;
gs_free_error GError *error = NULL;
gs_free const char *hwaddr = NULL;
gs_free const char *uri = NULL;
gs_free const char * hwaddr = NULL;
gs_free const char * uri = NULL;
char sbuf[100];
GCPData *gcp_data;
GCPData * gcp_data;
gcp_data = iface_data->gcp_data;
nm_http_client_poll_get_finish (NM_HTTP_CLIENT (source),
result,
NULL,
&response,
&error);
nm_http_client_poll_get_finish(NM_HTTP_CLIENT(source), result, NULL, &response, &error);
if (error)
goto iface_error;
hwaddr = nmcs_utils_hwaddr_normalize (g_bytes_get_data (response, NULL), -1);
iface_data->iface_get_config = g_hash_table_lookup (gcp_data->config_data->result_dict,
hwaddr);
hwaddr = nmcs_utils_hwaddr_normalize(g_bytes_get_data(response, NULL), -1);
iface_data->iface_get_config = g_hash_table_lookup(gcp_data->config_data->result_dict, hwaddr);
if (!iface_data->iface_get_config) {
_LOGI ("GCP interface[%"G_GSSIZE_FORMAT"]: did not find a matching device",
_LOGI("GCP interface[%" G_GSSIZE_FORMAT "]: did not find a matching device",
iface_data->iface_idx);
error = nm_utils_error_new (NM_UTILS_ERROR_UNKNOWN,
error = nm_utils_error_new(NM_UTILS_ERROR_UNKNOWN,
"no matching hwaddr found for GCP interface");
goto iface_error;
}
_LOGI ("GCP interface[%"G_GSSIZE_FORMAT"]: found a matching device with hwaddr %s",
_LOGI("GCP interface[%" G_GSSIZE_FORMAT "]: found a matching device with hwaddr %s",
iface_data->iface_idx,
hwaddr);
nm_sprintf_buf (sbuf, "%"G_GSSIZE_FORMAT"/forwarded-ips/", iface_data->iface_idx);
nm_sprintf_buf(sbuf, "%" G_GSSIZE_FORMAT "/forwarded-ips/", iface_data->iface_idx);
nm_http_client_poll_get (NM_HTTP_CLIENT (source),
(uri = _gcp_uri_interfaces (sbuf)),
nm_http_client_poll_get(NM_HTTP_CLIENT(source),
(uri = _gcp_uri_interfaces(sbuf)),
HTTP_TIMEOUT_MS,
HTTP_REQ_MAX_DATA,
HTTP_POLL_TIMEOUT_MS,
HTTP_RATE_LIMIT_MS,
NM_MAKE_STRV (NM_GCP_METADATA_HEADER),
g_task_get_cancellable (gcp_data->config_data->task),
NM_MAKE_STRV(NM_GCP_METADATA_HEADER),
g_task_get_cancellable(gcp_data->config_data->task),
NULL,
NULL,
_get_config_ips_list_cb,
@ -358,47 +319,38 @@ _get_config_iface_cb (GObject *source,
return;
iface_error:
nm_g_slice_free (iface_data);
nm_g_slice_free(iface_data);
--gcp_data->n_ifaces_pending;
_get_config_maybe_task_return (gcp_data, g_steal_pointer (&error));
_get_config_maybe_task_return(gcp_data, g_steal_pointer(&error));
}
static void
_get_net_ifaces_list_cb (GObject *source,
GAsyncResult *result,
gpointer user_data)
_get_net_ifaces_list_cb(GObject *source, GAsyncResult *result, gpointer user_data)
{
gs_unref_ptrarray GPtrArray *ifaces_arr = NULL;
gs_unref_bytes GBytes *response = NULL;
gs_free_error GError *error = NULL;
GCPData *gcp_data = user_data;
const char *response_str;
GCPData * gcp_data = user_data;
const char * response_str;
gsize response_len;
const char *line;
const char * line;
gsize line_len;
guint i;
nm_http_client_poll_get_finish (NM_HTTP_CLIENT (source),
result,
NULL,
&response,
&error);
nm_http_client_poll_get_finish(NM_HTTP_CLIENT(source), result, NULL, &response, &error);
if (error) {
_get_config_maybe_task_return (gcp_data, g_steal_pointer (&error));
_get_config_maybe_task_return(gcp_data, g_steal_pointer(&error));
return;
}
response_str = g_bytes_get_data (response, &response_len);
response_str = g_bytes_get_data(response, &response_len);
/* NMHttpClient guarantees that there is a trailing NUL after the data. */
nm_assert (response_str[response_len] == 0);
nm_assert(response_str[response_len] == 0);
ifaces_arr = g_ptr_array_new ();
ifaces_arr = g_ptr_array_new();
while (nm_utils_parse_next_line (&response_str,
&response_len,
&line,
&line_len)) {
while (nm_utils_parse_next_line(&response_str, &response_len, &line, &line_len)) {
GCPIfaceData *iface_data;
gssize iface_idx;
@ -411,41 +363,40 @@ _get_net_ifaces_list_cb (GObject *source,
if (line[line_len - 1] == '/')
((char *) line)[--line_len] = '\0';
iface_idx = _nm_utils_ascii_str_to_int64 (line, 10, 0, G_MAXSSIZE, -1);
iface_idx = _nm_utils_ascii_str_to_int64(line, 10, 0, G_MAXSSIZE, -1);
if (iface_idx < 0)
continue;
iface_data = g_slice_new (GCPIfaceData);
*iface_data = (GCPIfaceData) {
iface_data = g_slice_new(GCPIfaceData);
*iface_data = (GCPIfaceData){
.iface_get_config = NULL,
.gcp_data = gcp_data,
.iface_idx = iface_idx,
.n_fips_pending = 0,
};
g_ptr_array_add (ifaces_arr, iface_data);
g_ptr_array_add(ifaces_arr, iface_data);
}
gcp_data->n_ifaces_pending = ifaces_arr->len;
_LOGI ("found GCP interfaces: %u", ifaces_arr->len);
_LOGI("found GCP interfaces: %u", ifaces_arr->len);
for (i = 0; i < ifaces_arr->len; ++i) {
GCPIfaceData *data = ifaces_arr->pdata[i];
GCPIfaceData * data = ifaces_arr->pdata[i];
gs_free const char *uri = NULL;
char sbuf[100];
_LOGD ("GCP interface[%"G_GSSIZE_FORMAT"]: retrieving configuration",
data->iface_idx);
_LOGD("GCP interface[%" G_GSSIZE_FORMAT "]: retrieving configuration", data->iface_idx);
nm_sprintf_buf (sbuf, "%"G_GSSIZE_FORMAT"/mac", data->iface_idx);
nm_sprintf_buf(sbuf, "%" G_GSSIZE_FORMAT "/mac", data->iface_idx);
nm_http_client_poll_get (NM_HTTP_CLIENT (source),
(uri = _gcp_uri_interfaces (sbuf)),
nm_http_client_poll_get(NM_HTTP_CLIENT(source),
(uri = _gcp_uri_interfaces(sbuf)),
HTTP_TIMEOUT_MS,
HTTP_REQ_MAX_DATA,
HTTP_POLL_TIMEOUT_MS,
HTTP_RATE_LIMIT_MS,
NM_MAKE_STRV (NM_GCP_METADATA_HEADER),
g_task_get_cancellable (gcp_data->config_data->task),
NM_MAKE_STRV(NM_GCP_METADATA_HEADER),
g_task_get_cancellable(gcp_data->config_data->task),
NULL,
NULL,
_get_config_iface_cb,
@ -453,35 +404,32 @@ _get_net_ifaces_list_cb (GObject *source,
}
if (ifaces_arr->len == 0) {
error = nm_utils_error_new (NM_UTILS_ERROR_UNKNOWN,
"no GCP interfaces found");
_get_config_maybe_task_return (gcp_data, g_steal_pointer (&error));
error = nm_utils_error_new(NM_UTILS_ERROR_UNKNOWN, "no GCP interfaces found");
_get_config_maybe_task_return(gcp_data, g_steal_pointer(&error));
}
}
static void
get_config (NMCSProvider *provider,
NMCSProviderGetConfigTaskData *get_config_data)
get_config(NMCSProvider *provider, NMCSProviderGetConfigTaskData *get_config_data)
{
gs_free const char *uri = NULL;
GCPData *gcp_data;
GCPData * gcp_data;
gcp_data = g_slice_new (GCPData);
*gcp_data = (GCPData) {
gcp_data = g_slice_new(GCPData);
*gcp_data = (GCPData){
.config_data = get_config_data,
.n_ifaces_pending = 0,
.error = NULL,
};
nm_http_client_poll_get (nmcs_provider_get_http_client (provider),
(uri = _gcp_uri_interfaces ()),
nm_http_client_poll_get(nmcs_provider_get_http_client(provider),
(uri = _gcp_uri_interfaces()),
HTTP_TIMEOUT_MS,
HTTP_REQ_MAX_DATA,
HTTP_POLL_TIMEOUT_MS,
HTTP_RATE_LIMIT_MS,
NM_MAKE_STRV (NM_GCP_METADATA_HEADER),
g_task_get_cancellable (gcp_data->config_data->task),
NM_MAKE_STRV(NM_GCP_METADATA_HEADER),
g_task_get_cancellable(gcp_data->config_data->task),
NULL,
NULL,
_get_net_ifaces_list_cb,
@ -491,17 +439,16 @@ get_config (NMCSProvider *provider,
/*****************************************************************************/
static void
nmcs_provider_gcp_init (NMCSProviderGCP *self)
{
}
nmcs_provider_gcp_init(NMCSProviderGCP *self)
{}
static void
nmcs_provider_gcp_class_init (NMCSProviderGCPClass *klass)
nmcs_provider_gcp_class_init(NMCSProviderGCPClass *klass)
{
NMCSProviderClass *provider_class = NMCS_PROVIDER_CLASS (klass);
NMCSProviderClass *provider_class = NMCS_PROVIDER_CLASS(klass);
provider_class->_name = "GCP";
provider_class->_env_provider_enabled = NMCS_ENV_VARIABLE ("NM_CLOUD_SETUP_GCP");
provider_class->_env_provider_enabled = NMCS_ENV_VARIABLE("NM_CLOUD_SETUP_GCP");
provider_class->detect = detect;
provider_class->get_config = get_config;
}

View file

@ -10,14 +10,17 @@
typedef struct _NMCSProviderGCP NMCSProviderGCP;
typedef struct _NMCSProviderGCPClass NMCSProviderGCPClass;
#define NMCS_TYPE_PROVIDER_GCP (nmcs_provider_gcp_get_type ())
#define NMCS_PROVIDER_GCP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMCS_TYPE_PROVIDER_GCP, NMCSProviderGCP))
#define NMCS_PROVIDER_GCP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NMCS_TYPE_PROVIDER_GCP, NMCSProviderGCPClass))
#define NMCS_IS_PROVIDER_GCP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NMCS_TYPE_PROVIDER_GCP))
#define NMCS_IS_PROVIDER_GCP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NMCS_TYPE_PROVIDER_GCP))
#define NMCS_PROVIDER_GCP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NMCS_TYPE_PROVIDER_GCP, NMCSProviderGCPClass))
#define NMCS_TYPE_PROVIDER_GCP (nmcs_provider_gcp_get_type())
#define NMCS_PROVIDER_GCP(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), NMCS_TYPE_PROVIDER_GCP, NMCSProviderGCP))
#define NMCS_PROVIDER_GCP_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), NMCS_TYPE_PROVIDER_GCP, NMCSProviderGCPClass))
#define NMCS_IS_PROVIDER_GCP(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), NMCS_TYPE_PROVIDER_GCP))
#define NMCS_IS_PROVIDER_GCP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NMCS_TYPE_PROVIDER_GCP))
#define NMCS_PROVIDER_GCP_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), NMCS_TYPE_PROVIDER_GCP, NMCSProviderGCPClass))
GType nmcs_provider_gcp_get_type (void);
GType nmcs_provider_gcp_get_type(void);
/*****************************************************************************/

View file

@ -8,100 +8,94 @@
/*****************************************************************************/
NM_GOBJECT_PROPERTIES_DEFINE_BASE (
PROP_HTTP_CLIENT,
);
NM_GOBJECT_PROPERTIES_DEFINE_BASE(PROP_HTTP_CLIENT, );
typedef struct _NMCSProviderPrivate {
NMHttpClient *http_client;
} NMCSProviderPrivate;
G_DEFINE_TYPE (NMCSProvider, nmcs_provider, G_TYPE_OBJECT);
G_DEFINE_TYPE(NMCSProvider, nmcs_provider, G_TYPE_OBJECT);
#define NMCS_PROVIDER_GET_PRIVATE(self) _NM_GET_PRIVATE_PTR(self, NMCSProvider, NMCS_IS_PROVIDER)
/*****************************************************************************/
const char *
nmcs_provider_get_name (NMCSProvider *self)
nmcs_provider_get_name(NMCSProvider *self)
{
NMCSProviderClass *klass;
g_return_val_if_fail (NMCS_IS_PROVIDER (self), NULL);
g_return_val_if_fail(NMCS_IS_PROVIDER(self), NULL);
klass = NMCS_PROVIDER_GET_CLASS (self);
nm_assert (klass->_name);
klass = NMCS_PROVIDER_GET_CLASS(self);
nm_assert(klass->_name);
return klass->_name;
}
/*****************************************************************************/
NMHttpClient *
nmcs_provider_get_http_client (NMCSProvider *self)
nmcs_provider_get_http_client(NMCSProvider *self)
{
g_return_val_if_fail (NMCS_IS_PROVIDER (self), NULL);
g_return_val_if_fail(NMCS_IS_PROVIDER(self), NULL);
return NMCS_PROVIDER_GET_PRIVATE (self)->http_client;
return NMCS_PROVIDER_GET_PRIVATE(self)->http_client;
}
GMainContext *
nmcs_provider_get_main_context (NMCSProvider *self)
nmcs_provider_get_main_context(NMCSProvider *self)
{
g_return_val_if_fail (NMCS_IS_PROVIDER (self), NULL);
g_return_val_if_fail(NMCS_IS_PROVIDER(self), NULL);
return nm_http_client_get_main_context (NMCS_PROVIDER_GET_PRIVATE (self)->http_client);
return nm_http_client_get_main_context(NMCS_PROVIDER_GET_PRIVATE(self)->http_client);
}
/*****************************************************************************/
void
nmcs_provider_detect (NMCSProvider *self,
GCancellable *cancellable,
nmcs_provider_detect(NMCSProvider * self,
GCancellable * cancellable,
GAsyncReadyCallback callback,
gpointer user_data)
{
gs_unref_object GTask *task = NULL;
const char *env;
const char * env;
g_return_if_fail (NMCS_IS_PROVIDER (self));
g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable));
g_return_if_fail(NMCS_IS_PROVIDER(self));
g_return_if_fail(!cancellable || G_IS_CANCELLABLE(cancellable));
task = nm_g_task_new (self, cancellable, nmcs_provider_detect, callback, user_data);
task = nm_g_task_new(self, cancellable, nmcs_provider_detect, callback, user_data);
nmcs_wait_for_objects_register (task);
nmcs_wait_for_objects_register(task);
env = g_getenv (NMCS_PROVIDER_GET_CLASS (self)->_env_provider_enabled);
if (!_nm_utils_ascii_str_to_bool (env, FALSE)) {
g_task_return_error (task,
nm_utils_error_new (NM_UTILS_ERROR_UNKNOWN,
"provider is disabled"));
env = g_getenv(NMCS_PROVIDER_GET_CLASS(self)->_env_provider_enabled);
if (!_nm_utils_ascii_str_to_bool(env, FALSE)) {
g_task_return_error(task,
nm_utils_error_new(NM_UTILS_ERROR_UNKNOWN, "provider is disabled"));
return;
}
NMCS_PROVIDER_GET_CLASS (self)->detect (self,
g_steal_pointer (&task));
NMCS_PROVIDER_GET_CLASS(self)->detect(self, g_steal_pointer(&task));
}
gboolean
nmcs_provider_detect_finish (NMCSProvider *self,
GAsyncResult *result,
GError **error)
nmcs_provider_detect_finish(NMCSProvider *self, GAsyncResult *result, GError **error)
{
g_return_val_if_fail (NMCS_IS_PROVIDER (self), FALSE);
g_return_val_if_fail (nm_g_task_is_valid (result, self, nmcs_provider_detect), FALSE);
g_return_val_if_fail(NMCS_IS_PROVIDER(self), FALSE);
g_return_val_if_fail(nm_g_task_is_valid(result, self, nmcs_provider_detect), FALSE);
return g_task_propagate_boolean (G_TASK (result), error);
return g_task_propagate_boolean(G_TASK(result), error);
}
/*****************************************************************************/
NMCSProviderGetConfigIfaceData *
nmcs_provider_get_config_iface_data_new (gboolean was_requested)
nmcs_provider_get_config_iface_data_new(gboolean was_requested)
{
NMCSProviderGetConfigIfaceData *iface_data;
iface_data = g_slice_new (NMCSProviderGetConfigIfaceData);
*iface_data = (NMCSProviderGetConfigIfaceData) {
iface_data = g_slice_new(NMCSProviderGetConfigIfaceData);
*iface_data = (NMCSProviderGetConfigIfaceData){
.iface_idx = -1,
.was_requested = was_requested,
};
@ -109,95 +103,87 @@ nmcs_provider_get_config_iface_data_new (gboolean was_requested)
}
static void
_iface_data_free (gpointer data)
_iface_data_free(gpointer data)
{
NMCSProviderGetConfigIfaceData *iface_data = data;
g_free (iface_data->ipv4s_arr);
g_free (iface_data->iproutes_arr);
g_free(iface_data->ipv4s_arr);
g_free(iface_data->iproutes_arr);
nm_g_slice_free (iface_data);
nm_g_slice_free(iface_data);
}
static void
_get_config_data_free (gpointer data)
_get_config_data_free(gpointer data)
{
NMCSProviderGetConfigTaskData *get_config_data = data;
if (get_config_data->extra_destroy)
get_config_data->extra_destroy (get_config_data->extra_data);
get_config_data->extra_destroy(get_config_data->extra_data);
nm_clear_pointer (&get_config_data->result_dict, g_hash_table_unref);
nm_clear_pointer(&get_config_data->result_dict, g_hash_table_unref);
nm_g_slice_free (get_config_data);
nm_g_slice_free(get_config_data);
}
void
nmcs_provider_get_config (NMCSProvider *self,
nmcs_provider_get_config(NMCSProvider * self,
gboolean any,
const char *const*hwaddrs,
GCancellable *cancellable,
const char *const * hwaddrs,
GCancellable * cancellable,
GAsyncReadyCallback callback,
gpointer user_data)
{
NMCSProviderGetConfigTaskData *get_config_data;
g_return_if_fail (NMCS_IS_PROVIDER (self));
g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable));
g_return_if_fail(NMCS_IS_PROVIDER(self));
g_return_if_fail(!cancellable || G_IS_CANCELLABLE(cancellable));
get_config_data = g_slice_new (NMCSProviderGetConfigTaskData);
*get_config_data = (NMCSProviderGetConfigTaskData) {
.task = nm_g_task_new (self, cancellable, nmcs_provider_get_config, callback, user_data),
get_config_data = g_slice_new(NMCSProviderGetConfigTaskData);
*get_config_data = (NMCSProviderGetConfigTaskData){
.task = nm_g_task_new(self, cancellable, nmcs_provider_get_config, callback, user_data),
.any = any,
.result_dict = g_hash_table_new_full (nm_str_hash,
g_str_equal,
g_free,
_iface_data_free),
.result_dict = g_hash_table_new_full(nm_str_hash, g_str_equal, g_free, _iface_data_free),
};
g_task_set_task_data (get_config_data->task, get_config_data, _get_config_data_free);
g_task_set_task_data(get_config_data->task, get_config_data, _get_config_data_free);
nmcs_wait_for_objects_register (get_config_data->task);
nmcs_wait_for_objects_register(get_config_data->task);
for (; hwaddrs && hwaddrs[0]; hwaddrs++) {
g_hash_table_insert (get_config_data->result_dict,
g_strdup (hwaddrs[0]),
nmcs_provider_get_config_iface_data_new (TRUE));
g_hash_table_insert(get_config_data->result_dict,
g_strdup(hwaddrs[0]),
nmcs_provider_get_config_iface_data_new(TRUE));
}
_LOGD ("get-config: starting");
_LOGD("get-config: starting");
NMCS_PROVIDER_GET_CLASS (self)->get_config (self, get_config_data);
NMCS_PROVIDER_GET_CLASS(self)->get_config(self, get_config_data);
}
GHashTable *
nmcs_provider_get_config_finish (NMCSProvider *self,
GAsyncResult *result,
GError **error)
nmcs_provider_get_config_finish(NMCSProvider *self, GAsyncResult *result, GError **error)
{
g_return_val_if_fail (NMCS_IS_PROVIDER (self), FALSE);
g_return_val_if_fail (nm_g_task_is_valid (result, self, nmcs_provider_get_config), FALSE);
g_return_val_if_fail(NMCS_IS_PROVIDER(self), FALSE);
g_return_val_if_fail(nm_g_task_is_valid(result, self, nmcs_provider_get_config), FALSE);
return g_task_propagate_pointer (G_TASK (result), error);
return g_task_propagate_pointer(G_TASK(result), error);
}
/*****************************************************************************/
static void
set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
{
NMCSProviderPrivate *priv = NMCS_PROVIDER_GET_PRIVATE (object);
NMCSProviderPrivate *priv = NMCS_PROVIDER_GET_PRIVATE(object);
switch (prop_id) {
case PROP_HTTP_CLIENT:
priv->http_client = g_value_dup_object (value);
g_return_if_fail (NM_IS_HTTP_CLIENT (priv->http_client));
priv->http_client = g_value_dup_object(value);
g_return_if_fail(NM_IS_HTTP_CLIENT(priv->http_client));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
@ -205,42 +191,42 @@ set_property (GObject *object,
/*****************************************************************************/
static void
nmcs_provider_init (NMCSProvider *self)
nmcs_provider_init(NMCSProvider *self)
{
NMCSProviderPrivate *priv;
priv = G_TYPE_INSTANCE_GET_PRIVATE (self, NMCS_TYPE_PROVIDER, NMCSProviderPrivate);
priv = G_TYPE_INSTANCE_GET_PRIVATE(self, NMCS_TYPE_PROVIDER, NMCSProviderPrivate);
self->_priv = priv;
}
static void
dispose (GObject *object)
dispose(GObject *object)
{
NMCSProvider *self = NMCS_PROVIDER (object);
NMCSProviderPrivate *priv = NMCS_PROVIDER_GET_PRIVATE (self);
NMCSProvider * self = NMCS_PROVIDER(object);
NMCSProviderPrivate *priv = NMCS_PROVIDER_GET_PRIVATE(self);
g_clear_object (&priv->http_client);
g_clear_object(&priv->http_client);
G_OBJECT_CLASS (nmcs_provider_parent_class)->dispose (object);
G_OBJECT_CLASS(nmcs_provider_parent_class)->dispose(object);
}
static void
nmcs_provider_class_init (NMCSProviderClass *klass)
nmcs_provider_class_init(NMCSProviderClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GObjectClass *object_class = G_OBJECT_CLASS(klass);
g_type_class_add_private (object_class, sizeof (NMCSProviderPrivate));
g_type_class_add_private(object_class, sizeof(NMCSProviderPrivate));
object_class->set_property = set_property;
object_class->dispose = dispose;
obj_properties[PROP_HTTP_CLIENT] =
g_param_spec_object (NMCS_PROVIDER_HTTP_CLIENT, "", "",
g_param_spec_object(NMCS_PROVIDER_HTTP_CLIENT,
"",
"",
NM_TYPE_HTTP_CLIENT,
G_PARAM_WRITABLE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS);
G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties);
g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties);
}

View file

@ -15,44 +15,43 @@ typedef struct {
gssize iface_idx;
in_addr_t cidr_addr;
guint8 cidr_prefix;
bool has_ipv4s:1;
bool has_cidr:1;
bool has_ipv4s : 1;
bool has_cidr : 1;
NMIPRoute **iproutes_arr;
gsize iproutes_len;
/* TRUE, if the configuration was requested via hwaddrs argument to
* nmcs_provider_get_config(). */
bool was_requested:1;
bool was_requested : 1;
} NMCSProviderGetConfigIfaceData;
static inline gboolean
nmcs_provider_get_config_iface_data_is_valid (const NMCSProviderGetConfigIfaceData *config_data)
nmcs_provider_get_config_iface_data_is_valid(const NMCSProviderGetConfigIfaceData *config_data)
{
return config_data
&& config_data->iface_idx >= 0
&& ( ( config_data->has_ipv4s
&& config_data->has_cidr)
|| config_data->iproutes_len);
return config_data && config_data->iface_idx >= 0
&& ((config_data->has_ipv4s && config_data->has_cidr) || config_data->iproutes_len);
}
NMCSProviderGetConfigIfaceData *nmcs_provider_get_config_iface_data_new (gboolean was_requested);
NMCSProviderGetConfigIfaceData *nmcs_provider_get_config_iface_data_new(gboolean was_requested);
typedef struct {
GTask *task;
GHashTable *result_dict;
GTask * task;
GHashTable * result_dict;
gpointer extra_data;
GDestroyNotify extra_destroy;
bool any:1;
bool any : 1;
} NMCSProviderGetConfigTaskData;
#define NMCS_TYPE_PROVIDER (nmcs_provider_get_type ())
#define NMCS_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMCS_TYPE_PROVIDER, NMCSProvider))
#define NMCS_PROVIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NMCS_TYPE_PROVIDER, NMCSProviderClass))
#define NMCS_IS_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NMCS_TYPE_PROVIDER))
#define NMCS_IS_PROVIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NMCS_TYPE_PROVIDER))
#define NMCS_PROVIDER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NMCS_TYPE_PROVIDER, NMCSProviderClass))
#define NMCS_TYPE_PROVIDER (nmcs_provider_get_type())
#define NMCS_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), NMCS_TYPE_PROVIDER, NMCSProvider))
#define NMCS_PROVIDER_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), NMCS_TYPE_PROVIDER, NMCSProviderClass))
#define NMCS_IS_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), NMCS_TYPE_PROVIDER))
#define NMCS_IS_PROVIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NMCS_TYPE_PROVIDER))
#define NMCS_PROVIDER_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), NMCS_TYPE_PROVIDER, NMCSProviderClass))
#define NMCS_PROVIDER_HTTP_CLIENT "http-client"
@ -65,48 +64,43 @@ typedef struct {
typedef struct {
GObjectClass parent;
const char *_name;
const char *_env_provider_enabled;
const char * _name;
const char * _env_provider_enabled;
void (*detect) (NMCSProvider *self,
GTask *task);
void (*detect)(NMCSProvider *self, GTask *task);
void (*get_config) (NMCSProvider *self,
NMCSProviderGetConfigTaskData *get_config_data);
void (*get_config)(NMCSProvider *self, NMCSProviderGetConfigTaskData *get_config_data);
} NMCSProviderClass;
GType nmcs_provider_get_type (void);
GType nmcs_provider_get_type(void);
/*****************************************************************************/
const char *nmcs_provider_get_name (NMCSProvider *provider);
const char *nmcs_provider_get_name(NMCSProvider *provider);
NMHttpClient *nmcs_provider_get_http_client (NMCSProvider *provider);
GMainContext *nmcs_provider_get_main_context (NMCSProvider *provider);
NMHttpClient *nmcs_provider_get_http_client(NMCSProvider *provider);
GMainContext *nmcs_provider_get_main_context(NMCSProvider *provider);
/*****************************************************************************/
void nmcs_provider_detect (NMCSProvider *provider,
GCancellable *cancellable,
void nmcs_provider_detect(NMCSProvider * provider,
GCancellable * cancellable,
GAsyncReadyCallback callback,
gpointer user_data);
gboolean nmcs_provider_detect_finish (NMCSProvider *provider,
GAsyncResult *result,
GError **error);
gboolean nmcs_provider_detect_finish(NMCSProvider *provider, GAsyncResult *result, GError **error);
/*****************************************************************************/
void nmcs_provider_get_config (NMCSProvider *provider,
void nmcs_provider_get_config(NMCSProvider * provider,
gboolean any,
const char *const*hwaddrs,
GCancellable *cancellable,
const char *const * hwaddrs,
GCancellable * cancellable,
GAsyncReadyCallback callback,
gpointer user_data);
GHashTable *nmcs_provider_get_config_finish (NMCSProvider *provider,
GAsyncResult *result,
GError **error);
GHashTable *
nmcs_provider_get_config_finish(NMCSProvider *provider, GAsyncResult *result, GError **error);
#endif /* __NMCS_PROVIDER_H__ */

File diff suppressed because it is too large Load diff

View file

@ -11,46 +11,43 @@
#include "nm-device.h"
#include "nm-libnm-core-intern/nm-libnm-core-utils.h"
const NMObject **nmc_objects_sort_by_path (const NMObject *const*objs, gssize len);
const NMObject **nmc_objects_sort_by_path(const NMObject *const *objs, gssize len);
const char *nmc_string_is_valid (const char *input, const char **allowed, GError **error);
const char *nmc_string_is_valid(const char *input, const char **allowed, GError **error);
gboolean nmc_string_to_uint (const char *str,
gboolean nmc_string_to_uint(const char * str,
gboolean range_check,
unsigned long int min,
unsigned long int max,
unsigned long int *value);
gboolean nmc_string_to_bool (const char *str, gboolean *val_bool, GError **error);
gboolean nmc_string_to_ternary (const char *str, NMTernary *val, GError **error);
gboolean nmc_string_to_bool(const char *str, gboolean *val_bool, GError **error);
gboolean nmc_string_to_ternary(const char *str, NMTernary *val, GError **error);
gboolean matches (const char *cmd, const char *pattern);
gboolean matches(const char *cmd, const char *pattern);
/* FIXME: don't expose this function on its own, at least not from this file. */
const char *nmc_bond_validate_mode (const char *mode, GError **error);
const char *nmc_bond_validate_mode(const char *mode, GError **error);
const char *nmc_device_state_to_string_with_external (NMDevice *device);
const char *nmc_device_state_to_string_with_external(NMDevice *device);
const char *nm_active_connection_state_reason_to_string (NMActiveConnectionStateReason reason);
const char *nmc_device_state_to_string (NMDeviceState state);
const char *nmc_device_reason_to_string (NMDeviceStateReason reason);
const char *nmc_device_metered_to_string (NMMetered value);
const char *nm_active_connection_state_reason_to_string(NMActiveConnectionStateReason reason);
const char *nmc_device_state_to_string(NMDeviceState state);
const char *nmc_device_reason_to_string(NMDeviceStateReason reason);
const char *nmc_device_metered_to_string(NMMetered value);
NMActiveConnectionState nmc_activation_get_effective_state (NMActiveConnection *active,
NMDevice *device,
const char **reason);
NMActiveConnectionState nmc_activation_get_effective_state(NMActiveConnection *active,
NMDevice * device,
const char ** reason);
const char *nmc_wifi_strength_bars (guint8 strength);
const char *nmc_wifi_strength_bars(guint8 strength);
const char *nmc_password_subst_char (void);
const char *nmc_password_subst_char(void);
void nmc_print_qrcode (const char *str);
void nmc_print_qrcode(const char *str);
GHashTable *nmc_utils_parse_passwd_file (char *contents,
gssize *out_error_line,
GError **error);
GHashTable *nmc_utils_parse_passwd_file(char *contents, gssize *out_error_line, GError **error);
GHashTable *nmc_utils_read_passwd_file (const char *passwd_file,
gssize *out_error_line,
GError **error);
GHashTable *
nmc_utils_read_passwd_file(const char *passwd_file, gssize *out_error_line, GError **error);
#endif /* __NM_CLIENT_UTILS_H__ */

View file

@ -10,34 +10,35 @@
/*****************************************************************************/
static const NMMetaSettingInfoEditor *
_get_meta_setting_info_editor_from_msi (const NMMetaSettingInfo *meta_setting_info)
_get_meta_setting_info_editor_from_msi(const NMMetaSettingInfo *meta_setting_info)
{
const NMMetaSettingInfoEditor *setting_info;
if (!meta_setting_info)
return NULL;
nm_assert (meta_setting_info->get_setting_gtype);
nm_assert (meta_setting_info->meta_type < G_N_ELEMENTS (nm_meta_setting_infos_editor));
nm_assert(meta_setting_info->get_setting_gtype);
nm_assert(meta_setting_info->meta_type < G_N_ELEMENTS(nm_meta_setting_infos_editor));
setting_info = &nm_meta_setting_infos_editor[meta_setting_info->meta_type];
nm_assert (setting_info->general == meta_setting_info);
nm_assert(setting_info->general == meta_setting_info);
return setting_info;
}
const NMMetaSettingInfoEditor *
nm_meta_setting_info_editor_find_by_name (const char *setting_name, gboolean use_alias)
nm_meta_setting_info_editor_find_by_name(const char *setting_name, gboolean use_alias)
{
const NMMetaSettingInfoEditor *setting_info;
guint i;
g_return_val_if_fail (setting_name, NULL);
g_return_val_if_fail(setting_name, NULL);
setting_info = _get_meta_setting_info_editor_from_msi (nm_meta_setting_infos_by_name (setting_name));
setting_info =
_get_meta_setting_info_editor_from_msi(nm_meta_setting_infos_by_name(setting_name));
if (!setting_info && use_alias) {
for (i = 0; i < _NM_META_SETTING_TYPE_NUM; i++) {
if (nm_streq0 (nm_meta_setting_infos_editor[i].alias, setting_name)) {
if (nm_streq0(nm_meta_setting_infos_editor[i].alias, setting_name)) {
setting_info = &nm_meta_setting_infos_editor[i];
break;
}
@ -48,39 +49,40 @@ nm_meta_setting_info_editor_find_by_name (const char *setting_name, gboolean use
}
const NMMetaSettingInfoEditor *
nm_meta_setting_info_editor_find_by_gtype (GType gtype)
nm_meta_setting_info_editor_find_by_gtype(GType gtype)
{
return _get_meta_setting_info_editor_from_msi (nm_meta_setting_infos_by_gtype (gtype));
return _get_meta_setting_info_editor_from_msi(nm_meta_setting_infos_by_gtype(gtype));
}
const NMMetaSettingInfoEditor *
nm_meta_setting_info_editor_find_by_setting (NMSetting *setting)
nm_meta_setting_info_editor_find_by_setting(NMSetting *setting)
{
const NMMetaSettingInfoEditor *setting_info;
g_return_val_if_fail (NM_IS_SETTING (setting), NULL);
g_return_val_if_fail(NM_IS_SETTING(setting), NULL);
setting_info = nm_meta_setting_info_editor_find_by_gtype (G_OBJECT_TYPE (setting));
setting_info = nm_meta_setting_info_editor_find_by_gtype(G_OBJECT_TYPE(setting));
nm_assert (setting_info);
nm_assert (G_TYPE_CHECK_INSTANCE_TYPE (setting, setting_info->general->get_setting_gtype ()));
nm_assert(setting_info);
nm_assert(G_TYPE_CHECK_INSTANCE_TYPE(setting, setting_info->general->get_setting_gtype()));
return setting_info;
}
/*****************************************************************************/
const NMMetaPropertyInfo *
nm_meta_setting_info_editor_get_property_info (const NMMetaSettingInfoEditor *setting_info, const char *property_name)
nm_meta_setting_info_editor_get_property_info(const NMMetaSettingInfoEditor *setting_info,
const char * property_name)
{
guint i;
g_return_val_if_fail (setting_info, NULL);
g_return_val_if_fail (property_name, NULL);
g_return_val_if_fail(setting_info, NULL);
g_return_val_if_fail(property_name, NULL);
for (i = 0; i < setting_info->properties_num; i++) {
nm_assert (setting_info->properties[i]->property_name);
nm_assert (setting_info->properties[i]->setting_info == setting_info);
if (nm_streq (setting_info->properties[i]->property_name, property_name))
nm_assert(setting_info->properties[i]->property_name);
nm_assert(setting_info->properties[i]->setting_info == setting_info);
if (nm_streq(setting_info->properties[i]->property_name, property_name))
return setting_info->properties[i];
}
@ -88,7 +90,7 @@ nm_meta_setting_info_editor_get_property_info (const NMMetaSettingInfoEditor *se
}
gboolean
nm_meta_setting_info_editor_has_secrets (const NMMetaSettingInfoEditor *setting_info)
nm_meta_setting_info_editor_has_secrets(const NMMetaSettingInfoEditor *setting_info)
{
guint i;
@ -104,58 +106,56 @@ nm_meta_setting_info_editor_has_secrets (const NMMetaSettingInfoEditor *setting_
}
const NMMetaPropertyInfo *
nm_meta_property_info_find_by_name (const char *setting_name, const char *property_name)
nm_meta_property_info_find_by_name(const char *setting_name, const char *property_name)
{
const NMMetaSettingInfoEditor *setting_info;
const NMMetaPropertyInfo *property_info;
const NMMetaPropertyInfo * property_info;
setting_info = nm_meta_setting_info_editor_find_by_name (setting_name, FALSE);
setting_info = nm_meta_setting_info_editor_find_by_name(setting_name, FALSE);
if (!setting_info)
return NULL;
property_info = nm_meta_setting_info_editor_get_property_info (setting_info, property_name);
property_info = nm_meta_setting_info_editor_get_property_info(setting_info, property_name);
if (!property_info)
return NULL;
nm_assert (property_info->setting_info == setting_info);
nm_assert(property_info->setting_info == setting_info);
return property_info;
}
const NMMetaPropertyInfo *
nm_meta_property_info_find_by_setting (NMSetting *setting, const char *property_name)
nm_meta_property_info_find_by_setting(NMSetting *setting, const char *property_name)
{
const NMMetaSettingInfoEditor *setting_info;
const NMMetaPropertyInfo *property_info;
const NMMetaPropertyInfo * property_info;
setting_info = nm_meta_setting_info_editor_find_by_setting (setting);
setting_info = nm_meta_setting_info_editor_find_by_setting(setting);
if (!setting_info)
return NULL;
property_info = nm_meta_setting_info_editor_get_property_info (setting_info, property_name);
property_info = nm_meta_setting_info_editor_get_property_info(setting_info, property_name);
if (!property_info)
return NULL;
nm_assert (property_info->setting_info == setting_info);
nm_assert (property_info == nm_meta_property_info_find_by_name (nm_setting_get_name (setting), property_name));
nm_assert(property_info->setting_info == setting_info);
nm_assert(property_info
== nm_meta_property_info_find_by_name(nm_setting_get_name(setting), property_name));
return property_info;
}
NMSetting *
nm_meta_setting_info_editor_new_setting (const NMMetaSettingInfoEditor *setting_info,
nm_meta_setting_info_editor_new_setting(const NMMetaSettingInfoEditor *setting_info,
NMMetaAccessorSettingInitType init_type)
{
NMSetting *setting;
g_return_val_if_fail (setting_info, NULL);
g_return_val_if_fail(setting_info, NULL);
setting = g_object_new (setting_info->general->get_setting_gtype (), NULL);
setting = g_object_new(setting_info->general->get_setting_gtype(), NULL);
if ( setting_info->setting_init_fcn
&& init_type != NM_META_ACCESSOR_SETTING_INIT_TYPE_DEFAULT) {
setting_info->setting_init_fcn (setting_info,
setting,
init_type);
if (setting_info->setting_init_fcn && init_type != NM_META_ACCESSOR_SETTING_INIT_TYPE_DEFAULT) {
setting_info->setting_init_fcn(setting_info, setting, init_type);
}
return setting;
@ -163,13 +163,13 @@ nm_meta_setting_info_editor_new_setting (const NMMetaSettingInfoEditor *setting_
/*****************************************************************************/
const NMMetaSettingInfoEditor *const*
nm_meta_setting_infos_editor_p (void)
const NMMetaSettingInfoEditor *const *
nm_meta_setting_infos_editor_p(void)
{
static const NMMetaSettingInfoEditor *cache[_NM_META_SETTING_TYPE_NUM + 1] = { NULL };
static const NMMetaSettingInfoEditor *cache[_NM_META_SETTING_TYPE_NUM + 1] = {NULL};
guint i;
if (G_UNLIKELY (!cache[0])) {
if (G_UNLIKELY(!cache[0])) {
for (i = 0; i < _NM_META_SETTING_TYPE_NUM; i++)
cache[i] = &nm_meta_setting_infos_editor[i];
}
@ -179,69 +179,69 @@ nm_meta_setting_infos_editor_p (void)
/*****************************************************************************/
const char *
nm_meta_abstract_info_get_name (const NMMetaAbstractInfo *abstract_info, gboolean for_header)
nm_meta_abstract_info_get_name(const NMMetaAbstractInfo *abstract_info, gboolean for_header)
{
const char *n;
nm_assert (abstract_info);
nm_assert (abstract_info->meta_type);
nm_assert (abstract_info->meta_type->get_name);
n = abstract_info->meta_type->get_name (abstract_info, for_header);
nm_assert (n && n[0]);
nm_assert(abstract_info);
nm_assert(abstract_info->meta_type);
nm_assert(abstract_info->meta_type->get_name);
n = abstract_info->meta_type->get_name(abstract_info, for_header);
nm_assert(n && n[0]);
return n;
}
const NMMetaAbstractInfo *const*
nm_meta_abstract_info_get_nested (const NMMetaAbstractInfo *abstract_info,
guint *out_len,
gpointer *nested_to_free)
const NMMetaAbstractInfo *const *
nm_meta_abstract_info_get_nested(const NMMetaAbstractInfo *abstract_info,
guint * out_len,
gpointer * nested_to_free)
{
const NMMetaAbstractInfo *const*nested;
const NMMetaAbstractInfo *const *nested;
guint l = 0;
gs_free gpointer f = NULL;
nm_assert (abstract_info);
nm_assert (abstract_info->meta_type);
nm_assert (nested_to_free && !*nested_to_free);
nm_assert(abstract_info);
nm_assert(abstract_info->meta_type);
nm_assert(nested_to_free && !*nested_to_free);
if (abstract_info->meta_type->get_nested) {
nested = abstract_info->meta_type->get_nested (abstract_info, &l, &f);
nm_assert (NM_PTRARRAY_LEN (nested) == l);
nm_assert (!f || nested == f);
nested = abstract_info->meta_type->get_nested(abstract_info, &l, &f);
nm_assert(NM_PTRARRAY_LEN(nested) == l);
nm_assert(!f || nested == f);
if (nested && nested[0]) {
NM_SET_OUT (out_len, l);
*nested_to_free = g_steal_pointer (&f);
NM_SET_OUT(out_len, l);
*nested_to_free = g_steal_pointer(&f);
return nested;
}
}
NM_SET_OUT (out_len, 0);
NM_SET_OUT(out_len, 0);
return NULL;
}
gconstpointer
nm_meta_abstract_info_get (const NMMetaAbstractInfo *abstract_info,
const NMMetaEnvironment *environment,
nm_meta_abstract_info_get(const NMMetaAbstractInfo * abstract_info,
const NMMetaEnvironment * environment,
gpointer environment_user_data,
gpointer target,
gpointer target_data,
NMMetaAccessorGetType get_type,
NMMetaAccessorGetFlags get_flags,
NMMetaAccessorGetOutFlags *out_flags,
gboolean *out_is_default,
gpointer *out_to_free)
gboolean * out_is_default,
gpointer * out_to_free)
{
nm_assert (abstract_info);
nm_assert (abstract_info->meta_type);
nm_assert (!out_to_free || !*out_to_free);
nm_assert (out_flags);
nm_assert(abstract_info);
nm_assert(abstract_info->meta_type);
nm_assert(!out_to_free || !*out_to_free);
nm_assert(out_flags);
*out_flags = NM_META_ACCESSOR_GET_OUT_FLAGS_NONE;
NM_SET_OUT (out_is_default, FALSE);
NM_SET_OUT(out_is_default, FALSE);
if (!abstract_info->meta_type->get_fcn)
g_return_val_if_reached (NULL);
g_return_val_if_reached(NULL);
return abstract_info->meta_type->get_fcn (abstract_info,
return abstract_info->meta_type->get_fcn(abstract_info,
environment,
environment_user_data,
target,
@ -253,28 +253,28 @@ nm_meta_abstract_info_get (const NMMetaAbstractInfo *abstract_info,
out_to_free);
}
const char *const*
nm_meta_abstract_info_complete (const NMMetaAbstractInfo *abstract_info,
const NMMetaEnvironment *environment,
const char *const *
nm_meta_abstract_info_complete(const NMMetaAbstractInfo * abstract_info,
const NMMetaEnvironment * environment,
gpointer environment_user_data,
const NMMetaOperationContext *operation_context,
const char *text,
gboolean *out_complete_filename,
char ***out_to_free)
const char * text,
gboolean * out_complete_filename,
char *** out_to_free)
{
const char *const*values;
const char *const *values;
gsize i, j, text_len;
nm_assert (abstract_info);
nm_assert (abstract_info->meta_type);
nm_assert (out_to_free && !*out_to_free);
nm_assert(abstract_info);
nm_assert(abstract_info->meta_type);
nm_assert(out_to_free && !*out_to_free);
*out_to_free = NULL;
if (!abstract_info->meta_type->complete_fcn)
return NULL;
values = abstract_info->meta_type->complete_fcn (abstract_info,
values = abstract_info->meta_type->complete_fcn(abstract_info,
environment,
environment_user_data,
operation_context,
@ -282,13 +282,13 @@ nm_meta_abstract_info_complete (const NMMetaAbstractInfo *abstract_info,
out_complete_filename,
out_to_free);
nm_assert (!*out_to_free || values == (const char *const*) *out_to_free);
nm_assert(!*out_to_free || values == (const char *const *) *out_to_free);
if (!values)
return NULL;
if (!values[0]) {
nm_clear_g_free (out_to_free);
nm_clear_g_free(out_to_free);
return NULL;
}
@ -298,14 +298,14 @@ nm_meta_abstract_info_complete (const NMMetaAbstractInfo *abstract_info,
/* for convenience, we allow the complete_fcn() implementations to
* ignore "text". We filter out invalid matches here. */
text_len = strlen (text);
text_len = strlen(text);
if (*out_to_free) {
char **v = *out_to_free;
for (i = 0, j = 0; v[i]; i++) {
if (strncmp (v[i], text, text_len) != 0) {
g_free (v[i]);
if (strncmp(v[i], text, text_len) != 0) {
g_free(v[i]);
continue;
}
v[j++] = v[i];
@ -313,16 +313,16 @@ nm_meta_abstract_info_complete (const NMMetaAbstractInfo *abstract_info,
if (j)
v[j++] = NULL;
else {
g_free (v);
g_free(v);
*out_to_free = v = NULL;
}
return (const char *const*) v;
return (const char *const *) v;
} else {
const char *const*v = values;
char **r;
const char *const *v = values;
char ** r;
for (i = 0, j = 0; v[i]; i++) {
if (strncmp (v[i], text, text_len) != 0)
if (strncmp(v[i], text, text_len) != 0)
continue;
j++;
}
@ -331,38 +331,40 @@ nm_meta_abstract_info_complete (const NMMetaAbstractInfo *abstract_info,
else if (!j)
return NULL;
r = g_new (char *, j + 1);
r = g_new(char *, j + 1);
v = values;
for (i = 0, j = 0; v[i]; i++) {
if (strncmp (v[i], text, text_len) != 0)
if (strncmp(v[i], text, text_len) != 0)
continue;
r[j++] = g_strdup (v[i]);
r[j++] = g_strdup(v[i]);
}
r[j++] = NULL;
return (const char *const*) (*out_to_free = r);
return (const char *const *) (*out_to_free = r);
}
}
/*****************************************************************************/
char *
nm_meta_abstract_info_get_nested_names_str (const NMMetaAbstractInfo *abstract_info, const char *name_prefix)
nm_meta_abstract_info_get_nested_names_str(const NMMetaAbstractInfo *abstract_info,
const char * name_prefix)
{
gs_free gpointer nested_to_free = NULL;
const NMMetaAbstractInfo *const*nested;
const NMMetaAbstractInfo *const *nested;
nested = nm_meta_abstract_info_get_nested (abstract_info, NULL, &nested_to_free);
nested = nm_meta_abstract_info_get_nested(abstract_info, NULL, &nested_to_free);
if (!nested)
return NULL;
if (!name_prefix)
name_prefix = nm_meta_abstract_info_get_name (abstract_info, FALSE);
name_prefix = nm_meta_abstract_info_get_name(abstract_info, FALSE);
return nm_meta_abstract_infos_get_names_str (nested, name_prefix);
return nm_meta_abstract_infos_get_names_str(nested, name_prefix);
}
char *
nm_meta_abstract_infos_get_names_str (const NMMetaAbstractInfo *const*fields_array, const char *name_prefix)
nm_meta_abstract_infos_get_names_str(const NMMetaAbstractInfo *const *fields_array,
const char * name_prefix)
{
GString *str;
guint i;
@ -370,17 +372,17 @@ nm_meta_abstract_infos_get_names_str (const NMMetaAbstractInfo *const*fields_arr
if (!fields_array || !fields_array[0])
return NULL;
str = g_string_sized_new (128);
str = g_string_sized_new(128);
for (i = 0; fields_array[i]; i++) {
if (str->len > 0)
g_string_append_c (str, ',');
g_string_append_c(str, ',');
if (name_prefix) {
g_string_append (str, name_prefix);
g_string_append_c (str, '.');
g_string_append(str, name_prefix);
g_string_append_c(str, '.');
}
g_string_append (str, nm_meta_abstract_info_get_name (fields_array[i], FALSE));
g_string_append(str, nm_meta_abstract_info_get_name(fields_array[i], FALSE));
}
return g_string_free (str, FALSE);
return g_string_free(str, FALSE);
}
/*****************************************************************************/
@ -392,9 +394,7 @@ typedef struct {
} OutputSelectionItem;
static NMMetaSelectionResultList *
_output_selection_pack (const NMMetaAbstractInfo *const* fields_array,
GArray *array,
GString *str)
_output_selection_pack(const NMMetaAbstractInfo *const *fields_array, GArray *array, GString *str)
{
NMMetaSelectionResultList *result;
guint i;
@ -405,16 +405,19 @@ _output_selection_pack (const NMMetaAbstractInfo *const* fields_array,
/* re-organize the collected output data in one buffer that can be freed using
* g_free(). This makes allocation more complicated, but saves us from special
* handling for free. */
result = g_malloc0 (sizeof (NMMetaSelectionResultList) + (len * sizeof (NMMetaSelectionItem)) + (str ? str->len : 0));
result = g_malloc0(sizeof(NMMetaSelectionResultList) + (len * sizeof(NMMetaSelectionItem))
+ (str ? str->len : 0));
*((guint *) &result->num) = len;
if (len > 0) {
char *pdata = &((char *) result)[sizeof (NMMetaSelectionResultList) + (len * sizeof (NMMetaSelectionItem))];
char *pdata =
&((char *)
result)[sizeof(NMMetaSelectionResultList) + (len * sizeof(NMMetaSelectionItem))];
if (str)
memcpy (pdata, str->str, str->len);
memcpy(pdata, str->str, str->len);
for (i = 0; i < len; i++) {
const OutputSelectionItem *a = &g_array_index (array, OutputSelectionItem, i);
NMMetaSelectionItem *p = (NMMetaSelectionItem *) &result->items[i];
const OutputSelectionItem *a = &g_array_index(array, OutputSelectionItem, i);
NMMetaSelectionItem * p = (NMMetaSelectionItem *) &result->items[i];
p->info = fields_array[a->idx];
p->idx = a->idx;
@ -429,29 +432,29 @@ _output_selection_pack (const NMMetaAbstractInfo *const* fields_array,
}
static gboolean
_output_selection_select_one (const NMMetaAbstractInfo *const* fields_array,
const char *fields_prefix,
const char *fields_str,
_output_selection_select_one(const NMMetaAbstractInfo *const *fields_array,
const char * fields_prefix,
const char * fields_str,
gboolean validate_nested,
GArray **p_array,
GString **p_str,
GError **error)
GArray ** p_array,
GString ** p_str,
GError ** error)
{
guint i, j;
const char *i_name;
const char *right;
const char * i_name;
const char * right;
gboolean found = FALSE;
const NMMetaAbstractInfo *fields_array_failure = NULL;
gs_free char *fields_str_clone = NULL;
gs_free char * fields_str_clone = NULL;
nm_assert (fields_str);
nm_assert (p_array);
nm_assert (p_str);
nm_assert (!error || !*error);
nm_assert(fields_str);
nm_assert(p_array);
nm_assert(p_str);
nm_assert(!error || !*error);
right = strchr (fields_str, '.');
right = strchr(fields_str, '.');
if (right) {
fields_str_clone = g_strdup (fields_str);
fields_str_clone = g_strdup(fields_str);
fields_str_clone[right - fields_str] = '\0';
i_name = fields_str_clone;
right = &fields_str_clone[right - fields_str + 1];
@ -462,11 +465,11 @@ _output_selection_select_one (const NMMetaAbstractInfo *const* fields_array,
goto not_found;
for (i = 0; fields_array[i]; i++) {
const NMMetaAbstractInfo *fi = fields_array[i];
const NMMetaAbstractInfo *const*nested;
const NMMetaAbstractInfo * fi = fields_array[i];
const NMMetaAbstractInfo *const *nested;
gs_free gpointer nested_to_free = NULL;
if (g_ascii_strcasecmp (i_name, nm_meta_abstract_info_get_name (fi, FALSE)) != 0)
if (g_ascii_strcasecmp(i_name, nm_meta_abstract_info_get_name(fi, FALSE)) != 0)
continue;
if (!right || !validate_nested) {
@ -474,10 +477,11 @@ _output_selection_select_one (const NMMetaAbstractInfo *const* fields_array,
break;
}
nested = nm_meta_abstract_info_get_nested (fi, NULL, &nested_to_free);
nested = nm_meta_abstract_info_get_nested(fi, NULL, &nested_to_free);
if (nested) {
for (j = 0; nested[j]; nested++) {
if (g_ascii_strcasecmp (right, nm_meta_abstract_info_get_name (nested[j], FALSE)) == 0) {
if (g_ascii_strcasecmp(right, nm_meta_abstract_info_get_name(nested[j], FALSE))
== 0) {
found = TRUE;
break;
}
@ -489,11 +493,13 @@ _output_selection_select_one (const NMMetaAbstractInfo *const* fields_array,
if (!found) {
not_found:
if ( !right
&& !fields_prefix
&& ( !g_ascii_strcasecmp (i_name, "all")
|| !g_ascii_strcasecmp (i_name, "common")))
g_set_error (error, NM_UTILS_ERROR, NM_UTILS_ERROR_UNKNOWN, _("field '%s' has to be alone"), i_name);
if (!right && !fields_prefix
&& (!g_ascii_strcasecmp(i_name, "all") || !g_ascii_strcasecmp(i_name, "common")))
g_set_error(error,
NM_UTILS_ERROR,
NM_UTILS_ERROR_UNKNOWN,
_("field '%s' has to be alone"),
i_name);
else {
gs_free char *allowed_fields = NULL;
@ -501,85 +507,100 @@ not_found:
gs_free char *p = NULL;
if (fields_prefix) {
p = g_strdup_printf ("%s.%s", fields_prefix,
nm_meta_abstract_info_get_name (fields_array_failure, FALSE));
p = g_strdup_printf(
"%s.%s",
fields_prefix,
nm_meta_abstract_info_get_name(fields_array_failure, FALSE));
}
allowed_fields = nm_meta_abstract_info_get_nested_names_str (fields_array_failure, p);
allowed_fields =
nm_meta_abstract_info_get_nested_names_str(fields_array_failure, p);
} else
allowed_fields = nm_meta_abstract_infos_get_names_str (fields_array, NULL);
allowed_fields = nm_meta_abstract_infos_get_names_str(fields_array, NULL);
g_set_error (error, NM_UTILS_ERROR, NM_UTILS_ERROR_UNKNOWN, _("invalid field '%s%s%s%s%s'; %s%s%s"),
fields_prefix ?: "", fields_prefix ? "." : "",
i_name, right ? "." : "", right ?: "",
NM_PRINT_FMT_QUOTED (allowed_fields, "allowed fields: ", allowed_fields, "", "no fields"));
g_set_error(error,
NM_UTILS_ERROR,
NM_UTILS_ERROR_UNKNOWN,
_("invalid field '%s%s%s%s%s'; %s%s%s"),
fields_prefix ?: "",
fields_prefix ? "." : "",
i_name,
right ? "." : "",
right ?: "",
NM_PRINT_FMT_QUOTED(allowed_fields,
"allowed fields: ",
allowed_fields,
"",
"no fields"));
}
return FALSE;
}
{
GString *str;
GString * str;
OutputSelectionItem s = {
.idx = i,
};
if (!*p_str)
*p_str = g_string_sized_new (64);
*p_str = g_string_sized_new(64);
str = *p_str;
s.self_offset_plus_1 = str->len + 1;
if (fields_prefix) {
g_string_append (str, fields_prefix);
g_string_append_c (str, '.');
g_string_append(str, fields_prefix);
g_string_append_c(str, '.');
}
g_string_append_len (str, i_name, strlen (i_name) + 1);
g_string_append_len(str, i_name, strlen(i_name) + 1);
if (right) {
s.sub_offset_plus_1 = str->len + 1;
g_string_append_len (str, right, strlen (right) + 1);
g_string_append_len(str, right, strlen(right) + 1);
}
if (!*p_array)
*p_array = g_array_new (FALSE, FALSE, sizeof (OutputSelectionItem));
g_array_append_val (*p_array, s);
*p_array = g_array_new(FALSE, FALSE, sizeof(OutputSelectionItem));
g_array_append_val(*p_array, s);
}
return TRUE;
}
NMMetaSelectionResultList *
nm_meta_selection_create_all (const NMMetaAbstractInfo *const* fields_array)
nm_meta_selection_create_all(const NMMetaAbstractInfo *const *fields_array)
{
gs_unref_array GArray *array = NULL;
guint i;
if (fields_array) {
array = g_array_new (FALSE, FALSE, sizeof (OutputSelectionItem));
array = g_array_new(FALSE, FALSE, sizeof(OutputSelectionItem));
for (i = 0; fields_array[i]; i++) {
OutputSelectionItem s = {
.idx = i,
};
g_array_append_val (array, s);
g_array_append_val(array, s);
}
}
return _output_selection_pack (fields_array, array, NULL);
return _output_selection_pack(fields_array, array, NULL);
}
NMMetaSelectionResultList *
nm_meta_selection_create_parse_one (const NMMetaAbstractInfo *const* fields_array,
const char *fields_prefix,
const char *fields_str, /* one field selector (contains no commas) and is already stripped of spaces. */
nm_meta_selection_create_parse_one(
const NMMetaAbstractInfo *const *fields_array,
const char * fields_prefix,
const char *
fields_str, /* one field selector (contains no commas) and is already stripped of spaces. */
gboolean validate_nested,
GError **error)
{
gs_unref_array GArray *array = NULL;
nm_auto_free_gstring GString *str = NULL;
g_return_val_if_fail (!error || !*error, NULL);
nm_assert (fields_str && !strchr (fields_str, ','));
g_return_val_if_fail(!error || !*error, NULL);
nm_assert(fields_str && !strchr(fields_str, ','));
if (!_output_selection_select_one (fields_array,
if (!_output_selection_select_one(fields_array,
fields_prefix,
fields_str,
validate_nested,
@ -587,38 +608,38 @@ nm_meta_selection_create_parse_one (const NMMetaAbstractInfo *const* fields_arra
&str,
error))
return NULL;
return _output_selection_pack (fields_array, array, str);
return _output_selection_pack(fields_array, array, str);
}
NMMetaSelectionResultList *
nm_meta_selection_create_parse_list (const NMMetaAbstractInfo *const* fields_array,
const char *fields_str, /* a comma separated list of selectors */
nm_meta_selection_create_parse_list(
const NMMetaAbstractInfo *const *fields_array,
const char * fields_str, /* a comma separated list of selectors */
gboolean validate_nested,
GError **error)
GError ** error)
{
gs_unref_array GArray *array = NULL;
nm_auto_free_gstring GString *str = NULL;
gs_free char *fields_str_clone = NULL;
char *fields_str_cur;
char *fields_str_next;
gs_free char * fields_str_clone = NULL;
char * fields_str_cur;
char * fields_str_next;
g_return_val_if_fail (!error || !*error, NULL);
g_return_val_if_fail(!error || !*error, NULL);
if (!fields_str)
return nm_meta_selection_create_all (fields_array);
return nm_meta_selection_create_all(fields_array);
fields_str_clone = g_strdup (fields_str);
fields_str_clone = g_strdup(fields_str);
for (fields_str_cur = fields_str_clone; fields_str_cur; fields_str_cur = fields_str_next) {
fields_str_cur = nm_str_skip_leading_spaces (fields_str_cur);
fields_str_next = strchr (fields_str_cur, ',');
fields_str_cur = nm_str_skip_leading_spaces(fields_str_cur);
fields_str_next = strchr(fields_str_cur, ',');
if (fields_str_next)
*fields_str_next++ = '\0';
g_strchomp (fields_str_cur);
g_strchomp(fields_str_cur);
if (!fields_str_cur[0])
continue;
if (!_output_selection_select_one (fields_array,
if (!_output_selection_select_one(fields_array,
NULL,
fields_str_cur,
validate_nested,
@ -628,5 +649,5 @@ nm_meta_selection_create_parse_list (const NMMetaAbstractInfo *const* fields_arr
return NULL;
}
return _output_selection_pack (fields_array, array, str);
return _output_selection_pack(fields_array, array, str);
}

View file

@ -11,64 +11,70 @@
/*****************************************************************************/
NMSetting *nm_meta_setting_info_editor_new_setting (const NMMetaSettingInfoEditor *setting_info,
NMSetting *nm_meta_setting_info_editor_new_setting(const NMMetaSettingInfoEditor *setting_info,
NMMetaAccessorSettingInitType init_type);
const NMMetaSettingInfoEditor *nm_meta_setting_info_editor_find_by_name (const char *setting_name, gboolean use_alias);
const NMMetaSettingInfoEditor *nm_meta_setting_info_editor_find_by_gtype (GType gtype);
const NMMetaSettingInfoEditor *nm_meta_setting_info_editor_find_by_setting (NMSetting *setting);
const NMMetaSettingInfoEditor *nm_meta_setting_info_editor_find_by_name(const char *setting_name,
gboolean use_alias);
const NMMetaSettingInfoEditor *nm_meta_setting_info_editor_find_by_gtype(GType gtype);
const NMMetaSettingInfoEditor *nm_meta_setting_info_editor_find_by_setting(NMSetting *setting);
const NMMetaPropertyInfo *nm_meta_setting_info_editor_get_property_info (const NMMetaSettingInfoEditor *setting_info,
const NMMetaPropertyInfo *
nm_meta_setting_info_editor_get_property_info(const NMMetaSettingInfoEditor *setting_info,
const char * property_name);
const NMMetaPropertyInfo *nm_meta_property_info_find_by_name(const char *setting_name,
const char *property_name);
const NMMetaPropertyInfo *nm_meta_property_info_find_by_name (const char *setting_name,
const char *property_name);
const NMMetaPropertyInfo *nm_meta_property_info_find_by_setting (NMSetting *setting,
const NMMetaPropertyInfo *nm_meta_property_info_find_by_setting(NMSetting * setting,
const char *property_name);
gboolean nm_meta_setting_info_editor_has_secrets (const NMMetaSettingInfoEditor *setting_info);
gboolean nm_meta_setting_info_editor_has_secrets(const NMMetaSettingInfoEditor *setting_info);
/*****************************************************************************/
const NMMetaSettingInfoEditor *const*nm_meta_setting_infos_editor_p (void);
const NMMetaSettingInfoEditor *const *nm_meta_setting_infos_editor_p(void);
/*****************************************************************************/
const char *nm_meta_abstract_info_get_name (const NMMetaAbstractInfo *abstract_info, gboolean for_header);
const char *nm_meta_abstract_info_get_name(const NMMetaAbstractInfo *abstract_info,
gboolean for_header);
const NMMetaAbstractInfo *const*nm_meta_abstract_info_get_nested (const NMMetaAbstractInfo *abstract_info,
guint *out_len,
gpointer *nested_to_free);
const NMMetaAbstractInfo *const *
nm_meta_abstract_info_get_nested(const NMMetaAbstractInfo *abstract_info,
guint * out_len,
gpointer * nested_to_free);
gconstpointer nm_meta_abstract_info_get (const NMMetaAbstractInfo *abstract_info,
const NMMetaEnvironment *environment,
gconstpointer nm_meta_abstract_info_get(const NMMetaAbstractInfo * abstract_info,
const NMMetaEnvironment * environment,
gpointer environment_user_data,
gpointer target,
gpointer target_data,
NMMetaAccessorGetType get_type,
NMMetaAccessorGetFlags get_flags,
NMMetaAccessorGetOutFlags *out_flags,
gboolean *out_is_default,
gpointer *out_to_free);
gboolean * out_is_default,
gpointer * out_to_free);
const char *const*nm_meta_abstract_info_complete (const NMMetaAbstractInfo *abstract_info,
const NMMetaEnvironment *environment,
const char *const *nm_meta_abstract_info_complete(const NMMetaAbstractInfo *abstract_info,
const NMMetaEnvironment * environment,
gpointer environment_user_data,
const NMMetaOperationContext *operation_context,
const char *text,
const char * text,
gboolean *out_complete_filename,
char ***out_to_free);
char *** out_to_free);
/*****************************************************************************/
char *nm_meta_abstract_info_get_nested_names_str (const NMMetaAbstractInfo *abstract_info, const char *name_prefix);
char *nm_meta_abstract_infos_get_names_str (const NMMetaAbstractInfo *const*fields_array, const char *name_prefix);
char *nm_meta_abstract_info_get_nested_names_str(const NMMetaAbstractInfo *abstract_info,
const char * name_prefix);
char *nm_meta_abstract_infos_get_names_str(const NMMetaAbstractInfo *const *fields_array,
const char * name_prefix);
/*****************************************************************************/
typedef struct {
const NMMetaAbstractInfo *info;
const char *self_selection;
const char *sub_selection;
const char * self_selection;
const char * sub_selection;
guint idx;
} NMMetaSelectionItem;
@ -77,15 +83,18 @@ typedef struct {
const NMMetaSelectionItem items[];
} NMMetaSelectionResultList;
NMMetaSelectionResultList *nm_meta_selection_create_all (const NMMetaAbstractInfo *const* fields_array);
NMMetaSelectionResultList *nm_meta_selection_create_parse_one (const NMMetaAbstractInfo *const* fields_array,
const char *fields_prefix,
const char *fields_str,
NMMetaSelectionResultList *
nm_meta_selection_create_all(const NMMetaAbstractInfo *const *fields_array);
NMMetaSelectionResultList *
nm_meta_selection_create_parse_one(const NMMetaAbstractInfo *const *fields_array,
const char * fields_prefix,
const char * fields_str,
gboolean validate_nested,
GError **error);
NMMetaSelectionResultList *nm_meta_selection_create_parse_list (const NMMetaAbstractInfo *const* fields_array,
const char *fields_str,
GError ** error);
NMMetaSelectionResultList *
nm_meta_selection_create_parse_list(const NMMetaAbstractInfo *const *fields_array,
const char * fields_str,
gboolean validate_nested,
GError **error);
GError ** error);
#endif /* _NM_META_SETTING_ACCESS_H__ */

File diff suppressed because it is too large Load diff

View file

@ -15,10 +15,13 @@ struct _NMDevice;
#define NM_META_TEXT_HIDDEN N_("<hidden>")
#define NM_META_TEXT_PROMPT_ADSL_PROTO N_("Protocol")
#define NM_META_TEXT_PROMPT_ADSL_PROTO_CHOICES "(" NM_SETTING_ADSL_PROTOCOL_PPPOA "/" NM_SETTING_ADSL_PROTOCOL_PPPOE "/" NM_SETTING_ADSL_PROTOCOL_IPOATM ")"
#define NM_META_TEXT_PROMPT_ADSL_PROTO_CHOICES \
"(" NM_SETTING_ADSL_PROTOCOL_PPPOA "/" NM_SETTING_ADSL_PROTOCOL_PPPOE \
"/" NM_SETTING_ADSL_PROTOCOL_IPOATM ")"
#define NM_META_TEXT_PROMPT_ADSL_ENCAP N_("ADSL encapsulation")
#define NM_META_TEXT_PROMPT_ADSL_ENCAP_CHOICES "(" NM_SETTING_ADSL_ENCAPSULATION_VCMUX "/" NM_SETTING_ADSL_ENCAPSULATION_LLC ") [none]"
#define NM_META_TEXT_PROMPT_ADSL_ENCAP_CHOICES \
"(" NM_SETTING_ADSL_ENCAPSULATION_VCMUX "/" NM_SETTING_ADSL_ENCAPSULATION_LLC ") [none]"
#define NM_META_TEXT_PROMPT_CON_TYPE N_("Connection type")
#define NM_META_TEXT_PROMPT_IFNAME N_("Interface name [*]")
@ -28,33 +31,41 @@ struct _NMDevice;
#define NM_META_TEXT_PROMPT_IB_MODE N_("Transport mode")
#define NM_META_TEXT_WORD_DATAGRAM "datagram"
#define NM_META_TEXT_WORD_CONNECTED "connected"
#define NM_META_TEXT_PROMPT_IB_MODE_CHOICES "(" NM_META_TEXT_WORD_DATAGRAM "/" NM_META_TEXT_WORD_CONNECTED ") [" NM_META_TEXT_WORD_DATAGRAM "]"
#define NM_META_TEXT_PROMPT_IB_MODE_CHOICES \
"(" NM_META_TEXT_WORD_DATAGRAM "/" NM_META_TEXT_WORD_CONNECTED \
") [" NM_META_TEXT_WORD_DATAGRAM "]"
#define NM_META_TEXT_PROMPT_BT_TYPE N_("Bluetooth type")
#define NM_META_TEXT_WORD_PANU "panu"
#define NM_META_TEXT_WORD_NAP "nap"
#define NM_META_TEXT_WORD_DUN_GSM "dun-gsm"
#define NM_META_TEXT_WORD_DUN_CDMA "dun-cdma"
#define NM_META_TEXT_PROMPT_BT_TYPE_CHOICES "(" NM_META_TEXT_WORD_PANU "/" NM_META_TEXT_WORD_NAP "/" NM_META_TEXT_WORD_DUN_GSM "/" NM_META_TEXT_WORD_DUN_CDMA ") [" NM_META_TEXT_WORD_PANU "]"
#define NM_META_TEXT_PROMPT_BT_TYPE_CHOICES \
"(" NM_META_TEXT_WORD_PANU "/" NM_META_TEXT_WORD_NAP "/" NM_META_TEXT_WORD_DUN_GSM \
"/" NM_META_TEXT_WORD_DUN_CDMA ") [" NM_META_TEXT_WORD_PANU "]"
#define NM_META_TEXT_PROMPT_BOND_MODE N_("Bonding mode")
#define NM_META_TEXT_PROMPT_BOND_MON_MODE N_("Bonding monitoring mode")
#define NM_META_TEXT_WORD_MIIMON "miimon"
#define NM_META_TEXT_WORD_ARP "arp"
#define NM_META_TEXT_PROMPT_BOND_MON_MODE_CHOICES "(" NM_META_TEXT_WORD_MIIMON "/" NM_META_TEXT_WORD_ARP ") [" NM_META_TEXT_WORD_MIIMON "]"
#define NM_META_TEXT_PROMPT_BOND_MON_MODE_CHOICES \
"(" NM_META_TEXT_WORD_MIIMON "/" NM_META_TEXT_WORD_ARP ") [" NM_META_TEXT_WORD_MIIMON "]"
#define NM_META_TEXT_PROMPT_WIFI_MODE N_("Wi-Fi mode")
#define NM_META_TEXT_WORD_INFRA "infrastructure"
#define NM_META_TEXT_WORD_AP "ap"
#define NM_META_TEXT_WORD_ADHOC "adhoc"
#define NM_META_TEXT_WORD_MESH "mesh"
#define NM_META_TEXT_PROMPT_WIFI_MODE_CHOICES "(" NM_META_TEXT_WORD_INFRA "/" NM_META_TEXT_WORD_AP "/" NM_META_TEXT_WORD_ADHOC "/" NM_META_TEXT_WORD_MESH ") [" NM_META_TEXT_WORD_INFRA "]"
#define NM_META_TEXT_PROMPT_WIFI_MODE_CHOICES \
"(" NM_META_TEXT_WORD_INFRA "/" NM_META_TEXT_WORD_AP "/" NM_META_TEXT_WORD_ADHOC \
"/" NM_META_TEXT_WORD_MESH ") [" NM_META_TEXT_WORD_INFRA "]"
#define NM_META_TEXT_PROMPT_TUN_MODE N_("Tun mode")
#define NM_META_TEXT_WORD_TUN "tun"
#define NM_META_TEXT_WORD_TAP "tap"
#define NM_META_TEXT_PROMPT_TUN_MODE_CHOICES "(" NM_META_TEXT_WORD_TUN "/" NM_META_TEXT_WORD_TAP ") [" NM_META_TEXT_WORD_TUN "]"
#define NM_META_TEXT_PROMPT_TUN_MODE_CHOICES \
"(" NM_META_TEXT_WORD_TUN "/" NM_META_TEXT_WORD_TAP ") [" NM_META_TEXT_WORD_TUN "]"
#define NM_META_TEXT_PROMPT_IP_TUNNEL_MODE N_("IP Tunnel mode")
@ -63,12 +74,14 @@ struct _NMDevice;
#define NM_META_TEXT_PROMPT_MACSEC_MODE N_("MACsec mode")
#define NM_META_TEXT_WORD_PSK "psk"
#define NM_META_TEXT_WORD_EAP "eap"
#define NM_META_TEXT_PROMPT_MACSEC_MODE_CHOICES "(" NM_META_TEXT_WORD_PSK "/" NM_META_TEXT_WORD_EAP ")"
#define NM_META_TEXT_PROMPT_MACSEC_MODE_CHOICES \
"(" NM_META_TEXT_WORD_PSK "/" NM_META_TEXT_WORD_EAP ")"
#define NM_META_TEXT_PROMPT_PROXY_METHOD N_("Proxy method")
#define NM_META_TEXT_WORD_NONE "none"
#define NM_META_TEXT_WORD_AUTO "auto"
#define NM_META_TEXT_PROMPT_PROXY_METHOD_CHOICES "(" NM_META_TEXT_WORD_NONE "/" NM_META_TEXT_WORD_AUTO ") [" NM_META_TEXT_WORD_NONE "]"
#define NM_META_TEXT_PROMPT_PROXY_METHOD_CHOICES \
"(" NM_META_TEXT_WORD_NONE "/" NM_META_TEXT_WORD_AUTO ") [" NM_META_TEXT_WORD_NONE "]"
typedef enum {
NM_META_COLOR_NONE = 0,
@ -187,42 +200,39 @@ struct _NMMetaOperationContext {
};
struct _NMMetaPropertyType {
/* should return a translated string */
const char *(*describe_fcn) (const NMMetaPropertyInfo *property_info,
char **out_to_free);
const char *(*describe_fcn)(const NMMetaPropertyInfo *property_info, char **out_to_free);
gconstpointer (*get_fcn) (const NMMetaPropertyInfo *property_info,
const NMMetaEnvironment *environment,
gconstpointer (*get_fcn)(const NMMetaPropertyInfo * property_info,
const NMMetaEnvironment * environment,
gpointer environment_user_data,
NMSetting *setting,
NMSetting * setting,
NMMetaAccessorGetType get_type,
NMMetaAccessorGetFlags get_flags,
NMMetaAccessorGetOutFlags *out_flags,
gboolean *out_is_default,
gpointer *out_to_free);
gboolean (*set_fcn) (const NMMetaPropertyInfo *property_info,
const NMMetaEnvironment *environment,
gboolean * out_is_default,
gpointer * out_to_free);
gboolean (*set_fcn)(const NMMetaPropertyInfo *property_info,
const NMMetaEnvironment * environment,
gpointer environment_user_data,
NMSetting *setting,
NMSetting * setting,
NMMetaAccessorModifier modifier,
const char *value,
GError **error);
const char * value,
GError ** error);
const char *const*(*values_fcn) (const NMMetaPropertyInfo *property_info,
char ***out_to_free);
const char *const *(*values_fcn)(const NMMetaPropertyInfo *property_info, char ***out_to_free);
const char *const*(*complete_fcn) (const NMMetaPropertyInfo *property_info,
const NMMetaEnvironment *environment,
const char *const *(*complete_fcn)(const NMMetaPropertyInfo * property_info,
const NMMetaEnvironment * environment,
gpointer environment_user_data,
const NMMetaOperationContext *operation_context,
const char *text,
gboolean *out_complete_filename,
char ***out_to_free);
const char * text,
gboolean * out_complete_filename,
char *** out_to_free);
/* Whether set_fcn() supports the '-' modifier. That is, whether the property
* is a list type. */
bool set_supports_remove:1;
bool set_supports_remove : 1;
};
struct _NMUtilsEnumValueInfo;
@ -233,22 +243,22 @@ typedef union {
} NMMetaSignUnsignInt64;
typedef struct {
const char *nick;
const char * nick;
NMMetaSignUnsignInt64 value;
} NMMetaUtilsIntValueInfo;
struct _NMMetaPropertyTypData {
union {
struct {
GType (*get_gtype) (void);
GType (*get_gtype)(void);
int min;
int max;
const struct _NMUtilsEnumValueInfo *value_infos_get; /* nicks for get function */
const struct _NMUtilsEnumValueInfo *value_infos; /* nicks for set function */
void (*pre_set_notify) (const NMMetaPropertyInfo *property_info,
const NMMetaEnvironment *environment,
void (*pre_set_notify)(const NMMetaPropertyInfo *property_info,
const NMMetaEnvironment * environment,
gpointer environment_user_data,
NMSetting *setting,
NMSetting * setting,
int value);
} gobject_enum;
struct {
@ -258,61 +268,59 @@ struct _NMMetaPropertyTypData {
const NMMetaUtilsIntValueInfo *value_infos;
} gobject_int;
struct {
const char *(*validate_fcn) (const char *value, char **out_to_free, GError **error);
bool handle_emptyunset:1;
const char *(*validate_fcn)(const char *value, char **out_to_free, GError **error);
bool handle_emptyunset : 1;
} gobject_string;
struct {
bool legacy_format:1;
bool legacy_format : 1;
} gobject_bytes;
struct {
guint32 (*get_num_fcn_u32) (NMSetting *setting);
guint (*get_num_fcn_u) (NMSetting *setting);
void (*clear_all_fcn) (NMSetting *setting);
guint32 (*get_num_fcn_u32)(NMSetting *setting);
guint (*get_num_fcn_u)(NMSetting *setting);
void (*clear_all_fcn)(NMSetting *setting);
/* some multilist properties distinguish between an empty list and
* and unset. If this function pointer is set, certain behaviors come
* into action to handle that. */
void (*clear_emptyunset_fcn) (NMSetting *setting,
void (*clear_emptyunset_fcn)(NMSetting *setting,
gboolean is_set /* or else set default */);
gboolean (*add_fcn) (NMSetting *setting,
const char *item);
void (*add2_fcn) (NMSetting *setting,
const char *item);
const char *(*validate_fcn) (const char *item, GError **error);
const char *(*validate2_fcn) (NMSetting *setting, const char *item, GError **error);
void (*remove_by_idx_fcn_u32) (NMSetting *setting, guint32 idx);
void (*remove_by_idx_fcn_u) (NMSetting *setting, guint idx);
void (*remove_by_idx_fcn_s) (NMSetting *setting, int idx);
gboolean (*remove_by_value_fcn) (NMSetting *setting, const char *item);
bool strsplit_plain:1;
bool strsplit_with_spaces:1;
gboolean (*add_fcn)(NMSetting *setting, const char *item);
void (*add2_fcn)(NMSetting *setting, const char *item);
const char *(*validate_fcn)(const char *item, GError **error);
const char *(*validate2_fcn)(NMSetting *setting, const char *item, GError **error);
void (*remove_by_idx_fcn_u32)(NMSetting *setting, guint32 idx);
void (*remove_by_idx_fcn_u)(NMSetting *setting, guint idx);
void (*remove_by_idx_fcn_s)(NMSetting *setting, int idx);
gboolean (*remove_by_value_fcn)(NMSetting *setting, const char *item);
bool strsplit_plain : 1;
bool strsplit_with_spaces : 1;
} multilist;
struct {
guint (*get_num_fcn) (NMSetting *setting);
void (*obj_to_str_fcn) (NMMetaAccessorGetType get_type,
NMSetting *setting,
guint (*get_num_fcn)(NMSetting *setting);
void (*obj_to_str_fcn)(NMMetaAccessorGetType get_type,
NMSetting * setting,
guint idx,
GString *str);
gboolean (*set_fcn) (NMSetting *setting,
GString * str);
gboolean (*set_fcn)(NMSetting * setting,
gboolean do_add /* or else remove. */,
const char *value,
GError **error);
void (*clear_all_fcn) (NMSetting *setting);
void (*remove_by_idx_fcn_u) (NMSetting *setting, guint idx);
void (*remove_by_idx_fcn_s) (NMSetting *setting, int idx);
bool delimit_pretty_with_semicolon:1;
bool strsplit_plain:1;
GError ** error);
void (*clear_all_fcn)(NMSetting *setting);
void (*remove_by_idx_fcn_u)(NMSetting *setting, guint idx);
void (*remove_by_idx_fcn_s)(NMSetting *setting, int idx);
bool delimit_pretty_with_semicolon : 1;
bool strsplit_plain : 1;
} objlist;
struct {
gboolean (*set_fcn) (NMSetting *setting,
gboolean (*set_fcn)(NMSetting * setting,
const char *option,
const char *value,
GError **error);
bool no_empty_value:1;
GError ** error);
bool no_empty_value : 1;
} optionlist;
struct {
guint32 (*get_fcn) (NMSetting *setting);
guint32 (*get_fcn)(NMSetting *setting);
} mtu;
struct {
NMSetting8021xSchemeType scheme_type;
@ -321,29 +329,23 @@ struct _NMMetaPropertyTypData {
NMMetaPropertyTypeMacMode mode;
} mac;
struct {
guint (*get_fcn) (NMSettingDcb *setting,
guint user_priority);
void (*set_fcn) (NMSettingDcb *setting,
guint id,
guint value);
guint (*get_fcn)(NMSettingDcb *setting, guint user_priority);
void (*set_fcn)(NMSettingDcb *setting, guint id, guint value);
guint max;
guint other;
bool is_percent:1;
bool is_percent : 1;
} dcb;
struct {
gboolean (*get_fcn) (NMSettingDcb *s_dcb,
guint priority);
void (*set_fcn) (NMSettingDcb *setting,
guint user_priority,
gboolean enabled);
bool with_flow_control_flags:1;
gboolean (*get_fcn)(NMSettingDcb *s_dcb, guint priority);
void (*set_fcn)(NMSettingDcb *setting, guint user_priority, gboolean enabled);
bool with_flow_control_flags : 1;
} dcb_bool;
struct {
NMEthtoolID ethtool_id;
} ethtool;
} subtype;
gboolean (*is_default_fcn) (NMSetting *setting);
const char *const*values_static;
gboolean (*is_default_fcn)(NMSetting *setting);
const char *const * values_static;
const NMMetaPropertyTypDataNested *nested;
NMMetaPropertyTypFlags typ_flags;
};
@ -360,8 +362,12 @@ enum {
_NM_META_PROPERTY_TYPE_CONNECTION_TYPE = 3,
};
#define nm_meta_property_info_connection_type (nm_meta_setting_infos_editor[NM_META_SETTING_TYPE_CONNECTION].properties[_NM_META_PROPERTY_TYPE_CONNECTION_TYPE])
#define nm_meta_property_info_vpn_service_type (nm_meta_setting_infos_editor[NM_META_SETTING_TYPE_VPN].properties[_NM_META_PROPERTY_TYPE_VPN_SERVICE_TYPE])
#define nm_meta_property_info_connection_type \
(nm_meta_setting_infos_editor[NM_META_SETTING_TYPE_CONNECTION] \
.properties[_NM_META_PROPERTY_TYPE_CONNECTION_TYPE])
#define nm_meta_property_info_vpn_service_type \
(nm_meta_setting_infos_editor[NM_META_SETTING_TYPE_VPN] \
.properties[_NM_META_PROPERTY_TYPE_VPN_SERVICE_TYPE])
struct _NMMetaPropertyInfo {
union {
@ -376,10 +382,10 @@ struct _NMMetaPropertyInfo {
const char *property_alias;
NMMetaPropertyInfFlags inf_flags;
bool is_secret:1;
bool is_secret : 1;
bool is_cli_option:1;
bool hide_if_default:1;
bool is_cli_option : 1;
bool hide_if_default : 1;
const char *prompt;
@ -390,7 +396,7 @@ struct _NMMetaPropertyInfo {
/* a non-translated but translatable static description (marked with N_()). */
const char *describe_message;
const NMMetaPropertyType *property_type;
const NMMetaPropertyType * property_type;
const NMMetaPropertyTypData *property_typ_data;
};
@ -404,10 +410,10 @@ struct _NMMetaSettingInfoEditor {
NMObjBaseInst parent;
const NMMetaType *meta_type;
};
const NMMetaSettingInfo *general;
const char *alias;
const char *pretty_name;
const NMMetaPropertyInfo *const*properties;
const NMMetaSettingInfo * general;
const char * alias;
const char * pretty_name;
const NMMetaPropertyInfo *const *properties;
guint properties_num;
/* a NMConnection has a main type (connection.type), which is a
@ -420,38 +426,37 @@ struct _NMMetaSettingInfoEditor {
* Some setting types a not a main type (NMSettingProxy). They
* don't have valid_settings but are usually referenced by other
* settings to be valid for them. */
const NMMetaSettingValidPartItem *const*valid_parts;
const NMMetaSettingValidPartItem *const *valid_parts;
void (*setting_init_fcn) (const NMMetaSettingInfoEditor *setting_info,
NMSetting *setting,
void (*setting_init_fcn)(const NMMetaSettingInfoEditor *setting_info,
NMSetting * setting,
NMMetaAccessorSettingInitType init_type);
};
struct _NMMetaType {
NMObjBaseClass parent;
const char *type_name;
const char *(*get_name) (const NMMetaAbstractInfo *abstract_info,
gboolean for_header);
const NMMetaAbstractInfo *const*(*get_nested) (const NMMetaAbstractInfo *abstract_info,
guint *out_len,
gpointer *out_to_free);
gconstpointer (*get_fcn) (const NMMetaAbstractInfo *info,
const NMMetaEnvironment *environment,
const char * type_name;
const char *(*get_name)(const NMMetaAbstractInfo *abstract_info, gboolean for_header);
const NMMetaAbstractInfo *const *(*get_nested)(const NMMetaAbstractInfo *abstract_info,
guint * out_len,
gpointer * out_to_free);
gconstpointer (*get_fcn)(const NMMetaAbstractInfo * info,
const NMMetaEnvironment * environment,
gpointer environment_user_data,
gpointer target,
gpointer target_data,
NMMetaAccessorGetType get_type,
NMMetaAccessorGetFlags get_flags,
NMMetaAccessorGetOutFlags *out_flags,
gboolean *out_is_default,
gpointer *out_to_free);
const char *const*(*complete_fcn) (const NMMetaAbstractInfo *info,
const NMMetaEnvironment *environment,
gboolean * out_is_default,
gpointer * out_to_free);
const char *const *(*complete_fcn)(const NMMetaAbstractInfo * info,
const NMMetaEnvironment * environment,
gpointer environment_user_data,
const NMMetaOperationContext *operation_context,
const char *text,
gboolean *out_complete_filename,
char ***out_to_free);
const char * text,
gboolean * out_complete_filename,
char *** out_to_free);
};
struct _NMMetaAbstractInfo {
@ -468,7 +473,9 @@ extern const NMMetaSettingInfoEditor nm_meta_setting_infos_editor[_NM_META_SETTI
extern const NMMetaSettingValidPartItem *const nm_meta_setting_info_valid_parts_default[];
const NMMetaSettingValidPartItem *const*nm_meta_setting_info_valid_parts_for_slave_type (const char *slave_type, const char **out_slave_name);
const NMMetaSettingValidPartItem *const *
nm_meta_setting_info_valid_parts_for_slave_type(const char * slave_type,
const char **out_slave_name);
/*****************************************************************************/
@ -482,21 +489,21 @@ typedef enum {
* The meta-data handlers may call back to the environment with certain
* actions. */
struct _NMMetaEnvironment {
void (*warn_fcn) (const NMMetaEnvironment *environment,
void (*warn_fcn)(
const NMMetaEnvironment *environment,
gpointer environment_user_data,
NMMetaEnvWarnLevel warn_level,
const char *fmt_l10n, /* the untranslated format string, but it is marked for translation using N_(). */
const char *
fmt_l10n, /* the untranslated format string, but it is marked for translation using N_(). */
va_list ap);
struct _NMDevice *const*(*get_nm_devices) (const NMMetaEnvironment *environment,
struct _NMDevice *const *(*get_nm_devices)(const NMMetaEnvironment *environment,
gpointer environment_user_data,
guint *out_len);
guint * out_len);
struct _NMRemoteConnection *const*(*get_nm_connections) (const NMMetaEnvironment *environment,
struct _NMRemoteConnection *const *(*get_nm_connections)(const NMMetaEnvironment *environment,
gpointer environment_user_data,
guint *out_len);
guint * out_len);
};
/*****************************************************************************/
@ -509,7 +516,7 @@ extern const NMMetaType nm_meta_type_nested_property_info;
struct _NMMetaNestedPropertyInfo {
union {
const NMMetaType *meta_type;
const NMMetaType * meta_type;
NMMetaPropertyInfo base;
};
const NMMetaPropertyInfo *parent_info;
@ -524,10 +531,10 @@ extern const NMMetaPropertyTypDataNested nm_meta_property_typ_data_bond;
/*****************************************************************************/
gboolean _nm_meta_setting_bond_add_option (NMSetting *setting,
gboolean _nm_meta_setting_bond_add_option(NMSetting * setting,
const char *name,
const char *value,
GError **error);
GError ** error);
/*****************************************************************************/

File diff suppressed because it is too large Load diff

View file

@ -15,15 +15,19 @@
typedef struct _NMPolkitListener NMPolkitListener;
typedef struct _NMPolkitListenerClass NMPolkitListenerClass;
#define NM_TYPE_POLKIT_LISTENER (nm_polkit_listener_get_type ())
#define NM_POLKIT_LISTENER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_POLKIT_LISTENER, NMPolkitListener))
#define NM_POLKIT_LISTENER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_POLKIT_LISTENER, NMPolkitListenerClass))
#define NM_IS_POLKIT_LISTENER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_POLKIT_LISTENER))
#define NM_IS_POLKIT_LISTENER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_POLKIT_LISTENER))
#define NM_POLKIT_LISTENER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_POLKIT_LISTENER, NMPolkitListenerClass))
#define NM_TYPE_POLKIT_LISTENER (nm_polkit_listener_get_type())
#define NM_POLKIT_LISTENER(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), NM_TYPE_POLKIT_LISTENER, NMPolkitListener))
#define NM_POLKIT_LISTENER_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), NM_TYPE_POLKIT_LISTENER, NMPolkitListenerClass))
#define NM_IS_POLKIT_LISTENER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), NM_TYPE_POLKIT_LISTENER))
#define NM_IS_POLKIT_LISTENER_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass), NM_TYPE_POLKIT_LISTENER))
#define NM_POLKIT_LISTENER_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), NM_TYPE_POLKIT_LISTENER, NMPolkitListenerClass))
GType nm_polkit_listener_get_type (void);
GType nm_polkit_listener_get_type(void);
NMPolkitListener *nm_polkit_listener_new (GDBusConnection *dbus_connection, gboolean session_agent);
NMPolkitListener *nm_polkit_listener_new(GDBusConnection *dbus_connection, gboolean session_agent);
#endif /* __NM_POLKIT_LISTENER_H__ */

File diff suppressed because it is too large Load diff

View file

@ -17,41 +17,45 @@ typedef enum {
typedef struct {
NMSecretAgentSecretType secret_type;
const char *pretty_name;
const char *entry_id;
char *value;
const char *vpn_type;
bool is_secret:1;
bool no_prompt_entry_id:1;
const char * pretty_name;
const char * entry_id;
char * value;
const char * vpn_type;
bool is_secret : 1;
bool no_prompt_entry_id : 1;
} NMSecretAgentSimpleSecret;
#define NM_SECRET_AGENT_ENTRY_ID_PREFX_VPN_SECRETS "vpn.secrets."
#define NM_SECRET_AGENT_VPN_TYPE_OPENCONNECT NM_DBUS_INTERFACE".openconnect"
#define NM_SECRET_AGENT_VPN_TYPE_OPENCONNECT NM_DBUS_INTERFACE ".openconnect"
/*****************************************************************************/
#define NM_TYPE_SECRET_AGENT_SIMPLE (nm_secret_agent_simple_get_type ())
#define NM_SECRET_AGENT_SIMPLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SECRET_AGENT_SIMPLE, NMSecretAgentSimple))
#define NM_SECRET_AGENT_SIMPLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SECRET_AGENT_SIMPLE, NMSecretAgentSimpleClass))
#define NM_IS_SECRET_AGENT_SIMPLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SECRET_AGENT_SIMPLE))
#define NM_IS_SECRET_AGENT_SIMPLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SECRET_AGENT_SIMPLE))
#define NM_SECRET_AGENT_SIMPLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SECRET_AGENT_SIMPLE, NMSecretAgentSimpleClass))
#define NM_TYPE_SECRET_AGENT_SIMPLE (nm_secret_agent_simple_get_type())
#define NM_SECRET_AGENT_SIMPLE(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), NM_TYPE_SECRET_AGENT_SIMPLE, NMSecretAgentSimple))
#define NM_SECRET_AGENT_SIMPLE_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), NM_TYPE_SECRET_AGENT_SIMPLE, NMSecretAgentSimpleClass))
#define NM_IS_SECRET_AGENT_SIMPLE(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj), NM_TYPE_SECRET_AGENT_SIMPLE))
#define NM_IS_SECRET_AGENT_SIMPLE_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass), NM_TYPE_SECRET_AGENT_SIMPLE))
#define NM_SECRET_AGENT_SIMPLE_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), NM_TYPE_SECRET_AGENT_SIMPLE, NMSecretAgentSimpleClass))
#define NM_SECRET_AGENT_SIMPLE_REQUEST_SECRETS "request-secrets"
typedef struct _NMSecretAgentSimple NMSecretAgentSimple;
typedef struct _NMSecretAgentSimpleClass NMSecretAgentSimpleClass;
GType nm_secret_agent_simple_get_type (void);
GType nm_secret_agent_simple_get_type(void);
NMSecretAgentSimple *nm_secret_agent_simple_new (const char *name);
NMSecretAgentSimple *nm_secret_agent_simple_new(const char *name);
void nm_secret_agent_simple_response (NMSecretAgentSimple *self,
const char *request_id,
GPtrArray *secrets);
void nm_secret_agent_simple_response(NMSecretAgentSimple *self,
const char * request_id,
GPtrArray * secrets);
void nm_secret_agent_simple_enable (NMSecretAgentSimple *self,
const char *path);
void nm_secret_agent_simple_enable(NMSecretAgentSimple *self, const char *path);
#endif /* __NM_SECRET_AGENT_SIMPLE_H__ */

View file

@ -23,42 +23,54 @@
/*****************************************************************************/
NMVpnEditorPlugin *
nm_vpn_get_editor_plugin (const char *service_type, GError **error)
nm_vpn_get_editor_plugin(const char *service_type, GError **error)
{
NMVpnEditorPlugin *plugin = NULL;
NMVpnPluginInfo *plugin_info;
NMVpnPluginInfo * plugin_info;
gs_free_error GError *local = NULL;
g_return_val_if_fail (service_type, NULL);
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
g_return_val_if_fail(service_type, NULL);
g_return_val_if_fail(error == NULL || *error == NULL, NULL);
plugin_info = nm_vpn_plugin_info_list_find_by_service (nm_vpn_get_plugin_infos (), service_type);
plugin_info = nm_vpn_plugin_info_list_find_by_service(nm_vpn_get_plugin_infos(), service_type);
if (!plugin_info) {
g_set_error (error, NM_VPN_PLUGIN_ERROR, NM_VPN_PLUGIN_ERROR_FAILED,
_("unknown VPN plugin \"%s\""), service_type);
g_set_error(error,
NM_VPN_PLUGIN_ERROR,
NM_VPN_PLUGIN_ERROR_FAILED,
_("unknown VPN plugin \"%s\""),
service_type);
return NULL;
}
plugin = nm_vpn_plugin_info_get_editor_plugin (plugin_info);
plugin = nm_vpn_plugin_info_get_editor_plugin(plugin_info);
if (!plugin)
plugin = nm_vpn_plugin_info_load_editor_plugin (plugin_info, &local);
plugin = nm_vpn_plugin_info_load_editor_plugin(plugin_info, &local);
if (!plugin) {
if ( !nm_vpn_plugin_info_get_plugin (plugin_info)
&& nm_vpn_plugin_info_lookup_property (plugin_info, NM_VPN_PLUGIN_INFO_KF_GROUP_GNOME, "properties")) {
g_set_error (error, NM_VPN_PLUGIN_ERROR, NM_VPN_PLUGIN_ERROR_FAILED,
if (!nm_vpn_plugin_info_get_plugin(plugin_info)
&& nm_vpn_plugin_info_lookup_property(plugin_info,
NM_VPN_PLUGIN_INFO_KF_GROUP_GNOME,
"properties")) {
g_set_error(error,
NM_VPN_PLUGIN_ERROR,
NM_VPN_PLUGIN_ERROR_FAILED,
_("cannot load legacy-only VPN plugin \"%s\" for \"%s\""),
nm_vpn_plugin_info_get_name (plugin_info),
nm_vpn_plugin_info_get_filename (plugin_info));
} else if (g_error_matches (local, G_FILE_ERROR, G_FILE_ERROR_NOENT)) {
g_set_error (error, NM_VPN_PLUGIN_ERROR, NM_VPN_PLUGIN_ERROR_FAILED,
nm_vpn_plugin_info_get_name(plugin_info),
nm_vpn_plugin_info_get_filename(plugin_info));
} else if (g_error_matches(local, G_FILE_ERROR, G_FILE_ERROR_NOENT)) {
g_set_error(
error,
NM_VPN_PLUGIN_ERROR,
NM_VPN_PLUGIN_ERROR_FAILED,
_("cannot load VPN plugin \"%s\" due to missing \"%s\". Missing client plugin?"),
nm_vpn_plugin_info_get_name (plugin_info),
nm_vpn_plugin_info_get_plugin (plugin_info));
nm_vpn_plugin_info_get_name(plugin_info),
nm_vpn_plugin_info_get_plugin(plugin_info));
} else {
g_set_error (error, NM_VPN_PLUGIN_ERROR, NM_VPN_PLUGIN_ERROR_FAILED,
g_set_error(error,
NM_VPN_PLUGIN_ERROR,
NM_VPN_PLUGIN_ERROR_FAILED,
_("failed to load VPN plugin \"%s\": %s"),
nm_vpn_plugin_info_get_name (plugin_info),
nm_vpn_plugin_info_get_name(plugin_info),
local->message);
}
return NULL;
@ -68,141 +80,124 @@ nm_vpn_get_editor_plugin (const char *service_type, GError **error)
}
GSList *
nm_vpn_get_plugin_infos (void)
nm_vpn_get_plugin_infos(void)
{
static bool plugins_loaded;
static GSList *plugins = NULL;
if (G_LIKELY (plugins_loaded))
if (G_LIKELY(plugins_loaded))
return plugins;
plugins_loaded = TRUE;
plugins = nm_vpn_plugin_info_list_load ();
plugins = nm_vpn_plugin_info_list_load();
return plugins;
}
gboolean
nm_vpn_supports_ipv6 (NMConnection *connection)
nm_vpn_supports_ipv6(NMConnection *connection)
{
NMSettingVpn *s_vpn;
const char *service_type;
NMSettingVpn * s_vpn;
const char * service_type;
NMVpnEditorPlugin *plugin;
guint32 capabilities;
s_vpn = nm_connection_get_setting_vpn (connection);
g_return_val_if_fail (s_vpn != NULL, FALSE);
s_vpn = nm_connection_get_setting_vpn(connection);
g_return_val_if_fail(s_vpn != NULL, FALSE);
service_type = nm_setting_vpn_get_service_type (s_vpn);
service_type = nm_setting_vpn_get_service_type(s_vpn);
if (!service_type)
return FALSE;
plugin = nm_vpn_get_editor_plugin (service_type, NULL);
plugin = nm_vpn_get_editor_plugin(service_type, NULL);
if (!plugin)
return FALSE;
capabilities = nm_vpn_editor_plugin_get_capabilities (plugin);
return NM_FLAGS_HAS (capabilities, NM_VPN_EDITOR_PLUGIN_CAPABILITY_IPV6);
capabilities = nm_vpn_editor_plugin_get_capabilities(plugin);
return NM_FLAGS_HAS(capabilities, NM_VPN_EDITOR_PLUGIN_CAPABILITY_IPV6);
}
const NmcVpnPasswordName *
nm_vpn_get_secret_names (const char *service_type)
nm_vpn_get_secret_names(const char *service_type)
{
const char *type;
if (!service_type)
return NULL;
if ( !NM_STR_HAS_PREFIX (service_type, NM_DBUS_INTERFACE)
|| service_type[NM_STRLEN (NM_DBUS_INTERFACE)] != '.') {
if (!NM_STR_HAS_PREFIX(service_type, NM_DBUS_INTERFACE)
|| service_type[NM_STRLEN(NM_DBUS_INTERFACE)] != '.') {
/* all our well-known, hard-coded vpn-types start with NM_DBUS_INTERFACE. */
return NULL;
}
type = service_type + (NM_STRLEN (NM_DBUS_INTERFACE) + 1);
type = service_type + (NM_STRLEN(NM_DBUS_INTERFACE) + 1);
#define _VPN_PASSWORD_LIST(...) \
({ \
static const NmcVpnPasswordName _arr[] = { \
__VA_ARGS__ \
{ 0 }, \
__VA_ARGS__{0}, \
}; \
_arr; \
})
if (NM_IN_STRSET (type, "pptp",
"iodine",
"ssh",
"l2tp",
"fortisslvpn")) {
return _VPN_PASSWORD_LIST (
{ "password", N_("Password") },
);
if (NM_IN_STRSET(type, "pptp", "iodine", "ssh", "l2tp", "fortisslvpn")) {
return _VPN_PASSWORD_LIST({"password", N_("Password")}, );
}
if (NM_IN_STRSET (type, "openvpn")) {
return _VPN_PASSWORD_LIST (
{ "password", N_("Password") },
{ "cert-pass", N_("Certificate password") },
{ "http-proxy-password", N_("HTTP proxy password") },
);
if (NM_IN_STRSET(type, "openvpn")) {
return _VPN_PASSWORD_LIST({"password", N_("Password")},
{"cert-pass", N_("Certificate password")},
{"http-proxy-password", N_("HTTP proxy password")}, );
}
if (NM_IN_STRSET (type, "vpnc")) {
return _VPN_PASSWORD_LIST (
{ "Xauth password", N_("Password") },
{ "IPSec secret", N_("Group password") },
);
if (NM_IN_STRSET(type, "vpnc")) {
return _VPN_PASSWORD_LIST({"Xauth password", N_("Password")},
{"IPSec secret", N_("Group password")}, );
};
if (NM_IN_STRSET (type, "openswan",
"libreswan",
"strongswan")) {
return _VPN_PASSWORD_LIST (
{ "xauthpassword", N_("Password") },
{ "pskvalue", N_("Group password") },
);
if (NM_IN_STRSET(type, "openswan", "libreswan", "strongswan")) {
return _VPN_PASSWORD_LIST({"xauthpassword", N_("Password")},
{"pskvalue", N_("Group password")}, );
};
if (NM_IN_STRSET (type, "openconnect")) {
return _VPN_PASSWORD_LIST (
{ "gateway", N_("Gateway") },
{ "cookie", N_("Cookie") },
{ "gwcert", N_("Gateway certificate hash") },
);
if (NM_IN_STRSET(type, "openconnect")) {
return _VPN_PASSWORD_LIST({"gateway", N_("Gateway")},
{"cookie", N_("Cookie")},
{"gwcert", N_("Gateway certificate hash")}, );
};
return NULL;
}
static gboolean
_extract_variable_value (char *line, const char *tag, char **value)
_extract_variable_value(char *line, const char *tag, char **value)
{
char *p1, *p2;
if (!g_str_has_prefix (line, tag))
if (!g_str_has_prefix(line, tag))
return FALSE;
p1 = line + strlen (tag);
p2 = line + strlen (line) - 1;
p1 = line + strlen(tag);
p2 = line + strlen(line) - 1;
if ((*p1 == '\'' || *p1 == '"') && (*p1 == *p2)) {
p1++;
*p2 = '\0';
}
NM_SET_OUT (value, g_strdup (p1));
NM_SET_OUT(value, g_strdup(p1));
return TRUE;
}
gboolean
nm_vpn_openconnect_authenticate_helper (const char *host,
char **cookie,
char **gateway,
char **gwcert,
int *status,
GError **error)
nm_vpn_openconnect_authenticate_helper(const char *host,
char ** cookie,
char ** gateway,
char ** gwcert,
int * status,
GError ** error)
{
gs_free char *output = NULL;
gs_free char * output = NULL;
gs_free const char **output_v = NULL;
const char *const*iter;
const char *path;
const char *const * iter;
const char * path;
const char *const DEFAULT_PATHS[] = {
"/sbin/",
"/usr/sbin/",
@ -213,16 +208,20 @@ nm_vpn_openconnect_authenticate_helper (const char *host,
NULL,
};
path = nm_utils_file_search_in_paths ("openconnect", "/usr/sbin/openconnect", DEFAULT_PATHS,
G_FILE_TEST_IS_EXECUTABLE, NULL, NULL, error);
path = nm_utils_file_search_in_paths("openconnect",
"/usr/sbin/openconnect",
DEFAULT_PATHS,
G_FILE_TEST_IS_EXECUTABLE,
NULL,
NULL,
error);
if (!path)
return FALSE;
if (!g_spawn_sync (NULL,
(char **) NM_MAKE_STRV (path, "--authenticate", host),
if (!g_spawn_sync(NULL,
(char **) NM_MAKE_STRV(path, "--authenticate", host),
NULL,
G_SPAWN_SEARCH_PATH
| G_SPAWN_CHILD_INHERITS_STDIN,
G_SPAWN_SEARCH_PATH | G_SPAWN_CHILD_INHERITS_STDIN,
NULL,
NULL,
&output,
@ -237,24 +236,24 @@ nm_vpn_openconnect_authenticate_helper (const char *host,
* HOST='1.2.3.4'
* FINGERPRINT='sha1:32bac90cf09a722e10ecc1942c67fe2ac8c21e2e'
*/
output_v = nm_utils_strsplit_set_with_empty (output, "\r\n");
output_v = nm_utils_strsplit_set_with_empty(output, "\r\n");
for (iter = output_v; iter && *iter; iter++) {
char *s_mutable = (char *) *iter;
_extract_variable_value (s_mutable, "COOKIE=", cookie);
_extract_variable_value (s_mutable, "HOST=", gateway);
_extract_variable_value (s_mutable, "FINGERPRINT=", gwcert);
_extract_variable_value(s_mutable, "COOKIE=", cookie);
_extract_variable_value(s_mutable, "HOST=", gateway);
_extract_variable_value(s_mutable, "FINGERPRINT=", gwcert);
}
return TRUE;
}
static gboolean
_wg_complete_peer (GPtrArray **p_peers,
_wg_complete_peer(GPtrArray ** p_peers,
NMWireGuardPeer *peer_take,
gsize peer_start_line_nr,
const char *filename,
GError **error)
const char * filename,
GError ** error)
{
nm_auto_unref_wgpeer NMWireGuardPeer *peer = peer_take;
gs_free_error GError *local = NULL;
@ -262,8 +261,9 @@ _wg_complete_peer (GPtrArray **p_peers,
if (!peer)
return TRUE;
if (!nm_wireguard_peer_is_valid (peer, TRUE, TRUE, &local)) {
nm_utils_error_set (error, NM_UTILS_ERROR_UNKNOWN,
if (!nm_wireguard_peer_is_valid(peer, TRUE, TRUE, &local)) {
nm_utils_error_set(error,
NM_UTILS_ERROR_UNKNOWN,
_("Invalid peer starting at %s:%zu: %s"),
filename,
peer_start_line_nr,
@ -272,27 +272,27 @@ _wg_complete_peer (GPtrArray **p_peers,
}
if (!*p_peers)
*p_peers = g_ptr_array_new_with_free_func ((GDestroyNotify) nm_wireguard_peer_unref);
g_ptr_array_add (*p_peers, g_steal_pointer (&peer));
*p_peers = g_ptr_array_new_with_free_func((GDestroyNotify) nm_wireguard_peer_unref);
g_ptr_array_add(*p_peers, g_steal_pointer(&peer));
return TRUE;
}
static gboolean
_line_match (char *line, const char *key, gsize key_len, const char **out_key, char **out_value)
_line_match(char *line, const char *key, gsize key_len, const char **out_key, char **out_value)
{
nm_assert (line);
nm_assert (key);
nm_assert (strlen (key) == key_len);
nm_assert (!strchr (key, '='));
nm_assert (out_key && !*out_key);
nm_assert (out_value && !*out_value);
nm_assert(line);
nm_assert(key);
nm_assert(strlen(key) == key_len);
nm_assert(!strchr(key, '='));
nm_assert(out_key && !*out_key);
nm_assert(out_value && !*out_value);
/* Note that `wg-quick` (linux.bash) does case-insensitive comparison (shopt -s nocasematch).
* `wg setconf` does case-insensitive comparison too (with strncasecmp, which is locale dependent).
*
* We do a case-insensitive comparison of the key, however in a locale-independent manner. */
if (g_ascii_strncasecmp (line, key, key_len) != 0)
if (g_ascii_strncasecmp(line, key, key_len) != 0)
return FALSE;
if (line[key_len] != '=')
@ -304,10 +304,10 @@ _line_match (char *line, const char *key, gsize key_len, const char **out_key, c
}
#define line_match(line, key, out_key, out_value) \
_line_match ((line), ""key"", NM_STRLEN (key), (out_key), (out_value))
_line_match((line), "" key "", NM_STRLEN(key), (out_key), (out_value))
static gboolean
value_split_word (char **line_remainder, char **out_word)
value_split_word(char **line_remainder, char **out_word)
{
char *str;
@ -316,7 +316,7 @@ value_split_word (char **line_remainder, char **out_word)
*out_word = *line_remainder;
str = strchrnul (*line_remainder, ',');
str = strchrnul(*line_remainder, ',');
if (str[0] == ',') {
str[0] = '\0';
*line_remainder = &str[1];
@ -326,20 +326,19 @@ value_split_word (char **line_remainder, char **out_word)
}
NMConnection *
nm_vpn_wireguard_import (const char *filename,
GError **error)
nm_vpn_wireguard_import(const char *filename, GError **error)
{
nm_auto_clear_secret_ptr NMSecretPtr file_content = NM_SECRET_PTR_INIT ();
nm_auto_clear_secret_ptr NMSecretPtr file_content = NM_SECRET_PTR_INIT();
char ifname[IFNAMSIZ];
gs_free char *uuid = NULL;
gs_free char * uuid = NULL;
gboolean ifname_valid = FALSE;
const char *cstr;
char *line_remainder;
const char * cstr;
char * line_remainder;
gs_unref_object NMConnection *connection = NULL;
NMSettingConnection *s_con;
NMSettingIPConfig *s_ip4;
NMSettingIPConfig *s_ip6;
NMSettingWireGuard *s_wg;
NMSettingConnection * s_con;
NMSettingIPConfig * s_ip4;
NMSettingIPConfig * s_ip6;
NMSettingWireGuard * s_wg;
gs_free_error GError *local = NULL;
enum {
LINE_CONTEXT_INIT,
@ -355,7 +354,7 @@ nm_vpn_wireguard_import (const char *filename,
gs_unref_ptrarray GPtrArray *data_addr_v4 = NULL;
gs_unref_ptrarray GPtrArray *data_addr_v6 = NULL;
gs_unref_ptrarray GPtrArray *data_peers = NULL;
const char *data_private_key = NULL;
const char * data_private_key = NULL;
gint64 data_table;
guint data_listen_port = 0;
guint data_fwmark = 0;
@ -363,35 +362,37 @@ nm_vpn_wireguard_import (const char *filename,
int is_v4;
guint i;
g_return_val_if_fail (filename, NULL);
g_return_val_if_fail (!error || !*error, NULL);
g_return_val_if_fail(filename, NULL);
g_return_val_if_fail(!error || !*error, NULL);
/* contrary to "wg-quick", we never interpret the filename as "/etc/wireguard/$INTERFACE.conf".
* If the filename has no '/', it is interpreted as relative to the current working directory.
* However, we do require a suitable filename suffix and that the name corresponds to the interface
* name. */
cstr = strrchr (filename, '/');
cstr = strrchr(filename, '/');
cstr = cstr ? &cstr[1] : filename;
if (NM_STR_HAS_SUFFIX (cstr, ".conf")) {
gsize len = strlen (cstr) - NM_STRLEN (".conf");
if (NM_STR_HAS_SUFFIX(cstr, ".conf")) {
gsize len = strlen(cstr) - NM_STRLEN(".conf");
if (len > 0 && len < sizeof (ifname)) {
memcpy (ifname, cstr, len);
if (len > 0 && len < sizeof(ifname)) {
memcpy(ifname, cstr, len);
ifname[len] = '\0';
if (nm_utils_ifname_valid (ifname, NMU_IFACE_KERNEL, NULL))
if (nm_utils_ifname_valid(ifname, NMU_IFACE_KERNEL, NULL))
ifname_valid = TRUE;
}
}
if (!ifname_valid) {
nm_utils_error_set_literal (error, NM_UTILS_ERROR_UNKNOWN,
_("The name of the WireGuard config must be a valid interface name followed by \".conf\""));
nm_utils_error_set_literal(error,
NM_UTILS_ERROR_UNKNOWN,
_("The name of the WireGuard config must be a valid interface "
"name followed by \".conf\""));
return FALSE;
}
if (!nm_utils_file_get_contents (-1,
if (!nm_utils_file_get_contents(-1,
filename,
10*1024*1024,
10 * 1024 * 1024,
NM_UTILS_FILE_GET_CONTENTS_FLAG_SECRET,
&file_content.str,
&file_content.len,
@ -419,15 +420,15 @@ nm_vpn_wireguard_import (const char *filename,
line_nr = 0;
while (line_remainder[0] != '\0') {
const char *matched_key = NULL;
char *value = NULL;
char *line;
char * value = NULL;
char * line;
char ch;
gint64 i64;
line_nr++;
line = line_remainder;
line_remainder = strchrnul (line, '\n');
line_remainder = strchrnul(line, '\n');
if (line_remainder[0] != '\0')
(line_remainder++)[0] = '\0';
@ -445,7 +446,7 @@ nm_vpn_wireguard_import (const char *filename,
n = 0;
for (l = 0; (ch = line[l]); l++) {
if (g_ascii_isspace (ch)) {
if (g_ascii_isspace(ch)) {
/* wg-setconf strips all whitespace before parsing the content. That means,
* *[I nterface]" will be accepted. We do that too. */
continue;
@ -459,9 +460,9 @@ nm_vpn_wireguard_import (const char *filename,
line[n] = '\0';
}
if (g_ascii_strcasecmp (line, "[Interface]") == 0) {
if (!_wg_complete_peer (&data_peers,
g_steal_pointer (&current_peer),
if (g_ascii_strcasecmp(line, "[Interface]") == 0) {
if (!_wg_complete_peer(&data_peers,
g_steal_pointer(&current_peer),
current_peer_start_line_nr,
filename,
error))
@ -470,57 +471,55 @@ nm_vpn_wireguard_import (const char *filename,
continue;
}
if (g_ascii_strcasecmp (line, "[Peer]") == 0) {
if (!_wg_complete_peer (&data_peers,
g_steal_pointer (&current_peer),
if (g_ascii_strcasecmp(line, "[Peer]") == 0) {
if (!_wg_complete_peer(&data_peers,
g_steal_pointer(&current_peer),
current_peer_start_line_nr,
filename,
error))
return FALSE;
current_peer_start_line_nr = line_nr;
current_peer = nm_wireguard_peer_new ();
current_peer = nm_wireguard_peer_new();
line_context = LINE_CONTEXT_PEER;
continue;
}
if (line_context == LINE_CONTEXT_INTERFACE) {
if (line_match (line, "Address", &matched_key, &value)) {
if (line_match(line, "Address", &matched_key, &value)) {
char *value_word;
while (value_split_word (&value, &value_word)) {
while (value_split_word(&value, &value_word)) {
GPtrArray **p_data_addr;
NMIPAddr addr_bin;
int addr_family;
int prefix_len;
if (!nm_utils_parse_inaddr_prefix_bin (AF_UNSPEC,
if (!nm_utils_parse_inaddr_prefix_bin(AF_UNSPEC,
value_word,
&addr_family,
&addr_bin,
&prefix_len))
goto fail_invalid_value;
p_data_addr = (addr_family == AF_INET)
? &data_addr_v4
: &data_addr_v6;
p_data_addr = (addr_family == AF_INET) ? &data_addr_v4 : &data_addr_v6;
if (!*p_data_addr)
*p_data_addr = g_ptr_array_new_with_free_func ((GDestroyNotify) nm_ip_address_unref);
*p_data_addr =
g_ptr_array_new_with_free_func((GDestroyNotify) nm_ip_address_unref);
g_ptr_array_add (*p_data_addr,
nm_ip_address_new_binary (addr_family,
g_ptr_array_add(
*p_data_addr,
nm_ip_address_new_binary(
addr_family,
&addr_bin,
prefix_len == -1
? ((addr_family == AF_INET) ? 32 : 128)
: prefix_len,
prefix_len == -1 ? ((addr_family == AF_INET) ? 32 : 128) : prefix_len,
NULL));
}
continue;
}
if (line_match (line, "MTU", &matched_key, &value)) {
i64 = _nm_utils_ascii_str_to_int64 (value, 0, 0, G_MAXUINT32, -1);
if (line_match(line, "MTU", &matched_key, &value)) {
i64 = _nm_utils_ascii_str_to_int64(value, 0, 0, G_MAXUINT32, -1);
if (i64 == -1)
goto fail_invalid_value;
@ -531,46 +530,40 @@ nm_vpn_wireguard_import (const char *filename,
continue;
}
if (line_match (line, "DNS", &matched_key, &value)) {
if (line_match(line, "DNS", &matched_key, &value)) {
char *value_word;
while (value_split_word (&value, &value_word)) {
while (value_split_word(&value, &value_word)) {
GPtrArray **p_data_dns;
NMIPAddr addr_bin;
int addr_family;
if (nm_utils_parse_inaddr_bin (AF_UNSPEC,
value_word,
&addr_family,
&addr_bin)) {
p_data_dns = (addr_family == AF_INET)
? &data_dns_v4
: &data_dns_v6;
if (nm_utils_parse_inaddr_bin(AF_UNSPEC, value_word, &addr_family, &addr_bin)) {
p_data_dns = (addr_family == AF_INET) ? &data_dns_v4 : &data_dns_v6;
if (!*p_data_dns)
*p_data_dns = g_ptr_array_new_with_free_func (g_free);
*p_data_dns = g_ptr_array_new_with_free_func(g_free);
g_ptr_array_add (*p_data_dns,
nm_utils_inet_ntop_dup (addr_family, &addr_bin));
g_ptr_array_add(*p_data_dns,
nm_utils_inet_ntop_dup(addr_family, &addr_bin));
continue;
}
if (!data_dns_search)
data_dns_search = g_ptr_array_new_with_free_func (g_free);
g_ptr_array_add (data_dns_search, g_strdup (value_word));
data_dns_search = g_ptr_array_new_with_free_func(g_free);
g_ptr_array_add(data_dns_search, g_strdup(value_word));
}
continue;
}
if (line_match (line, "Table", &matched_key, &value)) {
if (nm_streq (value, "auto"))
if (line_match(line, "Table", &matched_key, &value)) {
if (nm_streq(value, "auto"))
data_table = _TABLE_AUTO;
else if (nm_streq (value, "off"))
else if (nm_streq(value, "off"))
data_table = _TABLE_OFF;
else {
/* we don't support table names from /etc/iproute2/rt_tables
* But we accept hex like `ip route add` would. */
i64 = _nm_utils_ascii_str_to_int64 (value, 0, 0, G_MAXINT32, -1);
i64 = _nm_utils_ascii_str_to_int64(value, 0, 0, G_MAXINT32, -1);
if (i64 == -1)
goto fail_invalid_value;
data_table = i64;
@ -578,37 +571,37 @@ nm_vpn_wireguard_import (const char *filename,
continue;
}
if ( line_match (line, "PreUp", &matched_key, &value)
|| line_match (line, "PreDown", &matched_key, &value)
|| line_match (line, "PostUp", &matched_key, &value)
|| line_match (line, "PostDown", &matched_key, &value)) {
if (line_match(line, "PreUp", &matched_key, &value)
|| line_match(line, "PreDown", &matched_key, &value)
|| line_match(line, "PostUp", &matched_key, &value)
|| line_match(line, "PostDown", &matched_key, &value)) {
/* we don't run any scripts. Silently ignore these parameters. */
continue;
}
if (line_match (line, "SaveConfig", &matched_key, &value)) {
if (line_match(line, "SaveConfig", &matched_key, &value)) {
/* we ignore the setting, but enforce that it's either true or false (like
* wg-quick. */
if (!NM_IN_STRSET (value, "true", "false"))
if (!NM_IN_STRSET(value, "true", "false"))
goto fail_invalid_value;
continue;
}
if (line_match (line, "ListenPort", &matched_key, &value)) {
if (line_match(line, "ListenPort", &matched_key, &value)) {
/* we don't use getaddrinfo(), unlike `wg setconf`. Just interpret
* the port as plain decimal number. */
i64 = _nm_utils_ascii_str_to_int64 (value, 10, 0, 0xFFFF, -1);
i64 = _nm_utils_ascii_str_to_int64(value, 10, 0, 0xFFFF, -1);
if (i64 == -1)
goto fail_invalid_value;
data_listen_port = i64;
continue;
}
if (line_match (line, "FwMark", &matched_key, &value)) {
if (nm_streq (value, "off"))
if (line_match(line, "FwMark", &matched_key, &value)) {
if (nm_streq(value, "off"))
data_fwmark = 0;
else {
i64 = _nm_utils_ascii_str_to_int64 (value, 0, 0, G_MAXINT32, -1);
i64 = _nm_utils_ascii_str_to_int64(value, 0, 0, G_MAXINT32, -1);
if (i64 == -1)
goto fail_invalid_value;
data_fwmark = i64;
@ -616,8 +609,8 @@ nm_vpn_wireguard_import (const char *filename,
continue;
}
if (line_match (line, "PrivateKey", &matched_key, &value)) {
if (!nm_utils_base64secret_decode (value, NM_WIREGUARD_PUBLIC_KEY_LEN, NULL))
if (line_match(line, "PrivateKey", &matched_key, &value)) {
if (!nm_utils_base64secret_decode(value, NM_WIREGUARD_PUBLIC_KEY_LEN, NULL))
goto fail_invalid_secret;
data_private_key = value;
continue;
@ -626,49 +619,46 @@ nm_vpn_wireguard_import (const char *filename,
goto fail_invalid_line;
}
if (line_context == LINE_CONTEXT_PEER) {
if (line_match (line, "Endpoint", &matched_key, &value)) {
if (!nm_wireguard_peer_set_endpoint (current_peer, value, FALSE))
if (line_match(line, "Endpoint", &matched_key, &value)) {
if (!nm_wireguard_peer_set_endpoint(current_peer, value, FALSE))
goto fail_invalid_value;
continue;
}
if (line_match (line, "PublicKey", &matched_key, &value)) {
if (!nm_wireguard_peer_set_public_key (current_peer, value, FALSE))
if (line_match(line, "PublicKey", &matched_key, &value)) {
if (!nm_wireguard_peer_set_public_key(current_peer, value, FALSE))
goto fail_invalid_value;
continue;
}
if (line_match (line, "AllowedIPs", &matched_key, &value)) {
if (line_match(line, "AllowedIPs", &matched_key, &value)) {
char *value_word;
while (value_split_word (&value, &value_word)) {
if (!nm_wireguard_peer_append_allowed_ip (current_peer,
value_word,
FALSE))
while (value_split_word(&value, &value_word)) {
if (!nm_wireguard_peer_append_allowed_ip(current_peer, value_word, FALSE))
goto fail_invalid_value;
}
continue;
}
if (line_match (line, "PersistentKeepalive", &matched_key, &value)) {
if (nm_streq (value, "off"))
if (line_match(line, "PersistentKeepalive", &matched_key, &value)) {
if (nm_streq(value, "off"))
i64 = 0;
else {
i64 = _nm_utils_ascii_str_to_int64 (value, 10, 0, G_MAXUINT16, -1);
i64 = _nm_utils_ascii_str_to_int64(value, 10, 0, G_MAXUINT16, -1);
if (i64 == -1)
goto fail_invalid_value;
}
nm_wireguard_peer_set_persistent_keepalive (current_peer, i64);
nm_wireguard_peer_set_persistent_keepalive(current_peer, i64);
continue;
}
if (line_match (line, "PresharedKey", &matched_key, &value)) {
if (!nm_wireguard_peer_set_preshared_key (current_peer, value, FALSE))
if (line_match(line, "PresharedKey", &matched_key, &value)) {
if (!nm_wireguard_peer_set_preshared_key(current_peer, value, FALSE))
goto fail_invalid_secret;
nm_wireguard_peer_set_preshared_key_flags (current_peer, NM_SETTING_SECRET_FLAG_NONE);
nm_wireguard_peer_set_preshared_key_flags(current_peer,
NM_SETTING_SECRET_FLAG_NONE);
continue;
}
@ -676,42 +666,50 @@ nm_vpn_wireguard_import (const char *filename,
}
fail_invalid_line:
nm_utils_error_set (error, NM_UTILS_ERROR_INVALID_ARGUMENT,
nm_utils_error_set(error,
NM_UTILS_ERROR_INVALID_ARGUMENT,
_("unrecognized line at %s:%zu"),
filename, line_nr);
filename,
line_nr);
return FALSE;
fail_invalid_value:
nm_utils_error_set (error, NM_UTILS_ERROR_INVALID_ARGUMENT,
nm_utils_error_set(error,
NM_UTILS_ERROR_INVALID_ARGUMENT,
_("invalid value for '%s' at %s:%zu"),
matched_key, filename, line_nr);
matched_key,
filename,
line_nr);
return FALSE;
fail_invalid_secret:
nm_utils_error_set (error, NM_UTILS_ERROR_INVALID_ARGUMENT,
nm_utils_error_set(error,
NM_UTILS_ERROR_INVALID_ARGUMENT,
_("invalid secret '%s' at %s:%zu"),
matched_key, filename, line_nr);
matched_key,
filename,
line_nr);
return FALSE;
}
if (!_wg_complete_peer (&data_peers,
g_steal_pointer (&current_peer),
if (!_wg_complete_peer(&data_peers,
g_steal_pointer(&current_peer),
current_peer_start_line_nr,
filename,
error))
return FALSE;
connection = nm_simple_connection_new ();
s_con = NM_SETTING_CONNECTION (nm_setting_connection_new ());
nm_connection_add_setting (connection, NM_SETTING (s_con));
s_ip4 = NM_SETTING_IP_CONFIG (nm_setting_ip4_config_new ());
nm_connection_add_setting (connection, NM_SETTING (s_ip4));
s_ip6 = NM_SETTING_IP_CONFIG (nm_setting_ip6_config_new ());
nm_connection_add_setting (connection, NM_SETTING (s_ip6));
s_wg = NM_SETTING_WIREGUARD (nm_setting_wireguard_new ());
nm_connection_add_setting (connection, NM_SETTING (s_wg));
connection = nm_simple_connection_new();
s_con = NM_SETTING_CONNECTION(nm_setting_connection_new());
nm_connection_add_setting(connection, NM_SETTING(s_con));
s_ip4 = NM_SETTING_IP_CONFIG(nm_setting_ip4_config_new());
nm_connection_add_setting(connection, NM_SETTING(s_ip4));
s_ip6 = NM_SETTING_IP_CONFIG(nm_setting_ip6_config_new());
nm_connection_add_setting(connection, NM_SETTING(s_ip6));
s_wg = NM_SETTING_WIREGUARD(nm_setting_wireguard_new());
nm_connection_add_setting(connection, NM_SETTING(s_wg));
uuid = nm_utils_uuid_generate ();
uuid = nm_utils_uuid_generate();
g_object_set (s_con,
g_object_set(s_con,
NM_SETTING_CONNECTION_ID,
ifname,
NM_SETTING_CONNECTION_UUID,
@ -722,7 +720,7 @@ fail_invalid_secret:
ifname,
NULL);
g_object_set (s_wg,
g_object_set(s_wg,
NM_SETTING_WIREGUARD_PRIVATE_KEY,
data_private_key,
NM_SETTING_WIREGUARD_LISTEN_PORT,
@ -735,16 +733,18 @@ fail_invalid_secret:
if (data_peers) {
for (i = 0; i < data_peers->len; i++)
nm_setting_wireguard_append_peer (s_wg, data_peers->pdata[i]);
nm_setting_wireguard_append_peer(s_wg, data_peers->pdata[i]);
}
for (is_v4 = 0; is_v4 < 2; is_v4++) {
const char *method_disabled = is_v4 ? NM_SETTING_IP4_CONFIG_METHOD_DISABLED : NM_SETTING_IP6_CONFIG_METHOD_DISABLED;
const char *method_manual = is_v4 ? NM_SETTING_IP4_CONFIG_METHOD_MANUAL : NM_SETTING_IP6_CONFIG_METHOD_MANUAL;
const char *method_disabled =
is_v4 ? NM_SETTING_IP4_CONFIG_METHOD_DISABLED : NM_SETTING_IP6_CONFIG_METHOD_DISABLED;
const char *method_manual =
is_v4 ? NM_SETTING_IP4_CONFIG_METHOD_MANUAL : NM_SETTING_IP6_CONFIG_METHOD_MANUAL;
NMSettingIPConfig *s_ip = is_v4 ? s_ip4 : s_ip6;
GPtrArray *data_dns = is_v4 ? data_dns_v4 : data_dns_v6;
GPtrArray *data_addr = is_v4 ? data_addr_v4 : data_addr_v6;
GPtrArray *data_dns_search2 = data_dns_search;
GPtrArray * data_dns = is_v4 ? data_dns_v4 : data_dns_v6;
GPtrArray * data_addr = is_v4 ? data_addr_v4 : data_addr_v6;
GPtrArray * data_dns_search2 = data_dns_search;
if (data_dns && !data_addr) {
/* When specifying "DNS", we also require an "Address" for the same address
@ -756,7 +756,7 @@ fail_invalid_secret:
data_dns_search2 = NULL;
}
g_object_set (s_ip,
g_object_set(s_ip,
NM_SETTING_IP_CONFIG_METHOD,
data_addr ? method_manual : method_disabled,
NULL);
@ -764,27 +764,24 @@ fail_invalid_secret:
/* For WireGuard profiles, always set dns-priority to a negative value,
* so that DNS servers on other profiles get ignored. This is also what
* wg-quick does, by calling `resolvconf -x`. */
g_object_set (s_ip,
NM_SETTING_IP_CONFIG_DNS_PRIORITY,
(int) -50,
NULL);
g_object_set(s_ip, NM_SETTING_IP_CONFIG_DNS_PRIORITY, (int) -50, NULL);
if (data_addr) {
for (i = 0; i < data_addr->len; i++)
nm_setting_ip_config_add_address (s_ip, data_addr->pdata[i]);
nm_setting_ip_config_add_address(s_ip, data_addr->pdata[i]);
}
if (data_dns) {
for (i = 0; i < data_dns->len; i++)
nm_setting_ip_config_add_dns (s_ip, data_dns->pdata[i]);
nm_setting_ip_config_add_dns(s_ip, data_dns->pdata[i]);
/* Of the wg-quick doesn't specify a search domain, assume the user
* wants to use the domain server for all searches. */
if (!data_dns_search2)
nm_setting_ip_config_add_dns_search (s_ip, "~");
nm_setting_ip_config_add_dns_search(s_ip, "~");
}
if (data_dns_search2) {
for (i = 0; i < data_dns_search2->len; i++)
nm_setting_ip_config_add_dns_search (s_ip, data_dns_search2->pdata[i]);
nm_setting_ip_config_add_dns_search(s_ip, data_dns_search2->pdata[i]);
}
if (data_table == _TABLE_AUTO) {
@ -805,25 +802,20 @@ fail_invalid_secret:
*/
} else if (data_table == _TABLE_OFF) {
if (is_v4) {
g_object_set (s_wg,
NM_SETTING_WIREGUARD_PEER_ROUTES,
FALSE,
NULL);
g_object_set(s_wg, NM_SETTING_WIREGUARD_PEER_ROUTES, FALSE, NULL);
}
} else {
g_object_set (s_ip,
NM_SETTING_IP_CONFIG_ROUTE_TABLE,
(guint) data_table,
NULL);
g_object_set(s_ip, NM_SETTING_IP_CONFIG_ROUTE_TABLE, (guint) data_table, NULL);
}
}
if (!nm_connection_normalize (connection, NULL, NULL, &local)) {
nm_utils_error_set (error, NM_UTILS_ERROR_INVALID_ARGUMENT,
if (!nm_connection_normalize(connection, NULL, NULL, &local)) {
nm_utils_error_set(error,
NM_UTILS_ERROR_INVALID_ARGUMENT,
_("Failed to create WireGuard connection: %s"),
local->message);
return FALSE;
}
return g_steal_pointer (&connection);
return g_steal_pointer(&connection);
}

View file

@ -11,22 +11,21 @@ typedef struct {
const char *ui_name;
} NmcVpnPasswordName;
GSList *nm_vpn_get_plugin_infos (void);
GSList *nm_vpn_get_plugin_infos(void);
NMVpnEditorPlugin *nm_vpn_get_editor_plugin (const char *service_type, GError **error);
NMVpnEditorPlugin *nm_vpn_get_editor_plugin(const char *service_type, GError **error);
gboolean nm_vpn_supports_ipv6 (NMConnection *connection);
gboolean nm_vpn_supports_ipv6(NMConnection *connection);
const NmcVpnPasswordName *nm_vpn_get_secret_names (const char *service_type);
const NmcVpnPasswordName *nm_vpn_get_secret_names(const char *service_type);
gboolean nm_vpn_openconnect_authenticate_helper (const char *host,
char **cookie,
char **gateway,
char **gwcert,
int *status,
GError **error);
gboolean nm_vpn_openconnect_authenticate_helper(const char *host,
char ** cookie,
char ** gateway,
char ** gwcert,
int * status,
GError ** error);
NMConnection *nm_vpn_wireguard_import (const char *filename,
GError **error);
NMConnection *nm_vpn_wireguard_import(const char *filename, GError **error);
#endif /* __NM_VPN_HELPERS_H__ */

View file

@ -33,7 +33,6 @@
#define testable // Expose private functions
#endif
/*---- Forward declarations for private functions ----*/
// Regarding all public and private functions defined in this source file:
@ -54,13 +53,17 @@
testable void appendBitsToBuffer(unsigned int val, int numBits, uint8_t buffer[], int *bitLen);
testable void addEccAndInterleave(uint8_t data[], int version, enum qrcodegen_Ecc ecl, uint8_t result[]);
testable void
addEccAndInterleave(uint8_t data[], int version, enum qrcodegen_Ecc ecl, uint8_t result[]);
testable int getNumDataCodewords(int version, enum qrcodegen_Ecc ecl);
testable int getNumRawDataModules(int ver);
testable void calcReedSolomonGenerator(int degree, uint8_t result[]);
testable void calcReedSolomonRemainder(const uint8_t data[], int dataLen,
const uint8_t generator[], int degree, uint8_t result[]);
testable void calcReedSolomonRemainder(const uint8_t data[],
int dataLen,
const uint8_t generator[],
int degree,
uint8_t result[]);
testable uint8_t finiteFieldMultiply(uint8_t x, uint8_t y);
testable void initializeFunctionModules(int version, uint8_t qrcode[]);
@ -84,8 +87,6 @@ testable int calcSegmentBitLength(enum qrcodegen_Mode mode, size_t numChars);
testable int getTotalBits(const struct qrcodegen_Segment segs[], size_t len, int version);
static int numCharCountBits(enum qrcodegen_Mode mode, int version);
/*---- Private tables of constants ----*/
// The set of all legal characters in alphanumeric mode, where each character
@ -96,10 +97,14 @@ static const char *ALPHANUMERIC_CHARSET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
testable const int8_t ECC_CODEWORDS_PER_BLOCK[4][41] = {
// Version: (note that index 0 is for padding, and is set to an illegal value)
//0, 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 Error correction level
{-1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, // Low
{-1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, // Medium
{-1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, // Quartile
{-1, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, // High
{-1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28,
28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, // Low
{-1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26,
26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, // Medium
{-1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30,
28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, // Quartile
{-1, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28,
30, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, // High
};
#define qrcodegen_REED_SOLOMON_DEGREE_MAX 30 // Based on the table above
@ -108,10 +113,14 @@ testable const int8_t ECC_CODEWORDS_PER_BLOCK[4][41] = {
testable const int8_t NUM_ERROR_CORRECTION_BLOCKS[4][41] = {
// Version: (note that index 0 is for padding, and is set to an illegal value)
//0, 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 Error correction level
{-1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25}, // Low
{-1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49}, // Medium
{-1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68}, // Quartile
{-1, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81}, // High
{-1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8,
8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25}, // Low
{-1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16,
17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49}, // Medium
{-1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20,
23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68}, // Quartile
{-1, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25,
25, 34, 30, 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81}, // High
};
// For automatic mask pattern selection.
@ -120,17 +129,30 @@ static const int PENALTY_N2 = 3;
static const int PENALTY_N3 = 40;
static const int PENALTY_N4 = 10;
/*---- High-level QR Code encoding functions ----*/
// Public function - see documentation comment in header file.
bool qrcodegen_encodeText(const char *text, uint8_t tempBuffer[], uint8_t qrcode[],
enum qrcodegen_Ecc ecl, int minVersion, int maxVersion, enum qrcodegen_Mask mask, bool boostEcl) {
bool
qrcodegen_encodeText(const char * text,
uint8_t tempBuffer[],
uint8_t qrcode[],
enum qrcodegen_Ecc ecl,
int minVersion,
int maxVersion,
enum qrcodegen_Mask mask,
bool boostEcl)
{
size_t textLen = strlen(text);
if (textLen == 0)
return qrcodegen_encodeSegmentsAdvanced(NULL, 0, ecl, minVersion, maxVersion, mask, boostEcl, tempBuffer, qrcode);
return qrcodegen_encodeSegmentsAdvanced(NULL,
0,
ecl,
minVersion,
maxVersion,
mask,
boostEcl,
tempBuffer,
qrcode);
size_t bufLen = qrcodegen_BUFFER_LEN_FOR_VERSION(maxVersion);
struct qrcodegen_Segment seg;
@ -146,26 +168,40 @@ bool qrcodegen_encodeText(const char *text, uint8_t tempBuffer[], uint8_t qrcode
if (textLen > bufLen)
goto fail;
for (size_t i = 0; i < textLen; i++)
tempBuffer[i] = (uint8_t)text[i];
tempBuffer[i] = (uint8_t) text[i];
seg.mode = qrcodegen_Mode_BYTE;
seg.bitLength = calcSegmentBitLength(seg.mode, textLen);
if (seg.bitLength == -1)
goto fail;
seg.numChars = (int)textLen;
seg.numChars = (int) textLen;
seg.data = tempBuffer;
}
return qrcodegen_encodeSegmentsAdvanced(&seg, 1, ecl, minVersion, maxVersion, mask, boostEcl, tempBuffer, qrcode);
return qrcodegen_encodeSegmentsAdvanced(&seg,
1,
ecl,
minVersion,
maxVersion,
mask,
boostEcl,
tempBuffer,
qrcode);
fail:
qrcode[0] = 0; // Set size to invalid value for safety
return false;
}
// Public function - see documentation comment in header file.
bool qrcodegen_encodeBinary(uint8_t dataAndTemp[], size_t dataLen, uint8_t qrcode[],
enum qrcodegen_Ecc ecl, int minVersion, int maxVersion, enum qrcodegen_Mask mask, bool boostEcl) {
bool
qrcodegen_encodeBinary(uint8_t dataAndTemp[],
size_t dataLen,
uint8_t qrcode[],
enum qrcodegen_Ecc ecl,
int minVersion,
int maxVersion,
enum qrcodegen_Mask mask,
bool boostEcl)
{
struct qrcodegen_Segment seg;
seg.mode = qrcodegen_Mode_BYTE;
seg.bitLength = calcSegmentBitLength(seg.mode, dataLen);
@ -173,43 +209,72 @@ bool qrcodegen_encodeBinary(uint8_t dataAndTemp[], size_t dataLen, uint8_t qrcod
qrcode[0] = 0; // Set size to invalid value for safety
return false;
}
seg.numChars = (int)dataLen;
seg.numChars = (int) dataLen;
seg.data = dataAndTemp;
return qrcodegen_encodeSegmentsAdvanced(&seg, 1, ecl, minVersion, maxVersion, mask, boostEcl, dataAndTemp, qrcode);
return qrcodegen_encodeSegmentsAdvanced(&seg,
1,
ecl,
minVersion,
maxVersion,
mask,
boostEcl,
dataAndTemp,
qrcode);
}
// Appends the given number of low-order bits of the given value to the given byte-based
// bit buffer, increasing the bit length. Requires 0 <= numBits <= 16 and val < 2^numBits.
testable void appendBitsToBuffer(unsigned int val, int numBits, uint8_t buffer[], int *bitLen) {
assert(0 <= numBits && numBits <= 16 && (unsigned long)val >> numBits == 0);
testable void
appendBitsToBuffer(unsigned int val, int numBits, uint8_t buffer[], int *bitLen)
{
assert(0 <= numBits && numBits <= 16 && (unsigned long) val >> numBits == 0);
for (int i = numBits - 1; i >= 0; i--, (*bitLen)++)
buffer[*bitLen >> 3] |= ((val >> i) & 1) << (7 - (*bitLen & 7));
}
/*---- Low-level QR Code encoding functions ----*/
// Public function - see documentation comment in header file.
bool qrcodegen_encodeSegments(const struct qrcodegen_Segment segs[], size_t len,
enum qrcodegen_Ecc ecl, uint8_t tempBuffer[], uint8_t qrcode[]) {
return qrcodegen_encodeSegmentsAdvanced(segs, len, ecl,
qrcodegen_VERSION_MIN, qrcodegen_VERSION_MAX, -1, true, tempBuffer, qrcode);
bool
qrcodegen_encodeSegments(const struct qrcodegen_Segment segs[],
size_t len,
enum qrcodegen_Ecc ecl,
uint8_t tempBuffer[],
uint8_t qrcode[])
{
return qrcodegen_encodeSegmentsAdvanced(segs,
len,
ecl,
qrcodegen_VERSION_MIN,
qrcodegen_VERSION_MAX,
-1,
true,
tempBuffer,
qrcode);
}
// Public function - see documentation comment in header file.
bool qrcodegen_encodeSegmentsAdvanced(const struct qrcodegen_Segment segs[], size_t len, enum qrcodegen_Ecc ecl,
int minVersion, int maxVersion, int mask, bool boostEcl, uint8_t tempBuffer[], uint8_t qrcode[]) {
bool
qrcodegen_encodeSegmentsAdvanced(const struct qrcodegen_Segment segs[],
size_t len,
enum qrcodegen_Ecc ecl,
int minVersion,
int maxVersion,
int mask,
bool boostEcl,
uint8_t tempBuffer[],
uint8_t qrcode[])
{
assert(segs != NULL || len == 0);
assert(qrcodegen_VERSION_MIN <= minVersion && minVersion <= maxVersion && maxVersion <= qrcodegen_VERSION_MAX);
assert(0 <= (int)ecl && (int)ecl <= 3 && -1 <= (int)mask && (int)mask <= 7);
assert(qrcodegen_VERSION_MIN <= minVersion && minVersion <= maxVersion
&& maxVersion <= qrcodegen_VERSION_MAX);
assert(0 <= (int) ecl && (int) ecl <= 3 && -1 <= (int) mask && (int) mask <= 7);
// Find the minimal version number to use
int version, dataUsedBits;
for (version = minVersion; ; version++) {
int dataCapacityBits = getNumDataCodewords(version, ecl) * 8; // Number of data bits available
for (version = minVersion;; version++) {
int dataCapacityBits =
getNumDataCodewords(version, ecl) * 8; // Number of data bits available
dataUsedBits = getTotalBits(segs, len, version);
if (dataUsedBits != -1 && dataUsedBits <= dataCapacityBits)
break; // This version number is found to be suitable
@ -221,9 +286,10 @@ bool qrcodegen_encodeSegmentsAdvanced(const struct qrcodegen_Segment segs[], siz
assert(dataUsedBits != -1);
// Increase the error correction level while the data still fits in the current version number
for (int i = (int)qrcodegen_Ecc_MEDIUM; i <= (int)qrcodegen_Ecc_HIGH; i++) { // From low to high
if (boostEcl && dataUsedBits <= getNumDataCodewords(version, (enum qrcodegen_Ecc)i) * 8)
ecl = (enum qrcodegen_Ecc)i;
for (int i = (int) qrcodegen_Ecc_MEDIUM; i <= (int) qrcodegen_Ecc_HIGH;
i++) { // From low to high
if (boostEcl && dataUsedBits <= getNumDataCodewords(version, (enum qrcodegen_Ecc) i) * 8)
ecl = (enum qrcodegen_Ecc) i;
}
// Concatenate all segments to create the data bit string
@ -231,7 +297,7 @@ bool qrcodegen_encodeSegmentsAdvanced(const struct qrcodegen_Segment segs[], siz
int bitLen = 0;
for (size_t i = 0; i < len; i++) {
const struct qrcodegen_Segment *seg = &segs[i];
appendBitsToBuffer((int)seg->mode, 4, qrcode, &bitLen);
appendBitsToBuffer((int) seg->mode, 4, qrcode, &bitLen);
appendBitsToBuffer(seg->numChars, numCharCountBits(seg->mode, version), qrcode, &bitLen);
for (int j = 0; j < seg->bitLength; j++)
appendBitsToBuffer((seg->data[j >> 3] >> (7 - (j & 7))) & 1, 1, qrcode, &bitLen);
@ -263,7 +329,7 @@ bool qrcodegen_encodeSegmentsAdvanced(const struct qrcodegen_Segment segs[], siz
if (mask == qrcodegen_Mask_AUTO) { // Automatically choose best mask
long minPenalty = LONG_MAX;
for (int i = 0; i < 8; i++) {
enum qrcodegen_Mask msk = (enum qrcodegen_Mask)i;
enum qrcodegen_Mask msk = (enum qrcodegen_Mask) i;
drawFormatBits(ecl, msk, qrcode);
applyMask(tempBuffer, qrcode, msk);
long penalty = getPenaltyScore(qrcode);
@ -274,25 +340,26 @@ bool qrcodegen_encodeSegmentsAdvanced(const struct qrcodegen_Segment segs[], siz
applyMask(tempBuffer, qrcode, msk); // Undoes the mask due to XOR
}
}
assert(0 <= (int)mask && (int)mask <= 7);
assert(0 <= (int) mask && (int) mask <= 7);
drawFormatBits(ecl, mask, qrcode);
applyMask(tempBuffer, qrcode, mask);
return true;
}
/*---- Error correction code generation functions ----*/
// Appends error correction bytes to each block of the given data array, then interleaves
// bytes from the blocks and stores them in the result array. data[0 : dataLen] contains
// the input data. data[dataLen : rawCodewords] is used as a temporary work area and will
// be clobbered by this function. The final answer is stored in result[0 : rawCodewords].
testable void addEccAndInterleave(uint8_t data[], int version, enum qrcodegen_Ecc ecl, uint8_t result[]) {
testable void
addEccAndInterleave(uint8_t data[], int version, enum qrcodegen_Ecc ecl, uint8_t result[])
{
// Calculate parameter numbers
assert(0 <= (int)ecl && (int)ecl < 4 && qrcodegen_VERSION_MIN <= version && version <= qrcodegen_VERSION_MAX);
int numBlocks = NUM_ERROR_CORRECTION_BLOCKS[(int)ecl][version];
int blockEccLen = ECC_CODEWORDS_PER_BLOCK [(int)ecl][version];
assert(0 <= (int) ecl && (int) ecl < 4 && qrcodegen_VERSION_MIN <= version
&& version <= qrcodegen_VERSION_MAX);
int numBlocks = NUM_ERROR_CORRECTION_BLOCKS[(int) ecl][version];
int blockEccLen = ECC_CODEWORDS_PER_BLOCK[(int) ecl][version];
int rawCodewords = getNumRawDataModules(version) / 8;
int dataLen = getNumDataCodewords(version, ecl);
int numShortBlocks = numBlocks - rawCodewords % numBlocks;
@ -318,22 +385,23 @@ testable void addEccAndInterleave(uint8_t data[], int version, enum qrcodegen_Ec
}
}
// Returns the number of 8-bit codewords that can be used for storing data (not ECC),
// for the given version number and error correction level. The result is in the range [9, 2956].
testable int getNumDataCodewords(int version, enum qrcodegen_Ecc ecl) {
int v = version, e = (int)ecl;
testable int
getNumDataCodewords(int version, enum qrcodegen_Ecc ecl)
{
int v = version, e = (int) ecl;
assert(0 <= e && e < 4);
return getNumRawDataModules(v) / 8
- ECC_CODEWORDS_PER_BLOCK [e][v]
* NUM_ERROR_CORRECTION_BLOCKS[e][v];
- ECC_CODEWORDS_PER_BLOCK[e][v] * NUM_ERROR_CORRECTION_BLOCKS[e][v];
}
// Returns the number of data bits that can be stored in a QR Code of the given version number, after
// all function modules are excluded. This includes remainder bits, so it might not be a multiple of 8.
// The result is in the range [208, 29648]. This could be implemented as a 40-entry lookup table.
testable int getNumRawDataModules(int ver) {
testable int
getNumRawDataModules(int ver)
{
assert(qrcodegen_VERSION_MIN <= ver && ver <= qrcodegen_VERSION_MAX);
int result = (16 * ver + 128) * ver + 64;
if (ver >= 2) {
@ -345,12 +413,12 @@ testable int getNumRawDataModules(int ver) {
return result;
}
/*---- Reed-Solomon ECC generator functions ----*/
// Calculates the Reed-Solomon generator polynomial of the given degree, storing in result[0 : degree].
testable void calcReedSolomonGenerator(int degree, uint8_t result[]) {
testable void
calcReedSolomonGenerator(int degree, uint8_t result[])
{
// Start with the monomial x^0
assert(1 <= degree && degree <= qrcodegen_REED_SOLOMON_DEGREE_MAX);
memset(result, 0, degree * sizeof(result[0]));
@ -371,12 +439,15 @@ testable void calcReedSolomonGenerator(int degree, uint8_t result[]) {
}
}
// Calculates the remainder of the polynomial data[0 : dataLen] when divided by the generator[0 : degree], where all
// polynomials are in big endian and the generator has an implicit leading 1 term, storing the result in result[0 : degree].
testable void calcReedSolomonRemainder(const uint8_t data[], int dataLen,
const uint8_t generator[], int degree, uint8_t result[]) {
testable void
calcReedSolomonRemainder(const uint8_t data[],
int dataLen,
const uint8_t generator[],
int degree,
uint8_t result[])
{
// Perform polynomial division
assert(1 <= degree && degree <= qrcodegen_REED_SOLOMON_DEGREE_MAX);
memset(result, 0, degree * sizeof(result[0]));
@ -391,10 +462,11 @@ testable void calcReedSolomonRemainder(const uint8_t data[], int dataLen,
#undef qrcodegen_REED_SOLOMON_DEGREE_MAX
// Returns the product of the two given field elements modulo GF(2^8/0x11D).
// All inputs are valid. This could be implemented as a 256*256 lookup table.
testable uint8_t finiteFieldMultiply(uint8_t x, uint8_t y) {
testable uint8_t
finiteFieldMultiply(uint8_t x, uint8_t y)
{
// Russian peasant multiplication
uint8_t z = 0;
for (int i = 7; i >= 0; i--) {
@ -404,17 +476,17 @@ testable uint8_t finiteFieldMultiply(uint8_t x, uint8_t y) {
return z;
}
/*---- Drawing function modules ----*/
// Clears the given QR Code grid with white modules for the given
// version's size, then marks every function module as black.
testable void initializeFunctionModules(int version, uint8_t qrcode[]) {
testable void
initializeFunctionModules(int version, uint8_t qrcode[])
{
// Initialize QR Code
int qrsize = version * 4 + 17;
memset(qrcode, 0, ((qrsize * qrsize + 7) / 8 + 1) * sizeof(qrcode[0]));
qrcode[0] = (uint8_t)qrsize;
qrcode[0] = (uint8_t) qrsize;
// Fill horizontal and vertical timing patterns
fillRectangle(6, 0, 1, qrsize, qrcode);
@ -431,7 +503,8 @@ testable void initializeFunctionModules(int version, uint8_t qrcode[]) {
for (int i = 0; i < numAlign; i++) {
for (int j = 0; j < numAlign; j++) {
// Don't draw on the three finder corners
if (!((i == 0 && j == 0) || (i == 0 && j == numAlign - 1) || (i == numAlign - 1 && j == 0)))
if (!((i == 0 && j == 0) || (i == 0 && j == numAlign - 1)
|| (i == numAlign - 1 && j == 0)))
fillRectangle(alignPatPos[i] - 2, alignPatPos[j] - 2, 5, 5, qrcode);
}
}
@ -443,11 +516,12 @@ testable void initializeFunctionModules(int version, uint8_t qrcode[]) {
}
}
// Draws white function modules and possibly some black modules onto the given QR Code, without changing
// non-function modules. This does not draw the format bits. This requires all function modules to be previously
// marked black (namely by initializeFunctionModules()), because this may skip redrawing black function modules.
static void drawWhiteFunctionModules(uint8_t qrcode[], int version) {
static void
drawWhiteFunctionModules(uint8_t qrcode[], int version)
{
// Draw horizontal and vertical timing patterns
int qrsize = qrcodegen_getSize(qrcode);
for (int i = 7; i < qrsize - 7; i += 2) {
@ -474,7 +548,8 @@ static void drawWhiteFunctionModules(uint8_t qrcode[], int version) {
int numAlign = getAlignmentPatternPositions(version, alignPatPos);
for (int i = 0; i < numAlign; i++) {
for (int j = 0; j < numAlign; j++) {
if ((i == 0 && j == 0) || (i == 0 && j == numAlign - 1) || (i == numAlign - 1 && j == 0))
if ((i == 0 && j == 0) || (i == 0 && j == numAlign - 1)
|| (i == numAlign - 1 && j == 0))
continue; // Don't draw on the three finder corners
for (int dy = -1; dy <= 1; dy++) {
for (int dx = -1; dx <= 1; dx++)
@ -489,7 +564,7 @@ static void drawWhiteFunctionModules(uint8_t qrcode[], int version) {
int rem = version; // version is uint6, in the range [7, 40]
for (int i = 0; i < 12; i++)
rem = (rem << 1) ^ ((rem >> 11) * 0x1F25);
long bits = (long)version << 12 | rem; // uint18
long bits = (long) version << 12 | rem; // uint18
assert(bits >> 18 == 0);
// Draw two copies
@ -504,15 +579,16 @@ static void drawWhiteFunctionModules(uint8_t qrcode[], int version) {
}
}
// Draws two copies of the format bits (with its own error correction code) based
// on the given mask and error correction level. This always draws all modules of
// the format bits, unlike drawWhiteFunctionModules() which might skip black modules.
static void drawFormatBits(enum qrcodegen_Ecc ecl, enum qrcodegen_Mask mask, uint8_t qrcode[]) {
static void
drawFormatBits(enum qrcodegen_Ecc ecl, enum qrcodegen_Mask mask, uint8_t qrcode[])
{
// Calculate error correction code and pack bits
assert(0 <= (int)mask && (int)mask <= 7);
assert(0 <= (int) mask && (int) mask <= 7);
static const int table[] = {1, 0, 3, 2};
int data = table[(int)ecl] << 3 | (int)mask; // errCorrLvl is uint2, mask is uint3
int data = table[(int) ecl] << 3 | (int) mask; // errCorrLvl is uint2, mask is uint3
int rem = data;
for (int i = 0; i < 10; i++)
rem = (rem << 1) ^ ((rem >> 9) * 0x537);
@ -537,43 +613,45 @@ static void drawFormatBits(enum qrcodegen_Ecc ecl, enum qrcodegen_Mask mask, uin
setModule(qrcode, 8, qrsize - 8, true); // Always black
}
// Calculates and stores an ascending list of positions of alignment patterns
// for this version number, returning the length of the list (in the range [0,7]).
// Each position is in the range [0,177), and are used on both the x and y axes.
// This could be implemented as lookup table of 40 variable-length lists of unsigned bytes.
testable int getAlignmentPatternPositions(int version, uint8_t result[7]) {
testable int
getAlignmentPatternPositions(int version, uint8_t result[7])
{
if (version == 1)
return 0;
int numAlign = version / 7 + 2;
int step = (version == 32) ? 26 :
(version*4 + numAlign*2 + 1) / (numAlign*2 - 2) * 2;
int step = (version == 32) ? 26 : (version * 4 + numAlign * 2 + 1) / (numAlign * 2 - 2) * 2;
for (int i = numAlign - 1, pos = version * 4 + 10; i >= 1; i--, pos -= step)
result[i] = pos;
result[0] = 6;
return numAlign;
}
// Sets every pixel in the range [left : left + width] * [top : top + height] to black.
static void fillRectangle(int left, int top, int width, int height, uint8_t qrcode[]) {
static void
fillRectangle(int left, int top, int width, int height, uint8_t qrcode[])
{
for (int dy = 0; dy < height; dy++) {
for (int dx = 0; dx < width; dx++)
setModule(qrcode, left + dx, top + dy, true);
}
}
/*---- Drawing data modules and masking ----*/
// Draws the raw codewords (including data and ECC) onto the given QR Code. This requires the initial state of
// the QR Code to be black at function modules and white at codeword modules (including unused remainder bits).
static void drawCodewords(const uint8_t data[], int dataLen, uint8_t qrcode[]) {
static void
drawCodewords(const uint8_t data[], int dataLen, uint8_t qrcode[])
{
int qrsize = qrcodegen_getSize(qrcode);
int i = 0; // Bit index into the data
// Do the funny zigzag scan
for (int right = qrsize - 1; right >= 1; right -= 2) { // Index of right column in each column pair
for (int right = qrsize - 1; right >= 1;
right -= 2) { // Index of right column in each column pair
if (right == 6)
right = 5;
for (int vert = 0; vert < qrsize; vert++) { // Vertical counter
@ -594,30 +672,49 @@ static void drawCodewords(const uint8_t data[], int dataLen, uint8_t qrcode[]) {
assert(i == dataLen * 8);
}
// XORs the codeword modules in this QR Code with the given mask pattern.
// The function modules must be marked and the codeword bits must be drawn
// before masking. Due to the arithmetic of XOR, calling applyMask() with
// the same mask value a second time will undo the mask. A final well-formed
// QR Code needs exactly one (not zero, two, etc.) mask applied.
static void applyMask(const uint8_t functionModules[], uint8_t qrcode[], enum qrcodegen_Mask mask) {
assert(0 <= (int)mask && (int)mask <= 7); // Disallows qrcodegen_Mask_AUTO
static void
applyMask(const uint8_t functionModules[], uint8_t qrcode[], enum qrcodegen_Mask mask)
{
assert(0 <= (int) mask && (int) mask <= 7); // Disallows qrcodegen_Mask_AUTO
int qrsize = qrcodegen_getSize(qrcode);
for (int y = 0; y < qrsize; y++) {
for (int x = 0; x < qrsize; x++) {
if (getModule(functionModules, x, y))
continue;
bool invert;
switch ((int)mask) {
case 0: invert = (x + y) % 2 == 0; break;
case 1: invert = y % 2 == 0; break;
case 2: invert = x % 3 == 0; break;
case 3: invert = (x + y) % 3 == 0; break;
case 4: invert = (x / 3 + y / 2) % 2 == 0; break;
case 5: invert = x * y % 2 + x * y % 3 == 0; break;
case 6: invert = (x * y % 2 + x * y % 3) % 2 == 0; break;
case 7: invert = ((x + y) % 2 + x * y % 3) % 2 == 0; break;
default: assert(false); return;
switch ((int) mask) {
case 0:
invert = (x + y) % 2 == 0;
break;
case 1:
invert = y % 2 == 0;
break;
case 2:
invert = x % 3 == 0;
break;
case 3:
invert = (x + y) % 3 == 0;
break;
case 4:
invert = (x / 3 + y / 2) % 2 == 0;
break;
case 5:
invert = x * y % 2 + x * y % 3 == 0;
break;
case 6:
invert = (x * y % 2 + x * y % 3) % 2 == 0;
break;
case 7:
invert = ((x + y) % 2 + x * y % 3) % 2 == 0;
break;
default:
assert(false);
return;
}
bool val = getModule(qrcode, x, y);
setModule(qrcode, x, y, val ^ invert);
@ -625,10 +722,11 @@ static void applyMask(const uint8_t functionModules[], uint8_t qrcode[], enum qr
}
}
// Calculates and returns the penalty score based on state of the given QR Code's current modules.
// This is used by the automatic mask choice algorithm to find the mask pattern that yields the lowest score.
static long getPenaltyScore(const uint8_t qrcode[]) {
static long
getPenaltyScore(const uint8_t qrcode[])
{
int qrsize = qrcodegen_getSize(qrcode);
long result = 0;
@ -689,9 +787,8 @@ static long getPenaltyScore(const uint8_t qrcode[]) {
for (int y = 0; y < qrsize - 1; y++) {
for (int x = 0; x < qrsize - 1; x++) {
bool color = getModule(qrcode, x, y);
if ( color == getModule(qrcode, x + 1, y) &&
color == getModule(qrcode, x, y + 1) &&
color == getModule(qrcode, x + 1, y + 1))
if (color == getModule(qrcode, x + 1, y) && color == getModule(qrcode, x, y + 1)
&& color == getModule(qrcode, x + 1, y + 1))
result += PENALTY_N2;
}
}
@ -706,24 +803,26 @@ static long getPenaltyScore(const uint8_t qrcode[]) {
}
int total = qrsize * qrsize; // Note that size is odd, so black/total != 1/2
// Compute the smallest integer k >= 0 such that (45-5k)% <= black/total <= (55+5k)%
int k = (int)((labs(black * 20L - total * 10L) + total - 1) / total) - 1;
int k = (int) ((labs(black * 20L - total * 10L) + total - 1) / total) - 1;
result += k * PENALTY_N4;
return result;
}
// Inserts the given value to the front of the given array, which shifts over the
// existing values and deletes the last value. A helper function for getPenaltyScore().
static void addRunToHistory(unsigned char run, unsigned char history[7]) {
static void
addRunToHistory(unsigned char run, unsigned char history[7])
{
memmove(&history[1], &history[0], 6 * sizeof(history[0]));
history[0] = run;
}
// Tests whether the given run history has the pattern of ratio 1:1:3:1:1 in the middle, and
// surrounded by at least 4 on either or both ends. A helper function for getPenaltyScore().
// Must only be called immediately after a run of white modules has ended.
static bool hasFinderLikePattern(unsigned char runHistory[7]) {
static bool
hasFinderLikePattern(unsigned char runHistory[7])
{
unsigned char n = runHistory[1];
// The maximum QR Code size is 177, hence the run length n <= 177.
// Arithmetic is promoted to int, so n*4 will not overflow.
@ -731,12 +830,12 @@ static bool hasFinderLikePattern(unsigned char runHistory[7]) {
&& runHistory[3] == n * 3 && (runHistory[0] >= n * 4 || runHistory[6] >= n * 4);
}
/*---- Basic QR Code information ----*/
// Public function - see documentation comment in header file.
int qrcodegen_getSize(const uint8_t qrcode[]) {
int
qrcodegen_getSize(const uint8_t qrcode[])
{
assert(qrcode != NULL);
int result = qrcode[0];
assert((qrcodegen_VERSION_MIN * 4 + 17) <= result
@ -744,26 +843,29 @@ int qrcodegen_getSize(const uint8_t qrcode[]) {
return result;
}
// Public function - see documentation comment in header file.
bool qrcodegen_getModule(const uint8_t qrcode[], int x, int y) {
bool
qrcodegen_getModule(const uint8_t qrcode[], int x, int y)
{
assert(qrcode != NULL);
int qrsize = qrcode[0];
return (0 <= x && x < qrsize && 0 <= y && y < qrsize) && getModule(qrcode, x, y);
}
// Gets the module at the given coordinates, which must be in bounds.
testable bool getModule(const uint8_t qrcode[], int x, int y) {
testable bool
getModule(const uint8_t qrcode[], int x, int y)
{
int qrsize = qrcode[0];
assert(21 <= qrsize && qrsize <= 177 && 0 <= x && x < qrsize && 0 <= y && y < qrsize);
int index = y * qrsize + x;
return getBit(qrcode[(index >> 3) + 1], index & 7);
}
// Sets the module at the given coordinates, which must be in bounds.
testable void setModule(uint8_t qrcode[], int x, int y, bool isBlack) {
testable void
setModule(uint8_t qrcode[], int x, int y, bool isBlack)
{
int qrsize = qrcode[0];
assert(21 <= qrsize && qrsize <= 177 && 0 <= x && x < qrsize && 0 <= y && y < qrsize);
int index = y * qrsize + x;
@ -775,26 +877,28 @@ testable void setModule(uint8_t qrcode[], int x, int y, bool isBlack) {
qrcode[byteIndex] &= (1 << bitIndex) ^ 0xFF;
}
// Sets the module at the given coordinates, doing nothing if out of bounds.
testable void setModuleBounded(uint8_t qrcode[], int x, int y, bool isBlack) {
testable void
setModuleBounded(uint8_t qrcode[], int x, int y, bool isBlack)
{
int qrsize = qrcode[0];
if (0 <= x && x < qrsize && 0 <= y && y < qrsize)
setModule(qrcode, x, y, isBlack);
}
// Returns true iff the i'th bit of x is set to 1. Requires x >= 0 and 0 <= i <= 14.
static bool getBit(int x, int i) {
static bool
getBit(int x, int i)
{
return ((x >> i) & 1) != 0;
}
/*---- Segment handling ----*/
// Public function - see documentation comment in header file.
bool qrcodegen_isAlphanumeric(const char *text) {
bool
qrcodegen_isAlphanumeric(const char *text)
{
assert(text != NULL);
for (; *text != '\0'; text++) {
if (strchr(ALPHANUMERIC_CHARSET, *text) == NULL)
@ -803,9 +907,10 @@ bool qrcodegen_isAlphanumeric(const char *text) {
return true;
}
// Public function - see documentation comment in header file.
bool qrcodegen_isNumeric(const char *text) {
bool
qrcodegen_isNumeric(const char *text)
{
assert(text != NULL);
for (; *text != '\0'; text++) {
if (*text < '0' || *text > '9')
@ -814,17 +919,17 @@ bool qrcodegen_isNumeric(const char *text) {
return true;
}
// Public function - see documentation comment in header file.
size_t qrcodegen_calcSegmentBufferSize(enum qrcodegen_Mode mode, size_t numChars) {
size_t
qrcodegen_calcSegmentBufferSize(enum qrcodegen_Mode mode, size_t numChars)
{
int temp = calcSegmentBitLength(mode, numChars);
if (temp == -1)
return SIZE_MAX;
assert(0 <= temp && temp <= INT16_MAX);
return ((size_t)temp + 7) / 8;
return ((size_t) temp + 7) / 8;
}
// Returns the number of data bits needed to represent a segment
// containing the given number of characters using the given mode. Notes:
// - Returns -1 on failure, i.e. numChars > INT16_MAX or
@ -833,11 +938,13 @@ size_t qrcodegen_calcSegmentBufferSize(enum qrcodegen_Mode mode, size_t numChars
// - For byte mode, numChars measures the number of bytes, not Unicode code points.
// - For ECI mode, numChars must be 0, and the worst-case number of bits is returned.
// An actual ECI segment can have shorter data. For non-ECI modes, the result is exact.
testable int calcSegmentBitLength(enum qrcodegen_Mode mode, size_t numChars) {
testable int
calcSegmentBitLength(enum qrcodegen_Mode mode, size_t numChars)
{
// All calculations are designed to avoid overflow on all platforms
if (numChars > (unsigned int)INT16_MAX)
if (numChars > (unsigned int) INT16_MAX)
return -1;
long result = (long)numChars;
long result = (long) numChars;
if (mode == qrcodegen_Mode_NUMERIC)
result = (result * 10 + 2) / 3; // ceil(10/3 * n)
else if (mode == qrcodegen_Mode_ALPHANUMERIC)
@ -853,38 +960,40 @@ testable int calcSegmentBitLength(enum qrcodegen_Mode mode, size_t numChars) {
return -1;
}
assert(result >= 0);
if (result > (unsigned int)INT16_MAX)
if (result > (unsigned int) INT16_MAX)
return -1;
return (int)result;
return (int) result;
}
// Public function - see documentation comment in header file.
struct qrcodegen_Segment qrcodegen_makeBytes(const uint8_t data[], size_t len, uint8_t buf[]) {
struct qrcodegen_Segment
qrcodegen_makeBytes(const uint8_t data[], size_t len, uint8_t buf[])
{
assert(data != NULL || len == 0);
struct qrcodegen_Segment result;
result.mode = qrcodegen_Mode_BYTE;
result.bitLength = calcSegmentBitLength(result.mode, len);
assert(result.bitLength != -1);
result.numChars = (int)len;
result.numChars = (int) len;
if (len > 0)
memcpy(buf, data, len * sizeof(buf[0]));
result.data = buf;
return result;
}
// Public function - see documentation comment in header file.
struct qrcodegen_Segment qrcodegen_makeNumeric(const char *digits, uint8_t buf[]) {
struct qrcodegen_Segment
qrcodegen_makeNumeric(const char *digits, uint8_t buf[])
{
assert(digits != NULL);
struct qrcodegen_Segment result;
size_t len = strlen(digits);
result.mode = qrcodegen_Mode_NUMERIC;
int bitLen = calcSegmentBitLength(result.mode, len);
assert(bitLen != -1);
result.numChars = (int)len;
result.numChars = (int) len;
if (bitLen > 0)
memset(buf, 0, ((size_t)bitLen + 7) / 8 * sizeof(buf[0]));
memset(buf, 0, ((size_t) bitLen + 7) / 8 * sizeof(buf[0]));
result.bitLength = 0;
unsigned int accumData = 0;
@ -892,7 +1001,7 @@ struct qrcodegen_Segment qrcodegen_makeNumeric(const char *digits, uint8_t buf[]
for (; *digits != '\0'; digits++) {
char c = *digits;
assert('0' <= c && c <= '9');
accumData = accumData * 10 + (unsigned int)(c - '0');
accumData = accumData * 10 + (unsigned int) (c - '0');
accumCount++;
if (accumCount == 3) {
appendBitsToBuffer(accumData, 10, buf, &result.bitLength);
@ -907,18 +1016,19 @@ struct qrcodegen_Segment qrcodegen_makeNumeric(const char *digits, uint8_t buf[]
return result;
}
// Public function - see documentation comment in header file.
struct qrcodegen_Segment qrcodegen_makeAlphanumeric(const char *text, uint8_t buf[]) {
struct qrcodegen_Segment
qrcodegen_makeAlphanumeric(const char *text, uint8_t buf[])
{
assert(text != NULL);
struct qrcodegen_Segment result;
size_t len = strlen(text);
result.mode = qrcodegen_Mode_ALPHANUMERIC;
int bitLen = calcSegmentBitLength(result.mode, len);
assert(bitLen != -1);
result.numChars = (int)len;
result.numChars = (int) len;
if (bitLen > 0)
memset(buf, 0, ((size_t)bitLen + 7) / 8 * sizeof(buf[0]));
memset(buf, 0, ((size_t) bitLen + 7) / 8 * sizeof(buf[0]));
result.bitLength = 0;
unsigned int accumData = 0;
@ -926,7 +1036,7 @@ struct qrcodegen_Segment qrcodegen_makeAlphanumeric(const char *text, uint8_t bu
for (; *text != '\0'; text++) {
const char *temp = strchr(ALPHANUMERIC_CHARSET, *text);
assert(temp != NULL);
accumData = accumData * 45 + (unsigned int)(temp - ALPHANUMERIC_CHARSET);
accumData = accumData * 45 + (unsigned int) (temp - ALPHANUMERIC_CHARSET);
accumCount++;
if (accumCount == 2) {
appendBitsToBuffer(accumData, 11, buf, &result.bitLength);
@ -941,9 +1051,10 @@ struct qrcodegen_Segment qrcodegen_makeAlphanumeric(const char *text, uint8_t bu
return result;
}
// Public function - see documentation comment in header file.
struct qrcodegen_Segment qrcodegen_makeEci(long assignVal, uint8_t buf[]) {
struct qrcodegen_Segment
qrcodegen_makeEci(long assignVal, uint8_t buf[])
{
struct qrcodegen_Segment result;
result.mode = qrcodegen_Mode_ECI;
result.numChars = 0;
@ -968,11 +1079,12 @@ struct qrcodegen_Segment qrcodegen_makeEci(long assignVal, uint8_t buf[]) {
return result;
}
// Calculates the number of bits needed to encode the given segments at the given version.
// Returns a non-negative number if successful. Otherwise, returns -1 if a segment has too
// many characters to fit its length field, or the total bits exceeds INT16_MAX.
testable int getTotalBits(const struct qrcodegen_Segment segs[], size_t len, int version) {
testable int
getTotalBits(const struct qrcodegen_Segment segs[], size_t len, int version)
{
assert(segs != NULL || len == 0);
long result = 0;
for (size_t i = 0; i < len; i++) {
@ -989,21 +1101,41 @@ testable int getTotalBits(const struct qrcodegen_Segment segs[], size_t len, int
return -1; // The sum might overflow an int type
}
assert(0 <= result && result <= INT16_MAX);
return (int)result;
return (int) result;
}
// Returns the bit width of the character count field for a segment in the given mode
// in a QR Code at the given version number. The result is in the range [0, 16].
static int numCharCountBits(enum qrcodegen_Mode mode, int version) {
static int
numCharCountBits(enum qrcodegen_Mode mode, int version)
{
assert(qrcodegen_VERSION_MIN <= version && version <= qrcodegen_VERSION_MAX);
int i = (version + 7) / 17;
switch (mode) {
case qrcodegen_Mode_NUMERIC : { static const int temp[] = {10, 12, 14}; return temp[i]; }
case qrcodegen_Mode_ALPHANUMERIC: { static const int temp[] = { 9, 11, 13}; return temp[i]; }
case qrcodegen_Mode_BYTE : { static const int temp[] = { 8, 16, 16}; return temp[i]; }
case qrcodegen_Mode_KANJI : { static const int temp[] = { 8, 10, 12}; return temp[i]; }
case qrcodegen_Mode_ECI : return 0;
default: assert(false); return -1; // Dummy value
case qrcodegen_Mode_NUMERIC:
{
static const int temp[] = {10, 12, 14};
return temp[i];
}
case qrcodegen_Mode_ALPHANUMERIC:
{
static const int temp[] = {9, 11, 13};
return temp[i];
}
case qrcodegen_Mode_BYTE:
{
static const int temp[] = {8, 16, 16};
return temp[i];
}
case qrcodegen_Mode_KANJI:
{
static const int temp[] = {8, 10, 12};
return temp[i];
}
case qrcodegen_Mode_ECI:
return 0;
default:
assert(false);
return -1; // Dummy value
}
}

View file

@ -27,12 +27,10 @@
#include <stddef.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/*
* This library creates QR Code symbols, which is a type of two-dimension barcode.
* Invented by Denso Wave and described in the ISO/IEC 18004 standard.
@ -48,7 +46,6 @@ extern "C" {
* (Note that all ways require supplying the desired error correction level and various byte buffers.)
*/
/*---- Enum and struct types----*/
/*
@ -57,13 +54,12 @@ extern "C" {
enum qrcodegen_Ecc {
// Must be declared in ascending order of error protection
// so that an internal qrcodegen function works properly
qrcodegen_Ecc_LOW = 0 , // The QR Code can tolerate about 7% erroneous codewords
qrcodegen_Ecc_MEDIUM , // The QR Code can tolerate about 15% erroneous codewords
qrcodegen_Ecc_LOW = 0, // The QR Code can tolerate about 7% erroneous codewords
qrcodegen_Ecc_MEDIUM, // The QR Code can tolerate about 15% erroneous codewords
qrcodegen_Ecc_QUARTILE, // The QR Code can tolerate about 25% erroneous codewords
qrcodegen_Ecc_HIGH , // The QR Code can tolerate about 30% erroneous codewords
qrcodegen_Ecc_HIGH, // The QR Code can tolerate about 30% erroneous codewords
};
/*
* The mask pattern used in a QR Code symbol.
*/
@ -82,7 +78,6 @@ enum qrcodegen_Mask {
qrcodegen_Mask_7,
};
/*
* Describes how a segment's data bits are interpreted.
*/
@ -94,7 +89,6 @@ enum qrcodegen_Mode {
qrcodegen_Mode_ECI = 0x7,
};
/*
* A segment of character/binary/control data in a QR Code symbol.
* The mid-level way to create a segment is to take the payload data
@ -125,26 +119,24 @@ struct qrcodegen_Segment {
int bitLength;
};
/*---- Macro constants and functions ----*/
#define qrcodegen_VERSION_MIN 1 // The minimum version number supported in the QR Code Model 2 standard
#define qrcodegen_VERSION_MAX 40 // The maximum version number supported in the QR Code Model 2 standard
#define qrcodegen_VERSION_MIN \
1 // The minimum version number supported in the QR Code Model 2 standard
#define qrcodegen_VERSION_MAX \
40 // The maximum version number supported in the QR Code Model 2 standard
// Calculates the number of bytes needed to store any QR Code up to and including the given version number,
// as a compile-time constant. For example, 'uint8_t buffer[qrcodegen_BUFFER_LEN_FOR_VERSION(25)];'
// can store any single QR Code from version 1 to 25 (inclusive). The result fits in an int (or int16).
// Requires qrcodegen_VERSION_MIN <= n <= qrcodegen_VERSION_MAX.
#define qrcodegen_BUFFER_LEN_FOR_VERSION(n) ((((n) * 4 + 17) * ((n) * 4 + 17) + 7) / 8 + 1)
#define qrcodegen_BUFFER_LEN_FOR_VERSION(n) ((((n) *4 + 17) * ((n) *4 + 17) + 7) / 8 + 1)
// The worst-case number of bytes needed to store one QR Code, up to and including
// version 40. This value equals 3918, which is just under 4 kilobytes.
// Use this more convenient value to avoid calculating tighter memory bounds for buffers.
#define qrcodegen_BUFFER_LEN_MAX qrcodegen_BUFFER_LEN_FOR_VERSION(qrcodegen_VERSION_MAX)
/*---- Functions (high level) to generate QR Codes ----*/
/*
@ -166,9 +158,14 @@ struct qrcodegen_Segment {
* - Please consult the QR Code specification for information on
* data capacities per version, ECC level, and text encoding mode.
*/
bool qrcodegen_encodeText(const char *text, uint8_t tempBuffer[], uint8_t qrcode[],
enum qrcodegen_Ecc ecl, int minVersion, int maxVersion, enum qrcodegen_Mask mask, bool boostEcl);
bool qrcodegen_encodeText(const char * text,
uint8_t tempBuffer[],
uint8_t qrcode[],
enum qrcodegen_Ecc ecl,
int minVersion,
int maxVersion,
enum qrcodegen_Mask mask,
bool boostEcl);
/*
* Encodes the given binary data to a QR Code, returning true if encoding succeeded.
@ -188,9 +185,14 @@ bool qrcodegen_encodeText(const char *text, uint8_t tempBuffer[], uint8_t qrcode
* - Please consult the QR Code specification for information on
* data capacities per version, ECC level, and text encoding mode.
*/
bool qrcodegen_encodeBinary(uint8_t dataAndTemp[], size_t dataLen, uint8_t qrcode[],
enum qrcodegen_Ecc ecl, int minVersion, int maxVersion, enum qrcodegen_Mask mask, bool boostEcl);
bool qrcodegen_encodeBinary(uint8_t dataAndTemp[],
size_t dataLen,
uint8_t qrcode[],
enum qrcodegen_Ecc ecl,
int minVersion,
int maxVersion,
enum qrcodegen_Mask mask,
bool boostEcl);
/*---- Functions (low level) to generate QR Codes ----*/
@ -206,9 +208,11 @@ bool qrcodegen_encodeBinary(uint8_t dataAndTemp[], size_t dataLen, uint8_t qrcod
* result in them being clobbered, but the QR Code output will still be correct.
* But the qrcode array must not overlap tempBuffer or any segment's data buffer.
*/
bool qrcodegen_encodeSegments(const struct qrcodegen_Segment segs[], size_t len,
enum qrcodegen_Ecc ecl, uint8_t tempBuffer[], uint8_t qrcode[]);
bool qrcodegen_encodeSegments(const struct qrcodegen_Segment segs[],
size_t len,
enum qrcodegen_Ecc ecl,
uint8_t tempBuffer[],
uint8_t qrcode[]);
/*
* Renders a QR Code representing the given segments with the given encoding parameters.
@ -225,9 +229,15 @@ bool qrcodegen_encodeSegments(const struct qrcodegen_Segment segs[], size_t len,
* result in them being clobbered, but the QR Code output will still be correct.
* But the qrcode array must not overlap tempBuffer or any segment's data buffer.
*/
bool qrcodegen_encodeSegmentsAdvanced(const struct qrcodegen_Segment segs[], size_t len, enum qrcodegen_Ecc ecl,
int minVersion, int maxVersion, int mask, bool boostEcl, uint8_t tempBuffer[], uint8_t qrcode[]);
bool qrcodegen_encodeSegmentsAdvanced(const struct qrcodegen_Segment segs[],
size_t len,
enum qrcodegen_Ecc ecl,
int minVersion,
int maxVersion,
int mask,
bool boostEcl,
uint8_t tempBuffer[],
uint8_t qrcode[]);
/*
* Tests whether the given string can be encoded as a segment in alphanumeric mode.
@ -236,14 +246,12 @@ bool qrcodegen_encodeSegmentsAdvanced(const struct qrcodegen_Segment segs[], siz
*/
bool qrcodegen_isAlphanumeric(const char *text);
/*
* Tests whether the given string can be encoded as a segment in numeric mode.
* A string is encodable iff each character is in the range 0 to 9.
*/
bool qrcodegen_isNumeric(const char *text);
/*
* Returns the number of bytes (uint8_t) needed for the data buffer of a segment
* containing the given number of characters using the given mode. Notes:
@ -257,7 +265,6 @@ bool qrcodegen_isNumeric(const char *text);
*/
size_t qrcodegen_calcSegmentBufferSize(enum qrcodegen_Mode mode, size_t numChars);
/*
* Returns a segment representing the given binary data encoded in
* byte mode. All input byte arrays are acceptable. Any text string
@ -265,13 +272,11 @@ size_t qrcodegen_calcSegmentBufferSize(enum qrcodegen_Mode mode, size_t numChars
*/
struct qrcodegen_Segment qrcodegen_makeBytes(const uint8_t data[], size_t len, uint8_t buf[]);
/*
* Returns a segment representing the given string of decimal digits encoded in numeric mode.
*/
struct qrcodegen_Segment qrcodegen_makeNumeric(const char *digits, uint8_t buf[]);
/*
* Returns a segment representing the given text string encoded in alphanumeric mode.
* The characters allowed are: 0 to 9, A to Z (uppercase only), space,
@ -279,14 +284,12 @@ struct qrcodegen_Segment qrcodegen_makeNumeric(const char *digits, uint8_t buf[]
*/
struct qrcodegen_Segment qrcodegen_makeAlphanumeric(const char *text, uint8_t buf[]);
/*
* Returns a segment representing an Extended Channel Interpretation
* (ECI) designator with the given assignment value.
*/
struct qrcodegen_Segment qrcodegen_makeEci(long assignVal, uint8_t buf[]);
/*---- Functions to extract raw data from QR Codes ----*/
/*
@ -297,7 +300,6 @@ struct qrcodegen_Segment qrcodegen_makeEci(long assignVal, uint8_t buf[]);
*/
int qrcodegen_getSize(const uint8_t qrcode[]);
/*
* Returns the color of the module (pixel) at the given coordinates, which is false
* for white or true for black. The top left corner has the coordinates (x=0, y=0).
@ -305,7 +307,6 @@ int qrcodegen_getSize(const uint8_t qrcode[]);
*/
bool qrcodegen_getModule(const uint8_t qrcode[], int x, int y);
#ifdef __cplusplus
}
#endif

View file

@ -14,313 +14,345 @@
/*****************************************************************************/
static void
test_client_meta_check (void)
test_client_meta_check(void)
{
const NMMetaSettingInfoEditor *const*infos_p;
const NMMetaSettingInfoEditor *const *infos_p;
NMMetaSettingType m;
guint p;
G_STATIC_ASSERT (G_STRUCT_OFFSET (NMMetaAbstractInfo, meta_type) == G_STRUCT_OFFSET (NMMetaSettingInfoEditor, meta_type));
G_STATIC_ASSERT (G_STRUCT_OFFSET (NMMetaAbstractInfo, meta_type) == G_STRUCT_OFFSET (NMMetaPropertyInfo, meta_type));
G_STATIC_ASSERT(G_STRUCT_OFFSET(NMMetaAbstractInfo, meta_type)
== G_STRUCT_OFFSET(NMMetaSettingInfoEditor, meta_type));
G_STATIC_ASSERT(G_STRUCT_OFFSET(NMMetaAbstractInfo, meta_type)
== G_STRUCT_OFFSET(NMMetaPropertyInfo, meta_type));
for (m = 0; m < _NM_META_SETTING_TYPE_NUM; m++) {
const NMMetaSettingInfo *info = &nm_meta_setting_infos[m];
GType gtype;
g_assert (info);
g_assert (info->meta_type == m);
g_assert (info->setting_name);
g_assert (info->get_setting_gtype);
g_assert(info);
g_assert(info->meta_type == m);
g_assert(info->setting_name);
g_assert(info->get_setting_gtype);
gtype = info->get_setting_gtype ();
g_assert (gtype != NM_TYPE_SETTING);
gtype = info->get_setting_gtype();
g_assert(gtype != NM_TYPE_SETTING);
{
nm_auto_unref_gtypeclass GTypeClass *gclass = g_type_class_ref (gtype);
nm_auto_unref_gtypeclass GTypeClass *gclass = g_type_class_ref(gtype);
g_assert (G_TYPE_CHECK_CLASS_TYPE (gclass, gtype));
g_assert(G_TYPE_CHECK_CLASS_TYPE(gclass, gtype));
}
{
gs_unref_object NMSetting *setting = g_object_new (gtype, NULL);
gs_unref_object NMSetting *setting = g_object_new(gtype, NULL);
g_assert (NM_IS_SETTING (setting));
g_assert (G_TYPE_CHECK_INSTANCE_TYPE (setting, gtype));
g_assert_cmpstr (nm_setting_get_name (setting), ==, info->setting_name);
g_assert(NM_IS_SETTING(setting));
g_assert(G_TYPE_CHECK_INSTANCE_TYPE(setting, gtype));
g_assert_cmpstr(nm_setting_get_name(setting), ==, info->setting_name);
}
}
for (m = 0; m < _NM_META_SETTING_TYPE_NUM; m++) {
const NMMetaSettingInfoEditor *info = &nm_meta_setting_infos_editor[m];
g_assert (info);
g_assert (info->meta_type == &nm_meta_type_setting_info_editor);
g_assert (info->general);
g_assert (info->general == &nm_meta_setting_infos[m]);
g_assert(info);
g_assert(info->meta_type == &nm_meta_type_setting_info_editor);
g_assert(info->general);
g_assert(info->general == &nm_meta_setting_infos[m]);
g_assert_cmpstr (info->general->setting_name, ==, info->meta_type->get_name ((const NMMetaAbstractInfo *) info, FALSE));
g_assert_cmpstr ("name", ==, info->meta_type->get_name ((const NMMetaAbstractInfo *) info, TRUE));
g_assert_cmpstr(info->general->setting_name,
==,
info->meta_type->get_name((const NMMetaAbstractInfo *) info, FALSE));
g_assert_cmpstr("name",
==,
info->meta_type->get_name((const NMMetaAbstractInfo *) info, TRUE));
g_assert (info->properties_num == NM_PTRARRAY_LEN (info->properties));
g_assert(info->properties_num == NM_PTRARRAY_LEN(info->properties));
if (info->properties_num) {
gs_unref_hashtable GHashTable *property_names = g_hash_table_new (nm_str_hash, g_str_equal);
gs_unref_hashtable GHashTable *property_names =
g_hash_table_new(nm_str_hash, g_str_equal);
g_assert (info->properties);
g_assert(info->properties);
for (p = 0; p < info->properties_num; p++) {
const NMMetaPropertyInfo *pi = info->properties[p];
g_assert (pi);
g_assert (pi->meta_type == &nm_meta_type_property_info);
g_assert (pi->setting_info == info);
g_assert (pi->property_name);
g_assert(pi);
g_assert(pi->meta_type == &nm_meta_type_property_info);
g_assert(pi->setting_info == info);
g_assert(pi->property_name);
g_assert (g_hash_table_add (property_names, (gpointer) pi->property_name));
g_assert(g_hash_table_add(property_names, (gpointer) pi->property_name));
g_assert_cmpstr (pi->property_name, ==, pi->meta_type->get_name ((const NMMetaAbstractInfo *) pi, FALSE));
g_assert_cmpstr (pi->property_name, ==, pi->meta_type->get_name ((const NMMetaAbstractInfo *) pi, TRUE));
g_assert_cmpstr(pi->property_name,
==,
pi->meta_type->get_name((const NMMetaAbstractInfo *) pi, FALSE));
g_assert_cmpstr(pi->property_name,
==,
pi->meta_type->get_name((const NMMetaAbstractInfo *) pi, TRUE));
g_assert (pi->property_type);
g_assert (pi->property_type->get_fcn);
g_assert(pi->property_type);
g_assert(pi->property_type->get_fcn);
}
g_assert (!info->properties[info->properties_num]);
g_assert(!info->properties[info->properties_num]);
} else
g_assert (!info->properties);
g_assert(!info->properties);
if (info->valid_parts) {
gsize i, l;
gs_unref_hashtable GHashTable *dup = g_hash_table_new (nm_direct_hash, NULL);
gs_unref_hashtable GHashTable *dup = g_hash_table_new(nm_direct_hash, NULL);
l = NM_PTRARRAY_LEN (info->valid_parts);
g_assert (l >= 2);
l = NM_PTRARRAY_LEN(info->valid_parts);
g_assert(l >= 2);
for (i = 0; info->valid_parts[i]; i++) {
g_assert (info->valid_parts[i]->setting_info);
g_assert (g_hash_table_add (dup, (gpointer) info->valid_parts[i]->setting_info));
g_assert(info->valid_parts[i]->setting_info);
g_assert(g_hash_table_add(dup, (gpointer) info->valid_parts[i]->setting_info));
if (i == 0) {
g_assert (info->valid_parts[i]->setting_info == &nm_meta_setting_infos_editor[NM_META_SETTING_TYPE_CONNECTION]);
g_assert (info->valid_parts[i]->mandatory);
g_assert(info->valid_parts[i]->setting_info
== &nm_meta_setting_infos_editor[NM_META_SETTING_TYPE_CONNECTION]);
g_assert(info->valid_parts[i]->mandatory);
}
if (i == 1) {
g_assert (info->valid_parts[i]->setting_info == &nm_meta_setting_infos_editor[m]);
g_assert (info->valid_parts[i]->mandatory);
g_assert(info->valid_parts[i]->setting_info
== &nm_meta_setting_infos_editor[m]);
g_assert(info->valid_parts[i]->mandatory);
}
}
g_assert (i == l);
g_assert(i == l);
}
}
for (m = 0; m < _NM_META_SETTING_TYPE_NUM; m++) {
const NMMetaSettingInfoEditor *info = &nm_meta_setting_infos_editor[m];
g_assert (nm_meta_setting_info_editor_find_by_name (info->general->setting_name, FALSE) == info);
g_assert (nm_meta_setting_info_editor_find_by_gtype (info->general->get_setting_gtype ()) == info);
g_assert(nm_meta_setting_info_editor_find_by_name(info->general->setting_name, FALSE)
== info);
g_assert(nm_meta_setting_info_editor_find_by_gtype(info->general->get_setting_gtype())
== info);
for (p = 0; p < info->properties_num; p++) {
const NMMetaPropertyInfo *pi = info->properties[p];
g_assert (nm_meta_setting_info_editor_get_property_info (info, pi->property_name) == pi);
g_assert (nm_meta_property_info_find_by_name (info->general->setting_name, pi->property_name) == pi);
g_assert(nm_meta_setting_info_editor_get_property_info(info, pi->property_name) == pi);
g_assert(
nm_meta_property_info_find_by_name(info->general->setting_name, pi->property_name)
== pi);
}
}
infos_p = nm_meta_setting_infos_editor_p ();
g_assert (infos_p);
infos_p = nm_meta_setting_infos_editor_p();
g_assert(infos_p);
for (m = 0; m < _NM_META_SETTING_TYPE_NUM; m++)
g_assert (infos_p[m] == &nm_meta_setting_infos_editor[m]);
g_assert (!infos_p[m]);
g_assert(infos_p[m] == &nm_meta_setting_infos_editor[m]);
g_assert(!infos_p[m]);
}
/*****************************************************************************/
static void
test_client_import_wireguard_test0 (void)
test_client_import_wireguard_test0(void)
{
gs_unref_object NMConnection *connection;
NMSettingWireGuard *s_wg;
NMSettingIPConfig *s_ip4;
NMSettingIPConfig *s_ip6;
NMWireGuardPeer *peer;
NMSettingWireGuard * s_wg;
NMSettingIPConfig * s_ip4;
NMSettingIPConfig * s_ip6;
NMWireGuardPeer * peer;
gs_free_error GError *error = NULL;
connection = nm_vpn_wireguard_import (NM_BUILD_SRCDIR"/clients/common/tests/wg-test0.conf",
&error);
connection =
nm_vpn_wireguard_import(NM_BUILD_SRCDIR "/clients/common/tests/wg-test0.conf", &error);
g_assert_no_error (error);
g_assert_no_error(error);
g_assert_cmpstr (nm_connection_get_id (connection), ==, "wg-test0");
g_assert_cmpstr (nm_connection_get_interface_name (connection), ==, "wg-test0");
g_assert_cmpstr (nm_connection_get_connection_type (connection), ==, NM_SETTING_WIREGUARD_SETTING_NAME);
g_assert_cmpstr(nm_connection_get_id(connection), ==, "wg-test0");
g_assert_cmpstr(nm_connection_get_interface_name(connection), ==, "wg-test0");
g_assert_cmpstr(nm_connection_get_connection_type(connection),
==,
NM_SETTING_WIREGUARD_SETTING_NAME);
s_wg = NM_SETTING_WIREGUARD (nm_connection_get_setting (connection, NM_TYPE_SETTING_WIREGUARD));
s_wg = NM_SETTING_WIREGUARD(nm_connection_get_setting(connection, NM_TYPE_SETTING_WIREGUARD));
g_assert_cmpint (nm_setting_wireguard_get_listen_port (s_wg), ==, 51820);
g_assert_cmpstr (nm_setting_wireguard_get_private_key (s_wg), ==, "yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk=");
g_assert_cmpint(nm_setting_wireguard_get_listen_port(s_wg), ==, 51820);
g_assert_cmpstr(nm_setting_wireguard_get_private_key(s_wg),
==,
"yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk=");
g_assert_cmpint (nm_setting_wireguard_get_peers_len (s_wg), ==, 3);
g_assert_cmpint(nm_setting_wireguard_get_peers_len(s_wg), ==, 3);
peer = nm_setting_wireguard_get_peer (s_wg, 0);
g_assert_cmpstr (nm_wireguard_peer_get_public_key (peer), ==, "xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg=");
g_assert_cmpstr (nm_wireguard_peer_get_endpoint (peer), ==, "192.95.5.67:1234");
g_assert_cmpint (nm_wireguard_peer_get_allowed_ips_len (peer), ==, 2);
g_assert_cmpstr (nm_wireguard_peer_get_allowed_ip (peer, 0, NULL), ==, "10.192.122.3/32");
g_assert_cmpstr (nm_wireguard_peer_get_allowed_ip (peer, 1, NULL), ==, "10.192.124.1/24");
peer = nm_setting_wireguard_get_peer(s_wg, 0);
g_assert_cmpstr(nm_wireguard_peer_get_public_key(peer),
==,
"xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg=");
g_assert_cmpstr(nm_wireguard_peer_get_endpoint(peer), ==, "192.95.5.67:1234");
g_assert_cmpint(nm_wireguard_peer_get_allowed_ips_len(peer), ==, 2);
g_assert_cmpstr(nm_wireguard_peer_get_allowed_ip(peer, 0, NULL), ==, "10.192.122.3/32");
g_assert_cmpstr(nm_wireguard_peer_get_allowed_ip(peer, 1, NULL), ==, "10.192.124.1/24");
peer = nm_setting_wireguard_get_peer (s_wg, 1);
g_assert_cmpstr (nm_wireguard_peer_get_public_key (peer), ==, "TrMvSoP4jYQlY6RIzBgbssQqY3vxI2Pi+y71lOWWXX0=");
g_assert_cmpstr (nm_wireguard_peer_get_endpoint (peer), ==, "[2607:5300:60:6b0::c05f:543]:2468");
g_assert_cmpint (nm_wireguard_peer_get_allowed_ips_len (peer), ==, 2);
g_assert_cmpstr (nm_wireguard_peer_get_allowed_ip (peer, 0, NULL), ==, "10.192.122.4/32");
g_assert_cmpstr (nm_wireguard_peer_get_allowed_ip (peer, 1, NULL), ==, "192.168.0.0/16");
peer = nm_setting_wireguard_get_peer(s_wg, 1);
g_assert_cmpstr(nm_wireguard_peer_get_public_key(peer),
==,
"TrMvSoP4jYQlY6RIzBgbssQqY3vxI2Pi+y71lOWWXX0=");
g_assert_cmpstr(nm_wireguard_peer_get_endpoint(peer), ==, "[2607:5300:60:6b0::c05f:543]:2468");
g_assert_cmpint(nm_wireguard_peer_get_allowed_ips_len(peer), ==, 2);
g_assert_cmpstr(nm_wireguard_peer_get_allowed_ip(peer, 0, NULL), ==, "10.192.122.4/32");
g_assert_cmpstr(nm_wireguard_peer_get_allowed_ip(peer, 1, NULL), ==, "192.168.0.0/16");
peer = nm_setting_wireguard_get_peer (s_wg, 2);
g_assert_cmpstr (nm_wireguard_peer_get_public_key (peer), ==, "gN65BkIKy1eCE9pP1wdc8ROUtkHLF2PfAqYdyYBz6EA=");
g_assert_cmpstr (nm_wireguard_peer_get_endpoint (peer), ==, "test.wireguard.com:18981");
g_assert_cmpint (nm_wireguard_peer_get_allowed_ips_len (peer), ==, 1);
g_assert_cmpstr (nm_wireguard_peer_get_allowed_ip (peer, 0, NULL), ==, "10.10.10.230/32");
peer = nm_setting_wireguard_get_peer(s_wg, 2);
g_assert_cmpstr(nm_wireguard_peer_get_public_key(peer),
==,
"gN65BkIKy1eCE9pP1wdc8ROUtkHLF2PfAqYdyYBz6EA=");
g_assert_cmpstr(nm_wireguard_peer_get_endpoint(peer), ==, "test.wireguard.com:18981");
g_assert_cmpint(nm_wireguard_peer_get_allowed_ips_len(peer), ==, 1);
g_assert_cmpstr(nm_wireguard_peer_get_allowed_ip(peer, 0, NULL), ==, "10.10.10.230/32");
s_ip4 = nm_connection_get_setting_ip4_config (connection);
s_ip6 = nm_connection_get_setting_ip6_config (connection);
s_ip4 = nm_connection_get_setting_ip4_config(connection);
s_ip6 = nm_connection_get_setting_ip6_config(connection);
g_assert_cmpint (nm_setting_ip_config_get_num_addresses (s_ip4), ==, 1);
g_assert_cmpint (nm_setting_ip_config_get_num_addresses (s_ip6), ==, 0);
g_assert_cmpint(nm_setting_ip_config_get_num_addresses(s_ip4), ==, 1);
g_assert_cmpint(nm_setting_ip_config_get_num_addresses(s_ip6), ==, 0);
g_assert_cmpint (nm_setting_ip_config_get_num_dns_searches (s_ip4), ==, 1);
g_assert_cmpint (nm_setting_ip_config_get_num_dns_searches (s_ip6), ==, 0);
g_assert_cmpint(nm_setting_ip_config_get_num_dns_searches(s_ip4), ==, 1);
g_assert_cmpint(nm_setting_ip_config_get_num_dns_searches(s_ip6), ==, 0);
g_assert_cmpstr (nm_setting_ip_config_get_dns_search (s_ip4, 0), ==, "~");
g_assert_cmpstr(nm_setting_ip_config_get_dns_search(s_ip4, 0), ==, "~");
}
static void
test_client_import_wireguard_test1 (void)
test_client_import_wireguard_test1(void)
{
gs_free_error GError *error = NULL;
nm_vpn_wireguard_import (NM_BUILD_SRCDIR"/clients/common/tests/wg-test1.conf", &error);
g_assert_error (error, NM_UTILS_ERROR, NM_UTILS_ERROR_INVALID_ARGUMENT);
g_assert (g_str_has_prefix (error->message, "invalid secret 'PrivateKey'"));
g_assert (g_str_has_suffix (error->message, "wg-test1.conf:2"));
nm_vpn_wireguard_import(NM_BUILD_SRCDIR "/clients/common/tests/wg-test1.conf", &error);
g_assert_error(error, NM_UTILS_ERROR, NM_UTILS_ERROR_INVALID_ARGUMENT);
g_assert(g_str_has_prefix(error->message, "invalid secret 'PrivateKey'"));
g_assert(g_str_has_suffix(error->message, "wg-test1.conf:2"));
}
static void
test_client_import_wireguard_test2 (void)
test_client_import_wireguard_test2(void)
{
gs_free_error GError *error = NULL;
nm_vpn_wireguard_import (NM_BUILD_SRCDIR"/clients/common/tests/wg-test2.conf", &error);
nm_vpn_wireguard_import(NM_BUILD_SRCDIR "/clients/common/tests/wg-test2.conf", &error);
g_assert_error (error, NM_UTILS_ERROR, NM_UTILS_ERROR_INVALID_ARGUMENT);
g_assert (g_str_has_prefix (error->message, "unrecognized line at"));
g_assert (g_str_has_suffix (error->message, "wg-test2.conf:5"));
g_assert_error(error, NM_UTILS_ERROR, NM_UTILS_ERROR_INVALID_ARGUMENT);
g_assert(g_str_has_prefix(error->message, "unrecognized line at"));
g_assert(g_str_has_suffix(error->message, "wg-test2.conf:5"));
}
static void
test_client_import_wireguard_test3 (void)
test_client_import_wireguard_test3(void)
{
gs_free_error GError *error = NULL;
nm_vpn_wireguard_import (NM_BUILD_SRCDIR"/clients/common/tests/wg-test3.conf", &error);
g_assert_error (error, NM_UTILS_ERROR, NM_UTILS_ERROR_INVALID_ARGUMENT);
g_assert (g_str_has_prefix (error->message, "invalid value for 'ListenPort'"));
g_assert (g_str_has_suffix (error->message, "wg-test3.conf:3"));
nm_vpn_wireguard_import(NM_BUILD_SRCDIR "/clients/common/tests/wg-test3.conf", &error);
g_assert_error(error, NM_UTILS_ERROR, NM_UTILS_ERROR_INVALID_ARGUMENT);
g_assert(g_str_has_prefix(error->message, "invalid value for 'ListenPort'"));
g_assert(g_str_has_suffix(error->message, "wg-test3.conf:3"));
}
static void
test_client_import_wireguard_missing (void)
test_client_import_wireguard_missing(void)
{
gs_free_error GError *error = NULL;
nm_vpn_wireguard_import (NM_BUILD_SRCDIR"/clients/common/tests/wg-missing.conf", &error);
g_assert_error (error, G_FILE_ERROR, G_FILE_ERROR_NOENT);
nm_vpn_wireguard_import(NM_BUILD_SRCDIR "/clients/common/tests/wg-missing.conf", &error);
g_assert_error(error, G_FILE_ERROR, G_FILE_ERROR_NOENT);
}
/*****************************************************************************/
#define _do_test_parse_passwd_file(contents, success, exp_error_line, ...) \
G_STMT_START { \
static const NMUtilsNamedValue _values[] = { \
__VA_ARGS__ \
}; \
gs_free char *_contents = g_strndup (contents, NM_STRLEN (contents)); \
G_STMT_START \
{ \
static const NMUtilsNamedValue _values[] = {__VA_ARGS__}; \
gs_free char * _contents = g_strndup(contents, NM_STRLEN(contents)); \
gs_unref_hashtable GHashTable *_secrets = NULL; \
gs_free_error GError *_local = NULL; \
gssize _error_line; \
GError **_p_local = nmtst_get_rand_bool () ? &_local : NULL; \
gssize *_p_error_line = nmtst_get_rand_bool () ? &_error_line : NULL; \
GError ** _p_local = nmtst_get_rand_bool() ? &_local : NULL; \
gssize * _p_error_line = nmtst_get_rand_bool() ? &_error_line : NULL; \
gboolean _success = !!(success); \
gssize _exp_error_line = (exp_error_line); \
int _i; \
\
g_assert (_success || (G_N_ELEMENTS (_values) == 0)); \
g_assert(_success || (G_N_ELEMENTS(_values) == 0)); \
\
_secrets = nmc_utils_parse_passwd_file (_contents, _p_error_line, _p_local); \
_secrets = nmc_utils_parse_passwd_file(_contents, _p_error_line, _p_local); \
\
g_assert (_success == (!!_secrets)); \
g_assert(_success == (!!_secrets)); \
if (!_success) { \
if (_p_error_line) \
g_assert_cmpint (_exp_error_line, ==, *_p_error_line); \
g_assert_cmpint(_exp_error_line, ==, *_p_error_line); \
if (_p_local) \
g_assert (_local); \
g_assert(_local); \
} else { \
if (_p_error_line) \
g_assert_cmpint (-1, ==, *_p_error_line); \
g_assert (!_local); \
g_assert_cmpint(-1, ==, *_p_error_line); \
g_assert(!_local); \
\
for (_i = 0; _i < G_N_ELEMENTS (_values); _i++) { \
for (_i = 0; _i < G_N_ELEMENTS(_values); _i++) { \
const NMUtilsNamedValue *_n = &_values[_i]; \
const char *_v; \
const char * _v; \
\
_v = g_hash_table_lookup (_secrets, _n->name); \
_v = g_hash_table_lookup(_secrets, _n->name); \
if (!_v) \
g_error ("cannot find key \"%s\"", _n->name); \
g_assert_cmpstr (_v, ==, _n->value_str); \
g_error("cannot find key \"%s\"", _n->name); \
g_assert_cmpstr(_v, ==, _n->value_str); \
} \
\
g_assert_cmpint (g_hash_table_size (_secrets), ==, G_N_ELEMENTS (_values)); \
g_assert_cmpint(g_hash_table_size(_secrets), ==, G_N_ELEMENTS(_values)); \
} \
} G_STMT_END
} \
G_STMT_END
#define _do_test_parse_passwd_file_bad( contents, exp_error_line) _do_test_parse_passwd_file (contents, FALSE, exp_error_line)
#define _do_test_parse_passwd_file_good(contents, ...) _do_test_parse_passwd_file (contents, TRUE, -1, __VA_ARGS__)
#define _do_test_parse_passwd_file_bad(contents, exp_error_line) \
_do_test_parse_passwd_file(contents, FALSE, exp_error_line)
#define _do_test_parse_passwd_file_good(contents, ...) \
_do_test_parse_passwd_file(contents, TRUE, -1, __VA_ARGS__)
static void
test_nmc_utils_parse_passwd_file (void)
test_nmc_utils_parse_passwd_file(void)
{
_do_test_parse_passwd_file_good ("");
_do_test_parse_passwd_file_bad ("x", 1);
_do_test_parse_passwd_file_bad ("\r\rx", 3);
_do_test_parse_passwd_file_good ("wifi.psk=abc",
NM_UTILS_NAMED_VALUE_INIT ("802-11-wireless-security.psk", "abc") );
_do_test_parse_passwd_file_good ("wifi.psk:ABC\r"
_do_test_parse_passwd_file_good("");
_do_test_parse_passwd_file_bad("x", 1);
_do_test_parse_passwd_file_bad("\r\rx", 3);
_do_test_parse_passwd_file_good(
"wifi.psk=abc",
NM_UTILS_NAMED_VALUE_INIT("802-11-wireless-security.psk", "abc"));
_do_test_parse_passwd_file_good(
"wifi.psk:ABC\r"
"wifi-sec.psk = abc ",
NM_UTILS_NAMED_VALUE_INIT ("802-11-wireless-security.psk", "abc") );
_do_test_parse_passwd_file_good ("wifi.psk: abc\r"
NM_UTILS_NAMED_VALUE_INIT("802-11-wireless-security.psk", "abc"));
_do_test_parse_passwd_file_good(
"wifi.psk: abc\r"
"wifi-sec.psk2 = d\\145f\r\n"
" wifi.psk3 = e\\ \n"
" #wifi-sec.psk2 = \r\n"
" wifi-sec.psk4:",
NM_UTILS_NAMED_VALUE_INIT ("802-11-wireless-security.psk", "abc"),
NM_UTILS_NAMED_VALUE_INIT ("802-11-wireless-security.psk2", "def"),
NM_UTILS_NAMED_VALUE_INIT ("802-11-wireless-security.psk3", "e "),
NM_UTILS_NAMED_VALUE_INIT ("802-11-wireless-security.psk4", "") );
NM_UTILS_NAMED_VALUE_INIT("802-11-wireless-security.psk", "abc"),
NM_UTILS_NAMED_VALUE_INIT("802-11-wireless-security.psk2", "def"),
NM_UTILS_NAMED_VALUE_INIT("802-11-wireless-security.psk3", "e "),
NM_UTILS_NAMED_VALUE_INIT("802-11-wireless-security.psk4", ""));
}
/*****************************************************************************/
NMTST_DEFINE ();
NMTST_DEFINE();
int
main (int argc, char **argv)
main(int argc, char **argv)
{
nmtst_init (&argc, &argv, TRUE);
nmtst_init(&argc, &argv, TRUE);
g_test_add_func ("/client/meta/check", test_client_meta_check);
g_test_add_func ("/client/import/wireguard/test0", test_client_import_wireguard_test0);
g_test_add_func ("/client/import/wireguard/test1", test_client_import_wireguard_test1);
g_test_add_func ("/client/import/wireguard/test2", test_client_import_wireguard_test2);
g_test_add_func ("/client/import/wireguard/test3", test_client_import_wireguard_test3);
g_test_add_func ("/client/import/wireguard/missing", test_client_import_wireguard_missing);
g_test_add_func ("/client/test_nmc_utils_parse_passwd_file", test_nmc_utils_parse_passwd_file);
g_test_add_func("/client/meta/check", test_client_meta_check);
g_test_add_func("/client/import/wireguard/test0", test_client_import_wireguard_test0);
g_test_add_func("/client/import/wireguard/test1", test_client_import_wireguard_test1);
g_test_add_func("/client/import/wireguard/test2", test_client_import_wireguard_test2);
g_test_add_func("/client/import/wireguard/test3", test_client_import_wireguard_test3);
g_test_add_func("/client/import/wireguard/missing", test_client_import_wireguard_missing);
g_test_add_func("/client/test_nmc_utils_parse_passwd_file", test_nmc_utils_parse_passwd_file);
return g_test_run ();
return g_test_run();
}

View file

@ -13,54 +13,54 @@
/*****************************************************************************/
static NMTeamLinkWatcher *
_team_link_watcher_from_string_impl (const char *str, gsize nextra, const char *const*vextra)
_team_link_watcher_from_string_impl(const char *str, gsize nextra, const char *const *vextra)
{
NMTeamLinkWatcher *watcher;
gs_free char *str1_free = NULL;
gs_free char * str1_free = NULL;
gs_free_error GError *error = NULL;
gsize i;
g_assert (str);
g_assert(str);
watcher = nm_utils_team_link_watcher_from_string (str, &error);
nmtst_assert_success (watcher, error);
watcher = nm_utils_team_link_watcher_from_string(str, &error);
nmtst_assert_success(watcher, error);
for (i = 0; i < 1 + nextra; i++) {
nm_auto_unref_team_link_watcher NMTeamLinkWatcher *watcher1 = NULL;
const char *str1;
const char * str1;
if (i == 0) {
str1_free = nm_utils_team_link_watcher_to_string (watcher);
g_assert (str1_free);
str1_free = nm_utils_team_link_watcher_to_string(watcher);
g_assert(str1_free);
str1 = str1_free;
g_assert_cmpstr (str, ==, str1);
g_assert_cmpstr(str, ==, str1);
} else
str1 = vextra[i - 1];
watcher1 = nm_utils_team_link_watcher_from_string (str1, &error);
nmtst_assert_success (watcher1, error);
if (!nm_team_link_watcher_equal (watcher, watcher1)) {
watcher1 = nm_utils_team_link_watcher_from_string(str1, &error);
nmtst_assert_success(watcher1, error);
if (!nm_team_link_watcher_equal(watcher, watcher1)) {
gs_free char *ss1 = NULL;
gs_free char *ss2 = NULL;
g_print (">>> watcher differs: \"%s\" vs. \"%s\"",
(ss1 = nm_utils_team_link_watcher_to_string (watcher)),
(ss2 = nm_utils_team_link_watcher_to_string (watcher1)));
g_print (">>> ORIG: \"%s\" vs. \"%s\"", str, str1);
g_assert_not_reached ();
g_print(">>> watcher differs: \"%s\" vs. \"%s\"",
(ss1 = nm_utils_team_link_watcher_to_string(watcher)),
(ss2 = nm_utils_team_link_watcher_to_string(watcher1)));
g_print(">>> ORIG: \"%s\" vs. \"%s\"", str, str1);
g_assert_not_reached();
}
g_assert (nm_team_link_watcher_equal (watcher1, watcher));
g_assert(nm_team_link_watcher_equal(watcher1, watcher));
}
return watcher;
}
#define _team_link_watcher_from_string(str, ...) \
_team_link_watcher_from_string_impl ((str), NM_NARG (__VA_ARGS__), NM_MAKE_STRV (__VA_ARGS__))
_team_link_watcher_from_string_impl((str), NM_NARG(__VA_ARGS__), NM_MAKE_STRV(__VA_ARGS__))
/*****************************************************************************/
static void
test_team_link_watcher_tofro_string (void)
test_team_link_watcher_tofro_string(void)
{
nm_auto_unref_team_link_watcher NMTeamLinkWatcher *w = NULL;
@ -75,25 +75,27 @@ test_team_link_watcher_tofro_string (void)
source_host, \
vlanid, \
arping_flags) \
G_STMT_START { \
nm_auto_unref_team_link_watcher NMTeamLinkWatcher *_w = g_steal_pointer (watcher); \
G_STMT_START \
{ \
nm_auto_unref_team_link_watcher NMTeamLinkWatcher *_w = g_steal_pointer(watcher); \
\
g_assert_cmpstr ((name), ==, nm_team_link_watcher_get_name (_w)); \
g_assert_cmpint ((delay_down), ==, nm_team_link_watcher_get_delay_down (_w)); \
g_assert_cmpint ((delay_up), ==, nm_team_link_watcher_get_delay_up (_w)); \
g_assert_cmpint ((init_wait), ==, nm_team_link_watcher_get_init_wait (_w)); \
g_assert_cmpint ((interval), ==, nm_team_link_watcher_get_interval (_w)); \
g_assert_cmpint ((missed_max), ==, nm_team_link_watcher_get_missed_max (_w)); \
g_assert_cmpstr ((target_host), ==, nm_team_link_watcher_get_target_host (_w)); \
g_assert_cmpstr ((source_host), ==, nm_team_link_watcher_get_source_host (_w)); \
g_assert_cmpint ((vlanid), ==, nm_team_link_watcher_get_vlanid (_w)); \
g_assert_cmpint ((arping_flags), ==, nm_team_link_watcher_get_flags (_w)); \
} G_STMT_END
g_assert_cmpstr((name), ==, nm_team_link_watcher_get_name(_w)); \
g_assert_cmpint((delay_down), ==, nm_team_link_watcher_get_delay_down(_w)); \
g_assert_cmpint((delay_up), ==, nm_team_link_watcher_get_delay_up(_w)); \
g_assert_cmpint((init_wait), ==, nm_team_link_watcher_get_init_wait(_w)); \
g_assert_cmpint((interval), ==, nm_team_link_watcher_get_interval(_w)); \
g_assert_cmpint((missed_max), ==, nm_team_link_watcher_get_missed_max(_w)); \
g_assert_cmpstr((target_host), ==, nm_team_link_watcher_get_target_host(_w)); \
g_assert_cmpstr((source_host), ==, nm_team_link_watcher_get_source_host(_w)); \
g_assert_cmpint((vlanid), ==, nm_team_link_watcher_get_vlanid(_w)); \
g_assert_cmpint((arping_flags), ==, nm_team_link_watcher_get_flags(_w)); \
} \
G_STMT_END
w = _team_link_watcher_from_string ("name=ethtool",
w = _team_link_watcher_from_string("name=ethtool",
"delay-up=0 name=ethtool",
" delay-down=0 name=ethtool ");
_team_link_watcher_cmp (&w,
_team_link_watcher_cmp(&w,
"ethtool",
0,
0,
@ -105,9 +107,9 @@ test_team_link_watcher_tofro_string (void)
-1,
NM_TEAM_LINK_WATCHER_ARP_PING_FLAG_NONE);
w = _team_link_watcher_from_string ("name=ethtool delay-up=10",
w = _team_link_watcher_from_string("name=ethtool delay-up=10",
" delay-down=0 delay-up=10 name=ethtool");
_team_link_watcher_cmp (&w,
_team_link_watcher_cmp(&w,
"ethtool",
0,
10,
@ -119,9 +121,9 @@ test_team_link_watcher_tofro_string (void)
-1,
NM_TEAM_LINK_WATCHER_ARP_PING_FLAG_NONE);
w = _team_link_watcher_from_string ("name=ethtool delay-up=10 delay-down=11",
w = _team_link_watcher_from_string("name=ethtool delay-up=10 delay-down=11",
" delay-down=11 delay-up=10 name=ethtool");
_team_link_watcher_cmp (&w,
_team_link_watcher_cmp(&w,
"ethtool",
11,
10,
@ -133,10 +135,11 @@ test_team_link_watcher_tofro_string (void)
-1,
NM_TEAM_LINK_WATCHER_ARP_PING_FLAG_NONE);
w = _team_link_watcher_from_string ("name=nsna_ping target-host=xxx",
w = _team_link_watcher_from_string(
"name=nsna_ping target-host=xxx",
"name=nsna_ping target-host=xxx",
" missed-max=3 target-host=xxx name=nsna_ping ");
_team_link_watcher_cmp (&w,
_team_link_watcher_cmp(&w,
"nsna_ping",
-1,
-1,
@ -148,9 +151,9 @@ test_team_link_watcher_tofro_string (void)
-1,
NM_TEAM_LINK_WATCHER_ARP_PING_FLAG_NONE);
w = _team_link_watcher_from_string ("name=arp_ping target-host=xxx source-host=yzd",
w = _team_link_watcher_from_string("name=arp_ping target-host=xxx source-host=yzd",
" source-host=yzd target-host=xxx name=arp_ping ");
_team_link_watcher_cmp (&w,
_team_link_watcher_cmp(&w,
"arp_ping",
-1,
-1,
@ -162,8 +165,9 @@ test_team_link_watcher_tofro_string (void)
-1,
NM_TEAM_LINK_WATCHER_ARP_PING_FLAG_NONE);
w = _team_link_watcher_from_string ("name=arp_ping missed-max=0 target-host=xxx vlanid=0 source-host=yzd");
_team_link_watcher_cmp (&w,
w = _team_link_watcher_from_string(
"name=arp_ping missed-max=0 target-host=xxx vlanid=0 source-host=yzd");
_team_link_watcher_cmp(&w,
"arp_ping",
-1,
-1,
@ -175,10 +179,12 @@ test_team_link_watcher_tofro_string (void)
0,
NM_TEAM_LINK_WATCHER_ARP_PING_FLAG_NONE);
w = _team_link_watcher_from_string ("name=arp_ping target-host=xxx source-host=yzd validate-active=true",
"source-host=yzd send-always=false name=arp_ping validate-active=true validate-inactive=false target-host=xxx",
w = _team_link_watcher_from_string(
"name=arp_ping target-host=xxx source-host=yzd validate-active=true",
"source-host=yzd send-always=false name=arp_ping validate-active=true "
"validate-inactive=false target-host=xxx",
" source-host=yzd target-host=xxx validate-active=true name=arp_ping ");
_team_link_watcher_cmp (&w,
_team_link_watcher_cmp(&w,
"arp_ping",
-1,
-1,
@ -190,11 +196,16 @@ test_team_link_watcher_tofro_string (void)
-1,
NM_TEAM_LINK_WATCHER_ARP_PING_FLAG_VALIDATE_ACTIVE);
w = _team_link_watcher_from_string ("name=arp_ping target-host=xxx source-host=yzd validate-active=true validate-inactive=true send-always=true",
"source-host=yzd send-always=true name=arp_ping validate-active=true validate-inactive=true target-host=xxx",
"source-host=yzd send-always=true name=arp_ping validate-active=1 validate-inactive=yes target-host=xxx",
" source-host=yzd target-host=xxx validate-inactive=true send-always=true validate-active=true name=arp_ping ");
_team_link_watcher_cmp (&w,
w = _team_link_watcher_from_string(
"name=arp_ping target-host=xxx source-host=yzd validate-active=true validate-inactive=true "
"send-always=true",
"source-host=yzd send-always=true name=arp_ping validate-active=true "
"validate-inactive=true target-host=xxx",
"source-host=yzd send-always=true name=arp_ping validate-active=1 validate-inactive=yes "
"target-host=xxx",
" source-host=yzd target-host=xxx validate-inactive=true send-always=true "
"validate-active=true name=arp_ping ");
_team_link_watcher_cmp(&w,
"arp_ping",
-1,
-1,
@ -208,8 +219,9 @@ test_team_link_watcher_tofro_string (void)
| NM_TEAM_LINK_WATCHER_ARP_PING_FLAG_VALIDATE_INACTIVE
| NM_TEAM_LINK_WATCHER_ARP_PING_FLAG_SEND_ALWAYS);
w = _team_link_watcher_from_string ("name=arp_ping missed-max=0 target-host=xxx vlanid=0 source-host=yzd");
_team_link_watcher_cmp (&w,
w = _team_link_watcher_from_string(
"name=arp_ping missed-max=0 target-host=xxx vlanid=0 source-host=yzd");
_team_link_watcher_cmp(&w,
"arp_ping",
-1,
-1,
@ -224,13 +236,15 @@ test_team_link_watcher_tofro_string (void)
/*****************************************************************************/
NMTST_DEFINE ();
NMTST_DEFINE();
int main (int argc, char **argv)
int
main(int argc, char **argv)
{
nmtst_init (&argc, &argv, TRUE);
nmtst_init(&argc, &argv, TRUE);
g_test_add_func ("/libnm-core-aux/test_team_link_watcher_tofro_string", test_team_link_watcher_tofro_string);
g_test_add_func("/libnm-core-aux/test_team_link_watcher_tofro_string",
test_team_link_watcher_tofro_string);
return g_test_run ();
return g_test_run();
}

View file

@ -33,10 +33,9 @@
#define EXIT_FAILURE_LIBNM_BUG 42
#define EXIT_FAILURE_UNSPECIFIED 43
typedef struct
{
GMainLoop *loop;
NMClient *client;
typedef struct {
GMainLoop * loop;
NMClient * client;
GCancellable *client_new_cancellable;
guint client_new_timeout_id;
guint handle_timeout_id;
@ -51,33 +50,33 @@ typedef struct
} OnlineData;
static gint64
_now_ms (void)
_now_ms(void)
{
return g_get_monotonic_time () / (G_USEC_PER_SEC / 1000);
return g_get_monotonic_time() / (G_USEC_PER_SEC / 1000);
}
static void
_return (OnlineData *data, int retval)
_return(OnlineData *data, int retval)
{
nm_assert (data);
nm_assert (data->retval == EXIT_FAILURE_UNSPECIFIED);
nm_assert(data);
nm_assert(data->retval == EXIT_FAILURE_UNSPECIFIED);
data->retval = retval;
nm_clear_g_signal_handler (data->client, &data->client_notify_id);
g_main_loop_quit (data->loop);
nm_clear_g_signal_handler(data->client, &data->client_notify_id);
g_main_loop_quit(data->loop);
}
static void
_print_progress (gboolean wait_startup, int progress_next_step_i, gint64 remaining_ms, int retval)
_print_progress(gboolean wait_startup, int progress_next_step_i, gint64 remaining_ms, int retval)
{
int i, j;
j = progress_next_step_i < 0 ? PROGRESS_STEPS : progress_next_step_i;
g_print ("\r%s", _("Connecting"));
g_print("\r%s", _("Connecting"));
for (i = 0; i < PROGRESS_STEPS; i++)
putchar (i < j ? '.' : ' ');
g_print (" %4lds", (long) (MAX (0, remaining_ms + 999) / 1000));
putchar(i < j ? '.' : ' ');
g_print(" %4lds", (long) (MAX(0, remaining_ms + 999) / 1000));
if (retval != EXIT_NONE) {
const char *result;
@ -88,45 +87,43 @@ _print_progress (gboolean wait_startup, int progress_next_step_i, gint64 remaini
result = "startup-pending";
else
result = "failure";
}
else {
} else {
if (retval == EXIT_SUCCESS)
result = "online";
else
result = "offline";
}
g_print (" [%s]\n", result);
g_print(" [%s]\n", result);
}
fflush (stdout);
fflush(stdout);
}
static gboolean
quit_if_connected (OnlineData *data)
quit_if_connected(OnlineData *data)
{
NMState state;
state = nm_client_get_state (data->client);
if (!nm_client_get_nm_running (data->client)) {
state = nm_client_get_state(data->client);
if (!nm_client_get_nm_running(data->client)) {
if (data->exit_no_nm) {
_return (data, EXIT_FAILURE_OFFLINE);
_return(data, EXIT_FAILURE_OFFLINE);
return TRUE;
}
} else if (data->wait_startup) {
if (!nm_client_get_startup (data->client)) {
_return (data, EXIT_SUCCESS);
if (!nm_client_get_startup(data->client)) {
_return(data, EXIT_SUCCESS);
return TRUE;
}
} else {
if ( state == NM_STATE_CONNECTED_LOCAL
|| state == NM_STATE_CONNECTED_SITE
if (state == NM_STATE_CONNECTED_LOCAL || state == NM_STATE_CONNECTED_SITE
|| state == NM_STATE_CONNECTED_GLOBAL) {
_return (data, EXIT_SUCCESS);
_return(data, EXIT_SUCCESS);
return TRUE;
}
}
if (data->exit_no_nm && (state != NM_STATE_CONNECTING)) {
_return (data, EXIT_FAILURE_OFFLINE);
_return(data, EXIT_FAILURE_OFFLINE);
return TRUE;
}
@ -134,18 +131,16 @@ quit_if_connected (OnlineData *data)
}
static void
client_properties_changed (GObject *object,
GParamSpec *pspec,
gpointer user_data)
client_properties_changed(GObject *object, GParamSpec *pspec, gpointer user_data)
{
quit_if_connected (user_data);
quit_if_connected(user_data);
}
static gboolean
handle_timeout (gpointer user_data)
handle_timeout(gpointer user_data)
{
OnlineData *data = user_data;
const gint64 now = _now_ms ();
OnlineData * data = user_data;
const gint64 now = _now_ms();
gint64 remaining_ms = data->end_timestamp_ms - now;
const gint64 elapsed_ms = now - data->start_timestamp_ms;
int progress_next_step_i = 0;
@ -153,7 +148,7 @@ handle_timeout (gpointer user_data)
data->handle_timeout_id = 0;
if (remaining_ms <= 3) {
_return (data, EXIT_FAILURE_OFFLINE);
_return(data, EXIT_FAILURE_OFFLINE);
return G_SOURCE_REMOVE;
}
@ -161,74 +156,75 @@ handle_timeout (gpointer user_data)
gint64 rem;
/* calculate the next step (not the current): floor()+1 */
progress_next_step_i = NM_MIN ((elapsed_ms / data->progress_step_duration) + 1, PROGRESS_STEPS);
_print_progress (data->wait_startup, progress_next_step_i, remaining_ms, EXIT_NONE);
progress_next_step_i =
NM_MIN((elapsed_ms / data->progress_step_duration) + 1, PROGRESS_STEPS);
_print_progress(data->wait_startup, progress_next_step_i, remaining_ms, EXIT_NONE);
/* synchronize the timeout with the ticking of the seconds. */
rem = remaining_ms % 1000;
if (rem <= 3)
rem = rem + G_USEC_PER_SEC;
/* add small offset to awake a bit after the second ticks */
remaining_ms = NM_MIN (remaining_ms, rem + 10);
remaining_ms = NM_MIN(remaining_ms, rem + 10);
/* synchronize the timeout with the steps of the progress bar. */
rem = (progress_next_step_i * data->progress_step_duration) - elapsed_ms;
if (rem <= 3)
rem = rem + data->progress_step_duration;
/* add small offset to awake a bit after the second ticks */
remaining_ms = NM_MIN (remaining_ms, rem + 10);
remaining_ms = NM_MIN(remaining_ms, rem + 10);
}
data->handle_timeout_id = g_timeout_add (remaining_ms, handle_timeout, data);
data->handle_timeout_id = g_timeout_add(remaining_ms, handle_timeout, data);
return G_SOURCE_REMOVE;
}
static gboolean
got_client_timeout (gpointer user_data)
got_client_timeout(gpointer user_data)
{
OnlineData *data = user_data;
data->client_new_timeout_id = 0;
data->quiet = TRUE;
g_printerr (_("Error: timeout creating NMClient object\n"));
_return (data, EXIT_FAILURE_LIBNM_BUG);
g_printerr(_("Error: timeout creating NMClient object\n"));
_return(data, EXIT_FAILURE_LIBNM_BUG);
return G_SOURCE_REMOVE;
}
static void
got_client (GObject *source_object, GAsyncResult *res, gpointer user_data)
got_client(GObject *source_object, GAsyncResult *res, gpointer user_data)
{
OnlineData *data = user_data;
OnlineData * data = user_data;
gs_free_error GError *error = NULL;
nm_assert (NM_IS_CLIENT (source_object));
nm_assert (NM_CLIENT (source_object) == data->client);
nm_assert(NM_IS_CLIENT(source_object));
nm_assert(NM_CLIENT(source_object) == data->client);
nm_clear_g_source (&data->client_new_timeout_id);
g_clear_object (&data->client_new_cancellable);
nm_clear_g_source(&data->client_new_timeout_id);
g_clear_object(&data->client_new_cancellable);
if (!g_async_initable_init_finish (G_ASYNC_INITABLE (source_object),
res,
&error)) {
if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
if (!g_async_initable_init_finish(G_ASYNC_INITABLE(source_object), res, &error)) {
if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
return;
data->quiet = TRUE;
g_printerr (_("Error: Could not create NMClient object: %s\n"),
error->message);
_return (data, EXIT_FAILURE_ERROR);
g_printerr(_("Error: Could not create NMClient object: %s\n"), error->message);
_return(data, EXIT_FAILURE_ERROR);
return;
}
if (quit_if_connected (data))
if (quit_if_connected(data))
return;
data->client_notify_id = g_signal_connect (data->client, "notify",
G_CALLBACK (client_properties_changed), data);
data->handle_timeout_id = g_timeout_add (data->quiet ? NM_MAX (0, data->end_timestamp_ms - _now_ms ()) : 0, handle_timeout, data);
data->client_notify_id =
g_signal_connect(data->client, "notify", G_CALLBACK(client_properties_changed), data);
data->handle_timeout_id =
g_timeout_add(data->quiet ? NM_MAX(0, data->end_timestamp_ms - _now_ms()) : 0,
handle_timeout,
data);
}
int
main (int argc, char *argv[])
main(int argc, char *argv[])
{
OnlineData data = {
.retval = EXIT_FAILURE_UNSPECIFIED,
@ -238,43 +234,64 @@ main (int argc, char *argv[])
gboolean success;
GOptionEntry options[] = {
{"quiet", 'q', 0, G_OPTION_ARG_NONE, &data.quiet, N_("Don't print anything"), NULL},
{"wait-for-startup", 's', 0, G_OPTION_ARG_NONE, &data.wait_startup, N_("Wait for NetworkManager startup instead of a connection"), NULL},
{"timeout", 't', 0, G_OPTION_ARG_INT, &t_secs, N_("Time to wait for a connection, in seconds (without the option, default value is 30)"), "<timeout>"},
{"exit", 'x', 0, G_OPTION_ARG_NONE, &data.exit_no_nm, N_("Exit immediately if NetworkManager is not running or connecting"), NULL},
{ NULL },
{"wait-for-startup",
's',
0,
G_OPTION_ARG_NONE,
&data.wait_startup,
N_("Wait for NetworkManager startup instead of a connection"),
NULL},
{"timeout",
't',
0,
G_OPTION_ARG_INT,
&t_secs,
N_("Time to wait for a connection, in seconds (without the option, default value is 30)"),
"<timeout>"},
{"exit",
'x',
0,
G_OPTION_ARG_NONE,
&data.exit_no_nm,
N_("Exit immediately if NetworkManager is not running or connecting"),
NULL},
{NULL},
};
/* Set locale to be able to use environment variables */
setlocale (LC_ALL, "");
setlocale(LC_ALL, "");
bindtextdomain (GETTEXT_PACKAGE, NMLOCALEDIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
textdomain (GETTEXT_PACKAGE);
bindtextdomain(GETTEXT_PACKAGE, NMLOCALEDIR);
bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
textdomain(GETTEXT_PACKAGE);
t_secs = _nm_utils_ascii_str_to_int64 (g_getenv ("NM_ONLINE_TIMEOUT"), 10, 0, G_MAXINT, 30);
t_secs = _nm_utils_ascii_str_to_int64(g_getenv("NM_ONLINE_TIMEOUT"), 10, 0, G_MAXINT, 30);
data.start_timestamp_ms = _now_ms ();
data.start_timestamp_ms = _now_ms();
opt_ctx = g_option_context_new (NULL);
g_option_context_set_translation_domain (opt_ctx, GETTEXT_PACKAGE);
g_option_context_set_ignore_unknown_options (opt_ctx, FALSE);
g_option_context_set_help_enabled (opt_ctx, TRUE);
g_option_context_add_main_entries (opt_ctx, options, NULL);
opt_ctx = g_option_context_new(NULL);
g_option_context_set_translation_domain(opt_ctx, GETTEXT_PACKAGE);
g_option_context_set_ignore_unknown_options(opt_ctx, FALSE);
g_option_context_set_help_enabled(opt_ctx, TRUE);
g_option_context_add_main_entries(opt_ctx, options, NULL);
g_option_context_set_summary (opt_ctx,
g_option_context_set_summary(
opt_ctx,
_("Waits for NetworkManager to finish activating startup network connections."));
success = g_option_context_parse (opt_ctx, &argc, &argv, NULL);
g_option_context_free (opt_ctx);
success = g_option_context_parse(opt_ctx, &argc, &argv, NULL);
g_option_context_free(opt_ctx);
if (!success) {
g_printerr ("%s: %s\n", argv[0],
g_printerr("%s: %s\n",
argv[0],
_("Invalid option. Please use --help to see a list of valid options."));
return EXIT_FAILURE_ERROR;
}
if (t_secs < 0 || t_secs > 3600) {
g_printerr ("%s: %s\n", argv[0],
g_printerr("%s: %s\n",
argv[0],
_("Invalid option. Please use --help to see a list of valid options."));
return EXIT_FAILURE_ERROR;
}
@ -282,33 +299,39 @@ main (int argc, char *argv[])
if (t_secs == 0)
data.quiet = TRUE;
data.loop = g_main_loop_new (NULL, FALSE);
data.loop = g_main_loop_new(NULL, FALSE);
data.end_timestamp_ms = data.start_timestamp_ms + (t_secs * 1000);
data.progress_step_duration = NM_MAX (1, (data.end_timestamp_ms - data.start_timestamp_ms + PROGRESS_STEPS/2) / PROGRESS_STEPS);
data.progress_step_duration = NM_MAX(
1,
(data.end_timestamp_ms - data.start_timestamp_ms + PROGRESS_STEPS / 2) / PROGRESS_STEPS);
data.client_new_cancellable = g_cancellable_new ();
data.client_new_cancellable = g_cancellable_new();
data.client_new_timeout_id = g_timeout_add_seconds (30, got_client_timeout, &data);
data.client_new_timeout_id = g_timeout_add_seconds(30, got_client_timeout, &data);
data.client = nmc_client_new_async (data.client_new_cancellable,
data.client = nmc_client_new_async(data.client_new_cancellable,
got_client,
&data,
NM_CLIENT_INSTANCE_FLAGS, (guint) NM_CLIENT_INSTANCE_FLAGS_NO_AUTO_FETCH_PERMISSIONS,
NM_CLIENT_INSTANCE_FLAGS,
(guint) NM_CLIENT_INSTANCE_FLAGS_NO_AUTO_FETCH_PERMISSIONS,
NULL);
g_main_loop_run (data.loop);
g_main_loop_run(data.loop);
nm_clear_g_cancellable (&data.client_new_cancellable);
nm_clear_g_source (&data.client_new_timeout_id);
nm_clear_g_source (&data.handle_timeout_id);
nm_clear_g_signal_handler (data.client, &data.client_notify_id);
g_clear_object (&data.client);
nm_clear_g_cancellable(&data.client_new_cancellable);
nm_clear_g_source(&data.client_new_timeout_id);
nm_clear_g_source(&data.handle_timeout_id);
nm_clear_g_signal_handler(data.client, &data.client_notify_id);
g_clear_object(&data.client);
nm_clear_pointer (&data.loop, g_main_loop_unref);
nm_clear_pointer(&data.loop, g_main_loop_unref);
if (!data.quiet)
_print_progress (data.wait_startup, -1, NM_MAX (0, data.end_timestamp_ms - _now_ms ()), data.retval);
_print_progress(data.wait_startup,
-1,
NM_MAX(0, data.end_timestamp_ms - _now_ms()),
data.retval);
return data.retval;
}

View file

@ -22,13 +22,14 @@
#include "nmt-newt-button.h"
G_DEFINE_TYPE (NmtNewtButtonBox, nmt_newt_button_box, NMT_TYPE_NEWT_CONTAINER)
G_DEFINE_TYPE(NmtNewtButtonBox, nmt_newt_button_box, NMT_TYPE_NEWT_CONTAINER)
#define NMT_NEWT_BUTTON_BOX_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NMT_TYPE_NEWT_BUTTON_BOX, NmtNewtButtonBoxPrivate))
#define NMT_NEWT_BUTTON_BOX_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE((o), NMT_TYPE_NEWT_BUTTON_BOX, NmtNewtButtonBoxPrivate))
typedef struct {
NmtNewtButtonBoxOrientation orientation;
GPtrArray *start_buttons, *end_buttons;
GPtrArray * start_buttons, *end_buttons;
} NmtNewtButtonBoxPrivate;
enum {
@ -56,20 +57,18 @@ enum {
* Returns: a new #NmtNewtButtonBox
*/
NmtNewtWidget *
nmt_newt_button_box_new (NmtNewtButtonBoxOrientation orientation)
nmt_newt_button_box_new(NmtNewtButtonBoxOrientation orientation)
{
return g_object_new (NMT_TYPE_NEWT_BUTTON_BOX,
"orientation", orientation,
NULL);
return g_object_new(NMT_TYPE_NEWT_BUTTON_BOX, "orientation", orientation, NULL);
}
static void
nmt_newt_button_box_init (NmtNewtButtonBox *bbox)
nmt_newt_button_box_init(NmtNewtButtonBox *bbox)
{
NmtNewtButtonBoxPrivate *priv = NMT_NEWT_BUTTON_BOX_GET_PRIVATE (bbox);
NmtNewtButtonBoxPrivate *priv = NMT_NEWT_BUTTON_BOX_GET_PRIVATE(bbox);
priv->start_buttons = g_ptr_array_new ();
priv->end_buttons = g_ptr_array_new ();
priv->start_buttons = g_ptr_array_new();
priv->end_buttons = g_ptr_array_new();
}
/**
@ -84,13 +83,12 @@ nmt_newt_button_box_init (NmtNewtButtonBox *bbox)
* Returns: the newly-created button, already added to @bbox
*/
NmtNewtWidget *
nmt_newt_button_box_add_start (NmtNewtButtonBox *bbox,
const char *label)
nmt_newt_button_box_add_start(NmtNewtButtonBox *bbox, const char *label)
{
NmtNewtWidget *button;
button = nmt_newt_button_new (label);
nmt_newt_button_box_add_widget_start (bbox, button);
button = nmt_newt_button_new(label);
nmt_newt_button_box_add_widget_start(bbox, button);
return button;
}
@ -102,14 +100,13 @@ nmt_newt_button_box_add_start (NmtNewtButtonBox *bbox,
* Adds the given widget to the "start" section of @bbox.
*/
void
nmt_newt_button_box_add_widget_start (NmtNewtButtonBox *bbox,
NmtNewtWidget *widget)
nmt_newt_button_box_add_widget_start(NmtNewtButtonBox *bbox, NmtNewtWidget *widget)
{
NmtNewtButtonBoxPrivate *priv = NMT_NEWT_BUTTON_BOX_GET_PRIVATE (bbox);
NmtNewtButtonBoxPrivate *priv = NMT_NEWT_BUTTON_BOX_GET_PRIVATE(bbox);
NMT_NEWT_CONTAINER_CLASS (nmt_newt_button_box_parent_class)->
add (NMT_NEWT_CONTAINER (bbox), widget);
g_ptr_array_add (priv->start_buttons, widget);
NMT_NEWT_CONTAINER_CLASS(nmt_newt_button_box_parent_class)
->add(NMT_NEWT_CONTAINER(bbox), widget);
g_ptr_array_add(priv->start_buttons, widget);
}
/**
@ -124,13 +121,12 @@ nmt_newt_button_box_add_widget_start (NmtNewtButtonBox *bbox,
* Returns: the newly-created button, already added to @bbox
*/
NmtNewtWidget *
nmt_newt_button_box_add_end (NmtNewtButtonBox *bbox,
const char *label)
nmt_newt_button_box_add_end(NmtNewtButtonBox *bbox, const char *label)
{
NmtNewtWidget *button;
button = nmt_newt_button_new (label);
nmt_newt_button_box_add_widget_end (bbox, button);
button = nmt_newt_button_new(label);
nmt_newt_button_box_add_widget_end(bbox, button);
return button;
}
@ -142,42 +138,39 @@ nmt_newt_button_box_add_end (NmtNewtButtonBox *bbox,
* Adds the given widget to the "end" section of @bbox.
*/
void
nmt_newt_button_box_add_widget_end (NmtNewtButtonBox *bbox,
NmtNewtWidget *widget)
nmt_newt_button_box_add_widget_end(NmtNewtButtonBox *bbox, NmtNewtWidget *widget)
{
NmtNewtButtonBoxPrivate *priv = NMT_NEWT_BUTTON_BOX_GET_PRIVATE (bbox);
NmtNewtButtonBoxPrivate *priv = NMT_NEWT_BUTTON_BOX_GET_PRIVATE(bbox);
NMT_NEWT_CONTAINER_CLASS (nmt_newt_button_box_parent_class)->
add (NMT_NEWT_CONTAINER (bbox), widget);
g_ptr_array_add (priv->end_buttons, widget);
NMT_NEWT_CONTAINER_CLASS(nmt_newt_button_box_parent_class)
->add(NMT_NEWT_CONTAINER(bbox), widget);
g_ptr_array_add(priv->end_buttons, widget);
}
static void
nmt_newt_button_box_remove (NmtNewtContainer *container,
NmtNewtWidget *child)
nmt_newt_button_box_remove(NmtNewtContainer *container, NmtNewtWidget *child)
{
NmtNewtButtonBoxPrivate *priv = NMT_NEWT_BUTTON_BOX_GET_PRIVATE (container);
NmtNewtButtonBoxPrivate *priv = NMT_NEWT_BUTTON_BOX_GET_PRIVATE(container);
int i;
NMT_NEWT_CONTAINER_CLASS (nmt_newt_button_box_parent_class)->
remove (container, child);
NMT_NEWT_CONTAINER_CLASS(nmt_newt_button_box_parent_class)->remove(container, child);
for (i = 0; i < priv->start_buttons->len; i++) {
if (priv->start_buttons->pdata[i] == (gpointer) child) {
g_ptr_array_remove_index (priv->start_buttons, i);
g_ptr_array_remove_index(priv->start_buttons, i);
return;
}
}
for (i = 0; i < priv->end_buttons->len; i++) {
if (priv->end_buttons->pdata[i] == (gpointer) child) {
g_ptr_array_remove_index (priv->end_buttons, i);
g_ptr_array_remove_index(priv->end_buttons, i);
return;
}
}
}
static void
add_buttons (GPtrArray *buttons, GPtrArray *cos)
add_buttons(GPtrArray *buttons, GPtrArray *cos)
{
NmtNewtWidget *child;
newtComponent *child_cos;
@ -186,69 +179,64 @@ add_buttons (GPtrArray *buttons, GPtrArray *cos)
for (i = 0; i < buttons->len; i++) {
child = buttons->pdata[i];
if (!nmt_newt_widget_get_visible (child))
if (!nmt_newt_widget_get_visible(child))
continue;
child_cos = nmt_newt_widget_get_components (child);
child_cos = nmt_newt_widget_get_components(child);
for (c = 0; child_cos[c]; c++)
g_ptr_array_add (cos, child_cos[c]);
g_free (child_cos);
g_ptr_array_add(cos, child_cos[c]);
g_free(child_cos);
}
}
static newtComponent *
nmt_newt_button_box_get_components (NmtNewtWidget *widget)
nmt_newt_button_box_get_components(NmtNewtWidget *widget)
{
NmtNewtButtonBoxPrivate *priv = NMT_NEWT_BUTTON_BOX_GET_PRIVATE (widget);
GPtrArray *cos;
NmtNewtButtonBoxPrivate *priv = NMT_NEWT_BUTTON_BOX_GET_PRIVATE(widget);
GPtrArray * cos;
cos = g_ptr_array_new ();
add_buttons (priv->start_buttons, cos);
add_buttons (priv->end_buttons, cos);
g_ptr_array_add (cos, NULL);
cos = g_ptr_array_new();
add_buttons(priv->start_buttons, cos);
add_buttons(priv->end_buttons, cos);
g_ptr_array_add(cos, NULL);
return (newtComponent *) g_ptr_array_free (cos, FALSE);
return (newtComponent *) g_ptr_array_free(cos, FALSE);
}
static void
size_request_buttons (NmtNewtButtonBox *bbox,
GPtrArray *buttons,
int *width,
int *height)
size_request_buttons(NmtNewtButtonBox *bbox, GPtrArray *buttons, int *width, int *height)
{
NmtNewtButtonBoxPrivate *priv = NMT_NEWT_BUTTON_BOX_GET_PRIVATE (bbox);
NmtNewtButtonBoxPrivate *priv = NMT_NEWT_BUTTON_BOX_GET_PRIVATE(bbox);
int child_width, child_height;
int i;
for (i = 0; i < buttons->len; i++) {
NmtNewtWidget *child = buttons->pdata[i];
nmt_newt_widget_size_request (child, &child_width, &child_height);
nmt_newt_widget_size_request(child, &child_width, &child_height);
if (priv->orientation == NMT_NEWT_BUTTON_BOX_HORIZONTAL) {
*width += child_width;
if (i > 0)
*width += 1;
*height = MAX (*height, child_height);
*height = MAX(*height, child_height);
} else {
*height += child_height;
if (i > 0)
*height += 1;
*width = MAX (*width, child_width);
*width = MAX(*width, child_width);
}
}
}
static void
nmt_newt_button_box_size_request (NmtNewtWidget *widget,
int *width,
int *height)
nmt_newt_button_box_size_request(NmtNewtWidget *widget, int *width, int *height)
{
NmtNewtButtonBox *bbox = NMT_NEWT_BUTTON_BOX (widget);
NmtNewtButtonBoxPrivate *priv = NMT_NEWT_BUTTON_BOX_GET_PRIVATE (widget);
NmtNewtButtonBox * bbox = NMT_NEWT_BUTTON_BOX(widget);
NmtNewtButtonBoxPrivate *priv = NMT_NEWT_BUTTON_BOX_GET_PRIVATE(widget);
*width = *height = 0;
size_request_buttons (bbox, priv->start_buttons, width, height);
size_request_buttons (bbox, priv->end_buttons, width, height);
size_request_buttons(bbox, priv->start_buttons, width, height);
size_request_buttons(bbox, priv->end_buttons, width, height);
if (priv->orientation == NMT_NEWT_BUTTON_BOX_HORIZONTAL)
*width += 1;
@ -257,14 +245,10 @@ nmt_newt_button_box_size_request (NmtNewtWidget *widget,
}
static void
nmt_newt_button_box_size_allocate (NmtNewtWidget *widget,
int x,
int y,
int width,
int height)
nmt_newt_button_box_size_allocate(NmtNewtWidget *widget, int x, int y, int width, int height)
{
NmtNewtButtonBoxPrivate *priv = NMT_NEWT_BUTTON_BOX_GET_PRIVATE (widget);
NmtNewtWidget *child;
NmtNewtButtonBoxPrivate *priv = NMT_NEWT_BUTTON_BOX_GET_PRIVATE(widget);
NmtNewtWidget * child;
int child_x, child_y, child_width, child_height;
int i;
@ -272,13 +256,13 @@ nmt_newt_button_box_size_allocate (NmtNewtWidget *widget,
child_y = y;
for (i = 0; i < priv->start_buttons->len; i++) {
child = priv->start_buttons->pdata[i];
nmt_newt_widget_size_request (child, &child_width, &child_height);
nmt_newt_widget_size_request(child, &child_width, &child_height);
if (priv->orientation == NMT_NEWT_BUTTON_BOX_HORIZONTAL) {
nmt_newt_widget_size_allocate (child, child_x, child_y, child_width, child_height);
nmt_newt_widget_size_allocate(child, child_x, child_y, child_width, child_height);
child_x += child_width + 1;
} else {
nmt_newt_widget_size_allocate (child, child_x, child_y, child_width, child_height);
nmt_newt_widget_size_allocate(child, child_x, child_y, child_width, child_height);
child_y += child_height + 1;
}
}
@ -290,66 +274,67 @@ nmt_newt_button_box_size_allocate (NmtNewtWidget *widget,
for (i = priv->end_buttons->len - 1; i >= 0; i--) {
child = priv->end_buttons->pdata[i];
nmt_newt_widget_size_request (child, &child_width, &child_height);
nmt_newt_widget_size_request(child, &child_width, &child_height);
if (priv->orientation == NMT_NEWT_BUTTON_BOX_HORIZONTAL) {
nmt_newt_widget_size_allocate (child,
child_x - child_width, child_y,
child_width, child_height);
nmt_newt_widget_size_allocate(child,
child_x - child_width,
child_y,
child_width,
child_height);
child_x -= child_width + 1;
} else {
nmt_newt_widget_size_allocate (child,
child_x, child_y - child_height,
child_width, child_height);
nmt_newt_widget_size_allocate(child,
child_x,
child_y - child_height,
child_width,
child_height);
child_y -= child_height + 1;
}
}
}
static void
nmt_newt_button_box_set_property (GObject *object,
nmt_newt_button_box_set_property(GObject * object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
GParamSpec * pspec)
{
NmtNewtButtonBoxPrivate *priv = NMT_NEWT_BUTTON_BOX_GET_PRIVATE (object);
NmtNewtButtonBoxPrivate *priv = NMT_NEWT_BUTTON_BOX_GET_PRIVATE(object);
switch (prop_id) {
case PROP_ORIENTATION:
priv->orientation = g_value_get_int (value);
priv->orientation = g_value_get_int(value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_newt_button_box_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
nmt_newt_button_box_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
{
NmtNewtButtonBoxPrivate *priv = NMT_NEWT_BUTTON_BOX_GET_PRIVATE (object);
NmtNewtButtonBoxPrivate *priv = NMT_NEWT_BUTTON_BOX_GET_PRIVATE(object);
switch (prop_id) {
case PROP_ORIENTATION:
g_value_set_int (value, priv->orientation);
g_value_set_int(value, priv->orientation);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_newt_button_box_class_init (NmtNewtButtonBoxClass *bbox_class)
nmt_newt_button_box_class_init(NmtNewtButtonBoxClass *bbox_class)
{
GObjectClass *object_class = G_OBJECT_CLASS (bbox_class);
NmtNewtWidgetClass *widget_class = NMT_NEWT_WIDGET_CLASS (bbox_class);
NmtNewtContainerClass *container_class = NMT_NEWT_CONTAINER_CLASS (bbox_class);
GObjectClass * object_class = G_OBJECT_CLASS(bbox_class);
NmtNewtWidgetClass * widget_class = NMT_NEWT_WIDGET_CLASS(bbox_class);
NmtNewtContainerClass *container_class = NMT_NEWT_CONTAINER_CLASS(bbox_class);
g_type_class_add_private (bbox_class, sizeof (NmtNewtButtonBoxPrivate));
g_type_class_add_private(bbox_class, sizeof(NmtNewtButtonBoxPrivate));
object_class->get_property = nmt_newt_button_box_get_property;
object_class->set_property = nmt_newt_button_box_set_property;
@ -360,11 +345,14 @@ nmt_newt_button_box_class_init (NmtNewtButtonBoxClass *bbox_class)
container_class->remove = nmt_newt_button_box_remove;
g_object_class_install_property
(object_class, PROP_ORIENTATION,
g_param_spec_int ("orientation", "", "",
0, G_MAXINT, 0,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
object_class,
PROP_ORIENTATION,
g_param_spec_int("orientation",
"",
"",
0,
G_MAXINT,
0,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
}

View file

@ -8,16 +8,19 @@
#include "nmt-newt-grid.h"
#define NMT_TYPE_NEWT_BUTTON_BOX (nmt_newt_button_box_get_type ())
#define NMT_NEWT_BUTTON_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMT_TYPE_NEWT_BUTTON_BOX, NmtNewtButtonBox))
#define NMT_NEWT_BUTTON_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NMT_TYPE_NEWT_BUTTON_BOX, NmtNewtButtonBoxClass))
#define NMT_IS_NEWT_BUTTON_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NMT_TYPE_NEWT_BUTTON_BOX))
#define NMT_IS_NEWT_BUTTON_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NMT_TYPE_NEWT_BUTTON_BOX))
#define NMT_NEWT_BUTTON_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NMT_TYPE_NEWT_BUTTON_BOX, NmtNewtButtonBoxClass))
#define NMT_TYPE_NEWT_BUTTON_BOX (nmt_newt_button_box_get_type())
#define NMT_NEWT_BUTTON_BOX(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), NMT_TYPE_NEWT_BUTTON_BOX, NmtNewtButtonBox))
#define NMT_NEWT_BUTTON_BOX_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), NMT_TYPE_NEWT_BUTTON_BOX, NmtNewtButtonBoxClass))
#define NMT_IS_NEWT_BUTTON_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), NMT_TYPE_NEWT_BUTTON_BOX))
#define NMT_IS_NEWT_BUTTON_BOX_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass), NMT_TYPE_NEWT_BUTTON_BOX))
#define NMT_NEWT_BUTTON_BOX_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), NMT_TYPE_NEWT_BUTTON_BOX, NmtNewtButtonBoxClass))
struct _NmtNewtButtonBox {
NmtNewtContainer parent;
};
typedef struct {
@ -25,23 +28,19 @@ typedef struct {
} NmtNewtButtonBoxClass;
GType nmt_newt_button_box_get_type (void);
GType nmt_newt_button_box_get_type(void);
typedef enum {
NMT_NEWT_BUTTON_BOX_HORIZONTAL,
NMT_NEWT_BUTTON_BOX_VERTICAL
} NmtNewtButtonBoxOrientation;
NmtNewtWidget *nmt_newt_button_box_new (NmtNewtButtonBoxOrientation orientation);
NmtNewtWidget *nmt_newt_button_box_new(NmtNewtButtonBoxOrientation orientation);
NmtNewtWidget *nmt_newt_button_box_add_start (NmtNewtButtonBox *bbox,
const char *label);
NmtNewtWidget *nmt_newt_button_box_add_end (NmtNewtButtonBox *bbox,
const char *label);
NmtNewtWidget *nmt_newt_button_box_add_start(NmtNewtButtonBox *bbox, const char *label);
NmtNewtWidget *nmt_newt_button_box_add_end(NmtNewtButtonBox *bbox, const char *label);
void nmt_newt_button_box_add_widget_start (NmtNewtButtonBox *bbox,
NmtNewtWidget *widget);
void nmt_newt_button_box_add_widget_end (NmtNewtButtonBox *bbox,
NmtNewtWidget *widget);
void nmt_newt_button_box_add_widget_start(NmtNewtButtonBox *bbox, NmtNewtWidget *widget);
void nmt_newt_button_box_add_widget_end(NmtNewtButtonBox *bbox, NmtNewtWidget *widget);
#endif /* NMT_NEWT_BUTTON_BOX_H */

View file

@ -15,9 +15,10 @@
#include "nmt-newt-button.h"
#include "nmt-newt-utils.h"
G_DEFINE_TYPE (NmtNewtButton, nmt_newt_button, NMT_TYPE_NEWT_COMPONENT)
G_DEFINE_TYPE(NmtNewtButton, nmt_newt_button, NMT_TYPE_NEWT_COMPONENT)
#define NMT_NEWT_BUTTON_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NMT_TYPE_NEWT_BUTTON, NmtNewtButtonPrivate))
#define NMT_NEWT_BUTTON_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE((o), NMT_TYPE_NEWT_BUTTON, NmtNewtButtonPrivate))
typedef struct {
char *label;
@ -36,7 +37,7 @@ enum {
LAST_SIGNAL
};
static guint signals[LAST_SIGNAL] = { 0 };
static guint signals[LAST_SIGNAL] = {0};
/**
* nmt_newt_button_new:
@ -47,11 +48,9 @@ static guint signals[LAST_SIGNAL] = { 0 };
* Returns: a new #NmtNewtButton
*/
NmtNewtWidget *
nmt_newt_button_new (const char *label)
nmt_newt_button_new(const char *label)
{
return g_object_new (NMT_TYPE_NEWT_BUTTON,
"label", label,
NULL);
return g_object_new(NMT_TYPE_NEWT_BUTTON, "label", label, NULL);
}
/**
@ -62,17 +61,16 @@ nmt_newt_button_new (const char *label)
* Updates @button's label.
*/
void
nmt_newt_button_set_label (NmtNewtButton *button,
const char *label)
nmt_newt_button_set_label(NmtNewtButton *button, const char *label)
{
NmtNewtButtonPrivate *priv = NMT_NEWT_BUTTON_GET_PRIVATE (button);
NmtNewtButtonPrivate *priv = NMT_NEWT_BUTTON_GET_PRIVATE(button);
if (!g_strcmp0 (priv->label, label))
if (!g_strcmp0(priv->label, label))
return;
g_free (priv->label);
priv->label = g_strdup (label);
nmt_newt_widget_needs_rebuild (NMT_NEWT_WIDGET (button));
g_free(priv->label);
priv->label = g_strdup(label);
nmt_newt_widget_needs_rebuild(NMT_NEWT_WIDGET(button));
}
/**
@ -84,127 +82,112 @@ nmt_newt_button_set_label (NmtNewtButton *button,
* Returns: @button's label.
*/
const char *
nmt_newt_button_get_label (NmtNewtButton *button)
nmt_newt_button_get_label(NmtNewtButton *button)
{
NmtNewtButtonPrivate *priv = NMT_NEWT_BUTTON_GET_PRIVATE (button);
NmtNewtButtonPrivate *priv = NMT_NEWT_BUTTON_GET_PRIVATE(button);
return priv->label;
}
static void
nmt_newt_button_init (NmtNewtButton *button)
{
}
nmt_newt_button_init(NmtNewtButton *button)
{}
static void
nmt_newt_button_finalize (GObject *object)
nmt_newt_button_finalize(GObject *object)
{
NmtNewtButtonPrivate *priv = NMT_NEWT_BUTTON_GET_PRIVATE (object);
NmtNewtButtonPrivate *priv = NMT_NEWT_BUTTON_GET_PRIVATE(object);
g_free (priv->label);
g_free(priv->label);
G_OBJECT_CLASS (nmt_newt_button_parent_class)->finalize (object);
G_OBJECT_CLASS(nmt_newt_button_parent_class)->finalize(object);
}
static newtComponent
nmt_newt_button_build_component (NmtNewtComponent *component,
gboolean sensitive)
nmt_newt_button_build_component(NmtNewtComponent *component, gboolean sensitive)
{
NmtNewtButtonPrivate *priv = NMT_NEWT_BUTTON_GET_PRIVATE (component);
NmtNewtButtonPrivate *priv = NMT_NEWT_BUTTON_GET_PRIVATE(component);
newtComponent co;
char *label = NULL, *label_lc;
char * label = NULL, *label_lc;
if (sensitive) {
label_lc = nmt_newt_locale_from_utf8 (priv->label);
co = newtCompactButton (-1, -1, label_lc);
g_free (label_lc);
label_lc = nmt_newt_locale_from_utf8(priv->label);
co = newtCompactButton(-1, -1, label_lc);
g_free(label_lc);
} else {
label = g_strdup_printf (" <%s>", priv->label);
label_lc = nmt_newt_locale_from_utf8 (label);
co = newtLabel (-1, -1, label_lc);
g_free (label_lc);
newtLabelSetColors (co, NMT_NEWT_COLORSET_DISABLED_BUTTON);
label = g_strdup_printf(" <%s>", priv->label);
label_lc = nmt_newt_locale_from_utf8(label);
co = newtLabel(-1, -1, label_lc);
g_free(label_lc);
newtLabelSetColors(co, NMT_NEWT_COLORSET_DISABLED_BUTTON);
}
return co;
}
static void
nmt_newt_button_size_request (NmtNewtWidget *widget,
int *width,
int *height)
nmt_newt_button_size_request(NmtNewtWidget *widget, int *width, int *height)
{
NMT_NEWT_WIDGET_CLASS (nmt_newt_button_parent_class)->size_request (widget, width, height);
NMT_NEWT_WIDGET_CLASS(nmt_newt_button_parent_class)->size_request(widget, width, height);
/* remove the automatically-added left padding */
(*width)--;
}
static void
nmt_newt_button_size_allocate (NmtNewtWidget *widget,
int x,
int y,
int width,
int height)
nmt_newt_button_size_allocate(NmtNewtWidget *widget, int x, int y, int width, int height)
{
/* account for the automatically-added left padding */
x--;
width++;
NMT_NEWT_WIDGET_CLASS (nmt_newt_button_parent_class)->size_allocate (widget, x, y, width, height);
NMT_NEWT_WIDGET_CLASS(nmt_newt_button_parent_class)->size_allocate(widget, x, y, width, height);
}
static void
nmt_newt_button_activated (NmtNewtWidget *widget)
nmt_newt_button_activated(NmtNewtWidget *widget)
{
g_signal_emit (widget, signals[CLICKED], 0);
g_signal_emit(widget, signals[CLICKED], 0);
NMT_NEWT_WIDGET_CLASS (nmt_newt_button_parent_class)->activated (widget);
NMT_NEWT_WIDGET_CLASS(nmt_newt_button_parent_class)->activated(widget);
}
static void
nmt_newt_button_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
nmt_newt_button_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
{
switch (prop_id) {
case PROP_LABEL:
nmt_newt_button_set_label (NMT_NEWT_BUTTON (object),
g_value_get_string (value));
nmt_newt_button_set_label(NMT_NEWT_BUTTON(object), g_value_get_string(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_newt_button_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
nmt_newt_button_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
{
NmtNewtButtonPrivate *priv = NMT_NEWT_BUTTON_GET_PRIVATE (object);
NmtNewtButtonPrivate *priv = NMT_NEWT_BUTTON_GET_PRIVATE(object);
switch (prop_id) {
case PROP_LABEL:
g_value_set_string (value, priv->label);
g_value_set_string(value, priv->label);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_newt_button_class_init (NmtNewtButtonClass *button_class)
nmt_newt_button_class_init(NmtNewtButtonClass *button_class)
{
GObjectClass *object_class = G_OBJECT_CLASS (button_class);
NmtNewtComponentClass *component_class = NMT_NEWT_COMPONENT_CLASS (button_class);
NmtNewtWidgetClass *widget_class = NMT_NEWT_WIDGET_CLASS (button_class);
GObjectClass * object_class = G_OBJECT_CLASS(button_class);
NmtNewtComponentClass *component_class = NMT_NEWT_COMPONENT_CLASS(button_class);
NmtNewtWidgetClass * widget_class = NMT_NEWT_WIDGET_CLASS(button_class);
g_type_class_add_private (button_class, sizeof (NmtNewtButtonPrivate));
g_type_class_add_private(button_class, sizeof(NmtNewtButtonPrivate));
/* virtual methods */
object_class->set_property = nmt_newt_button_set_property;
@ -225,12 +208,15 @@ nmt_newt_button_class_init (NmtNewtButtonClass *button_class)
*
* Emitted when the button is clicked.
*/
signals[CLICKED] =
g_signal_new ("clicked",
G_OBJECT_CLASS_TYPE (object_class),
signals[CLICKED] = g_signal_new("clicked",
G_OBJECT_CLASS_TYPE(object_class),
G_SIGNAL_RUN_FIRST,
0, NULL, NULL, NULL,
G_TYPE_NONE, 0);
0,
NULL,
NULL,
NULL,
G_TYPE_NONE,
0);
/* properties */
@ -239,10 +225,8 @@ nmt_newt_button_class_init (NmtNewtButtonClass *button_class)
*
* The button's label
*/
g_object_class_install_property
(object_class, PROP_LABEL,
g_param_spec_string ("label", "", "",
NULL,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
object_class,
PROP_LABEL,
g_param_spec_string("label", "", "", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
}

View file

@ -8,16 +8,18 @@
#include "nmt-newt-component.h"
#define NMT_TYPE_NEWT_BUTTON (nmt_newt_button_get_type ())
#define NMT_NEWT_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMT_TYPE_NEWT_BUTTON, NmtNewtButton))
#define NMT_NEWT_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NMT_TYPE_NEWT_BUTTON, NmtNewtButtonClass))
#define NMT_IS_NEWT_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NMT_TYPE_NEWT_BUTTON))
#define NMT_IS_NEWT_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NMT_TYPE_NEWT_BUTTON))
#define NMT_NEWT_BUTTON_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NMT_TYPE_NEWT_BUTTON, NmtNewtButtonClass))
#define NMT_TYPE_NEWT_BUTTON (nmt_newt_button_get_type())
#define NMT_NEWT_BUTTON(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), NMT_TYPE_NEWT_BUTTON, NmtNewtButton))
#define NMT_NEWT_BUTTON_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), NMT_TYPE_NEWT_BUTTON, NmtNewtButtonClass))
#define NMT_IS_NEWT_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), NMT_TYPE_NEWT_BUTTON))
#define NMT_IS_NEWT_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NMT_TYPE_NEWT_BUTTON))
#define NMT_NEWT_BUTTON_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), NMT_TYPE_NEWT_BUTTON, NmtNewtButtonClass))
struct _NmtNewtButton {
NmtNewtComponent parent;
};
typedef struct {
@ -25,12 +27,11 @@ typedef struct {
} NmtNewtButtonClass;
GType nmt_newt_button_get_type (void);
GType nmt_newt_button_get_type(void);
NmtNewtWidget *nmt_newt_button_new (const char *label);
NmtNewtWidget *nmt_newt_button_new(const char *label);
void nmt_newt_button_set_label (NmtNewtButton *button,
const char *label);
const char *nmt_newt_button_get_label (NmtNewtButton *button);
void nmt_newt_button_set_label(NmtNewtButton *button, const char *label);
const char *nmt_newt_button_get_label(NmtNewtButton *button);
#endif /* NMT_NEWT_BUTTON_H */

View file

@ -15,12 +15,13 @@
#include "nmt-newt-checkbox.h"
#include "nmt-newt-utils.h"
G_DEFINE_TYPE (NmtNewtCheckbox, nmt_newt_checkbox, NMT_TYPE_NEWT_COMPONENT)
G_DEFINE_TYPE(NmtNewtCheckbox, nmt_newt_checkbox, NMT_TYPE_NEWT_COMPONENT)
#define NMT_NEWT_CHECKBOX_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NMT_TYPE_NEWT_CHECKBOX, NmtNewtCheckboxPrivate))
#define NMT_NEWT_CHECKBOX_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE((o), NMT_TYPE_NEWT_CHECKBOX, NmtNewtCheckboxPrivate))
typedef struct {
char *label_lc;
char * label_lc;
gboolean active;
} NmtNewtCheckboxPrivate;
@ -45,11 +46,9 @@ enum {
* Returns: a new #NmtNewtCheckbox
*/
NmtNewtWidget *
nmt_newt_checkbox_new (const char *label)
nmt_newt_checkbox_new(const char *label)
{
return g_object_new (NMT_TYPE_NEWT_CHECKBOX,
"label", label,
NULL);
return g_object_new(NMT_TYPE_NEWT_CHECKBOX, "label", label, NULL);
}
/**
@ -60,10 +59,9 @@ nmt_newt_checkbox_new (const char *label)
* Updates @checkbox's checked state
*/
void
nmt_newt_checkbox_set_active (NmtNewtCheckbox *checkbox,
gboolean active)
nmt_newt_checkbox_set_active(NmtNewtCheckbox *checkbox, gboolean active)
{
NmtNewtCheckboxPrivate *priv = NMT_NEWT_CHECKBOX_GET_PRIVATE (checkbox);
NmtNewtCheckboxPrivate *priv = NMT_NEWT_CHECKBOX_GET_PRIVATE(checkbox);
newtComponent co;
active = !!active;
@ -72,11 +70,11 @@ nmt_newt_checkbox_set_active (NmtNewtCheckbox *checkbox,
priv->active = active;
co = nmt_newt_component_get_component (NMT_NEWT_COMPONENT (checkbox));
co = nmt_newt_component_get_component(NMT_NEWT_COMPONENT(checkbox));
if (co)
newtCheckboxSetValue (co, priv->active ? CHECKBOX_ACTIVE : CHECKBOX_INACTIVE);
newtCheckboxSetValue(co, priv->active ? CHECKBOX_ACTIVE : CHECKBOX_INACTIVE);
g_object_notify (G_OBJECT (checkbox), "active");
g_object_notify(G_OBJECT(checkbox), "active");
}
/**
@ -88,109 +86,106 @@ nmt_newt_checkbox_set_active (NmtNewtCheckbox *checkbox,
* Returns: @checkbox's checked state
*/
gboolean
nmt_newt_checkbox_get_active (NmtNewtCheckbox *checkbox)
nmt_newt_checkbox_get_active(NmtNewtCheckbox *checkbox)
{
NmtNewtCheckboxPrivate *priv = NMT_NEWT_CHECKBOX_GET_PRIVATE (checkbox);
NmtNewtCheckboxPrivate *priv = NMT_NEWT_CHECKBOX_GET_PRIVATE(checkbox);
return priv->active;
}
static void
nmt_newt_checkbox_init (NmtNewtCheckbox *checkbox)
nmt_newt_checkbox_init(NmtNewtCheckbox *checkbox)
{}
static void
nmt_newt_checkbox_finalize(GObject *object)
{
NmtNewtCheckboxPrivate *priv = NMT_NEWT_CHECKBOX_GET_PRIVATE(object);
g_free(priv->label_lc);
G_OBJECT_CLASS(nmt_newt_checkbox_parent_class)->finalize(object);
}
static void
nmt_newt_checkbox_finalize (GObject *object)
checkbox_toggled_callback(newtComponent co, void *checkbox)
{
NmtNewtCheckboxPrivate *priv = NMT_NEWT_CHECKBOX_GET_PRIVATE (object);
g_free (priv->label_lc);
G_OBJECT_CLASS (nmt_newt_checkbox_parent_class)->finalize (object);
}
static void
checkbox_toggled_callback (newtComponent co,
void *checkbox)
{
NmtNewtCheckboxPrivate *priv = NMT_NEWT_CHECKBOX_GET_PRIVATE (checkbox);
NmtNewtCheckboxPrivate *priv = NMT_NEWT_CHECKBOX_GET_PRIVATE(checkbox);
gboolean active;
active = (newtCheckboxGetValue (co) == CHECKBOX_ACTIVE);
active = (newtCheckboxGetValue(co) == CHECKBOX_ACTIVE);
if (active != priv->active) {
priv->active = active;
g_object_notify (checkbox, "active");
g_object_notify(checkbox, "active");
}
}
static newtComponent
nmt_newt_checkbox_build_component (NmtNewtComponent *component,
gboolean sensitive)
nmt_newt_checkbox_build_component(NmtNewtComponent *component, gboolean sensitive)
{
NmtNewtCheckboxPrivate *priv = NMT_NEWT_CHECKBOX_GET_PRIVATE (component);
NmtNewtCheckboxPrivate *priv = NMT_NEWT_CHECKBOX_GET_PRIVATE(component);
newtComponent co;
co = newtCheckbox (-1, -1, priv->label_lc,
co = newtCheckbox(-1,
-1,
priv->label_lc,
priv->active ? CHECKBOX_ACTIVE : CHECKBOX_INACTIVE,
CHECKBOX_STATES, NULL);
CHECKBOX_STATES,
NULL);
if (!sensitive)
newtCheckboxSetFlags (co, NEWT_FLAG_DISABLED, NEWT_FLAGS_SET);
newtComponentAddCallback (co, checkbox_toggled_callback, component);
newtCheckboxSetFlags(co, NEWT_FLAG_DISABLED, NEWT_FLAGS_SET);
newtComponentAddCallback(co, checkbox_toggled_callback, component);
return co;
}
static void
nmt_newt_checkbox_set_property (GObject *object,
nmt_newt_checkbox_set_property(GObject * object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
GParamSpec * pspec)
{
NmtNewtCheckbox *checkbox = NMT_NEWT_CHECKBOX (object);
NmtNewtCheckboxPrivate *priv = NMT_NEWT_CHECKBOX_GET_PRIVATE (object);
NmtNewtCheckbox * checkbox = NMT_NEWT_CHECKBOX(object);
NmtNewtCheckboxPrivate *priv = NMT_NEWT_CHECKBOX_GET_PRIVATE(object);
switch (prop_id) {
case PROP_LABEL:
g_free (priv->label_lc);
priv->label_lc = nmt_newt_locale_from_utf8 (g_value_get_string (value));
g_free(priv->label_lc);
priv->label_lc = nmt_newt_locale_from_utf8(g_value_get_string(value));
break;
case PROP_ACTIVE:
nmt_newt_checkbox_set_active (checkbox, g_value_get_boolean (value));
nmt_newt_checkbox_set_active(checkbox, g_value_get_boolean(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_newt_checkbox_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
nmt_newt_checkbox_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
{
NmtNewtCheckboxPrivate *priv = NMT_NEWT_CHECKBOX_GET_PRIVATE (object);
NmtNewtCheckboxPrivate *priv = NMT_NEWT_CHECKBOX_GET_PRIVATE(object);
switch (prop_id) {
case PROP_LABEL:
g_value_take_string (value, nmt_newt_locale_to_utf8 (priv->label_lc));
g_value_take_string(value, nmt_newt_locale_to_utf8(priv->label_lc));
break;
case PROP_ACTIVE:
g_value_set_boolean (value, priv->active);
g_value_set_boolean(value, priv->active);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_newt_checkbox_class_init (NmtNewtCheckboxClass *checkbox_class)
nmt_newt_checkbox_class_init(NmtNewtCheckboxClass *checkbox_class)
{
GObjectClass *object_class = G_OBJECT_CLASS (checkbox_class);
NmtNewtComponentClass *component_class = NMT_NEWT_COMPONENT_CLASS (checkbox_class);
GObjectClass * object_class = G_OBJECT_CLASS(checkbox_class);
NmtNewtComponentClass *component_class = NMT_NEWT_COMPONENT_CLASS(checkbox_class);
g_type_class_add_private (checkbox_class, sizeof (NmtNewtCheckboxPrivate));
g_type_class_add_private(checkbox_class, sizeof(NmtNewtCheckboxPrivate));
/* virtual methods */
object_class->set_property = nmt_newt_checkbox_set_property;
@ -204,21 +199,17 @@ nmt_newt_checkbox_class_init (NmtNewtCheckboxClass *checkbox_class)
*
* The checkbox's label
*/
g_object_class_install_property
(object_class, PROP_LABEL,
g_param_spec_string ("label", "", "",
NULL,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
object_class,
PROP_LABEL,
g_param_spec_string("label", "", "", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
* NmtNewtCheckbox:active:
*
* The checkbox's checked state
*/
g_object_class_install_property
(object_class, PROP_ACTIVE,
g_param_spec_boolean ("active", "", "",
FALSE,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
object_class,
PROP_ACTIVE,
g_param_spec_boolean("active", "", "", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
}

View file

@ -8,16 +8,18 @@
#include "nmt-newt-component.h"
#define NMT_TYPE_NEWT_CHECKBOX (nmt_newt_checkbox_get_type ())
#define NMT_NEWT_CHECKBOX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMT_TYPE_NEWT_CHECKBOX, NmtNewtCheckbox))
#define NMT_NEWT_CHECKBOX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NMT_TYPE_NEWT_CHECKBOX, NmtNewtCheckboxClass))
#define NMT_IS_NEWT_CHECKBOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NMT_TYPE_NEWT_CHECKBOX))
#define NMT_IS_NEWT_CHECKBOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NMT_TYPE_NEWT_CHECKBOX))
#define NMT_NEWT_CHECKBOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NMT_TYPE_NEWT_CHECKBOX, NmtNewtCheckboxClass))
#define NMT_TYPE_NEWT_CHECKBOX (nmt_newt_checkbox_get_type())
#define NMT_NEWT_CHECKBOX(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), NMT_TYPE_NEWT_CHECKBOX, NmtNewtCheckbox))
#define NMT_NEWT_CHECKBOX_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), NMT_TYPE_NEWT_CHECKBOX, NmtNewtCheckboxClass))
#define NMT_IS_NEWT_CHECKBOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), NMT_TYPE_NEWT_CHECKBOX))
#define NMT_IS_NEWT_CHECKBOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NMT_TYPE_NEWT_CHECKBOX))
#define NMT_NEWT_CHECKBOX_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), NMT_TYPE_NEWT_CHECKBOX, NmtNewtCheckboxClass))
struct _NmtNewtCheckbox {
NmtNewtComponent parent;
};
typedef struct {
@ -25,12 +27,11 @@ typedef struct {
} NmtNewtCheckboxClass;
GType nmt_newt_checkbox_get_type (void);
GType nmt_newt_checkbox_get_type(void);
NmtNewtWidget *nmt_newt_checkbox_new (const char *label);
NmtNewtWidget *nmt_newt_checkbox_new(const char *label);
void nmt_newt_checkbox_set_active (NmtNewtCheckbox *checkbox,
gboolean active);
gboolean nmt_newt_checkbox_get_active (NmtNewtCheckbox *checkbox);
void nmt_newt_checkbox_set_active(NmtNewtCheckbox *checkbox, gboolean active);
gboolean nmt_newt_checkbox_get_active(NmtNewtCheckbox *checkbox);
#endif /* NMT_NEWT_CHECKBOX_H */

View file

@ -17,9 +17,10 @@
#include "nmt-newt-form.h"
#include "nmt-newt-hacks.h"
G_DEFINE_ABSTRACT_TYPE (NmtNewtComponent, nmt_newt_component, NMT_TYPE_NEWT_WIDGET)
G_DEFINE_ABSTRACT_TYPE(NmtNewtComponent, nmt_newt_component, NMT_TYPE_NEWT_WIDGET)
#define NMT_NEWT_COMPONENT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NMT_TYPE_NEWT_COMPONENT, NmtNewtComponentPrivate))
#define NMT_NEWT_COMPONENT_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE((o), NMT_TYPE_NEWT_COMPONENT, NmtNewtComponentPrivate))
typedef struct {
newtComponent co;
@ -37,71 +38,69 @@ enum {
};
static void
nmt_newt_component_init (NmtNewtComponent *component)
nmt_newt_component_init(NmtNewtComponent *component)
{
NmtNewtComponentPrivate *priv = NMT_NEWT_COMPONENT_GET_PRIVATE (component);
NmtNewtComponentPrivate *priv = NMT_NEWT_COMPONENT_GET_PRIVATE(component);
priv->sensitive = TRUE;
}
static void
nmt_newt_component_unrealize (NmtNewtWidget *widget)
nmt_newt_component_unrealize(NmtNewtWidget *widget)
{
NmtNewtComponentPrivate *priv = NMT_NEWT_COMPONENT_GET_PRIVATE (widget);
NmtNewtComponentPrivate *priv = NMT_NEWT_COMPONENT_GET_PRIVATE(widget);
if (!priv->co)
return;
newtComponentAddCallback (priv->co, NULL, NULL);
newtComponentAddDestroyCallback (priv->co, NULL, NULL);
newtComponentAddCallback(priv->co, NULL, NULL);
newtComponentAddDestroyCallback(priv->co, NULL, NULL);
if (priv->own_component)
newtComponentDestroy (priv->co);
newtComponentDestroy(priv->co);
priv->co = NULL;
}
static void
component_destroy_callback (newtComponent co,
void *component)
component_destroy_callback(newtComponent co, void *component)
{
NmtNewtComponentPrivate *priv = NMT_NEWT_COMPONENT_GET_PRIVATE (component);
NmtNewtComponentPrivate *priv = NMT_NEWT_COMPONENT_GET_PRIVATE(component);
priv->own_component = FALSE;
nmt_newt_widget_unrealize (component);
nmt_newt_widget_needs_rebuild (component);
nmt_newt_widget_unrealize(component);
nmt_newt_widget_needs_rebuild(component);
}
static void
nmt_newt_component_realize (NmtNewtWidget *widget)
nmt_newt_component_realize(NmtNewtWidget *widget)
{
NmtNewtComponentPrivate *priv = NMT_NEWT_COMPONENT_GET_PRIVATE (widget);
NmtNewtComponentPrivate *priv = NMT_NEWT_COMPONENT_GET_PRIVATE(widget);
nmt_newt_component_unrealize (widget);
priv->co = NMT_NEWT_COMPONENT_GET_CLASS (widget)->
build_component (NMT_NEWT_COMPONENT (widget), priv->sensitive);
nmt_newt_component_unrealize(widget);
priv->co = NMT_NEWT_COMPONENT_GET_CLASS(widget)->build_component(NMT_NEWT_COMPONENT(widget),
priv->sensitive);
priv->own_component = TRUE;
if (!priv->sensitive)
newtComponentTakesFocus (priv->co, FALSE);
newtComponentAddDestroyCallback (priv->co, component_destroy_callback, widget);
newtComponentTakesFocus(priv->co, FALSE);
newtComponentAddDestroyCallback(priv->co, component_destroy_callback, widget);
}
static newtComponent *
nmt_newt_component_get_components (NmtNewtWidget *widget)
nmt_newt_component_get_components(NmtNewtWidget *widget)
{
NmtNewtComponentPrivate *priv = NMT_NEWT_COMPONENT_GET_PRIVATE (widget);
newtComponent *cos;
NmtNewtComponentPrivate *priv = NMT_NEWT_COMPONENT_GET_PRIVATE(widget);
newtComponent * cos;
priv->own_component = FALSE;
cos = g_new0 (newtComponent, 2);
cos = g_new0(newtComponent, 2);
cos[0] = priv->co;
return cos;
}
static NmtNewtWidget *
nmt_newt_component_find_component (NmtNewtWidget *widget,
newtComponent co)
nmt_newt_component_find_component(NmtNewtWidget *widget, newtComponent co)
{
NmtNewtComponentPrivate *priv = NMT_NEWT_COMPONENT_GET_PRIVATE (widget);
NmtNewtComponentPrivate *priv = NMT_NEWT_COMPONENT_GET_PRIVATE(widget);
if (co == priv->co)
return widget;
@ -110,41 +109,42 @@ nmt_newt_component_find_component (NmtNewtWidget *widget,
}
static void
nmt_newt_component_size_request (NmtNewtWidget *widget,
int *width,
int *height)
nmt_newt_component_size_request(NmtNewtWidget *widget, int *width, int *height)
{
NmtNewtComponentPrivate *priv = NMT_NEWT_COMPONENT_GET_PRIVATE (widget);
NmtNewtComponentPrivate *priv = NMT_NEWT_COMPONENT_GET_PRIVATE(widget);
newtComponentGetSize (priv->co, width, height);
newtComponentGetSize(priv->co, width, height);
}
static void
nmt_newt_component_size_allocate (NmtNewtWidget *widget,
int x,
int y,
int width,
int height)
nmt_newt_component_size_allocate(NmtNewtWidget *widget, int x, int y, int width, int height)
{
NmtNewtComponentPrivate *priv = NMT_NEWT_COMPONENT_GET_PRIVATE (widget);
NmtNewtComponentPrivate *priv = NMT_NEWT_COMPONENT_GET_PRIVATE(widget);
newtGrid grid;
/* You can't directly place a newtComponent, so we create a newtGrid,
* position the component within that, and then place the grid.
*/
grid = newtCreateGrid (1, 1);
newtGridSetField (grid, 0, 0,
NEWT_GRID_COMPONENT, priv->co,
x, y, 0, 0,
NEWT_ANCHOR_LEFT | NEWT_ANCHOR_TOP, 0);
newtGridPlace (grid, 0, 0);
newtGridFree (grid, FALSE);
grid = newtCreateGrid(1, 1);
newtGridSetField(grid,
0,
0,
NEWT_GRID_COMPONENT,
priv->co,
x,
y,
0,
0,
NEWT_ANCHOR_LEFT | NEWT_ANCHOR_TOP,
0);
newtGridPlace(grid, 0, 0);
newtGridFree(grid, FALSE);
}
static newtComponent
nmt_newt_component_get_focus_component (NmtNewtWidget *widget)
nmt_newt_component_get_focus_component(NmtNewtWidget *widget)
{
NmtNewtComponentPrivate *priv = NMT_NEWT_COMPONENT_GET_PRIVATE (widget);
NmtNewtComponentPrivate *priv = NMT_NEWT_COMPONENT_GET_PRIVATE(widget);
return priv->co;
}
@ -161,9 +161,9 @@ nmt_newt_component_get_focus_component (NmtNewtWidget *widget)
* Returns: @component's #newtComponent
*/
newtComponent
nmt_newt_component_get_component (NmtNewtComponent *component)
nmt_newt_component_get_component(NmtNewtComponent *component)
{
NmtNewtComponentPrivate *priv = NMT_NEWT_COMPONENT_GET_PRIVATE (component);
NmtNewtComponentPrivate *priv = NMT_NEWT_COMPONENT_GET_PRIVATE(component);
return priv->co;
}
@ -180,9 +180,9 @@ nmt_newt_component_get_component (NmtNewtComponent *component)
* Returns: @component's #NmtNewtComponent:sensitive property
*/
gboolean
nmt_newt_component_get_sensitive (NmtNewtComponent *component)
nmt_newt_component_get_sensitive(NmtNewtComponent *component)
{
NmtNewtComponentPrivate *priv = NMT_NEWT_COMPONENT_GET_PRIVATE (component);
NmtNewtComponentPrivate *priv = NMT_NEWT_COMPONENT_GET_PRIVATE(component);
return priv->sensitive;
}
@ -195,66 +195,62 @@ nmt_newt_component_get_sensitive (NmtNewtComponent *component)
* Sets @component's #NmtNewtComponent:sensitive property.
*/
void
nmt_newt_component_set_sensitive (NmtNewtComponent *component,
gboolean sensitive)
nmt_newt_component_set_sensitive(NmtNewtComponent *component, gboolean sensitive)
{
NmtNewtComponentPrivate *priv = NMT_NEWT_COMPONENT_GET_PRIVATE (component);
NmtNewtComponentPrivate *priv = NMT_NEWT_COMPONENT_GET_PRIVATE(component);
sensitive = !!sensitive;
if (priv->sensitive == sensitive)
return;
priv->sensitive = sensitive;
g_object_notify (G_OBJECT (component), "sensitive");
nmt_newt_widget_needs_rebuild (NMT_NEWT_WIDGET (component));
g_object_notify(G_OBJECT(component), "sensitive");
nmt_newt_widget_needs_rebuild(NMT_NEWT_WIDGET(component));
}
static void
nmt_newt_component_set_property (GObject *object,
nmt_newt_component_set_property(GObject * object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
GParamSpec * pspec)
{
NmtNewtComponent *component = NMT_NEWT_COMPONENT (object);
NmtNewtComponent *component = NMT_NEWT_COMPONENT(object);
switch (prop_id) {
case PROP_SENSITIVE:
nmt_newt_component_set_sensitive (component, g_value_get_boolean (value));
nmt_newt_component_set_sensitive(component, g_value_get_boolean(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_newt_component_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
nmt_newt_component_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
{
NmtNewtComponent *component = NMT_NEWT_COMPONENT (object);
NmtNewtComponent *component = NMT_NEWT_COMPONENT(object);
switch (prop_id) {
case PROP_COMPONENT:
g_value_set_pointer (value, nmt_newt_component_get_component (component));
g_value_set_pointer(value, nmt_newt_component_get_component(component));
break;
case PROP_SENSITIVE:
g_value_set_boolean (value, nmt_newt_component_get_sensitive (component));
g_value_set_boolean(value, nmt_newt_component_get_sensitive(component));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_newt_component_class_init (NmtNewtComponentClass *component_class)
nmt_newt_component_class_init(NmtNewtComponentClass *component_class)
{
GObjectClass *object_class = G_OBJECT_CLASS (component_class);
NmtNewtWidgetClass *widget_class = NMT_NEWT_WIDGET_CLASS (component_class);
GObjectClass * object_class = G_OBJECT_CLASS(component_class);
NmtNewtWidgetClass *widget_class = NMT_NEWT_WIDGET_CLASS(component_class);
g_type_class_add_private (component_class, sizeof (NmtNewtComponentPrivate));
g_type_class_add_private(component_class, sizeof(NmtNewtComponentPrivate));
/* virtual methods */
object_class->set_property = nmt_newt_component_set_property;
@ -275,11 +271,10 @@ nmt_newt_component_class_init (NmtNewtComponentClass *component_class)
*
* The component's #newtComponent
*/
g_object_class_install_property
(object_class, PROP_COMPONENT,
g_param_spec_pointer ("component", "", "",
G_PARAM_READABLE |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
object_class,
PROP_COMPONENT,
g_param_spec_pointer("component", "", "", G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
/**
* NmtNewtComponent:sensitive:
*
@ -287,10 +282,12 @@ nmt_newt_component_class_init (NmtNewtComponentClass *component_class)
* be skipped over in the keyboard tab chain, and may be displayed
* differently.
*/
g_object_class_install_property
(object_class, PROP_SENSITIVE,
g_param_spec_boolean ("sensitive", "", "",
g_object_class_install_property(
object_class,
PROP_SENSITIVE,
g_param_spec_boolean("sensitive",
"",
"",
TRUE,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
}

View file

@ -8,33 +8,34 @@
#include "nmt-newt-widget.h"
#define NMT_TYPE_NEWT_COMPONENT (nmt_newt_component_get_type ())
#define NMT_NEWT_COMPONENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMT_TYPE_NEWT_COMPONENT, NmtNewtComponent))
#define NMT_NEWT_COMPONENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NMT_TYPE_NEWT_COMPONENT, NmtNewtComponentClass))
#define NMT_IS_NEWT_COMPONENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NMT_TYPE_NEWT_COMPONENT))
#define NMT_IS_NEWT_COMPONENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NMT_TYPE_NEWT_COMPONENT))
#define NMT_NEWT_COMPONENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NMT_TYPE_NEWT_COMPONENT, NmtNewtComponentClass))
#define NMT_TYPE_NEWT_COMPONENT (nmt_newt_component_get_type())
#define NMT_NEWT_COMPONENT(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), NMT_TYPE_NEWT_COMPONENT, NmtNewtComponent))
#define NMT_NEWT_COMPONENT_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), NMT_TYPE_NEWT_COMPONENT, NmtNewtComponentClass))
#define NMT_IS_NEWT_COMPONENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), NMT_TYPE_NEWT_COMPONENT))
#define NMT_IS_NEWT_COMPONENT_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass), NMT_TYPE_NEWT_COMPONENT))
#define NMT_NEWT_COMPONENT_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), NMT_TYPE_NEWT_COMPONENT, NmtNewtComponentClass))
struct _NmtNewtComponent {
NmtNewtWidget parent;
};
typedef struct {
NmtNewtWidgetClass parent;
/* methods */
newtComponent (*build_component) (NmtNewtComponent *component,
gboolean sensitive);
newtComponent (*build_component)(NmtNewtComponent *component, gboolean sensitive);
} NmtNewtComponentClass;
GType nmt_newt_component_get_type (void);
GType nmt_newt_component_get_type(void);
newtComponent nmt_newt_component_get_component (NmtNewtComponent *component);
newtComponent nmt_newt_component_get_component(NmtNewtComponent *component);
gboolean nmt_newt_component_get_sensitive (NmtNewtComponent *component);
void nmt_newt_component_set_sensitive (NmtNewtComponent *component,
gboolean sensitive);
gboolean nmt_newt_component_get_sensitive(NmtNewtComponent *component);
void nmt_newt_component_set_sensitive(NmtNewtComponent *component, gboolean sensitive);
#endif /* NMT_NEWT_COMPONENT_H */

View file

@ -19,142 +19,139 @@
#include "nmt-newt-component.h"
G_DEFINE_ABSTRACT_TYPE (NmtNewtContainer, nmt_newt_container, NMT_TYPE_NEWT_WIDGET)
G_DEFINE_ABSTRACT_TYPE(NmtNewtContainer, nmt_newt_container, NMT_TYPE_NEWT_WIDGET)
#define NMT_NEWT_CONTAINER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NMT_TYPE_NEWT_CONTAINER, NmtNewtContainerPrivate))
#define NMT_NEWT_CONTAINER_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE((o), NMT_TYPE_NEWT_CONTAINER, NmtNewtContainerPrivate))
typedef struct {
GPtrArray *children;
} NmtNewtContainerPrivate;
static void child_needs_rebuild (NmtNewtWidget *widget, gpointer user_data);
static void child_needs_rebuild(NmtNewtWidget *widget, gpointer user_data);
static void
nmt_newt_container_init (NmtNewtContainer *container)
nmt_newt_container_init(NmtNewtContainer *container)
{
NmtNewtContainerPrivate *priv = NMT_NEWT_CONTAINER_GET_PRIVATE (container);
NmtNewtContainerPrivate *priv = NMT_NEWT_CONTAINER_GET_PRIVATE(container);
priv->children = g_ptr_array_new ();
priv->children = g_ptr_array_new();
}
static void
nmt_newt_container_finalize (GObject *object)
nmt_newt_container_finalize(GObject *object)
{
NmtNewtContainer *container = NMT_NEWT_CONTAINER (object);
NmtNewtContainerPrivate *priv = NMT_NEWT_CONTAINER_GET_PRIVATE (object);
NmtNewtContainer * container = NMT_NEWT_CONTAINER(object);
NmtNewtContainerPrivate *priv = NMT_NEWT_CONTAINER_GET_PRIVATE(object);
while (priv->children->len)
nmt_newt_container_remove (container, priv->children->pdata[0]);
nmt_newt_container_remove(container, priv->children->pdata[0]);
G_OBJECT_CLASS (nmt_newt_container_parent_class)->finalize (object);
G_OBJECT_CLASS(nmt_newt_container_parent_class)->finalize(object);
}
static void
nmt_newt_container_realize (NmtNewtWidget *widget)
nmt_newt_container_realize(NmtNewtWidget *widget)
{
NmtNewtContainerPrivate *priv = NMT_NEWT_CONTAINER_GET_PRIVATE (widget);
NmtNewtContainerPrivate *priv = NMT_NEWT_CONTAINER_GET_PRIVATE(widget);
int i;
for (i = 0; i < priv->children->len; i++)
nmt_newt_widget_realize (priv->children->pdata[i]);
nmt_newt_widget_realize(priv->children->pdata[i]);
}
static void
nmt_newt_container_unrealize (NmtNewtWidget *widget)
nmt_newt_container_unrealize(NmtNewtWidget *widget)
{
NmtNewtContainerPrivate *priv = NMT_NEWT_CONTAINER_GET_PRIVATE (widget);
NmtNewtContainerPrivate *priv = NMT_NEWT_CONTAINER_GET_PRIVATE(widget);
int i;
for (i = 0; i < priv->children->len; i++)
nmt_newt_widget_unrealize (priv->children->pdata[i]);
nmt_newt_widget_unrealize(priv->children->pdata[i]);
}
static void
child_needs_rebuild (NmtNewtWidget *widget,
gpointer user_data)
child_needs_rebuild(NmtNewtWidget *widget, gpointer user_data)
{
NmtNewtWidget *container = user_data;
nmt_newt_widget_needs_rebuild (container);
nmt_newt_widget_needs_rebuild(container);
}
static void
nmt_newt_container_real_child_validity_changed (NmtNewtContainer *container,
NmtNewtWidget *widget)
nmt_newt_container_real_child_validity_changed(NmtNewtContainer *container, NmtNewtWidget *widget)
{
NmtNewtContainerPrivate *priv;
int i;
if (widget) {
if (!nmt_newt_widget_get_visible (widget))
if (!nmt_newt_widget_get_visible(widget))
return;
if (!nmt_newt_widget_get_valid (widget)) {
nmt_newt_widget_set_valid (NMT_NEWT_WIDGET (container), FALSE);
if (!nmt_newt_widget_get_valid(widget)) {
nmt_newt_widget_set_valid(NMT_NEWT_WIDGET(container), FALSE);
return;
}
}
priv = NMT_NEWT_CONTAINER_GET_PRIVATE (container);
priv = NMT_NEWT_CONTAINER_GET_PRIVATE(container);
for (i = 0; i < priv->children->len; i++) {
widget = priv->children->pdata[i];
if ( nmt_newt_widget_get_visible (widget)
&& !nmt_newt_widget_get_valid (widget)) {
nmt_newt_widget_set_valid (NMT_NEWT_WIDGET (container), FALSE);
if (nmt_newt_widget_get_visible(widget) && !nmt_newt_widget_get_valid(widget)) {
nmt_newt_widget_set_valid(NMT_NEWT_WIDGET(container), FALSE);
return;
}
}
nmt_newt_widget_set_valid (NMT_NEWT_WIDGET (container), TRUE);
nmt_newt_widget_set_valid(NMT_NEWT_WIDGET(container), TRUE);
}
static void
nmt_newt_container_child_validity_changed (NmtNewtContainer *container,
NmtNewtWidget *widget)
nmt_newt_container_child_validity_changed(NmtNewtContainer *container, NmtNewtWidget *widget)
{
NMT_NEWT_CONTAINER_GET_CLASS (container)->child_validity_changed (container, widget);
NMT_NEWT_CONTAINER_GET_CLASS(container)->child_validity_changed(container, widget);
}
static void
child_validity_notify (GObject *object,
GParamSpec *pspec,
gpointer container)
child_validity_notify(GObject *object, GParamSpec *pspec, gpointer container)
{
nmt_newt_container_child_validity_changed (container, NMT_NEWT_WIDGET (object));
nmt_newt_container_child_validity_changed(container, NMT_NEWT_WIDGET(object));
}
static void
nmt_newt_container_real_add (NmtNewtContainer *container,
NmtNewtWidget *widget)
nmt_newt_container_real_add(NmtNewtContainer *container, NmtNewtWidget *widget)
{
NmtNewtContainerPrivate *priv = NMT_NEWT_CONTAINER_GET_PRIVATE (container);
NmtNewtContainerPrivate *priv = NMT_NEWT_CONTAINER_GET_PRIVATE(container);
g_signal_connect (widget, "needs-rebuild", G_CALLBACK (child_needs_rebuild), container);
g_signal_connect (widget, "notify::valid", G_CALLBACK (child_validity_notify), container);
g_ptr_array_add (priv->children, g_object_ref_sink (widget));
nmt_newt_widget_set_parent (widget, NMT_NEWT_WIDGET (container));
g_signal_connect(widget, "needs-rebuild", G_CALLBACK(child_needs_rebuild), container);
g_signal_connect(widget, "notify::valid", G_CALLBACK(child_validity_notify), container);
g_ptr_array_add(priv->children, g_object_ref_sink(widget));
nmt_newt_widget_set_parent(widget, NMT_NEWT_WIDGET(container));
nmt_newt_container_child_validity_changed (container, widget);
nmt_newt_widget_needs_rebuild (NMT_NEWT_WIDGET (container));
nmt_newt_container_child_validity_changed(container, widget);
nmt_newt_widget_needs_rebuild(NMT_NEWT_WIDGET(container));
}
static void
nmt_newt_container_real_remove (NmtNewtContainer *container,
NmtNewtWidget *widget)
nmt_newt_container_real_remove(NmtNewtContainer *container, NmtNewtWidget *widget)
{
NmtNewtContainerPrivate *priv = NMT_NEWT_CONTAINER_GET_PRIVATE (container);
NmtNewtContainerPrivate *priv = NMT_NEWT_CONTAINER_GET_PRIVATE(container);
int i;
for (i = 0; i < priv->children->len; i++) {
if (widget == priv->children->pdata[i]) {
g_ptr_array_remove_index (priv->children, i);
g_signal_handlers_disconnect_by_func (widget, G_CALLBACK (child_needs_rebuild), container);
g_signal_handlers_disconnect_by_func (widget, G_CALLBACK (child_validity_notify), container);
nmt_newt_widget_set_parent (widget, NULL);
g_object_unref (widget);
g_ptr_array_remove_index(priv->children, i);
g_signal_handlers_disconnect_by_func(widget,
G_CALLBACK(child_needs_rebuild),
container);
g_signal_handlers_disconnect_by_func(widget,
G_CALLBACK(child_validity_notify),
container);
nmt_newt_widget_set_parent(widget, NULL);
g_object_unref(widget);
nmt_newt_container_child_validity_changed (container, NULL);
nmt_newt_widget_needs_rebuild (NMT_NEWT_WIDGET (container));
nmt_newt_container_child_validity_changed(container, NULL);
nmt_newt_widget_needs_rebuild(NMT_NEWT_WIDGET(container));
return;
}
}
@ -172,24 +169,22 @@ nmt_newt_container_real_remove (NmtNewtContainer *container,
* container-type-specific methods to add widgets to containers.
*/
void
nmt_newt_container_remove (NmtNewtContainer *container,
NmtNewtWidget *widget)
nmt_newt_container_remove(NmtNewtContainer *container, NmtNewtWidget *widget)
{
NMT_NEWT_CONTAINER_GET_CLASS (container)->remove (container, widget);
NMT_NEWT_CONTAINER_GET_CLASS(container)->remove(container, widget);
}
static NmtNewtWidget *
nmt_newt_container_find_component (NmtNewtWidget *widget,
newtComponent co)
nmt_newt_container_find_component(NmtNewtWidget *widget, newtComponent co)
{
NmtNewtContainerPrivate *priv = NMT_NEWT_CONTAINER_GET_PRIVATE (widget);
NmtNewtWidget *found, *child;
NmtNewtContainerPrivate *priv = NMT_NEWT_CONTAINER_GET_PRIVATE(widget);
NmtNewtWidget * found, *child;
int i;
for (i = 0; i < priv->children->len; i++) {
child = priv->children->pdata[i];
found = nmt_newt_widget_find_component (child, co);
found = nmt_newt_widget_find_component(child, co);
if (found)
return found;
}
@ -206,24 +201,24 @@ nmt_newt_container_find_component (NmtNewtWidget *widget,
* Returns: (transfer full): a list of @container's children.
*/
GSList *
nmt_newt_container_get_children (NmtNewtContainer *container)
nmt_newt_container_get_children(NmtNewtContainer *container)
{
NmtNewtContainerPrivate *priv = NMT_NEWT_CONTAINER_GET_PRIVATE (container);
GSList *ret;
NmtNewtContainerPrivate *priv = NMT_NEWT_CONTAINER_GET_PRIVATE(container);
GSList * ret;
int i;
for (i = 0, ret = NULL; i < priv->children->len; i++)
ret = g_slist_prepend (ret, g_object_ref (priv->children->pdata[i]));
return g_slist_reverse (ret);
ret = g_slist_prepend(ret, g_object_ref(priv->children->pdata[i]));
return g_slist_reverse(ret);
}
static void
nmt_newt_container_class_init (NmtNewtContainerClass *container_class)
nmt_newt_container_class_init(NmtNewtContainerClass *container_class)
{
GObjectClass *object_class = G_OBJECT_CLASS (container_class);
NmtNewtWidgetClass *widget_class = NMT_NEWT_WIDGET_CLASS (container_class);
GObjectClass * object_class = G_OBJECT_CLASS(container_class);
NmtNewtWidgetClass *widget_class = NMT_NEWT_WIDGET_CLASS(container_class);
g_type_class_add_private (container_class, sizeof (NmtNewtContainerPrivate));
g_type_class_add_private(container_class, sizeof(NmtNewtContainerPrivate));
/* virtual methods */
object_class->finalize = nmt_newt_container_finalize;

View file

@ -8,37 +8,36 @@
#include "nmt-newt-widget.h"
#define NMT_TYPE_NEWT_CONTAINER (nmt_newt_container_get_type ())
#define NMT_NEWT_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMT_TYPE_NEWT_CONTAINER, NmtNewtContainer))
#define NMT_NEWT_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NMT_TYPE_NEWT_CONTAINER, NmtNewtContainerClass))
#define NMT_IS_NEWT_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NMT_TYPE_NEWT_CONTAINER))
#define NMT_IS_NEWT_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NMT_TYPE_NEWT_CONTAINER))
#define NMT_NEWT_CONTAINER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NMT_TYPE_NEWT_CONTAINER, NmtNewtContainerClass))
#define NMT_TYPE_NEWT_CONTAINER (nmt_newt_container_get_type())
#define NMT_NEWT_CONTAINER(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), NMT_TYPE_NEWT_CONTAINER, NmtNewtContainer))
#define NMT_NEWT_CONTAINER_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), NMT_TYPE_NEWT_CONTAINER, NmtNewtContainerClass))
#define NMT_IS_NEWT_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), NMT_TYPE_NEWT_CONTAINER))
#define NMT_IS_NEWT_CONTAINER_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass), NMT_TYPE_NEWT_CONTAINER))
#define NMT_NEWT_CONTAINER_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), NMT_TYPE_NEWT_CONTAINER, NmtNewtContainerClass))
struct _NmtNewtContainer {
NmtNewtWidget parent;
};
typedef struct {
NmtNewtWidgetClass parent;
/* methods */
void (*add) (NmtNewtContainer *container,
NmtNewtWidget *child);
void (*remove) (NmtNewtContainer *container,
NmtNewtWidget *child);
void (*add)(NmtNewtContainer *container, NmtNewtWidget *child);
void (*remove)(NmtNewtContainer *container, NmtNewtWidget *child);
void (*child_validity_changed) (NmtNewtContainer *container,
NmtNewtWidget *child);
void (*child_validity_changed)(NmtNewtContainer *container, NmtNewtWidget *child);
} NmtNewtContainerClass;
GType nmt_newt_container_get_type (void);
GType nmt_newt_container_get_type(void);
void nmt_newt_container_remove (NmtNewtContainer *container,
NmtNewtWidget *widget);
void nmt_newt_container_remove(NmtNewtContainer *container, NmtNewtWidget *widget);
GSList *nmt_newt_container_get_children (NmtNewtContainer *container);
GSList *nmt_newt_container_get_children(NmtNewtContainer *container);
#endif /* NMT_NEWT_CONTAINER_H */

View file

@ -19,9 +19,10 @@
#include "nmt-newt-entry-numeric.h"
G_DEFINE_TYPE (NmtNewtEntryNumeric, nmt_newt_entry_numeric, NMT_TYPE_NEWT_ENTRY)
G_DEFINE_TYPE(NmtNewtEntryNumeric, nmt_newt_entry_numeric, NMT_TYPE_NEWT_ENTRY)
#define NMT_NEWT_ENTRY_NUMERIC_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NMT_TYPE_NEWT_ENTRY_NUMERIC, NmtNewtEntryNumericPrivate))
#define NMT_NEWT_ENTRY_NUMERIC_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE((o), NMT_TYPE_NEWT_ENTRY_NUMERIC, NmtNewtEntryNumericPrivate))
typedef struct {
gint64 min, max;
@ -49,14 +50,9 @@ enum {
* Returns: a new #NmtNewtEntryNumeric
*/
NmtNewtWidget *
nmt_newt_entry_numeric_new (int width,
gint64 min,
gint64 max)
nmt_newt_entry_numeric_new(int width, gint64 min, gint64 max)
{
return nmt_newt_entry_numeric_new_full (width,
min,
max,
FALSE);
return nmt_newt_entry_numeric_new_full(width, min, max, FALSE);
}
/**
@ -72,29 +68,30 @@ nmt_newt_entry_numeric_new (int width,
* Returns: a new #NmtNewtEntryNumeric
*/
NmtNewtWidget *
nmt_newt_entry_numeric_new_full (int width,
gint64 min,
gint64 max,
gboolean optional)
nmt_newt_entry_numeric_new_full(int width, gint64 min, gint64 max, gboolean optional)
{
return g_object_new (NMT_TYPE_NEWT_ENTRY_NUMERIC,
"width", width,
"minimum", min,
"maximum", max,
"optional", optional,
return g_object_new(NMT_TYPE_NEWT_ENTRY_NUMERIC,
"width",
width,
"minimum",
min,
"maximum",
max,
"optional",
optional,
NULL);
}
static gboolean
newt_entry_numeric_filter (NmtNewtEntry *entry,
const char *text,
newt_entry_numeric_filter(NmtNewtEntry *entry,
const char * text,
int ch,
int position,
gpointer user_data)
{
NmtNewtEntryNumericPrivate *priv = NMT_NEWT_ENTRY_NUMERIC_GET_PRIVATE (entry);
NmtNewtEntryNumericPrivate *priv = NMT_NEWT_ENTRY_NUMERIC_GET_PRIVATE(entry);
if (g_ascii_isdigit (ch))
if (g_ascii_isdigit(ch))
return TRUE;
if (ch == '-' && position == 0 && priv->min < 0)
@ -104,96 +101,94 @@ newt_entry_numeric_filter (NmtNewtEntry *entry,
}
static gboolean
newt_entry_numeric_validate (NmtNewtEntry *entry,
const char *text,
gpointer user_data)
newt_entry_numeric_validate(NmtNewtEntry *entry, const char *text, gpointer user_data)
{
NmtNewtEntryNumericPrivate *priv = NMT_NEWT_ENTRY_NUMERIC_GET_PRIVATE (entry);
NmtNewtEntryNumericPrivate *priv = NMT_NEWT_ENTRY_NUMERIC_GET_PRIVATE(entry);
gint64 val;
if (!*text)
return priv->optional ? TRUE : FALSE;
val = _nm_utils_ascii_str_to_int64 (text, 10, priv->min, priv->max, G_MAXINT64);
val = _nm_utils_ascii_str_to_int64(text, 10, priv->min, priv->max, G_MAXINT64);
return val != G_MAXINT64 || errno == 0;
}
static void
nmt_newt_entry_numeric_init (NmtNewtEntryNumeric *entry)
nmt_newt_entry_numeric_init(NmtNewtEntryNumeric *entry)
{
nmt_newt_entry_set_filter (NMT_NEWT_ENTRY (entry), newt_entry_numeric_filter, NULL);
nmt_newt_entry_set_validator (NMT_NEWT_ENTRY (entry), newt_entry_numeric_validate, NULL);
nmt_newt_entry_set_filter(NMT_NEWT_ENTRY(entry), newt_entry_numeric_filter, NULL);
nmt_newt_entry_set_validator(NMT_NEWT_ENTRY(entry), newt_entry_numeric_validate, NULL);
}
static void
nmt_newt_entry_numeric_constructed (GObject *object)
nmt_newt_entry_numeric_constructed(GObject *object)
{
NmtNewtEntryNumericPrivate *priv = NMT_NEWT_ENTRY_NUMERIC_GET_PRIVATE (object);
NmtNewtEntryNumericPrivate *priv = NMT_NEWT_ENTRY_NUMERIC_GET_PRIVATE(object);
if (!*nmt_newt_entry_get_text (NMT_NEWT_ENTRY (object))) {
if (!*nmt_newt_entry_get_text(NMT_NEWT_ENTRY(object))) {
char buf[32];
g_snprintf (buf, sizeof (buf), "%lld", (long long) priv->min);
nmt_newt_entry_set_text (NMT_NEWT_ENTRY (object), buf);
g_snprintf(buf, sizeof(buf), "%lld", (long long) priv->min);
nmt_newt_entry_set_text(NMT_NEWT_ENTRY(object), buf);
}
G_OBJECT_CLASS (nmt_newt_entry_numeric_parent_class)->constructed (object);
G_OBJECT_CLASS(nmt_newt_entry_numeric_parent_class)->constructed(object);
}
static void
nmt_newt_entry_numeric_set_property (GObject *object,
nmt_newt_entry_numeric_set_property(GObject * object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
GParamSpec * pspec)
{
NmtNewtEntryNumericPrivate *priv = NMT_NEWT_ENTRY_NUMERIC_GET_PRIVATE (object);
NmtNewtEntryNumericPrivate *priv = NMT_NEWT_ENTRY_NUMERIC_GET_PRIVATE(object);
switch (prop_id) {
case PROP_MINIMUM:
priv->min = g_value_get_int64 (value);
priv->min = g_value_get_int64(value);
break;
case PROP_MAXIMUM:
priv->max = g_value_get_int64 (value);
priv->max = g_value_get_int64(value);
break;
case PROP_OPTIONAL:
priv->optional = g_value_get_boolean (value);
priv->optional = g_value_get_boolean(value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_newt_entry_numeric_get_property (GObject *object,
nmt_newt_entry_numeric_get_property(GObject * object,
guint prop_id,
GValue *value,
GValue * value,
GParamSpec *pspec)
{
NmtNewtEntryNumericPrivate *priv = NMT_NEWT_ENTRY_NUMERIC_GET_PRIVATE (object);
NmtNewtEntryNumericPrivate *priv = NMT_NEWT_ENTRY_NUMERIC_GET_PRIVATE(object);
switch (prop_id) {
case PROP_MINIMUM:
g_value_set_int64 (value, priv->min);
g_value_set_int64(value, priv->min);
break;
case PROP_MAXIMUM:
g_value_set_int64 (value, priv->max);
g_value_set_int64(value, priv->max);
break;
case PROP_OPTIONAL:
g_value_set_boolean (value, priv->optional);
g_value_set_boolean(value, priv->optional);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_newt_entry_numeric_class_init (NmtNewtEntryNumericClass *entry_class)
nmt_newt_entry_numeric_class_init(NmtNewtEntryNumericClass *entry_class)
{
GObjectClass *object_class = G_OBJECT_CLASS (entry_class);
GObjectClass *object_class = G_OBJECT_CLASS(entry_class);
g_type_class_add_private (entry_class, sizeof (NmtNewtEntryNumericPrivate));
g_type_class_add_private(entry_class, sizeof(NmtNewtEntryNumericPrivate));
/* virtual methods */
object_class->constructed = nmt_newt_entry_numeric_constructed;
@ -207,36 +202,43 @@ nmt_newt_entry_numeric_class_init (NmtNewtEntryNumericClass *entry_class)
* is non-negative, then the entry will not allow negative numbers
* to be entered.
*/
g_object_class_install_property
(object_class, PROP_MINIMUM,
g_param_spec_int64 ("minimum", "", "",
G_MININT64, G_MAXINT64, 0,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
object_class,
PROP_MINIMUM,
g_param_spec_int64("minimum",
"",
"",
G_MININT64,
G_MAXINT64,
0,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
/**
* NmtNewtEntryNumeric:maximum:
*
* The maximum #NmtNewtWidget:valid value for the entry.
*/
g_object_class_install_property
(object_class, PROP_MAXIMUM,
g_param_spec_int64 ("maximum", "", "",
G_MININT64, G_MAXINT64, G_MAXINT64,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
object_class,
PROP_MAXIMUM,
g_param_spec_int64("maximum",
"",
"",
G_MININT64,
G_MAXINT64,
G_MAXINT64,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
/**
* NmtNewtEntryNumeric:optional:
*
* If %TRUE, allow empty string to indicate some default value.
* It means the property is optional and can be left at the default
*/
g_object_class_install_property
(object_class, PROP_OPTIONAL,
g_param_spec_boolean ("optional", "", "",
g_object_class_install_property(
object_class,
PROP_OPTIONAL,
g_param_spec_boolean("optional",
"",
"",
FALSE,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
}

View file

@ -8,16 +8,20 @@
#include "nmt-newt-entry.h"
#define NMT_TYPE_NEWT_ENTRY_NUMERIC (nmt_newt_entry_numeric_get_type ())
#define NMT_NEWT_ENTRY_NUMERIC(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMT_TYPE_NEWT_ENTRY_NUMERIC, NmtNewtEntryNumeric))
#define NMT_NEWT_ENTRY_NUMERIC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NMT_TYPE_NEWT_ENTRY_NUMERIC, NmtNewtEntryNumericClass))
#define NMT_IS_NEWT_ENTRY_NUMERIC(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NMT_TYPE_NEWT_ENTRY_NUMERIC))
#define NMT_IS_NEWT_ENTRY_NUMERIC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NMT_TYPE_NEWT_ENTRY_NUMERIC))
#define NMT_NEWT_ENTRY_NUMERIC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NMT_TYPE_NEWT_ENTRY_NUMERIC, NmtNewtEntryNumericClass))
#define NMT_TYPE_NEWT_ENTRY_NUMERIC (nmt_newt_entry_numeric_get_type())
#define NMT_NEWT_ENTRY_NUMERIC(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), NMT_TYPE_NEWT_ENTRY_NUMERIC, NmtNewtEntryNumeric))
#define NMT_NEWT_ENTRY_NUMERIC_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), NMT_TYPE_NEWT_ENTRY_NUMERIC, NmtNewtEntryNumericClass))
#define NMT_IS_NEWT_ENTRY_NUMERIC(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj), NMT_TYPE_NEWT_ENTRY_NUMERIC))
#define NMT_IS_NEWT_ENTRY_NUMERIC_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass), NMT_TYPE_NEWT_ENTRY_NUMERIC))
#define NMT_NEWT_ENTRY_NUMERIC_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), NMT_TYPE_NEWT_ENTRY_NUMERIC, NmtNewtEntryNumericClass))
struct _NmtNewtEntryNumeric {
NmtNewtEntry parent;
};
typedef struct {
@ -25,15 +29,11 @@ typedef struct {
} NmtNewtEntryNumericClass;
GType nmt_newt_entry_numeric_get_type (void);
GType nmt_newt_entry_numeric_get_type(void);
NmtNewtWidget *nmt_newt_entry_numeric_new (int width,
gint64 min,
gint64 max);
NmtNewtWidget *nmt_newt_entry_numeric_new(int width, gint64 min, gint64 max);
NmtNewtWidget *nmt_newt_entry_numeric_new_full (int width,
gint64 min,
gint64 max,
gboolean optional);
NmtNewtWidget *
nmt_newt_entry_numeric_new_full(int width, gint64 min, gint64 max, gboolean optional);
#endif /* NMT_NEWT_ENTRY_NUMERIC_H */

View file

@ -20,14 +20,15 @@
#include "nmt-newt-hacks.h"
#include "nmt-newt-utils.h"
G_DEFINE_TYPE (NmtNewtEntry, nmt_newt_entry, NMT_TYPE_NEWT_COMPONENT)
G_DEFINE_TYPE(NmtNewtEntry, nmt_newt_entry, NMT_TYPE_NEWT_COMPONENT)
#define NMT_NEWT_ENTRY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NMT_TYPE_NEWT_ENTRY, NmtNewtEntryPrivate))
#define NMT_NEWT_ENTRY_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE((o), NMT_TYPE_NEWT_ENTRY, NmtNewtEntryPrivate))
typedef struct {
int width;
NmtNewtEntryFlags flags;
char *text;
char * text;
int last_cursor_pos;
guint idle_update;
@ -70,13 +71,9 @@ enum {
* Returns: a new #NmtNewtEntry
*/
NmtNewtWidget *
nmt_newt_entry_new (int width,
NmtNewtEntryFlags flags)
nmt_newt_entry_new(int width, NmtNewtEntryFlags flags)
{
return g_object_new (NMT_TYPE_NEWT_ENTRY,
"width", width,
"flags", flags,
NULL);
return g_object_new(NMT_TYPE_NEWT_ENTRY, "width", width, "flags", flags, NULL);
}
/**
@ -107,31 +104,28 @@ nmt_newt_entry_new (int width,
* nmt_newt_entry_set_text().
*/
void
nmt_newt_entry_set_filter (NmtNewtEntry *entry,
NmtNewtEntryFilter filter,
gpointer user_data)
nmt_newt_entry_set_filter(NmtNewtEntry *entry, NmtNewtEntryFilter filter, gpointer user_data)
{
NmtNewtEntryPrivate *priv = NMT_NEWT_ENTRY_GET_PRIVATE (entry);
NmtNewtEntryPrivate *priv = NMT_NEWT_ENTRY_GET_PRIVATE(entry);
priv->filter = filter;
priv->filter_data = user_data;
}
static void
nmt_newt_entry_check_valid (NmtNewtEntry *entry)
nmt_newt_entry_check_valid(NmtNewtEntry *entry)
{
NmtNewtEntryPrivate *priv = NMT_NEWT_ENTRY_GET_PRIVATE (entry);
NmtNewtEntryPrivate *priv = NMT_NEWT_ENTRY_GET_PRIVATE(entry);
gboolean valid;
if ( (priv->flags & NMT_NEWT_ENTRY_NONEMPTY)
&& *priv->text == '\0')
if ((priv->flags & NMT_NEWT_ENTRY_NONEMPTY) && *priv->text == '\0')
valid = FALSE;
else if (priv->validator)
valid = !!priv->validator (entry, priv->text, priv->validator_data);
valid = !!priv->validator(entry, priv->text, priv->validator_data);
else
valid = TRUE;
nmt_newt_widget_set_valid (NMT_NEWT_WIDGET (entry), valid);
nmt_newt_widget_set_valid(NMT_NEWT_WIDGET(entry), valid);
}
/**
@ -156,47 +150,45 @@ nmt_newt_entry_check_valid (NmtNewtEntry *entry)
* will not be considered #NmtNewtWidget:valid.
*/
void
nmt_newt_entry_set_validator (NmtNewtEntry *entry,
nmt_newt_entry_set_validator(NmtNewtEntry * entry,
NmtNewtEntryValidator validator,
gpointer user_data)
{
NmtNewtEntryPrivate *priv = NMT_NEWT_ENTRY_GET_PRIVATE (entry);
NmtNewtEntryPrivate *priv = NMT_NEWT_ENTRY_GET_PRIVATE(entry);
priv->validator = validator;
priv->validator_data = user_data;
nmt_newt_entry_check_valid (entry);
nmt_newt_entry_check_valid(entry);
}
static void
nmt_newt_entry_set_text_internal (NmtNewtEntry *entry,
const char *text,
newtComponent co)
nmt_newt_entry_set_text_internal(NmtNewtEntry *entry, const char *text, newtComponent co)
{
NmtNewtEntryPrivate *priv = NMT_NEWT_ENTRY_GET_PRIVATE (entry);
NmtNewtEntryPrivate *priv = NMT_NEWT_ENTRY_GET_PRIVATE(entry);
if (!text)
text = "";
if (!strcmp (priv->text, text))
if (!strcmp(priv->text, text))
return;
g_free (priv->text);
priv->text = g_strdup (text);
g_free(priv->text);
priv->text = g_strdup(text);
if (co) {
char *text_lc;
text_lc = priv->text ? nmt_newt_locale_from_utf8 (priv->text) : NULL;
newtEntrySet (co, text_lc, TRUE);
g_free (text_lc);
text_lc = priv->text ? nmt_newt_locale_from_utf8(priv->text) : NULL;
newtEntrySet(co, text_lc, TRUE);
g_free(text_lc);
priv->last_cursor_pos = -1;
}
g_object_freeze_notify (G_OBJECT (entry));
nmt_newt_entry_check_valid (entry);
g_object_notify (G_OBJECT (entry), "text");
g_object_thaw_notify (G_OBJECT (entry));
g_object_freeze_notify(G_OBJECT(entry));
nmt_newt_entry_check_valid(entry);
g_object_notify(G_OBJECT(entry), "text");
g_object_thaw_notify(G_OBJECT(entry));
}
/**
@ -209,13 +201,12 @@ nmt_newt_entry_set_text_internal (NmtNewtEntry *entry,
* be re-run.
*/
void
nmt_newt_entry_set_text (NmtNewtEntry *entry,
const char *text)
nmt_newt_entry_set_text(NmtNewtEntry *entry, const char *text)
{
newtComponent co;
co = nmt_newt_component_get_component (NMT_NEWT_COMPONENT (entry));
nmt_newt_entry_set_text_internal (entry, text, co);
co = nmt_newt_component_get_component(NMT_NEWT_COMPONENT(entry));
nmt_newt_entry_set_text_internal(entry, text, co);
}
/**
@ -227,9 +218,9 @@ nmt_newt_entry_set_text (NmtNewtEntry *entry,
* Returns: @entry's text
*/
const char *
nmt_newt_entry_get_text (NmtNewtEntry *entry)
nmt_newt_entry_get_text(NmtNewtEntry *entry)
{
NmtNewtEntryPrivate *priv = NMT_NEWT_ENTRY_GET_PRIVATE (entry);
NmtNewtEntryPrivate *priv = NMT_NEWT_ENTRY_GET_PRIVATE(entry);
return priv->text;
}
@ -242,18 +233,17 @@ nmt_newt_entry_get_text (NmtNewtEntry *entry)
* Updates @entry's width
*/
void
nmt_newt_entry_set_width (NmtNewtEntry *entry,
int width)
nmt_newt_entry_set_width(NmtNewtEntry *entry, int width)
{
NmtNewtEntryPrivate *priv = NMT_NEWT_ENTRY_GET_PRIVATE (entry);
NmtNewtEntryPrivate *priv = NMT_NEWT_ENTRY_GET_PRIVATE(entry);
if (priv->width == width)
return;
priv->width = width;
nmt_newt_widget_needs_rebuild (NMT_NEWT_WIDGET (entry));
nmt_newt_widget_needs_rebuild(NMT_NEWT_WIDGET(entry));
g_object_notify (G_OBJECT (entry), "width");
g_object_notify(G_OBJECT(entry), "width");
}
/**
@ -265,89 +255,86 @@ nmt_newt_entry_set_width (NmtNewtEntry *entry,
* Returns: @entry's width
*/
int
nmt_newt_entry_get_width (NmtNewtEntry *entry)
nmt_newt_entry_get_width(NmtNewtEntry *entry)
{
NmtNewtEntryPrivate *priv = NMT_NEWT_ENTRY_GET_PRIVATE (entry);
NmtNewtEntryPrivate *priv = NMT_NEWT_ENTRY_GET_PRIVATE(entry);
return priv->width;
}
static void
nmt_newt_entry_init (NmtNewtEntry *entry)
nmt_newt_entry_init(NmtNewtEntry *entry)
{
NmtNewtEntryPrivate *priv = NMT_NEWT_ENTRY_GET_PRIVATE (entry);
NmtNewtEntryPrivate *priv = NMT_NEWT_ENTRY_GET_PRIVATE(entry);
priv->text = g_strdup ("");
priv->text = g_strdup("");
priv->last_cursor_pos = -1;
}
static void
nmt_newt_entry_constructed (GObject *object)
nmt_newt_entry_constructed(GObject *object)
{
nmt_newt_entry_check_valid (NMT_NEWT_ENTRY (object));
nmt_newt_entry_check_valid(NMT_NEWT_ENTRY(object));
G_OBJECT_CLASS (nmt_newt_entry_parent_class)->constructed (object);
G_OBJECT_CLASS(nmt_newt_entry_parent_class)->constructed(object);
}
static void
nmt_newt_entry_finalize (GObject *object)
nmt_newt_entry_finalize(GObject *object)
{
NmtNewtEntryPrivate *priv = NMT_NEWT_ENTRY_GET_PRIVATE (object);
NmtNewtEntryPrivate *priv = NMT_NEWT_ENTRY_GET_PRIVATE(object);
g_free (priv->text);
g_free(priv->text);
if (priv->idle_update)
g_source_remove (priv->idle_update);
g_source_remove(priv->idle_update);
G_OBJECT_CLASS (nmt_newt_entry_parent_class)->finalize (object);
G_OBJECT_CLASS(nmt_newt_entry_parent_class)->finalize(object);
}
static gboolean
idle_update_entry (gpointer entry)
idle_update_entry(gpointer entry)
{
NmtNewtEntryPrivate *priv = NMT_NEWT_ENTRY_GET_PRIVATE (entry);
newtComponent co = nmt_newt_component_get_component (entry);
char *text;
NmtNewtEntryPrivate *priv = NMT_NEWT_ENTRY_GET_PRIVATE(entry);
newtComponent co = nmt_newt_component_get_component(entry);
char * text;
priv->idle_update = 0;
if (!co)
return FALSE;
priv->last_cursor_pos = newtEntryGetCursorPosition (co);
priv->last_cursor_pos = newtEntryGetCursorPosition(co);
text = nmt_newt_locale_to_utf8 (newtEntryGetValue (co));
nmt_newt_entry_set_text_internal (entry, text, NULL);
g_free (text);
text = nmt_newt_locale_to_utf8(newtEntryGetValue(co));
nmt_newt_entry_set_text_internal(entry, text, NULL);
g_free(text);
return FALSE;
}
static int
entry_filter (newtComponent entry,
void *self,
int ch,
int cursor)
entry_filter(newtComponent entry, void *self, int ch, int cursor)
{
NmtNewtEntryPrivate *priv = NMT_NEWT_ENTRY_GET_PRIVATE (self);
NmtNewtEntryPrivate *priv = NMT_NEWT_ENTRY_GET_PRIVATE(self);
if (g_ascii_isprint (ch)) {
if (g_ascii_isprint(ch)) {
if (priv->filter) {
char *text = nmt_newt_locale_to_utf8 (newtEntryGetValue (entry));
char *text = nmt_newt_locale_to_utf8(newtEntryGetValue(entry));
if (!priv->filter (self, text, ch, cursor, priv->filter_data)) {
g_free (text);
if (!priv->filter(self, text, ch, cursor, priv->filter_data)) {
g_free(text);
return 0;
}
g_free (text);
g_free(text);
}
}
if (!priv->idle_update)
priv->idle_update = g_idle_add (idle_update_entry, self);
priv->idle_update = g_idle_add(idle_update_entry, self);
return ch;
}
static guint
convert_flags (NmtNewtEntryFlags flags)
convert_flags(NmtNewtEntryFlags flags)
{
guint newt_flags = NEWT_FLAG_RETURNEXIT;
@ -360,111 +347,104 @@ convert_flags (NmtNewtEntryFlags flags)
}
static newtComponent
nmt_newt_entry_build_component (NmtNewtComponent *component,
gboolean sensitive)
nmt_newt_entry_build_component(NmtNewtComponent *component, gboolean sensitive)
{
NmtNewtEntryPrivate *priv = NMT_NEWT_ENTRY_GET_PRIVATE (component);
NmtNewtEntryPrivate *priv = NMT_NEWT_ENTRY_GET_PRIVATE(component);
newtComponent co;
char *text_lc;
char * text_lc;
int flags;
flags = convert_flags (priv->flags);
flags = convert_flags(priv->flags);
if (!sensitive)
flags |= NEWT_FLAG_DISABLED;
text_lc = priv->text ? nmt_newt_locale_from_utf8 (priv->text) : NULL;
co = newtEntry (-1, -1, text_lc, priv->width, NULL, flags);
g_free (text_lc);
text_lc = priv->text ? nmt_newt_locale_from_utf8(priv->text) : NULL;
co = newtEntry(-1, -1, text_lc, priv->width, NULL, flags);
g_free(text_lc);
if (priv->last_cursor_pos != -1)
newtEntrySetCursorPosition (co, priv->last_cursor_pos);
newtEntrySetCursorPosition(co, priv->last_cursor_pos);
newtEntrySetFilter (co, entry_filter, component);
newtEntrySetFilter(co, entry_filter, component);
return co;
}
static void
nmt_newt_entry_activated (NmtNewtWidget *widget)
nmt_newt_entry_activated(NmtNewtWidget *widget)
{
NmtNewtEntryPrivate *priv = NMT_NEWT_ENTRY_GET_PRIVATE (widget);
NmtNewtEntryPrivate *priv = NMT_NEWT_ENTRY_GET_PRIVATE(widget);
if (priv->idle_update) {
g_source_remove (priv->idle_update);
idle_update_entry (widget);
g_source_remove(priv->idle_update);
idle_update_entry(widget);
}
NMT_NEWT_WIDGET_CLASS (nmt_newt_entry_parent_class)->activated (widget);
NMT_NEWT_WIDGET_CLASS(nmt_newt_entry_parent_class)->activated(widget);
}
static void
nmt_newt_entry_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
nmt_newt_entry_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
{
NmtNewtEntry *entry = NMT_NEWT_ENTRY (object);
NmtNewtEntryPrivate *priv = NMT_NEWT_ENTRY_GET_PRIVATE (entry);
NmtNewtEntry * entry = NMT_NEWT_ENTRY(object);
NmtNewtEntryPrivate *priv = NMT_NEWT_ENTRY_GET_PRIVATE(entry);
switch (prop_id) {
case PROP_TEXT:
nmt_newt_entry_set_text (entry, g_value_get_string (value));
nmt_newt_entry_set_text(entry, g_value_get_string(value));
break;
case PROP_WIDTH:
nmt_newt_entry_set_width (entry, g_value_get_int (value));
nmt_newt_entry_set_width(entry, g_value_get_int(value));
break;
case PROP_FLAGS:
priv->flags = g_value_get_uint (value);
nmt_newt_widget_needs_rebuild (NMT_NEWT_WIDGET (entry));
priv->flags = g_value_get_uint(value);
nmt_newt_widget_needs_rebuild(NMT_NEWT_WIDGET(entry));
break;
case PROP_PASSWORD:
if (g_value_get_boolean (value))
if (g_value_get_boolean(value))
priv->flags |= NMT_NEWT_ENTRY_PASSWORD;
else
priv->flags &= ~NMT_NEWT_ENTRY_PASSWORD;
nmt_newt_widget_needs_rebuild (NMT_NEWT_WIDGET (entry));
nmt_newt_widget_needs_rebuild(NMT_NEWT_WIDGET(entry));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_newt_entry_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
nmt_newt_entry_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
{
NmtNewtEntry *entry = NMT_NEWT_ENTRY (object);
NmtNewtEntryPrivate *priv = NMT_NEWT_ENTRY_GET_PRIVATE (entry);
NmtNewtEntry * entry = NMT_NEWT_ENTRY(object);
NmtNewtEntryPrivate *priv = NMT_NEWT_ENTRY_GET_PRIVATE(entry);
switch (prop_id) {
case PROP_TEXT:
g_value_set_string (value, nmt_newt_entry_get_text (entry));
g_value_set_string(value, nmt_newt_entry_get_text(entry));
break;
case PROP_WIDTH:
g_value_set_int (value, priv->width);
g_value_set_int(value, priv->width);
break;
case PROP_FLAGS:
g_value_set_uint (value, priv->flags);
g_value_set_uint(value, priv->flags);
break;
case PROP_PASSWORD:
g_value_set_boolean (value, (priv->flags & NMT_NEWT_ENTRY_PASSWORD) != 0);
g_value_set_boolean(value, (priv->flags & NMT_NEWT_ENTRY_PASSWORD) != 0);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_newt_entry_class_init (NmtNewtEntryClass *entry_class)
nmt_newt_entry_class_init(NmtNewtEntryClass *entry_class)
{
GObjectClass *object_class = G_OBJECT_CLASS (entry_class);
NmtNewtWidgetClass *widget_class = NMT_NEWT_WIDGET_CLASS (entry_class);
NmtNewtComponentClass *component_class = NMT_NEWT_COMPONENT_CLASS (entry_class);
GObjectClass * object_class = G_OBJECT_CLASS(entry_class);
NmtNewtWidgetClass * widget_class = NMT_NEWT_WIDGET_CLASS(entry_class);
NmtNewtComponentClass *component_class = NMT_NEWT_COMPONENT_CLASS(entry_class);
g_type_class_add_private (entry_class, sizeof (NmtNewtEntryPrivate));
g_type_class_add_private(entry_class, sizeof(NmtNewtEntryPrivate));
/* virtual methods */
object_class->constructed = nmt_newt_entry_constructed;
@ -481,45 +461,46 @@ nmt_newt_entry_class_init (NmtNewtEntryClass *entry_class)
*
* The entry's text
*/
g_object_class_install_property
(object_class, PROP_TEXT,
g_param_spec_string ("text", "", "",
NULL,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
object_class,
PROP_TEXT,
g_param_spec_string("text", "", "", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
* NmtNewtEntry:width
*
* The entry's width in characters
*/
g_object_class_install_property
(object_class, PROP_WIDTH,
g_param_spec_int ("width", "", "",
-1, 80, -1,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
object_class,
PROP_WIDTH,
g_param_spec_int("width", "", "", -1, 80, -1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
* NmtNewtEntry:flags
*
* The entry's #NmtNewtEntryFlags
*/
g_object_class_install_property
(object_class, PROP_FLAGS,
g_param_spec_uint ("flags", "", "",
0, 0xFFFF, 0,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
object_class,
PROP_FLAGS,
g_param_spec_uint("flags",
"",
"",
0,
0xFFFF,
0,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
/**
* NmtNewtEntry:password
*
* %TRUE if #NmtNewtEntry:flags contains %NMT_NEWT_ENTRY_PASSWORD,
* %FALSE if not.
*/
g_object_class_install_property
(object_class, PROP_PASSWORD,
g_param_spec_boolean ("password", "", "",
g_object_class_install_property(
object_class,
PROP_PASSWORD,
g_param_spec_boolean("password",
"",
"",
FALSE,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
}

View file

@ -8,16 +8,17 @@
#include "nmt-newt-component.h"
#define NMT_TYPE_NEWT_ENTRY (nmt_newt_entry_get_type ())
#define NMT_NEWT_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMT_TYPE_NEWT_ENTRY, NmtNewtEntry))
#define NMT_NEWT_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NMT_TYPE_NEWT_ENTRY, NmtNewtEntryClass))
#define NMT_IS_NEWT_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NMT_TYPE_NEWT_ENTRY))
#define NMT_IS_NEWT_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NMT_TYPE_NEWT_ENTRY))
#define NMT_NEWT_ENTRY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NMT_TYPE_NEWT_ENTRY, NmtNewtEntryClass))
#define NMT_TYPE_NEWT_ENTRY (nmt_newt_entry_get_type())
#define NMT_NEWT_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), NMT_TYPE_NEWT_ENTRY, NmtNewtEntry))
#define NMT_NEWT_ENTRY_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), NMT_TYPE_NEWT_ENTRY, NmtNewtEntryClass))
#define NMT_IS_NEWT_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), NMT_TYPE_NEWT_ENTRY))
#define NMT_IS_NEWT_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NMT_TYPE_NEWT_ENTRY))
#define NMT_NEWT_ENTRY_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), NMT_TYPE_NEWT_ENTRY, NmtNewtEntryClass))
struct _NmtNewtEntry {
NmtNewtComponent parent;
};
typedef struct {
@ -25,10 +26,11 @@ typedef struct {
} NmtNewtEntryClass;
GType nmt_newt_entry_get_type (void);
GType nmt_newt_entry_get_type(void);
typedef gboolean (*NmtNewtEntryFilter) (NmtNewtEntry *, const char *text, int ch, int position, gpointer);
typedef gboolean (*NmtNewtEntryValidator) (NmtNewtEntry *, const char *text, gpointer);
typedef gboolean (
*NmtNewtEntryFilter)(NmtNewtEntry *, const char *text, int ch, int position, gpointer);
typedef gboolean (*NmtNewtEntryValidator)(NmtNewtEntry *, const char *text, gpointer);
typedef enum {
NMT_NEWT_ENTRY_NOSCROLL = (1 << 0),
@ -36,22 +38,17 @@ typedef enum {
NMT_NEWT_ENTRY_NONEMPTY = (1 << 2)
} NmtNewtEntryFlags;
NmtNewtWidget *nmt_newt_entry_new (int width,
NmtNewtEntryFlags flags);
NmtNewtWidget *nmt_newt_entry_new(int width, NmtNewtEntryFlags flags);
void nmt_newt_entry_set_filter (NmtNewtEntry *entry,
NmtNewtEntryFilter filter,
gpointer user_data);
void nmt_newt_entry_set_validator (NmtNewtEntry *entry,
void nmt_newt_entry_set_filter(NmtNewtEntry *entry, NmtNewtEntryFilter filter, gpointer user_data);
void nmt_newt_entry_set_validator(NmtNewtEntry * entry,
NmtNewtEntryValidator validator,
gpointer user_data);
void nmt_newt_entry_set_text (NmtNewtEntry *entry,
const char *text);
const char *nmt_newt_entry_get_text (NmtNewtEntry *entry);
void nmt_newt_entry_set_text(NmtNewtEntry *entry, const char *text);
const char *nmt_newt_entry_get_text(NmtNewtEntry *entry);
void nmt_newt_entry_set_width (NmtNewtEntry *entry,
int width);
int nmt_newt_entry_get_width (NmtNewtEntry *entry);
void nmt_newt_entry_set_width(NmtNewtEntry *entry, int width);
int nmt_newt_entry_get_width(NmtNewtEntry *entry);
#endif /* NMT_NEWT_ENTRY_H */

View file

@ -21,9 +21,10 @@
#include "nmt-newt-grid.h"
#include "nmt-newt-utils.h"
G_DEFINE_TYPE (NmtNewtForm, nmt_newt_form, NMT_TYPE_NEWT_CONTAINER)
G_DEFINE_TYPE(NmtNewtForm, nmt_newt_form, NMT_TYPE_NEWT_CONTAINER)
#define NMT_NEWT_FORM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NMT_TYPE_NEWT_FORM, NmtNewtFormPrivate))
#define NMT_NEWT_FORM_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE((o), NMT_TYPE_NEWT_FORM, NmtNewtFormPrivate))
typedef struct {
newtComponent form;
@ -33,7 +34,7 @@ typedef struct {
guint padding;
gboolean fixed_x, fixed_y;
gboolean fixed_width, fixed_height;
char *title_lc;
char * title_lc;
gboolean dirty, escape_exits;
NmtNewtWidget *focus;
@ -64,9 +65,9 @@ enum {
LAST_SIGNAL
};
static guint signals[LAST_SIGNAL] = { 0 };
static guint signals[LAST_SIGNAL] = {0};
static void nmt_newt_form_redraw (NmtNewtForm *form);
static void nmt_newt_form_redraw(NmtNewtForm *form);
/**
* nmt_newt_form_new:
@ -84,11 +85,9 @@ static void nmt_newt_form_redraw (NmtNewtForm *form);
* Returns: a new #NmtNewtForm
*/
NmtNewtForm *
nmt_newt_form_new (const char *title)
nmt_newt_form_new(const char *title)
{
return g_object_new (NMT_TYPE_NEWT_FORM,
"title", title,
NULL);
return g_object_new(NMT_TYPE_NEWT_FORM, "title", title, NULL);
}
/**
@ -102,52 +101,48 @@ nmt_newt_form_new (const char *title)
* Returns: a new #NmtNewtForm
*/
NmtNewtForm *
nmt_newt_form_new_fullscreen (const char *title)
nmt_newt_form_new_fullscreen(const char *title)
{
return g_object_new (NMT_TYPE_NEWT_FORM,
"title", title,
"fullscreen", TRUE,
NULL);
return g_object_new(NMT_TYPE_NEWT_FORM, "title", title, "fullscreen", TRUE, NULL);
}
static void
nmt_newt_form_init (NmtNewtForm *form)
nmt_newt_form_init(NmtNewtForm *form)
{
g_object_ref_sink (form);
g_object_ref_sink(form);
}
static void
nmt_newt_form_finalize (GObject *object)
nmt_newt_form_finalize(GObject *object)
{
NmtNewtFormPrivate *priv = NMT_NEWT_FORM_GET_PRIVATE (object);
NmtNewtFormPrivate *priv = NMT_NEWT_FORM_GET_PRIVATE(object);
g_free (priv->title_lc);
g_clear_object (&priv->focus);
g_free(priv->title_lc);
g_clear_object(&priv->focus);
G_OBJECT_CLASS (nmt_newt_form_parent_class)->finalize (object);
G_OBJECT_CLASS(nmt_newt_form_parent_class)->finalize(object);
}
static void
nmt_newt_form_needs_rebuild (NmtNewtWidget *widget)
nmt_newt_form_needs_rebuild(NmtNewtWidget *widget)
{
NmtNewtFormPrivate *priv = NMT_NEWT_FORM_GET_PRIVATE (widget);
NmtNewtFormPrivate *priv = NMT_NEWT_FORM_GET_PRIVATE(widget);
if (!priv->dirty) {
priv->dirty = TRUE;
nmt_newt_form_redraw (NMT_NEWT_FORM (widget));
nmt_newt_form_redraw(NMT_NEWT_FORM(widget));
}
}
static void
nmt_newt_form_remove (NmtNewtContainer *container,
NmtNewtWidget *widget)
nmt_newt_form_remove(NmtNewtContainer *container, NmtNewtWidget *widget)
{
NmtNewtFormPrivate *priv = NMT_NEWT_FORM_GET_PRIVATE (container);
NmtNewtContainerClass *parent_class = NMT_NEWT_CONTAINER_CLASS (nmt_newt_form_parent_class);
NmtNewtFormPrivate * priv = NMT_NEWT_FORM_GET_PRIVATE(container);
NmtNewtContainerClass *parent_class = NMT_NEWT_CONTAINER_CLASS(nmt_newt_form_parent_class);
g_return_if_fail (widget == priv->content);
g_return_if_fail(widget == priv->content);
parent_class->remove (container, widget);
parent_class->remove(container, widget);
priv->content = NULL;
}
@ -159,100 +154,100 @@ nmt_newt_form_remove (NmtNewtContainer *container,
* Sets @form's content to be @content.
*/
void
nmt_newt_form_set_content (NmtNewtForm *form,
NmtNewtWidget *content)
nmt_newt_form_set_content(NmtNewtForm *form, NmtNewtWidget *content)
{
NmtNewtFormPrivate *priv = NMT_NEWT_FORM_GET_PRIVATE (form);
NmtNewtContainerClass *parent_class = NMT_NEWT_CONTAINER_CLASS (nmt_newt_form_parent_class);
NmtNewtFormPrivate * priv = NMT_NEWT_FORM_GET_PRIVATE(form);
NmtNewtContainerClass *parent_class = NMT_NEWT_CONTAINER_CLASS(nmt_newt_form_parent_class);
if (priv->content)
nmt_newt_form_remove (NMT_NEWT_CONTAINER (form), priv->content);
nmt_newt_form_remove(NMT_NEWT_CONTAINER(form), priv->content);
priv->content = content;
if (priv->content)
parent_class->add (NMT_NEWT_CONTAINER (form), content);
parent_class->add(NMT_NEWT_CONTAINER(form), content);
}
static void
nmt_newt_form_build (NmtNewtForm *form)
nmt_newt_form_build(NmtNewtForm *form)
{
NmtNewtFormPrivate *priv = NMT_NEWT_FORM_GET_PRIVATE (form);
NmtNewtFormPrivate *priv = NMT_NEWT_FORM_GET_PRIVATE(form);
int screen_height, screen_width, form_height, form_width;
newtComponent *cos;
newtComponent * cos;
int i;
priv->dirty = FALSE;
nmt_newt_widget_realize (NMT_NEWT_WIDGET (form));
nmt_newt_widget_realize(NMT_NEWT_WIDGET(form));
nmt_newt_widget_size_request (priv->content, &form_width, &form_height);
newtGetScreenSize (&screen_width, &screen_height);
nmt_newt_widget_size_request(priv->content, &form_width, &form_height);
newtGetScreenSize(&screen_width, &screen_height);
if (!priv->fixed_width)
priv->width = MIN (form_width + 2 * priv->padding, screen_width - 2);
priv->width = MIN(form_width + 2 * priv->padding, screen_width - 2);
if (!priv->fixed_height)
priv->height = MIN (form_height + 2 * priv->padding, screen_height - 2);
priv->height = MIN(form_height + 2 * priv->padding, screen_height - 2);
if (!priv->fixed_x)
priv->x = (screen_width - form_width) / 2;
if (!priv->fixed_y)
priv->y = (screen_height - form_height) / 2;
nmt_newt_widget_size_allocate (priv->content,
nmt_newt_widget_size_allocate(priv->content,
priv->padding,
priv->padding,
priv->width - 2 * priv->padding,
priv->height - 2 * priv->padding);
if (priv->height - 2 * priv->padding < form_height) {
newtComponent scroll_bar =
newtVerticalScrollbar (priv->width - 1, 0, priv->height,
newtComponent scroll_bar = newtVerticalScrollbar(priv->width - 1,
0,
priv->height,
NEWT_COLORSET_WINDOW,
NEWT_COLORSET_ACTCHECKBOX);
priv->form = newtForm (scroll_bar, NULL, NEWT_FLAG_NOF12);
newtFormAddComponent (priv->form, scroll_bar);
newtFormSetHeight (priv->form, priv->height - 2);
priv->form = newtForm(scroll_bar, NULL, NEWT_FLAG_NOF12);
newtFormAddComponent(priv->form, scroll_bar);
newtFormSetHeight(priv->form, priv->height - 2);
} else
priv->form = newtForm (NULL, NULL, NEWT_FLAG_NOF12);
priv->form = newtForm(NULL, NULL, NEWT_FLAG_NOF12);
if (priv->escape_exits)
newtFormAddHotKey (priv->form, NEWT_KEY_ESCAPE);
newtFormAddHotKey(priv->form, NEWT_KEY_ESCAPE);
cos = nmt_newt_widget_get_components (priv->content);
cos = nmt_newt_widget_get_components(priv->content);
for (i = 0; cos[i]; i++)
newtFormAddComponent (priv->form, cos[i]);
g_free (cos);
newtFormAddComponent(priv->form, cos[i]);
g_free(cos);
if (priv->focus) {
newtComponent fco;
fco = nmt_newt_widget_get_focus_component (priv->focus);
fco = nmt_newt_widget_get_focus_component(priv->focus);
if (fco)
newtFormSetCurrent (priv->form, fco);
newtFormSetCurrent(priv->form, fco);
}
#ifdef HAVE_NEWTFORMGETSCROLLPOSITION
if (priv->scroll_position)
newtFormSetScrollPosition (priv->form, priv->scroll_position);
newtFormSetScrollPosition(priv->form, priv->scroll_position);
#endif
newtOpenWindow (priv->x, priv->y, priv->width, priv->height, priv->title_lc);
newtOpenWindow(priv->x, priv->y, priv->width, priv->height, priv->title_lc);
}
static void
nmt_newt_form_destroy (NmtNewtForm *form)
nmt_newt_form_destroy(NmtNewtForm *form)
{
NmtNewtFormPrivate *priv = NMT_NEWT_FORM_GET_PRIVATE (form);
NmtNewtFormPrivate *priv = NMT_NEWT_FORM_GET_PRIVATE(form);
#ifdef HAVE_NEWTFORMGETSCROLLPOSITION
priv->scroll_position = newtFormGetScrollPosition (priv->form);
priv->scroll_position = newtFormGetScrollPosition(priv->form);
#endif
newtFormDestroy (priv->form);
newtFormDestroy(priv->form);
priv->form = NULL;
newtPopWindowNoRefresh ();
newtPopWindowNoRefresh();
nmt_newt_widget_unrealize (NMT_NEWT_WIDGET (form));
nmt_newt_widget_unrealize(NMT_NEWT_WIDGET(form));
}
/* A "normal" newt program would call newtFormRun() to run newt's main loop
@ -263,25 +258,24 @@ nmt_newt_form_destroy (NmtNewtForm *form)
* or keypresses).
*/
static void
nmt_newt_form_iterate (NmtNewtForm *form)
nmt_newt_form_iterate(NmtNewtForm *form)
{
NmtNewtFormPrivate *priv = NMT_NEWT_FORM_GET_PRIVATE (form);
NmtNewtWidget *focus;
NmtNewtFormPrivate * priv = NMT_NEWT_FORM_GET_PRIVATE(form);
NmtNewtWidget * focus;
struct newtExitStruct es;
if (priv->dirty) {
nmt_newt_form_destroy (form);
nmt_newt_form_build (form);
nmt_newt_form_destroy(form);
nmt_newt_form_build(form);
}
newtFormSetTimer (priv->form, 1);
newtFormRun (priv->form, &es);
newtFormSetTimer(priv->form, 1);
newtFormRun(priv->form, &es);
if ( es.reason == NEWT_EXIT_HOTKEY
|| es.reason == NEWT_EXIT_ERROR) {
if (es.reason == NEWT_EXIT_HOTKEY || es.reason == NEWT_EXIT_ERROR) {
/* The user hit Esc or there was an error. */
g_clear_object (&priv->focus);
nmt_newt_form_quit (form);
g_clear_object(&priv->focus);
nmt_newt_form_quit(form);
return;
}
@ -289,17 +283,16 @@ nmt_newt_form_iterate (NmtNewtForm *form)
/* The user hit Return/Space on a component; update the form focus
* to point that component, and activate it.
*/
focus = nmt_newt_widget_find_component (priv->content, es.u.co);
focus = nmt_newt_widget_find_component(priv->content, es.u.co);
if (focus) {
nmt_newt_form_set_focus (form, focus);
nmt_newt_widget_activated (focus);
nmt_newt_form_set_focus(form, focus);
nmt_newt_widget_activated(focus);
}
} else {
/* The 1ms timer ran out. Update focus but don't do anything else. */
focus = nmt_newt_widget_find_component (priv->content,
newtFormGetCurrent (priv->form));
focus = nmt_newt_widget_find_component(priv->content, newtFormGetCurrent(priv->form));
if (focus)
nmt_newt_form_set_focus (form, focus);
nmt_newt_form_set_focus(form, focus);
}
}
@ -308,51 +301,49 @@ nmt_newt_form_iterate (NmtNewtForm *form)
* nmt_newt_form_keypress_callback() iterates the top-most form, so it can
* process the keypress.
*/
static GSList *form_stack;
static GSList * form_stack;
static GSource *keypress_source;
static gboolean
nmt_newt_form_keypress_callback (int fd,
GIOCondition condition,
gpointer user_data)
nmt_newt_form_keypress_callback(int fd, GIOCondition condition, gpointer user_data)
{
g_return_val_if_fail (form_stack != NULL, FALSE);
g_return_val_if_fail(form_stack != NULL, FALSE);
nmt_newt_form_iterate (form_stack->data);
nmt_newt_form_iterate(form_stack->data);
return TRUE;
}
static gboolean
nmt_newt_form_timeout_callback (gpointer user_data)
nmt_newt_form_timeout_callback(gpointer user_data)
{
if (form_stack)
nmt_newt_form_iterate (form_stack->data);
nmt_newt_form_iterate(form_stack->data);
return FALSE;
}
static void
nmt_newt_form_redraw (NmtNewtForm *form)
nmt_newt_form_redraw(NmtNewtForm *form)
{
g_timeout_add (0, nmt_newt_form_timeout_callback, NULL);
g_timeout_add(0, nmt_newt_form_timeout_callback, NULL);
}
static void
nmt_newt_form_real_show (NmtNewtForm *form)
nmt_newt_form_real_show(NmtNewtForm *form)
{
if (!keypress_source) {
keypress_source = nm_g_unix_fd_source_new (STDIN_FILENO,
keypress_source = nm_g_unix_fd_source_new(STDIN_FILENO,
G_IO_IN,
G_PRIORITY_DEFAULT,
nmt_newt_form_keypress_callback,
NULL,
NULL);
g_source_set_can_recurse (keypress_source, TRUE);
g_source_attach (keypress_source, NULL);
g_source_set_can_recurse(keypress_source, TRUE);
g_source_attach(keypress_source, NULL);
}
nmt_newt_form_build (form);
form_stack = g_slist_prepend (form_stack, g_object_ref (form));
nmt_newt_form_redraw (form);
nmt_newt_form_build(form);
form_stack = g_slist_prepend(form_stack, g_object_ref(form));
nmt_newt_form_redraw(form);
}
/**
@ -367,9 +358,9 @@ nmt_newt_form_real_show (NmtNewtForm *form)
* Call nmt_newt_form_quit() to quit the form.
*/
void
nmt_newt_form_show (NmtNewtForm *form)
nmt_newt_form_show(NmtNewtForm *form)
{
NMT_NEWT_FORM_GET_CLASS (form)->show (form);
NMT_NEWT_FORM_GET_CLASS(form)->show(form);
}
/**
@ -384,13 +375,13 @@ nmt_newt_form_show (NmtNewtForm *form)
* sort of weird and may not be 100% accurate anyway.
*/
NmtNewtWidget *
nmt_newt_form_run_sync (NmtNewtForm *form)
nmt_newt_form_run_sync(NmtNewtForm *form)
{
NmtNewtFormPrivate *priv = NMT_NEWT_FORM_GET_PRIVATE (form);
NmtNewtFormPrivate *priv = NMT_NEWT_FORM_GET_PRIVATE(form);
nmt_newt_form_show (form);
nmt_newt_form_show(form);
while (priv->form)
g_main_context_iteration (NULL, TRUE);
g_main_context_iteration(NULL, TRUE);
return priv->focus;
}
@ -402,23 +393,23 @@ nmt_newt_form_run_sync (NmtNewtForm *form)
* Causes @form to exit.
*/
void
nmt_newt_form_quit (NmtNewtForm *form)
nmt_newt_form_quit(NmtNewtForm *form)
{
NmtNewtFormPrivate *priv = NMT_NEWT_FORM_GET_PRIVATE (form);
NmtNewtFormPrivate *priv = NMT_NEWT_FORM_GET_PRIVATE(form);
g_return_if_fail (priv->form != NULL);
g_return_if_fail(priv->form != NULL);
nmt_newt_form_destroy (form);
nmt_newt_form_destroy(form);
form_stack = g_slist_remove (form_stack, form);
form_stack = g_slist_remove(form_stack, form);
if (form_stack)
nmt_newt_form_iterate (form_stack->data);
nmt_newt_form_iterate(form_stack->data);
else
nm_clear_g_source_inst (&keypress_source);
nm_clear_g_source_inst(&keypress_source);
g_signal_emit (form, signals[QUIT], 0);
g_object_unref (form);
g_signal_emit(form, signals[QUIT], 0);
g_object_unref(form);
}
/**
@ -429,42 +420,38 @@ nmt_newt_form_quit (NmtNewtForm *form)
* Focuses @widget in @form.
*/
void
nmt_newt_form_set_focus (NmtNewtForm *form,
NmtNewtWidget *widget)
nmt_newt_form_set_focus(NmtNewtForm *form, NmtNewtWidget *widget)
{
NmtNewtFormPrivate *priv = NMT_NEWT_FORM_GET_PRIVATE (form);
NmtNewtFormPrivate *priv = NMT_NEWT_FORM_GET_PRIVATE(form);
g_return_if_fail (priv->form != NULL);
g_return_if_fail(priv->form != NULL);
if (priv->focus == widget)
return;
if (priv->focus)
g_object_unref (priv->focus);
g_object_unref(priv->focus);
priv->focus = widget;
if (priv->focus)
g_object_ref (priv->focus);
g_object_ref(priv->focus);
}
static void
nmt_newt_form_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
nmt_newt_form_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
{
NmtNewtFormPrivate *priv = NMT_NEWT_FORM_GET_PRIVATE (object);
NmtNewtFormPrivate *priv = NMT_NEWT_FORM_GET_PRIVATE(object);
int screen_width, screen_height;
switch (prop_id) {
case PROP_TITLE:
if (g_value_get_string (value)) {
priv->title_lc = nmt_newt_locale_from_utf8 (g_value_get_string (value));
if (g_value_get_string(value)) {
priv->title_lc = nmt_newt_locale_from_utf8(g_value_get_string(value));
} else
priv->title_lc = NULL;
break;
case PROP_FULLSCREEN:
if (g_value_get_boolean (value)) {
newtGetScreenSize (&screen_width, &screen_height);
if (g_value_get_boolean(value)) {
newtGetScreenSize(&screen_width, &screen_height);
priv->x = priv->y = 2;
priv->fixed_x = priv->fixed_y = TRUE;
priv->width = screen_width - 4;
@ -473,8 +460,8 @@ nmt_newt_form_set_property (GObject *object,
}
break;
case PROP_FULLSCREEN_VERTICAL:
if (g_value_get_boolean (value)) {
newtGetScreenSize (&screen_width, &screen_height);
if (g_value_get_boolean(value)) {
newtGetScreenSize(&screen_width, &screen_height);
priv->y = 2;
priv->fixed_y = TRUE;
priv->height = screen_height - 4;
@ -482,8 +469,8 @@ nmt_newt_form_set_property (GObject *object,
}
break;
case PROP_FULLSCREEN_HORIZONTAL:
if (g_value_get_boolean (value)) {
newtGetScreenSize (&screen_width, &screen_height);
if (g_value_get_boolean(value)) {
newtGetScreenSize(&screen_width, &screen_height);
priv->x = 2;
priv->fixed_x = TRUE;
priv->width = screen_width - 4;
@ -491,88 +478,85 @@ nmt_newt_form_set_property (GObject *object,
}
break;
case PROP_X:
if (g_value_get_uint (value)) {
priv->x = g_value_get_uint (value);
if (g_value_get_uint(value)) {
priv->x = g_value_get_uint(value);
priv->fixed_x = TRUE;
}
break;
case PROP_Y:
if (g_value_get_uint (value)) {
priv->y = g_value_get_uint (value);
if (g_value_get_uint(value)) {
priv->y = g_value_get_uint(value);
priv->fixed_y = TRUE;
}
break;
case PROP_WIDTH:
if (g_value_get_uint (value)) {
priv->width = g_value_get_uint (value);
if (g_value_get_uint(value)) {
priv->width = g_value_get_uint(value);
priv->fixed_width = TRUE;
}
break;
case PROP_HEIGHT:
if (g_value_get_uint (value)) {
priv->height = g_value_get_uint (value);
if (g_value_get_uint(value)) {
priv->height = g_value_get_uint(value);
priv->fixed_height = TRUE;
}
break;
case PROP_PADDING:
priv->padding = g_value_get_uint (value);
priv->padding = g_value_get_uint(value);
break;
case PROP_ESCAPE_EXITS:
priv->escape_exits = g_value_get_boolean (value);
priv->escape_exits = g_value_get_boolean(value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_newt_form_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
nmt_newt_form_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
{
NmtNewtFormPrivate *priv = NMT_NEWT_FORM_GET_PRIVATE (object);
NmtNewtFormPrivate *priv = NMT_NEWT_FORM_GET_PRIVATE(object);
switch (prop_id) {
case PROP_TITLE:
if (priv->title_lc) {
g_value_take_string (value, nmt_newt_locale_to_utf8 (priv->title_lc));
g_value_take_string(value, nmt_newt_locale_to_utf8(priv->title_lc));
} else
g_value_set_string (value, NULL);
g_value_set_string(value, NULL);
break;
case PROP_X:
g_value_set_uint (value, priv->x);
g_value_set_uint(value, priv->x);
break;
case PROP_Y:
g_value_set_uint (value, priv->y);
g_value_set_uint(value, priv->y);
break;
case PROP_WIDTH:
g_value_set_uint (value, priv->width);
g_value_set_uint(value, priv->width);
break;
case PROP_HEIGHT:
g_value_set_uint (value, priv->height);
g_value_set_uint(value, priv->height);
break;
case PROP_PADDING:
g_value_set_uint (value, priv->padding);
g_value_set_uint(value, priv->padding);
break;
case PROP_ESCAPE_EXITS:
g_value_set_boolean (value, priv->escape_exits);
g_value_set_boolean(value, priv->escape_exits);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_newt_form_class_init (NmtNewtFormClass *form_class)
nmt_newt_form_class_init(NmtNewtFormClass *form_class)
{
GObjectClass *object_class = G_OBJECT_CLASS (form_class);
NmtNewtContainerClass *container_class = NMT_NEWT_CONTAINER_CLASS (form_class);
NmtNewtWidgetClass *widget_class = NMT_NEWT_WIDGET_CLASS (form_class);
GObjectClass * object_class = G_OBJECT_CLASS(form_class);
NmtNewtContainerClass *container_class = NMT_NEWT_CONTAINER_CLASS(form_class);
NmtNewtWidgetClass * widget_class = NMT_NEWT_WIDGET_CLASS(form_class);
g_type_class_add_private (form_class, sizeof (NmtNewtFormPrivate));
g_type_class_add_private(form_class, sizeof(NmtNewtFormPrivate));
/* virtual methods */
object_class->set_property = nmt_newt_form_set_property;
@ -593,13 +577,15 @@ nmt_newt_form_class_init (NmtNewtFormClass *form_class)
*
* Emitted when the form quits.
*/
signals[QUIT] =
g_signal_new ("quit",
G_OBJECT_CLASS_TYPE (object_class),
signals[QUIT] = g_signal_new("quit",
G_OBJECT_CLASS_TYPE(object_class),
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (NmtNewtFormClass, quit),
NULL, NULL, NULL,
G_TYPE_NONE, 0);
G_STRUCT_OFFSET(NmtNewtFormClass, quit),
NULL,
NULL,
NULL,
G_TYPE_NONE,
0);
/**
* NmtNewtForm:title:
@ -607,127 +593,147 @@ nmt_newt_form_class_init (NmtNewtFormClass *form_class)
* The form's title. If non-%NULL, this will be displayed above
* the form in its border.
*/
g_object_class_install_property
(object_class, PROP_TITLE,
g_param_spec_string ("title", "", "",
g_object_class_install_property(
object_class,
PROP_TITLE,
g_param_spec_string("title",
"",
"",
NULL,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS |
G_PARAM_CONSTRUCT_ONLY));
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY));
/**
* NmtNewtForm:fullscreen:
*
* If %TRUE, the form will fill the entire "screen" (ie, terminal
* window).
*/
g_object_class_install_property
(object_class, PROP_FULLSCREEN,
g_param_spec_boolean ("fullscreen", "", "",
g_object_class_install_property(
object_class,
PROP_FULLSCREEN,
g_param_spec_boolean("fullscreen",
"",
"",
FALSE,
G_PARAM_WRITABLE |
G_PARAM_STATIC_STRINGS |
G_PARAM_CONSTRUCT_ONLY));
G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY));
/**
* NmtNewtForm:fullscreen-vertical:
*
* If %TRUE, the form will fill the entire "screen" (ie, terminal
* window) vertically, but not necessarily horizontally.
*/
g_object_class_install_property
(object_class, PROP_FULLSCREEN_VERTICAL,
g_param_spec_boolean ("fullscreen-vertical", "", "",
g_object_class_install_property(
object_class,
PROP_FULLSCREEN_VERTICAL,
g_param_spec_boolean("fullscreen-vertical",
"",
"",
FALSE,
G_PARAM_WRITABLE |
G_PARAM_STATIC_STRINGS |
G_PARAM_CONSTRUCT_ONLY));
G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY));
/**
* NmtNewtForm:fullscreen-horizontal:
*
* If %TRUE, the form will fill the entire "screen" (ie, terminal
* window) horizontally, but not necessarily vertically.
*/
g_object_class_install_property
(object_class, PROP_FULLSCREEN_HORIZONTAL,
g_param_spec_boolean ("fullscreen-horizontal", "", "",
g_object_class_install_property(
object_class,
PROP_FULLSCREEN_HORIZONTAL,
g_param_spec_boolean("fullscreen-horizontal",
"",
"",
FALSE,
G_PARAM_WRITABLE |
G_PARAM_STATIC_STRINGS |
G_PARAM_CONSTRUCT_ONLY));
G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY));
/**
* NmtNewtForm:x:
*
* The form's x coordinate. By default, the form will be centered
* on the screen.
*/
g_object_class_install_property
(object_class, PROP_X,
g_param_spec_uint ("x", "", "",
0, G_MAXUINT, 0,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(
object_class,
PROP_X,
g_param_spec_uint("x",
"",
"",
0,
G_MAXUINT,
0,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY));
/**
* NmtNewtForm:y:
*
* The form's y coordinate. By default, the form will be centered
* on the screen.
*/
g_object_class_install_property
(object_class, PROP_Y,
g_param_spec_uint ("y", "", "",
0, G_MAXUINT, 0,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(
object_class,
PROP_Y,
g_param_spec_uint("y",
"",
"",
0,
G_MAXUINT,
0,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY));
/**
* NmtNewtForm:width:
*
* The form's width. By default, this will be determined by the
* width of the form's content.
*/
g_object_class_install_property
(object_class, PROP_WIDTH,
g_param_spec_uint ("width", "", "",
0, G_MAXUINT, 0,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(
object_class,
PROP_WIDTH,
g_param_spec_uint("width",
"",
"",
0,
G_MAXUINT,
0,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY));
/**
* NmtNewtForm:height:
*
* The form's height. By default, this will be determined by the
* height of the form's content.
*/
g_object_class_install_property
(object_class, PROP_HEIGHT,
g_param_spec_uint ("height", "", "",
0, G_MAXUINT, 0,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(
object_class,
PROP_HEIGHT,
g_param_spec_uint("height",
"",
"",
0,
G_MAXUINT,
0,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY));
/**
* NmtNewtForm:padding:
*
* The padding between the form's content and its border.
*/
g_object_class_install_property
(object_class, PROP_PADDING,
g_param_spec_uint ("padding", "", "",
0, G_MAXUINT, 1,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(
object_class,
PROP_PADDING,
g_param_spec_uint("padding",
"",
"",
0,
G_MAXUINT,
1,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY));
/**
* NmtNewtForm:escape-exits:
*
* If %TRUE, then hitting the Escape key will cause the form to
* exit.
*/
g_object_class_install_property
(object_class, PROP_ESCAPE_EXITS,
g_param_spec_boolean ("escape-exits", "", "",
g_object_class_install_property(
object_class,
PROP_ESCAPE_EXITS,
g_param_spec_boolean("escape-exits",
"",
"",
FALSE,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS |
G_PARAM_CONSTRUCT_ONLY));
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY));
}

View file

@ -8,42 +8,41 @@
#include "nmt-newt-container.h"
#define NMT_TYPE_NEWT_FORM (nmt_newt_form_get_type ())
#define NMT_NEWT_FORM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMT_TYPE_NEWT_FORM, NmtNewtForm))
#define NMT_NEWT_FORM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NMT_TYPE_NEWT_FORM, NmtNewtFormClass))
#define NMT_IS_NEWT_FORM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NMT_TYPE_NEWT_FORM))
#define NMT_IS_NEWT_FORM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NMT_TYPE_NEWT_FORM))
#define NMT_NEWT_FORM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NMT_TYPE_NEWT_FORM, NmtNewtFormClass))
#define NMT_TYPE_NEWT_FORM (nmt_newt_form_get_type())
#define NMT_NEWT_FORM(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), NMT_TYPE_NEWT_FORM, NmtNewtForm))
#define NMT_NEWT_FORM_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), NMT_TYPE_NEWT_FORM, NmtNewtFormClass))
#define NMT_IS_NEWT_FORM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), NMT_TYPE_NEWT_FORM))
#define NMT_IS_NEWT_FORM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NMT_TYPE_NEWT_FORM))
#define NMT_NEWT_FORM_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), NMT_TYPE_NEWT_FORM, NmtNewtFormClass))
struct _NmtNewtForm {
NmtNewtContainer parent;
};
typedef struct {
NmtNewtContainerClass parent;
/* signals */
void (*quit) (NmtNewtForm *form);
void (*quit)(NmtNewtForm *form);
/* methods */
void (*show) (NmtNewtForm *form);
void (*show)(NmtNewtForm *form);
} NmtNewtFormClass;
GType nmt_newt_form_get_type (void);
GType nmt_newt_form_get_type(void);
NmtNewtForm *nmt_newt_form_new (const char *title);
NmtNewtForm *nmt_newt_form_new_fullscreen (const char *title);
NmtNewtForm *nmt_newt_form_new(const char *title);
NmtNewtForm *nmt_newt_form_new_fullscreen(const char *title);
void nmt_newt_form_set_content (NmtNewtForm *form,
NmtNewtWidget *content);
void nmt_newt_form_set_content(NmtNewtForm *form, NmtNewtWidget *content);
void nmt_newt_form_show (NmtNewtForm *form);
NmtNewtWidget *nmt_newt_form_run_sync (NmtNewtForm *form);
void nmt_newt_form_quit (NmtNewtForm *form);
void nmt_newt_form_show(NmtNewtForm *form);
NmtNewtWidget *nmt_newt_form_run_sync(NmtNewtForm *form);
void nmt_newt_form_quit(NmtNewtForm *form);
void nmt_newt_form_set_focus (NmtNewtForm *form,
NmtNewtWidget *widget);
void nmt_newt_form_set_focus(NmtNewtForm *form, NmtNewtWidget *widget);
#endif /* NMT_NEWT_FORM_H */

View file

@ -31,21 +31,22 @@
#include "nmt-newt-grid.h"
G_DEFINE_TYPE (NmtNewtGrid, nmt_newt_grid, NMT_TYPE_NEWT_CONTAINER)
G_DEFINE_TYPE(NmtNewtGrid, nmt_newt_grid, NMT_TYPE_NEWT_CONTAINER)
#define NMT_NEWT_GRID_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NMT_TYPE_NEWT_GRID, NmtNewtGridPrivate))
#define NMT_NEWT_GRID_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE((o), NMT_TYPE_NEWT_GRID, NmtNewtGridPrivate))
typedef struct {
NmtNewtWidget *widget;
NmtNewtWidget * widget;
int x, y;
NmtNewtGridFlags flags;
int req_height, req_width;
} NmtNewtGridChild;
typedef struct {
GArray *children;
GArray * children;
int max_x, max_y;
int *row_heights, *col_widths;
int * row_heights, *col_widths;
gboolean *expand_rows, *expand_cols;
int n_expand_rows, n_expand_cols;
int req_height, req_width;
@ -59,39 +60,38 @@ typedef struct {
* Returns: a new #NmtNewtGrid
*/
NmtNewtWidget *
nmt_newt_grid_new (void)
nmt_newt_grid_new(void)
{
return g_object_new (NMT_TYPE_NEWT_GRID, NULL);
return g_object_new(NMT_TYPE_NEWT_GRID, NULL);
}
static void
nmt_newt_grid_init (NmtNewtGrid *grid)
nmt_newt_grid_init(NmtNewtGrid *grid)
{
NmtNewtGridPrivate *priv = NMT_NEWT_GRID_GET_PRIVATE (grid);
NmtNewtGridPrivate *priv = NMT_NEWT_GRID_GET_PRIVATE(grid);
priv->children = g_array_new (FALSE, FALSE, sizeof (NmtNewtGridChild));
priv->children = g_array_new(FALSE, FALSE, sizeof(NmtNewtGridChild));
}
static void
nmt_newt_grid_finalize (GObject *object)
nmt_newt_grid_finalize(GObject *object)
{
NmtNewtGridPrivate *priv = NMT_NEWT_GRID_GET_PRIVATE (object);
NmtNewtGridPrivate *priv = NMT_NEWT_GRID_GET_PRIVATE(object);
g_array_unref (priv->children);
nm_clear_g_free (&priv->row_heights);
nm_clear_g_free (&priv->col_widths);
nm_clear_g_free (&priv->expand_rows);
nm_clear_g_free (&priv->expand_cols);
g_array_unref(priv->children);
nm_clear_g_free(&priv->row_heights);
nm_clear_g_free(&priv->col_widths);
nm_clear_g_free(&priv->expand_rows);
nm_clear_g_free(&priv->expand_cols);
G_OBJECT_CLASS (nmt_newt_grid_parent_class)->finalize (object);
G_OBJECT_CLASS(nmt_newt_grid_parent_class)->finalize(object);
}
static int
child_sort_func (gconstpointer a,
gconstpointer b)
child_sort_func(gconstpointer a, gconstpointer b)
{
NmtNewtGridChild *child_a = (NmtNewtGridChild *)a;
NmtNewtGridChild *child_b = (NmtNewtGridChild *)b;
NmtNewtGridChild *child_a = (NmtNewtGridChild *) a;
NmtNewtGridChild *child_b = (NmtNewtGridChild *) b;
if (child_a->y != child_b->y)
return child_a->y - child_b->y;
@ -100,52 +100,50 @@ child_sort_func (gconstpointer a,
}
static newtComponent *
nmt_newt_grid_get_components (NmtNewtWidget *widget)
nmt_newt_grid_get_components(NmtNewtWidget *widget)
{
NmtNewtGridPrivate *priv = NMT_NEWT_GRID_GET_PRIVATE (widget);
NmtNewtGridChild *children;
GPtrArray *cos;
newtComponent *child_cos;
NmtNewtGridPrivate *priv = NMT_NEWT_GRID_GET_PRIVATE(widget);
NmtNewtGridChild * children;
GPtrArray * cos;
newtComponent * child_cos;
int i, c;
g_array_sort (priv->children, child_sort_func);
children = (NmtNewtGridChild *)priv->children->data;
g_array_sort(priv->children, child_sort_func);
children = (NmtNewtGridChild *) priv->children->data;
cos = g_ptr_array_new ();
cos = g_ptr_array_new();
for (i = 0; i < priv->children->len; i++) {
if (!nmt_newt_widget_get_visible (children[i].widget))
if (!nmt_newt_widget_get_visible(children[i].widget))
continue;
child_cos = nmt_newt_widget_get_components (children[i].widget);
child_cos = nmt_newt_widget_get_components(children[i].widget);
for (c = 0; child_cos[c]; c++)
g_ptr_array_add (cos, child_cos[c]);
g_free (child_cos);
g_ptr_array_add(cos, child_cos[c]);
g_free(child_cos);
}
g_ptr_array_add (cos, NULL);
g_ptr_array_add(cos, NULL);
return (newtComponent *) g_ptr_array_free (cos, FALSE);
return (newtComponent *) g_ptr_array_free(cos, FALSE);
}
static void
nmt_newt_grid_size_request (NmtNewtWidget *widget,
int *width,
int *height)
nmt_newt_grid_size_request(NmtNewtWidget *widget, int *width, int *height)
{
NmtNewtGrid *grid = NMT_NEWT_GRID (widget);
NmtNewtGridPrivate *priv = NMT_NEWT_GRID_GET_PRIVATE (grid);
NmtNewtGridChild *children = (NmtNewtGridChild *)priv->children->data;
NmtNewtGrid * grid = NMT_NEWT_GRID(widget);
NmtNewtGridPrivate *priv = NMT_NEWT_GRID_GET_PRIVATE(grid);
NmtNewtGridChild * children = (NmtNewtGridChild *) priv->children->data;
int row, col, i;
g_free (priv->row_heights);
g_free (priv->col_widths);
g_free (priv->expand_rows);
g_free (priv->expand_cols);
g_free(priv->row_heights);
g_free(priv->col_widths);
g_free(priv->expand_rows);
g_free(priv->expand_cols);
priv->row_heights = g_new0 (int, priv->max_y + 1);
priv->col_widths = g_new0 (int, priv->max_x + 1);
priv->expand_rows = g_new0 (gboolean, priv->max_y + 1);
priv->expand_cols = g_new0 (gboolean, priv->max_x + 1);
priv->row_heights = g_new0(int, priv->max_y + 1);
priv->col_widths = g_new0(int, priv->max_x + 1);
priv->expand_rows = g_new0(gboolean, priv->max_y + 1);
priv->expand_cols = g_new0(gboolean, priv->max_x + 1);
priv->n_expand_rows = priv->n_expand_cols = 0;
for (row = 0; row < priv->max_y + 1; row++) {
@ -153,10 +151,10 @@ nmt_newt_grid_size_request (NmtNewtWidget *widget,
for (i = 0; i < priv->children->len; i++) {
if (children[i].x != col || children[i].y != row)
continue;
if (!nmt_newt_widget_get_visible (children[i].widget))
if (!nmt_newt_widget_get_visible(children[i].widget))
continue;
nmt_newt_widget_size_request (children[i].widget,
nmt_newt_widget_size_request(children[i].widget,
&children[i].req_width,
&children[i].req_height);
if (children[i].req_height > priv->row_heights[row])
@ -164,12 +162,12 @@ nmt_newt_grid_size_request (NmtNewtWidget *widget,
if (children[i].req_width > priv->col_widths[col])
priv->col_widths[col] = children[i].req_width;
if ( (children[i].flags & NMT_NEWT_GRID_EXPAND_X)
if ((children[i].flags & NMT_NEWT_GRID_EXPAND_X)
&& !priv->expand_cols[children[i].x]) {
priv->expand_cols[children[i].x] = TRUE;
priv->n_expand_cols++;
}
if ( (children[i].flags & NMT_NEWT_GRID_EXPAND_Y)
if ((children[i].flags & NMT_NEWT_GRID_EXPAND_Y)
&& !priv->expand_rows[children[i].y]) {
priv->expand_rows[children[i].y] = TRUE;
priv->n_expand_rows++;
@ -189,14 +187,10 @@ nmt_newt_grid_size_request (NmtNewtWidget *widget,
}
static void
nmt_newt_grid_size_allocate (NmtNewtWidget *widget,
int x,
int y,
int width,
int height)
nmt_newt_grid_size_allocate(NmtNewtWidget *widget, int x, int y, int width, int height)
{
NmtNewtGridPrivate *priv = NMT_NEWT_GRID_GET_PRIVATE (widget);
NmtNewtGridChild *children = (NmtNewtGridChild *)priv->children->data, *child;
NmtNewtGridPrivate *priv = NMT_NEWT_GRID_GET_PRIVATE(widget);
NmtNewtGridChild * children = (NmtNewtGridChild *) priv->children->data, *child;
int i, row, col;
int child_x, child_y, child_width, child_height;
int extra, extra_all, extra_some;
@ -235,7 +229,7 @@ nmt_newt_grid_size_allocate (NmtNewtWidget *widget,
for (i = 0; i < priv->children->len; i++) {
child = &children[i];
if (!nmt_newt_widget_get_visible (child->widget))
if (!nmt_newt_widget_get_visible(child->widget))
continue;
child_x = x;
@ -266,17 +260,15 @@ nmt_newt_grid_size_allocate (NmtNewtWidget *widget,
child_y += (priv->row_heights[child->y] - child->req_height) / 2;
}
nmt_newt_widget_size_allocate (child->widget,
child_x, child_y,
child_width, child_height);
nmt_newt_widget_size_allocate(child->widget, child_x, child_y, child_width, child_height);
}
}
static void
nmt_newt_grid_find_size (NmtNewtGrid *grid)
nmt_newt_grid_find_size(NmtNewtGrid *grid)
{
NmtNewtGridPrivate *priv = NMT_NEWT_GRID_GET_PRIVATE (grid);
NmtNewtGridChild *children = (NmtNewtGridChild *)priv->children->data;
NmtNewtGridPrivate *priv = NMT_NEWT_GRID_GET_PRIVATE(grid);
NmtNewtGridChild * children = (NmtNewtGridChild *) priv->children->data;
int i;
priv->max_x = priv->max_y = 0;
@ -299,22 +291,19 @@ nmt_newt_grid_find_size (NmtNewtGrid *grid)
* details of exactly how this works.
*/
void
nmt_newt_grid_add (NmtNewtGrid *grid,
NmtNewtWidget *widget,
int x,
int y)
nmt_newt_grid_add(NmtNewtGrid *grid, NmtNewtWidget *widget, int x, int y)
{
NmtNewtGridPrivate *priv = NMT_NEWT_GRID_GET_PRIVATE (grid);
NmtNewtGridPrivate *priv = NMT_NEWT_GRID_GET_PRIVATE(grid);
NmtNewtGridChild child;
NMT_NEWT_CONTAINER_CLASS (nmt_newt_grid_parent_class)->add (NMT_NEWT_CONTAINER (grid), widget);
NMT_NEWT_CONTAINER_CLASS(nmt_newt_grid_parent_class)->add(NMT_NEWT_CONTAINER(grid), widget);
memset (&child, 0, sizeof (child));
memset(&child, 0, sizeof(child));
child.widget = widget;
child.x = x;
child.y = y;
child.flags = NMT_NEWT_GRID_FILL_X | NMT_NEWT_GRID_FILL_Y;
g_array_append_val (priv->children, child);
g_array_append_val(priv->children, child);
if (x > priv->max_x)
priv->max_x = x;
@ -323,11 +312,10 @@ nmt_newt_grid_add (NmtNewtGrid *grid,
}
static int
find_child (NmtNewtGrid *grid,
NmtNewtWidget *widget)
find_child(NmtNewtGrid *grid, NmtNewtWidget *widget)
{
NmtNewtGridPrivate *priv = NMT_NEWT_GRID_GET_PRIVATE (grid);
NmtNewtGridChild *children = (NmtNewtGridChild *)priv->children->data;
NmtNewtGridPrivate *priv = NMT_NEWT_GRID_GET_PRIVATE(grid);
NmtNewtGridChild * children = (NmtNewtGridChild *) priv->children->data;
int i;
for (i = 0; i < priv->children->len; i++) {
@ -339,20 +327,19 @@ find_child (NmtNewtGrid *grid,
}
static void
nmt_newt_grid_remove (NmtNewtContainer *container,
NmtNewtWidget *widget)
nmt_newt_grid_remove(NmtNewtContainer *container, NmtNewtWidget *widget)
{
NmtNewtGrid *grid = NMT_NEWT_GRID (container);
NmtNewtGridPrivate *priv = NMT_NEWT_GRID_GET_PRIVATE (grid);
NmtNewtGrid * grid = NMT_NEWT_GRID(container);
NmtNewtGridPrivate *priv = NMT_NEWT_GRID_GET_PRIVATE(grid);
int i;
i = find_child (grid, widget);
i = find_child(grid, widget);
if (i != -1) {
g_array_remove_index (priv->children, i);
nmt_newt_grid_find_size (grid);
g_array_remove_index(priv->children, i);
nmt_newt_grid_find_size(grid);
}
NMT_NEWT_CONTAINER_CLASS (nmt_newt_grid_parent_class)->remove (container, widget);
NMT_NEWT_CONTAINER_CLASS(nmt_newt_grid_parent_class)->remove(container, widget);
}
/**
@ -365,21 +352,18 @@ nmt_newt_grid_remove (NmtNewtContainer *container,
* Moves @widget to the given new coordinates.
*/
void
nmt_newt_grid_move (NmtNewtGrid *grid,
NmtNewtWidget *widget,
int x,
int y)
nmt_newt_grid_move(NmtNewtGrid *grid, NmtNewtWidget *widget, int x, int y)
{
NmtNewtGridPrivate *priv = NMT_NEWT_GRID_GET_PRIVATE (grid);
NmtNewtGridChild *children = (NmtNewtGridChild *)priv->children->data;
NmtNewtGridPrivate *priv = NMT_NEWT_GRID_GET_PRIVATE(grid);
NmtNewtGridChild * children = (NmtNewtGridChild *) priv->children->data;
int i;
i = find_child (grid, widget);
i = find_child(grid, widget);
if (i != -1 && (children[i].x != x || children[i].y != y)) {
children[i].x = x;
children[i].y = y;
nmt_newt_grid_find_size (grid);
nmt_newt_widget_needs_rebuild (NMT_NEWT_WIDGET (grid));
nmt_newt_grid_find_size(grid);
nmt_newt_widget_needs_rebuild(NMT_NEWT_WIDGET(grid));
}
}
@ -424,27 +408,25 @@ nmt_newt_grid_move (NmtNewtGrid *grid,
* Sets the #NmtNewtGridFlags on @widget
*/
void
nmt_newt_grid_set_flags (NmtNewtGrid *grid,
NmtNewtWidget *widget,
NmtNewtGridFlags flags)
nmt_newt_grid_set_flags(NmtNewtGrid *grid, NmtNewtWidget *widget, NmtNewtGridFlags flags)
{
NmtNewtGridPrivate *priv = NMT_NEWT_GRID_GET_PRIVATE (grid);
NmtNewtGridChild *children = (NmtNewtGridChild *)priv->children->data;
NmtNewtGridPrivate *priv = NMT_NEWT_GRID_GET_PRIVATE(grid);
NmtNewtGridChild * children = (NmtNewtGridChild *) priv->children->data;
int i;
i = find_child (grid, widget);
i = find_child(grid, widget);
if (i != -1)
children[i].flags = flags;
}
static void
nmt_newt_grid_class_init (NmtNewtGridClass *grid_class)
nmt_newt_grid_class_init(NmtNewtGridClass *grid_class)
{
GObjectClass *object_class = G_OBJECT_CLASS (grid_class);
NmtNewtWidgetClass *widget_class = NMT_NEWT_WIDGET_CLASS (grid_class);
NmtNewtContainerClass *container_class = NMT_NEWT_CONTAINER_CLASS (grid_class);
GObjectClass * object_class = G_OBJECT_CLASS(grid_class);
NmtNewtWidgetClass * widget_class = NMT_NEWT_WIDGET_CLASS(grid_class);
NmtNewtContainerClass *container_class = NMT_NEWT_CONTAINER_CLASS(grid_class);
g_type_class_add_private (grid_class, sizeof (NmtNewtGridPrivate));
g_type_class_add_private(grid_class, sizeof(NmtNewtGridPrivate));
/* virtual methods */
object_class->finalize = nmt_newt_grid_finalize;

View file

@ -8,16 +8,17 @@
#include "nmt-newt-container.h"
#define NMT_TYPE_NEWT_GRID (nmt_newt_grid_get_type ())
#define NMT_NEWT_GRID(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMT_TYPE_NEWT_GRID, NmtNewtGrid))
#define NMT_NEWT_GRID_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NMT_TYPE_NEWT_GRID, NmtNewtGridClass))
#define NMT_IS_NEWT_GRID(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NMT_TYPE_NEWT_GRID))
#define NMT_IS_NEWT_GRID_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NMT_TYPE_NEWT_GRID))
#define NMT_NEWT_GRID_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NMT_TYPE_NEWT_GRID, NmtNewtGridClass))
#define NMT_TYPE_NEWT_GRID (nmt_newt_grid_get_type())
#define NMT_NEWT_GRID(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), NMT_TYPE_NEWT_GRID, NmtNewtGrid))
#define NMT_NEWT_GRID_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), NMT_TYPE_NEWT_GRID, NmtNewtGridClass))
#define NMT_IS_NEWT_GRID(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), NMT_TYPE_NEWT_GRID))
#define NMT_IS_NEWT_GRID_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NMT_TYPE_NEWT_GRID))
#define NMT_NEWT_GRID_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), NMT_TYPE_NEWT_GRID, NmtNewtGridClass))
struct _NmtNewtGrid {
NmtNewtContainer parent;
};
typedef struct {
@ -25,7 +26,7 @@ typedef struct {
} NmtNewtGridClass;
GType nmt_newt_grid_get_type (void);
GType nmt_newt_grid_get_type(void);
typedef enum {
NMT_NEWT_GRID_EXPAND_X = (1 << 0),
@ -38,18 +39,10 @@ typedef enum {
NMT_NEWT_GRID_FILL_Y = NMT_NEWT_GRID_ANCHOR_TOP | NMT_NEWT_GRID_ANCHOR_BOTTOM,
} NmtNewtGridFlags;
NmtNewtWidget *nmt_newt_grid_new (void);
NmtNewtWidget *nmt_newt_grid_new(void);
void nmt_newt_grid_add (NmtNewtGrid *grid,
NmtNewtWidget *widget,
int x,
int y);
void nmt_newt_grid_move (NmtNewtGrid *grid,
NmtNewtWidget *widget,
int x,
int y);
void nmt_newt_grid_set_flags (NmtNewtGrid *grid,
NmtNewtWidget *widget,
NmtNewtGridFlags flags);
void nmt_newt_grid_add(NmtNewtGrid *grid, NmtNewtWidget *widget, int x, int y);
void nmt_newt_grid_move(NmtNewtGrid *grid, NmtNewtWidget *widget, int x, int y);
void nmt_newt_grid_set_flags(NmtNewtGrid *grid, NmtNewtWidget *widget, NmtNewtGridFlags flags);
#endif /* NMT_NEWT_GRID_H */

View file

@ -15,7 +15,7 @@
#include "nmt-newt-hacks.h"
#if !defined (HAVE_NEWTCOMPONENTGETSIZE) || !defined (HAVE_NEWTENTRYGETCURSORPOSITION)
#if !defined(HAVE_NEWTCOMPONENTGETSIZE) || !defined(HAVE_NEWTENTRYGETCURSORPOSITION)
struct newtComponent_0_52_15_struct_hack {
int height, width;
int top, left;
@ -25,10 +25,10 @@ struct newtComponent_0_52_15_struct_hack {
struct componentOps *ops;
newtCallback callback;
void *callbackData;
void * callbackData;
newtCallback destroyCallback;
void *destroyCallbackData;
void * destroyCallbackData;
void *data;
};
@ -36,9 +36,7 @@ struct newtComponent_0_52_15_struct_hack {
#ifndef HAVE_NEWTCOMPONENTGETSIZE
void
newtComponentGetSize (newtComponent component,
int *width,
int *height)
newtComponentGetSize(newtComponent component, int *width, int *height)
{
struct newtComponent_0_52_15_struct_hack *hack = (void *) component;
@ -47,9 +45,7 @@ newtComponentGetSize (newtComponent component,
}
void
newtComponentGetPosition (newtComponent component,
int *left,
int *top)
newtComponentGetPosition(newtComponent component, int *left, int *top)
{
struct newtComponent_0_52_15_struct_hack *hack = (void *) component;
@ -61,7 +57,7 @@ newtComponentGetPosition (newtComponent component,
#ifndef HAVE_NEWTENTRYGETCURSORPOSITION
struct newtEntry_0_52_15_struct_hack {
int flags;
char *buf;
char * buf;
const char **resultPtr;
int bufAlloced;
int bufUsed;
@ -70,20 +66,19 @@ struct newtEntry_0_52_15_struct_hack {
};
int
newtEntryGetCursorPosition (newtComponent component)
newtEntryGetCursorPosition(newtComponent component)
{
struct newtComponent_0_52_15_struct_hack *co_hack = (void *) component;
struct newtEntry_0_52_15_struct_hack *entry_hack = co_hack->data;
struct newtEntry_0_52_15_struct_hack * entry_hack = co_hack->data;
return entry_hack->cursorPosition;
}
void
newtEntrySetCursorPosition (newtComponent component,
int position)
newtEntrySetCursorPosition(newtComponent component, int position)
{
struct newtComponent_0_52_15_struct_hack *co_hack = (void *) component;
struct newtEntry_0_52_15_struct_hack *entry_hack = co_hack->data;
struct newtEntry_0_52_15_struct_hack * entry_hack = co_hack->data;
entry_hack->cursorPosition = position;
}

View file

@ -9,19 +9,14 @@
#include <newt.h>
#ifndef HAVE_NEWTCOMPONENTGETSIZE
void newtComponentGetSize (newtComponent component,
int *width,
int *height);
void newtComponentGetSize(newtComponent component, int *width, int *height);
void newtComponentGetPosition (newtComponent component,
int *left,
int *top);
void newtComponentGetPosition(newtComponent component, int *left, int *top);
#endif
#ifndef HAVE_NEWTENTRYGETCURSORPOSITION
int newtEntryGetCursorPosition (newtComponent component);
void newtEntrySetCursorPosition (newtComponent component,
int position);
int newtEntryGetCursorPosition(newtComponent component);
void newtEntrySetCursorPosition(newtComponent component, int position);
#endif
#endif /* NMT_NEWT_HACKS_H */

View file

@ -18,12 +18,13 @@
#include "nmt-newt-utils.h"
G_DEFINE_TYPE (NmtNewtLabel, nmt_newt_label, NMT_TYPE_NEWT_COMPONENT)
G_DEFINE_TYPE(NmtNewtLabel, nmt_newt_label, NMT_TYPE_NEWT_COMPONENT)
#define NMT_NEWT_LABEL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NMT_TYPE_NEWT_LABEL, NmtNewtLabelPrivate))
#define NMT_NEWT_LABEL_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE((o), NMT_TYPE_NEWT_LABEL, NmtNewtLabelPrivate))
typedef struct {
char *text;
char * text;
NmtNewtLabelStyle style;
gboolean highlight;
} NmtNewtLabelPrivate;
@ -46,11 +47,9 @@ enum {
* Returns: a new #NmtNewtLabel
*/
NmtNewtWidget *
nmt_newt_label_new (const char *text)
nmt_newt_label_new(const char *text)
{
return g_object_new (NMT_TYPE_NEWT_LABEL,
"text", text,
NULL);
return g_object_new(NMT_TYPE_NEWT_LABEL, "text", text, NULL);
}
/**
@ -61,19 +60,18 @@ nmt_newt_label_new (const char *text)
* Updates @label's text.
*/
void
nmt_newt_label_set_text (NmtNewtLabel *label,
const char *text)
nmt_newt_label_set_text(NmtNewtLabel *label, const char *text)
{
NmtNewtLabelPrivate *priv = NMT_NEWT_LABEL_GET_PRIVATE (label);
NmtNewtLabelPrivate *priv = NMT_NEWT_LABEL_GET_PRIVATE(label);
if (!g_strcmp0 (priv->text, text))
if (!g_strcmp0(priv->text, text))
return;
g_free (priv->text);
priv->text = g_strdup (text);
g_free(priv->text);
priv->text = g_strdup(text);
g_object_notify (G_OBJECT (label), "text");
nmt_newt_widget_needs_rebuild (NMT_NEWT_WIDGET (label));
g_object_notify(G_OBJECT(label), "text");
nmt_newt_widget_needs_rebuild(NMT_NEWT_WIDGET(label));
}
/**
@ -85,9 +83,9 @@ nmt_newt_label_set_text (NmtNewtLabel *label,
* Returns: @label's text
*/
const char *
nmt_newt_label_get_text (NmtNewtLabel *label)
nmt_newt_label_get_text(NmtNewtLabel *label)
{
NmtNewtLabelPrivate *priv = NMT_NEWT_LABEL_GET_PRIVATE (label);
NmtNewtLabelPrivate *priv = NMT_NEWT_LABEL_GET_PRIVATE(label);
return priv->text;
}
@ -110,17 +108,16 @@ nmt_newt_label_get_text (NmtNewtLabel *label)
* Sets the style of @label
*/
void
nmt_newt_label_set_style (NmtNewtLabel *label,
NmtNewtLabelStyle style)
nmt_newt_label_set_style(NmtNewtLabel *label, NmtNewtLabelStyle style)
{
NmtNewtLabelPrivate *priv = NMT_NEWT_LABEL_GET_PRIVATE (label);
NmtNewtLabelPrivate *priv = NMT_NEWT_LABEL_GET_PRIVATE(label);
if (priv->style == style)
return;
priv->style = style;
g_object_notify (G_OBJECT (label), "style");
nmt_newt_widget_needs_rebuild (NMT_NEWT_WIDGET (label));
g_object_notify(G_OBJECT(label), "style");
nmt_newt_widget_needs_rebuild(NMT_NEWT_WIDGET(label));
}
/**
@ -132,9 +129,9 @@ nmt_newt_label_set_style (NmtNewtLabel *label,
* Returns: the style of @label
*/
NmtNewtLabelStyle
nmt_newt_label_get_style (NmtNewtLabel *label)
nmt_newt_label_get_style(NmtNewtLabel *label)
{
NmtNewtLabelPrivate *priv = NMT_NEWT_LABEL_GET_PRIVATE (label);
NmtNewtLabelPrivate *priv = NMT_NEWT_LABEL_GET_PRIVATE(label);
return priv->style;
}
@ -148,18 +145,17 @@ nmt_newt_label_get_style (NmtNewtLabel *label)
* this is generally used to highlight invalid widgets.
*/
void
nmt_newt_label_set_highlight (NmtNewtLabel *label,
gboolean highlight)
nmt_newt_label_set_highlight(NmtNewtLabel *label, gboolean highlight)
{
NmtNewtLabelPrivate *priv = NMT_NEWT_LABEL_GET_PRIVATE (label);
NmtNewtLabelPrivate *priv = NMT_NEWT_LABEL_GET_PRIVATE(label);
highlight = !!highlight;
if (priv->highlight == highlight)
return;
priv->highlight = highlight;
g_object_notify (G_OBJECT (label), "highlight");
nmt_newt_widget_needs_rebuild (NMT_NEWT_WIDGET (label));
g_object_notify(G_OBJECT(label), "highlight");
nmt_newt_widget_needs_rebuild(NMT_NEWT_WIDGET(label));
}
/**
@ -171,103 +167,95 @@ nmt_newt_label_set_highlight (NmtNewtLabel *label,
* Returns: whether @label is highlighted.
*/
gboolean
nmt_newt_label_get_highlight (NmtNewtLabel *label)
nmt_newt_label_get_highlight(NmtNewtLabel *label)
{
NmtNewtLabelPrivate *priv = NMT_NEWT_LABEL_GET_PRIVATE (label);
NmtNewtLabelPrivate *priv = NMT_NEWT_LABEL_GET_PRIVATE(label);
return priv->highlight;
}
static void
nmt_newt_label_init (NmtNewtLabel *label)
{
}
nmt_newt_label_init(NmtNewtLabel *label)
{}
static void
nmt_newt_label_finalize (GObject *object)
nmt_newt_label_finalize(GObject *object)
{
NmtNewtLabelPrivate *priv = NMT_NEWT_LABEL_GET_PRIVATE (object);
NmtNewtLabelPrivate *priv = NMT_NEWT_LABEL_GET_PRIVATE(object);
g_free (priv->text);
g_free(priv->text);
G_OBJECT_CLASS (nmt_newt_label_parent_class)->finalize (object);
G_OBJECT_CLASS(nmt_newt_label_parent_class)->finalize(object);
}
static newtComponent
nmt_newt_label_build_component (NmtNewtComponent *component,
gboolean sensitive)
nmt_newt_label_build_component(NmtNewtComponent *component, gboolean sensitive)
{
NmtNewtLabelPrivate *priv = NMT_NEWT_LABEL_GET_PRIVATE (component);
NmtNewtLabelPrivate *priv = NMT_NEWT_LABEL_GET_PRIVATE(component);
newtComponent co;
char *text_lc;
char * text_lc;
text_lc = nmt_newt_locale_from_utf8 (priv->text);
co = newtLabel (-1, -1, text_lc);
g_free (text_lc);
text_lc = nmt_newt_locale_from_utf8(priv->text);
co = newtLabel(-1, -1, text_lc);
g_free(text_lc);
if (priv->highlight)
newtLabelSetColors (co, NMT_NEWT_COLORSET_BAD_LABEL);
newtLabelSetColors(co, NMT_NEWT_COLORSET_BAD_LABEL);
else if (priv->style == NMT_NEWT_LABEL_PLAIN)
newtLabelSetColors (co, NMT_NEWT_COLORSET_PLAIN_LABEL);
newtLabelSetColors(co, NMT_NEWT_COLORSET_PLAIN_LABEL);
return co;
}
static void
nmt_newt_label_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
nmt_newt_label_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
{
NmtNewtLabel *label = NMT_NEWT_LABEL (object);
NmtNewtLabel *label = NMT_NEWT_LABEL(object);
switch (prop_id) {
case PROP_TEXT:
nmt_newt_label_set_text (label, g_value_get_string (value));
nmt_newt_label_set_text(label, g_value_get_string(value));
break;
case PROP_STYLE:
nmt_newt_label_set_style (label, g_value_get_int (value));
nmt_newt_label_set_style(label, g_value_get_int(value));
break;
case PROP_HIGHLIGHT:
nmt_newt_label_set_highlight (label, g_value_get_boolean (value));
nmt_newt_label_set_highlight(label, g_value_get_boolean(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_newt_label_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
nmt_newt_label_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
{
NmtNewtLabelPrivate *priv = NMT_NEWT_LABEL_GET_PRIVATE (object);
NmtNewtLabelPrivate *priv = NMT_NEWT_LABEL_GET_PRIVATE(object);
switch (prop_id) {
case PROP_TEXT:
g_value_set_string (value, priv->text);
g_value_set_string(value, priv->text);
break;
case PROP_STYLE:
g_value_set_int (value, priv->style);
g_value_set_int(value, priv->style);
break;
case PROP_HIGHLIGHT:
g_value_set_boolean (value, priv->highlight);
g_value_set_boolean(value, priv->highlight);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_newt_label_class_init (NmtNewtLabelClass *label_class)
nmt_newt_label_class_init(NmtNewtLabelClass *label_class)
{
GObjectClass *object_class = G_OBJECT_CLASS (label_class);
NmtNewtComponentClass *component_class = NMT_NEWT_COMPONENT_CLASS (label_class);
GObjectClass * object_class = G_OBJECT_CLASS(label_class);
NmtNewtComponentClass *component_class = NMT_NEWT_COMPONENT_CLASS(label_class);
g_type_class_add_private (label_class, sizeof (NmtNewtLabelPrivate));
g_type_class_add_private(label_class, sizeof(NmtNewtLabelPrivate));
/* virtual methods */
object_class->set_property = nmt_newt_label_set_property;
@ -281,32 +269,35 @@ nmt_newt_label_class_init (NmtNewtLabelClass *label_class)
*
* The label's text
*/
g_object_class_install_property
(object_class, PROP_TEXT,
g_param_spec_string ("text", "", "",
NULL,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
object_class,
PROP_TEXT,
g_param_spec_string("text", "", "", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
* NmtNewtLabel:style:
*
* The label's #NmtNewtLabelStyle
*/
g_object_class_install_property
(object_class, PROP_STYLE,
g_param_spec_int ("style", "", "",
0, G_MAXINT, 0,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(object_class,
PROP_STYLE,
g_param_spec_int("style",
"",
"",
0,
G_MAXINT,
0,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
* NmtNewtLabel:highlight:
*
* Whether the label is highlighted.
*/
g_object_class_install_property
(object_class, PROP_HIGHLIGHT,
g_param_spec_boolean ("highlight", "", "",
g_object_class_install_property(
object_class,
PROP_HIGHLIGHT,
g_param_spec_boolean("highlight",
"",
"",
FALSE,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
}

View file

@ -8,16 +8,17 @@
#include "nmt-newt-component.h"
#define NMT_TYPE_NEWT_LABEL (nmt_newt_label_get_type ())
#define NMT_NEWT_LABEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMT_TYPE_NEWT_LABEL, NmtNewtLabel))
#define NMT_NEWT_LABEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NMT_TYPE_NEWT_LABEL, NmtNewtLabelClass))
#define NMT_IS_NEWT_LABEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NMT_TYPE_NEWT_LABEL))
#define NMT_IS_NEWT_LABEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NMT_TYPE_NEWT_LABEL))
#define NMT_NEWT_LABEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NMT_TYPE_NEWT_LABEL, NmtNewtLabelClass))
#define NMT_TYPE_NEWT_LABEL (nmt_newt_label_get_type())
#define NMT_NEWT_LABEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), NMT_TYPE_NEWT_LABEL, NmtNewtLabel))
#define NMT_NEWT_LABEL_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), NMT_TYPE_NEWT_LABEL, NmtNewtLabelClass))
#define NMT_IS_NEWT_LABEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), NMT_TYPE_NEWT_LABEL))
#define NMT_IS_NEWT_LABEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NMT_TYPE_NEWT_LABEL))
#define NMT_NEWT_LABEL_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), NMT_TYPE_NEWT_LABEL, NmtNewtLabelClass))
struct _NmtNewtLabel {
NmtNewtComponent parent;
};
typedef struct {
@ -25,25 +26,19 @@ typedef struct {
} NmtNewtLabelClass;
GType nmt_newt_label_get_type (void);
GType nmt_newt_label_get_type(void);
typedef enum {
NMT_NEWT_LABEL_NORMAL,
NMT_NEWT_LABEL_PLAIN
} NmtNewtLabelStyle;
typedef enum { NMT_NEWT_LABEL_NORMAL, NMT_NEWT_LABEL_PLAIN } NmtNewtLabelStyle;
NmtNewtWidget *nmt_newt_label_new (const char *text);
NmtNewtWidget *nmt_newt_label_new(const char *text);
void nmt_newt_label_set_text (NmtNewtLabel *label,
const char *text);
const char *nmt_newt_label_get_text (NmtNewtLabel *label);
void nmt_newt_label_set_text(NmtNewtLabel *label, const char *text);
const char *nmt_newt_label_get_text(NmtNewtLabel *label);
void nmt_newt_label_set_style (NmtNewtLabel *label,
NmtNewtLabelStyle style);
NmtNewtLabelStyle nmt_newt_label_get_style (NmtNewtLabel *label);
void nmt_newt_label_set_style(NmtNewtLabel *label, NmtNewtLabelStyle style);
NmtNewtLabelStyle nmt_newt_label_get_style(NmtNewtLabel *label);
void nmt_newt_label_set_highlight (NmtNewtLabel *label,
gboolean highlight);
gboolean nmt_newt_label_get_highlight (NmtNewtLabel *label);
void nmt_newt_label_set_highlight(NmtNewtLabel *label, gboolean highlight);
gboolean nmt_newt_label_get_highlight(NmtNewtLabel *label);
#endif /* NMT_NEWT_LABEL_H */

View file

@ -24,9 +24,10 @@
#include "nmt-newt-form.h"
#include "nmt-newt-utils.h"
G_DEFINE_TYPE (NmtNewtListbox, nmt_newt_listbox, NMT_TYPE_NEWT_COMPONENT)
G_DEFINE_TYPE(NmtNewtListbox, nmt_newt_listbox, NMT_TYPE_NEWT_COMPONENT)
#define NMT_NEWT_LISTBOX_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NMT_TYPE_NEWT_LISTBOX, NmtNewtListboxPrivate))
#define NMT_NEWT_LISTBOX_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE((o), NMT_TYPE_NEWT_LISTBOX, NmtNewtListboxPrivate))
typedef struct {
int height, alloc_height, width;
@ -71,13 +72,9 @@ enum {
* Returns: a new #NmtNewtListbox
*/
NmtNewtWidget *
nmt_newt_listbox_new (int height,
NmtNewtListboxFlags flags)
nmt_newt_listbox_new(int height, NmtNewtListboxFlags flags)
{
return g_object_new (NMT_TYPE_NEWT_LISTBOX,
"height", height,
"flags", flags,
NULL);
return g_object_new(NMT_TYPE_NEWT_LISTBOX, "height", height, "flags", flags, NULL);
}
/**
@ -89,15 +86,13 @@ nmt_newt_listbox_new (int height,
* Adds a row to @listbox.
*/
void
nmt_newt_listbox_append (NmtNewtListbox *listbox,
const char *entry,
gpointer key)
nmt_newt_listbox_append(NmtNewtListbox *listbox, const char *entry, gpointer key)
{
NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE (listbox);
NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE(listbox);
g_ptr_array_add (priv->entries, nmt_newt_locale_from_utf8 (entry));
g_ptr_array_add (priv->keys, key);
nmt_newt_widget_needs_rebuild (NMT_NEWT_WIDGET (listbox));
g_ptr_array_add(priv->entries, nmt_newt_locale_from_utf8(entry));
g_ptr_array_add(priv->keys, key);
nmt_newt_widget_needs_rebuild(NMT_NEWT_WIDGET(listbox));
}
/**
@ -107,17 +102,17 @@ nmt_newt_listbox_append (NmtNewtListbox *listbox,
* Clears the contents of @listbox.
*/
void
nmt_newt_listbox_clear (NmtNewtListbox *listbox)
nmt_newt_listbox_clear(NmtNewtListbox *listbox)
{
NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE (listbox);
NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE(listbox);
g_ptr_array_set_size (priv->entries, 0);
g_ptr_array_set_size (priv->keys, 0);
g_ptr_array_set_size(priv->entries, 0);
g_ptr_array_set_size(priv->keys, 0);
priv->active = -1;
priv->active_key = NULL;
nmt_newt_widget_needs_rebuild (NMT_NEWT_WIDGET (listbox));
nmt_newt_widget_needs_rebuild(NMT_NEWT_WIDGET(listbox));
}
/**
@ -129,22 +124,21 @@ nmt_newt_listbox_clear (NmtNewtListbox *listbox)
* scrolling it into view if needed.
*/
void
nmt_newt_listbox_set_active (NmtNewtListbox *listbox,
int active)
nmt_newt_listbox_set_active(NmtNewtListbox *listbox, int active)
{
NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE (listbox);
NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE(listbox);
if (active == priv->active)
return;
g_return_if_fail (active >= 0 && active < priv->entries->len);
g_return_if_fail (!priv->skip_null_keys || priv->keys->pdata[active]);
g_return_if_fail(active >= 0 && active < priv->entries->len);
g_return_if_fail(!priv->skip_null_keys || priv->keys->pdata[active]);
priv->active = active;
priv->active_key = priv->keys->pdata[active];
g_object_notify (G_OBJECT (listbox), "active");
g_object_notify (G_OBJECT (listbox), "active-key");
g_object_notify(G_OBJECT(listbox), "active");
g_object_notify(G_OBJECT(listbox), "active-key");
}
/**
@ -156,24 +150,23 @@ nmt_newt_listbox_set_active (NmtNewtListbox *listbox,
* scrolling it into view if needed.
*/
void
nmt_newt_listbox_set_active_key (NmtNewtListbox *listbox,
gpointer active_key)
nmt_newt_listbox_set_active_key(NmtNewtListbox *listbox, gpointer active_key)
{
NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE (listbox);
NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE(listbox);
int i;
if (active_key == priv->active_key)
return;
g_return_if_fail (!priv->skip_null_keys || active_key);
g_return_if_fail(!priv->skip_null_keys || active_key);
for (i = 0; i < priv->keys->len; i++) {
if (priv->keys->pdata[i] == active_key) {
priv->active = i;
priv->active_key = active_key;
g_object_notify (G_OBJECT (listbox), "active");
g_object_notify (G_OBJECT (listbox), "active-key");
g_object_notify(G_OBJECT(listbox), "active");
g_object_notify(G_OBJECT(listbox), "active-key");
return;
}
}
@ -188,9 +181,9 @@ nmt_newt_listbox_set_active_key (NmtNewtListbox *listbox,
* Returns: the currently-selected row in @listbox.
*/
int
nmt_newt_listbox_get_active (NmtNewtListbox *listbox)
nmt_newt_listbox_get_active(NmtNewtListbox *listbox)
{
NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE (listbox);
NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE(listbox);
return priv->active;
}
@ -204,9 +197,9 @@ nmt_newt_listbox_get_active (NmtNewtListbox *listbox)
* Returns: the key of the currently-selected row in @listbox.
*/
gpointer
nmt_newt_listbox_get_active_key (NmtNewtListbox *listbox)
nmt_newt_listbox_get_active_key(NmtNewtListbox *listbox)
{
NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE (listbox);
NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE(listbox);
return priv->active_key;
}
@ -219,47 +212,43 @@ nmt_newt_listbox_get_active_key (NmtNewtListbox *listbox)
* Updates @listbox's height.
*/
void
nmt_newt_listbox_set_height (NmtNewtListbox *listbox,
int height)
nmt_newt_listbox_set_height(NmtNewtListbox *listbox, int height)
{
NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE (listbox);
NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE(listbox);
priv->height = height;
priv->fixed_height = priv->height != 0;
g_object_notify (G_OBJECT (listbox), "height");
g_object_notify(G_OBJECT(listbox), "height");
}
static void
nmt_newt_listbox_init (NmtNewtListbox *listbox)
nmt_newt_listbox_init(NmtNewtListbox *listbox)
{
NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE (listbox);
NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE(listbox);
priv->entries = g_ptr_array_new_with_free_func (g_free);
priv->keys = g_ptr_array_new ();
priv->entries = g_ptr_array_new_with_free_func(g_free);
priv->keys = g_ptr_array_new();
priv->active = -1;
}
static void
nmt_newt_listbox_finalize (GObject *object)
nmt_newt_listbox_finalize(GObject *object)
{
NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE (object);
NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE(object);
g_ptr_array_unref (priv->entries);
g_ptr_array_unref (priv->keys);
g_ptr_array_unref(priv->entries);
g_ptr_array_unref(priv->keys);
G_OBJECT_CLASS (nmt_newt_listbox_parent_class)->finalize (object);
G_OBJECT_CLASS(nmt_newt_listbox_parent_class)->finalize(object);
}
static void
nmt_newt_listbox_size_request (NmtNewtWidget *widget,
int *width,
int *height)
nmt_newt_listbox_size_request(NmtNewtWidget *widget, int *width, int *height)
{
NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE (widget);
NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE(widget);
NMT_NEWT_WIDGET_CLASS (nmt_newt_listbox_parent_class)->
size_request (widget, width, height);
NMT_NEWT_WIDGET_CLASS(nmt_newt_listbox_parent_class)->size_request(widget, width, height);
priv->alloc_height = -1;
if (!priv->fixed_height)
@ -268,35 +257,29 @@ nmt_newt_listbox_size_request (NmtNewtWidget *widget,
}
static void
nmt_newt_listbox_size_allocate (NmtNewtWidget *widget,
int x,
int y,
int width,
int height)
nmt_newt_listbox_size_allocate(NmtNewtWidget *widget, int x, int y, int width, int height)
{
NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE (widget);
NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE(widget);
if (width > priv->width) {
newtListboxSetWidth (nmt_newt_component_get_component (NMT_NEWT_COMPONENT (widget)),
width);
newtListboxSetWidth(nmt_newt_component_get_component(NMT_NEWT_COMPONENT(widget)), width);
}
NMT_NEWT_WIDGET_CLASS (nmt_newt_listbox_parent_class)->
size_allocate (widget, x, y, width, height);
NMT_NEWT_WIDGET_CLASS(nmt_newt_listbox_parent_class)
->size_allocate(widget, x, y, width, height);
priv->alloc_height = height;
if (!priv->fixed_height && height != priv->height) {
priv->height = height;
nmt_newt_widget_needs_rebuild (widget);
nmt_newt_widget_needs_rebuild(widget);
}
}
static void
update_active_internal (NmtNewtListbox *listbox,
int new_active)
update_active_internal(NmtNewtListbox *listbox, int new_active)
{
NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE (listbox);
NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE(listbox);
if (priv->active == new_active)
return;
@ -305,43 +288,38 @@ update_active_internal (NmtNewtListbox *listbox,
if (priv->skip_null_keys && !priv->keys->pdata[new_active]) {
if (new_active > priv->active) {
while ( new_active < priv->entries->len
&& !priv->keys->pdata[new_active])
while (new_active < priv->entries->len && !priv->keys->pdata[new_active])
new_active++;
} else {
while ( new_active >= 0
&& !priv->keys->pdata[new_active])
while (new_active >= 0 && !priv->keys->pdata[new_active])
new_active--;
}
if ( new_active < 0
|| new_active >= priv->entries->len
|| !priv->keys->pdata[new_active]) {
g_assert (priv->active >= 0 && priv->active < priv->entries->len);
if (new_active < 0 || new_active >= priv->entries->len || !priv->keys->pdata[new_active]) {
g_assert(priv->active >= 0 && priv->active < priv->entries->len);
return;
}
}
nmt_newt_listbox_set_active (listbox, new_active);
nmt_newt_listbox_set_active(listbox, new_active);
}
static void
selection_changed_callback (newtComponent co,
void *user_data)
selection_changed_callback(newtComponent co, void *user_data)
{
NmtNewtListbox *listbox = user_data;
NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE (listbox);
NmtNewtListbox * listbox = user_data;
NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE(listbox);
int new_active;
new_active = GPOINTER_TO_UINT (newtListboxGetCurrent (co));
update_active_internal (listbox, new_active);
new_active = GPOINTER_TO_UINT(newtListboxGetCurrent(co));
update_active_internal(listbox, new_active);
if (priv->active != new_active)
newtListboxSetCurrent (co, priv->active);
newtListboxSetCurrent(co, priv->active);
}
static guint
convert_flags (NmtNewtListboxFlags flags)
convert_flags(NmtNewtListboxFlags flags)
{
guint newt_flags = NEWT_FLAG_RETURNEXIT;
@ -354,113 +332,109 @@ convert_flags (NmtNewtListboxFlags flags)
}
static newtComponent
nmt_newt_listbox_build_component (NmtNewtComponent *component,
gboolean sensitive)
nmt_newt_listbox_build_component(NmtNewtComponent *component, gboolean sensitive)
{
NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE (component);
NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE(component);
newtComponent co;
int i, active;
if (priv->active == -1)
update_active_internal (NMT_NEWT_LISTBOX (component), 0);
update_active_internal(NMT_NEWT_LISTBOX(component), 0);
active = priv->active;
co = newtListbox (-1, -1, priv->height, convert_flags (priv->flags));
newtComponentAddCallback (co, selection_changed_callback, component);
co = newtListbox(-1, -1, priv->height, convert_flags(priv->flags));
newtComponentAddCallback(co, selection_changed_callback, component);
for (i = 0; i < priv->entries->len; i++) {
newtListboxAppendEntry (co, priv->entries->pdata[i], GUINT_TO_POINTER (i));
newtListboxAppendEntry(co, priv->entries->pdata[i], GUINT_TO_POINTER(i));
if (active == -1 && priv->keys->pdata[i] == priv->active_key)
active = i;
}
if (active != -1)
newtListboxSetCurrent (co, active);
newtListboxSetCurrent(co, active);
return co;
}
static void
nmt_newt_listbox_activated (NmtNewtWidget *widget)
nmt_newt_listbox_activated(NmtNewtWidget *widget)
{
NmtNewtListbox *listbox = NMT_NEWT_LISTBOX (widget);
newtComponent co = nmt_newt_component_get_component (NMT_NEWT_COMPONENT (widget));
NmtNewtListbox *listbox = NMT_NEWT_LISTBOX(widget);
newtComponent co = nmt_newt_component_get_component(NMT_NEWT_COMPONENT(widget));
nmt_newt_listbox_set_active (listbox, GPOINTER_TO_UINT (newtListboxGetCurrent (co)));
nmt_newt_listbox_set_active(listbox, GPOINTER_TO_UINT(newtListboxGetCurrent(co)));
NMT_NEWT_WIDGET_CLASS (nmt_newt_listbox_parent_class)->activated (widget);
NMT_NEWT_WIDGET_CLASS(nmt_newt_listbox_parent_class)->activated(widget);
}
static void
nmt_newt_listbox_set_property (GObject *object,
nmt_newt_listbox_set_property(GObject * object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
GParamSpec * pspec)
{
NmtNewtListbox *listbox = NMT_NEWT_LISTBOX (object);
NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE (object);
NmtNewtListbox * listbox = NMT_NEWT_LISTBOX(object);
NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE(object);
switch (prop_id) {
case PROP_HEIGHT:
priv->height = g_value_get_int (value);
priv->height = g_value_get_int(value);
priv->fixed_height = (priv->height != 0);
break;
case PROP_FLAGS:
priv->flags = g_value_get_uint (value);
priv->flags = g_value_get_uint(value);
break;
case PROP_ACTIVE:
nmt_newt_listbox_set_active (listbox, g_value_get_int (value));
nmt_newt_listbox_set_active(listbox, g_value_get_int(value));
break;
case PROP_ACTIVE_KEY:
nmt_newt_listbox_set_active_key (listbox, g_value_get_pointer (value));
nmt_newt_listbox_set_active_key(listbox, g_value_get_pointer(value));
break;
case PROP_SKIP_NULL_KEYS:
priv->skip_null_keys = g_value_get_boolean (value);
priv->skip_null_keys = g_value_get_boolean(value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_newt_listbox_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
nmt_newt_listbox_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
{
NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE (object);
NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE(object);
switch (prop_id) {
case PROP_HEIGHT:
g_value_set_int (value, priv->height);
g_value_set_int(value, priv->height);
break;
case PROP_FLAGS:
g_value_set_uint (value, priv->flags);
g_value_set_uint(value, priv->flags);
break;
case PROP_ACTIVE:
g_value_set_int (value, priv->active);
g_value_set_int(value, priv->active);
break;
case PROP_ACTIVE_KEY:
g_value_set_pointer (value, priv->active_key);
g_value_set_pointer(value, priv->active_key);
break;
case PROP_SKIP_NULL_KEYS:
g_value_set_boolean (value, priv->skip_null_keys);
g_value_set_boolean(value, priv->skip_null_keys);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_newt_listbox_class_init (NmtNewtListboxClass *listbox_class)
nmt_newt_listbox_class_init(NmtNewtListboxClass *listbox_class)
{
GObjectClass *object_class = G_OBJECT_CLASS (listbox_class);
NmtNewtWidgetClass *widget_class = NMT_NEWT_WIDGET_CLASS (listbox_class);
NmtNewtComponentClass *component_class = NMT_NEWT_COMPONENT_CLASS (listbox_class);
GObjectClass * object_class = G_OBJECT_CLASS(listbox_class);
NmtNewtWidgetClass * widget_class = NMT_NEWT_WIDGET_CLASS(listbox_class);
NmtNewtComponentClass *component_class = NMT_NEWT_COMPONENT_CLASS(listbox_class);
g_type_class_add_private (listbox_class, sizeof (NmtNewtListboxPrivate));
g_type_class_add_private(listbox_class, sizeof(NmtNewtListboxPrivate));
/* virtual methods */
object_class->set_property = nmt_newt_listbox_set_property;
@ -480,56 +454,65 @@ nmt_newt_listbox_class_init (NmtNewtListboxClass *listbox_class)
*
* The listbox's height, or -1 if it has no fixed height.
*/
g_object_class_install_property
(object_class, PROP_HEIGHT,
g_param_spec_int ("height", "", "",
-1, 255, -1,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(object_class,
PROP_HEIGHT,
g_param_spec_int("height",
"",
"",
-1,
255,
-1,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
* NmtNewtListbox:flags:
*
* The listbox's #NmtNewtListboxFlags.
*/
g_object_class_install_property
(object_class, PROP_FLAGS,
g_param_spec_uint ("flags", "", "",
0, 0xFFFF, 0,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
object_class,
PROP_FLAGS,
g_param_spec_uint("flags",
"",
"",
0,
0xFFFF,
0,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
/**
* NmtNewtListbox:active:
*
* The currently-selected row.
*/
g_object_class_install_property
(object_class, PROP_ACTIVE,
g_param_spec_int ("active", "", "",
0, G_MAXINT, 0,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(object_class,
PROP_ACTIVE,
g_param_spec_int("active",
"",
"",
0,
G_MAXINT,
0,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
* NmtNewtListbox:active-key:
*
* The key of the currently-selected row.
*/
g_object_class_install_property
(object_class, PROP_ACTIVE_KEY,
g_param_spec_pointer ("active-key", "", "",
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
object_class,
PROP_ACTIVE_KEY,
g_param_spec_pointer("active-key", "", "", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
* NmtNewtListbox:skip-null-keys:
*
* If %TRUE, rows with %NULL key values will be skipped over when
* navigating the list with the arrow keys.
*/
g_object_class_install_property
(object_class, PROP_SKIP_NULL_KEYS,
g_param_spec_boolean ("skip-null-keys", "", "",
g_object_class_install_property(
object_class,
PROP_SKIP_NULL_KEYS,
g_param_spec_boolean("skip-null-keys",
"",
"",
FALSE,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
}

View file

@ -8,16 +8,18 @@
#include "nmt-newt-component.h"
#define NMT_TYPE_NEWT_LISTBOX (nmt_newt_listbox_get_type ())
#define NMT_NEWT_LISTBOX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMT_TYPE_NEWT_LISTBOX, NmtNewtListbox))
#define NMT_NEWT_LISTBOX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NMT_TYPE_NEWT_LISTBOX, NmtNewtListboxClass))
#define NMT_IS_NEWT_LISTBOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NMT_TYPE_NEWT_LISTBOX))
#define NMT_IS_NEWT_LISTBOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NMT_TYPE_NEWT_LISTBOX))
#define NMT_NEWT_LISTBOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NMT_TYPE_NEWT_LISTBOX, NmtNewtListboxClass))
#define NMT_TYPE_NEWT_LISTBOX (nmt_newt_listbox_get_type())
#define NMT_NEWT_LISTBOX(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), NMT_TYPE_NEWT_LISTBOX, NmtNewtListbox))
#define NMT_NEWT_LISTBOX_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), NMT_TYPE_NEWT_LISTBOX, NmtNewtListboxClass))
#define NMT_IS_NEWT_LISTBOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), NMT_TYPE_NEWT_LISTBOX))
#define NMT_IS_NEWT_LISTBOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NMT_TYPE_NEWT_LISTBOX))
#define NMT_NEWT_LISTBOX_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), NMT_TYPE_NEWT_LISTBOX, NmtNewtListboxClass))
struct _NmtNewtListbox {
NmtNewtComponent parent;
};
typedef struct {
@ -25,30 +27,24 @@ typedef struct {
} NmtNewtListboxClass;
GType nmt_newt_listbox_get_type (void);
GType nmt_newt_listbox_get_type(void);
typedef enum {
NMT_NEWT_LISTBOX_SCROLL = (1 << 0),
NMT_NEWT_LISTBOX_BORDER = (1 << 1)
} NmtNewtListboxFlags;
NmtNewtWidget *nmt_newt_listbox_new (int height,
NmtNewtListboxFlags flags);
NmtNewtWidget *nmt_newt_listbox_new(int height, NmtNewtListboxFlags flags);
void nmt_newt_listbox_set_height (NmtNewtListbox *listbox,
int height);
void nmt_newt_listbox_set_height(NmtNewtListbox *listbox, int height);
void nmt_newt_listbox_append (NmtNewtListbox *listbox,
const char *entry,
gpointer key);
void nmt_newt_listbox_clear (NmtNewtListbox *listbox);
void nmt_newt_listbox_append(NmtNewtListbox *listbox, const char *entry, gpointer key);
void nmt_newt_listbox_clear(NmtNewtListbox *listbox);
void nmt_newt_listbox_set_active (NmtNewtListbox *listbox,
int active);
void nmt_newt_listbox_set_active_key (NmtNewtListbox *listbox,
gpointer active_key);
void nmt_newt_listbox_set_active(NmtNewtListbox *listbox, int active);
void nmt_newt_listbox_set_active_key(NmtNewtListbox *listbox, gpointer active_key);
int nmt_newt_listbox_get_active (NmtNewtListbox *listbox);
gpointer nmt_newt_listbox_get_active_key (NmtNewtListbox *listbox);
int nmt_newt_listbox_get_active(NmtNewtListbox *listbox);
gpointer nmt_newt_listbox_get_active_key(NmtNewtListbox *listbox);
#endif /* NMT_NEWT_LISTBOX_H */

View file

@ -21,9 +21,10 @@
#include "nmt-newt-listbox.h"
#include "nmt-newt-utils.h"
G_DEFINE_TYPE (NmtNewtPopup, nmt_newt_popup, NMT_TYPE_NEWT_BUTTON)
G_DEFINE_TYPE(NmtNewtPopup, nmt_newt_popup, NMT_TYPE_NEWT_BUTTON)
#define NMT_NEWT_POPUP_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NMT_TYPE_NEWT_POPUP, NmtNewtPopupPrivate))
#define NMT_NEWT_POPUP_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE((o), NMT_TYPE_NEWT_POPUP, NmtNewtPopupPrivate))
typedef struct {
GArray *entries;
@ -56,92 +57,88 @@ enum {
* Returns: a new #NmtNewtPopup
*/
NmtNewtWidget *
nmt_newt_popup_new (NmtNewtPopupEntry *entries)
nmt_newt_popup_new(NmtNewtPopupEntry *entries)
{
NmtNewtWidget *widget;
NmtNewtWidget * widget;
NmtNewtPopupPrivate *priv;
int i;
widget = g_object_new (NMT_TYPE_NEWT_POPUP, NULL);
priv = NMT_NEWT_POPUP_GET_PRIVATE (widget);
widget = g_object_new(NMT_TYPE_NEWT_POPUP, NULL);
priv = NMT_NEWT_POPUP_GET_PRIVATE(widget);
for (i = 0; entries[i].label; i++) {
NmtNewtPopupEntry entry;
entry.label = nmt_newt_locale_from_utf8 (_(entries[i].label));
entry.id = g_strdup (entries[i].id);
g_array_append_val (priv->entries, entry);
entry.label = nmt_newt_locale_from_utf8(_(entries[i].label));
entry.id = g_strdup(entries[i].id);
g_array_append_val(priv->entries, entry);
}
return widget;
}
static void
popup_entry_clear_func (NmtNewtPopupEntry *entry)
popup_entry_clear_func(NmtNewtPopupEntry *entry)
{
g_free (entry->label);
g_free (entry->id);
g_free(entry->label);
g_free(entry->id);
}
static void
nmt_newt_popup_init (NmtNewtPopup *popup)
nmt_newt_popup_init(NmtNewtPopup *popup)
{
NmtNewtPopupPrivate *priv = NMT_NEWT_POPUP_GET_PRIVATE (popup);
NmtNewtPopupPrivate *priv = NMT_NEWT_POPUP_GET_PRIVATE(popup);
priv->entries = g_array_sized_new (FALSE, FALSE, sizeof (NmtNewtPopupEntry), 10);
g_array_set_clear_func (priv->entries, (GDestroyNotify) popup_entry_clear_func);
priv->entries = g_array_sized_new(FALSE, FALSE, sizeof(NmtNewtPopupEntry), 10);
g_array_set_clear_func(priv->entries, (GDestroyNotify) popup_entry_clear_func);
}
static void
nmt_newt_popup_finalize (GObject *object)
nmt_newt_popup_finalize(GObject *object)
{
NmtNewtPopupPrivate *priv = NMT_NEWT_POPUP_GET_PRIVATE (object);
NmtNewtPopupPrivate *priv = NMT_NEWT_POPUP_GET_PRIVATE(object);
g_array_unref (priv->entries);
g_array_unref(priv->entries);
G_OBJECT_CLASS (nmt_newt_popup_parent_class)->finalize (object);
G_OBJECT_CLASS(nmt_newt_popup_parent_class)->finalize(object);
}
static newtComponent
nmt_newt_popup_build_component (NmtNewtComponent *component,
gboolean sensitive)
nmt_newt_popup_build_component(NmtNewtComponent *component, gboolean sensitive)
{
NmtNewtPopupPrivate *priv = NMT_NEWT_POPUP_GET_PRIVATE (component);
NmtNewtPopupEntry *entries = (NmtNewtPopupEntry *)priv->entries->data;
NmtNewtPopupPrivate *priv = NMT_NEWT_POPUP_GET_PRIVATE(component);
NmtNewtPopupEntry * entries = (NmtNewtPopupEntry *) priv->entries->data;
nmt_newt_button_set_label (NMT_NEWT_BUTTON (component),
entries[priv->active].label);
return NMT_NEWT_COMPONENT_CLASS (nmt_newt_popup_parent_class)->
build_component (component, sensitive);
nmt_newt_button_set_label(NMT_NEWT_BUTTON(component), entries[priv->active].label);
return NMT_NEWT_COMPONENT_CLASS(nmt_newt_popup_parent_class)
->build_component(component, sensitive);
}
static void
nmt_newt_popup_activated (NmtNewtWidget *widget)
nmt_newt_popup_activated(NmtNewtWidget *widget)
{
NmtNewtPopupPrivate *priv = NMT_NEWT_POPUP_GET_PRIVATE (widget);
NmtNewtPopupEntry *entries = (NmtNewtPopupEntry *)priv->entries->data;
NmtNewtForm *form;
NmtNewtWidget *listbox, *ret;
NmtNewtPopupPrivate *priv = NMT_NEWT_POPUP_GET_PRIVATE(widget);
NmtNewtPopupEntry * entries = (NmtNewtPopupEntry *) priv->entries->data;
NmtNewtForm * form;
NmtNewtWidget * listbox, *ret;
int button_x, button_y;
int window_x, window_y;
int list_w, list_h;
int i, active;
listbox = nmt_newt_listbox_new (priv->entries->len, 0);
nmt_newt_widget_set_exit_on_activate (listbox, TRUE);
listbox = nmt_newt_listbox_new(priv->entries->len, 0);
nmt_newt_widget_set_exit_on_activate(listbox, TRUE);
for (i = 0; i < priv->entries->len; i++)
nmt_newt_listbox_append (NMT_NEWT_LISTBOX (listbox), entries[i].label, NULL);
nmt_newt_listbox_set_active (NMT_NEWT_LISTBOX (listbox), priv->active);
nmt_newt_widget_set_padding (listbox, 1, 0, 1, 0);
nmt_newt_listbox_append(NMT_NEWT_LISTBOX(listbox), entries[i].label, NULL);
nmt_newt_listbox_set_active(NMT_NEWT_LISTBOX(listbox), priv->active);
nmt_newt_widget_set_padding(listbox, 1, 0, 1, 0);
nmt_newt_widget_size_request (listbox, &list_w, &list_h);
nmt_newt_widget_size_request(listbox, &list_w, &list_h);
g_object_get (nmt_newt_widget_get_form (widget),
"x", &window_x,
"y", &window_y,
NULL);
newtComponentGetPosition (nmt_newt_component_get_component (NMT_NEWT_COMPONENT (widget)),
&button_x, &button_y);
g_object_get(nmt_newt_widget_get_form(widget), "x", &window_x, "y", &window_y, NULL);
newtComponentGetPosition(nmt_newt_component_get_component(NMT_NEWT_COMPONENT(widget)),
&button_x,
&button_y);
/* (window_x + button_x) is the screen X coordinate of the newtComponent. A
* newtButton labelled "Foo" is rendered as " <Foo>" (with a preceding
* space), so the "F" is at (window_x + button_x + 2). We've added 1 column
@ -154,32 +151,38 @@ nmt_newt_popup_activated (NmtNewtWidget *widget)
window_x += button_x + 1;
window_y += button_y - priv->active;
form = g_object_new (NMT_TYPE_NEWT_FORM,
"x", window_x,
"y", window_y,
"width", list_w,
"height", list_h,
"padding", 0,
"escape-exits", TRUE,
form = g_object_new(NMT_TYPE_NEWT_FORM,
"x",
window_x,
"y",
window_y,
"width",
list_w,
"height",
list_h,
"padding",
0,
"escape-exits",
TRUE,
NULL);
nmt_newt_form_set_content (form, listbox);
nmt_newt_form_set_content(form, listbox);
ret = nmt_newt_form_run_sync (form);
ret = nmt_newt_form_run_sync(form);
if (ret == listbox)
active = nmt_newt_listbox_get_active (NMT_NEWT_LISTBOX (listbox));
active = nmt_newt_listbox_get_active(NMT_NEWT_LISTBOX(listbox));
else
active = priv->active;
g_object_unref (form);
g_object_unref(form);
if (active != priv->active) {
priv->active = active;
g_object_notify (G_OBJECT (widget), "active");
g_object_notify (G_OBJECT (widget), "active-id");
nmt_newt_widget_needs_rebuild (widget);
g_object_notify(G_OBJECT(widget), "active");
g_object_notify(G_OBJECT(widget), "active-id");
nmt_newt_widget_needs_rebuild(widget);
}
NMT_NEWT_WIDGET_CLASS (nmt_newt_popup_parent_class)->activated (widget);
NMT_NEWT_WIDGET_CLASS(nmt_newt_popup_parent_class)->activated(widget);
}
/**
@ -191,9 +194,9 @@ nmt_newt_popup_activated (NmtNewtWidget *widget)
* Returns: the index of the active entry in @popup.
*/
int
nmt_newt_popup_get_active (NmtNewtPopup *popup)
nmt_newt_popup_get_active(NmtNewtPopup *popup)
{
NmtNewtPopupPrivate *priv = NMT_NEWT_POPUP_GET_PRIVATE (popup);
NmtNewtPopupPrivate *priv = NMT_NEWT_POPUP_GET_PRIVATE(popup);
return priv->active;
}
@ -206,17 +209,16 @@ nmt_newt_popup_get_active (NmtNewtPopup *popup)
* Sets the active entry in @popup.
*/
void
nmt_newt_popup_set_active (NmtNewtPopup *popup,
int active)
nmt_newt_popup_set_active(NmtNewtPopup *popup, int active)
{
NmtNewtPopupPrivate *priv = NMT_NEWT_POPUP_GET_PRIVATE (popup);
NmtNewtPopupPrivate *priv = NMT_NEWT_POPUP_GET_PRIVATE(popup);
active = CLAMP (active, 0, priv->entries->len - 1);
active = CLAMP(active, 0, priv->entries->len - 1);
if (active != priv->active) {
priv->active = active;
g_object_notify (G_OBJECT (popup), "active");
g_object_notify (G_OBJECT (popup), "active-id");
g_object_notify(G_OBJECT(popup), "active");
g_object_notify(G_OBJECT(popup), "active-id");
}
}
@ -229,10 +231,10 @@ nmt_newt_popup_set_active (NmtNewtPopup *popup,
* Returns: the ID of the active entry in @popup.
*/
const char *
nmt_newt_popup_get_active_id (NmtNewtPopup *popup)
nmt_newt_popup_get_active_id(NmtNewtPopup *popup)
{
NmtNewtPopupPrivate *priv = NMT_NEWT_POPUP_GET_PRIVATE (popup);
NmtNewtPopupEntry *entries = (NmtNewtPopupEntry *)priv->entries->data;
NmtNewtPopupPrivate *priv = NMT_NEWT_POPUP_GET_PRIVATE(popup);
NmtNewtPopupEntry * entries = (NmtNewtPopupEntry *) priv->entries->data;
return entries[priv->active].id;
}
@ -245,71 +247,64 @@ nmt_newt_popup_get_active_id (NmtNewtPopup *popup)
* Sets the active entry in @popup.
*/
void
nmt_newt_popup_set_active_id (NmtNewtPopup *popup,
const char *active_id)
nmt_newt_popup_set_active_id(NmtNewtPopup *popup, const char *active_id)
{
NmtNewtPopupPrivate *priv = NMT_NEWT_POPUP_GET_PRIVATE (popup);
NmtNewtPopupEntry *entries = (NmtNewtPopupEntry *)priv->entries->data;
NmtNewtPopupPrivate *priv = NMT_NEWT_POPUP_GET_PRIVATE(popup);
NmtNewtPopupEntry * entries = (NmtNewtPopupEntry *) priv->entries->data;
int i;
for (i = 0; i < priv->entries->len; i++) {
if (!g_strcmp0 (active_id, entries[i].id)) {
nmt_newt_popup_set_active (popup, i);
if (!g_strcmp0(active_id, entries[i].id)) {
nmt_newt_popup_set_active(popup, i);
return;
}
}
}
static void
nmt_newt_popup_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
nmt_newt_popup_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
{
NmtNewtPopup *popup = NMT_NEWT_POPUP (object);
NmtNewtPopup *popup = NMT_NEWT_POPUP(object);
switch (prop_id) {
case PROP_ACTIVE:
nmt_newt_popup_set_active (popup, g_value_get_uint (value));
nmt_newt_popup_set_active(popup, g_value_get_uint(value));
break;
case PROP_ACTIVE_ID:
nmt_newt_popup_set_active_id (popup, g_value_get_string (value));
nmt_newt_popup_set_active_id(popup, g_value_get_string(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_newt_popup_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
nmt_newt_popup_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
{
NmtNewtPopup *popup = NMT_NEWT_POPUP (object);
NmtNewtPopup *popup = NMT_NEWT_POPUP(object);
switch (prop_id) {
case PROP_ACTIVE:
g_value_set_uint (value, nmt_newt_popup_get_active (popup));
g_value_set_uint(value, nmt_newt_popup_get_active(popup));
break;
case PROP_ACTIVE_ID:
g_value_set_string (value, nmt_newt_popup_get_active_id (popup));
g_value_set_string(value, nmt_newt_popup_get_active_id(popup));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_newt_popup_class_init (NmtNewtPopupClass *popup_class)
nmt_newt_popup_class_init(NmtNewtPopupClass *popup_class)
{
GObjectClass *object_class = G_OBJECT_CLASS (popup_class);
NmtNewtWidgetClass *widget_class = NMT_NEWT_WIDGET_CLASS (popup_class);
NmtNewtComponentClass *component_class = NMT_NEWT_COMPONENT_CLASS (popup_class);
GObjectClass * object_class = G_OBJECT_CLASS(popup_class);
NmtNewtWidgetClass * widget_class = NMT_NEWT_WIDGET_CLASS(popup_class);
NmtNewtComponentClass *component_class = NMT_NEWT_COMPONENT_CLASS(popup_class);
g_type_class_add_private (popup_class, sizeof (NmtNewtPopupPrivate));
g_type_class_add_private(popup_class, sizeof(NmtNewtPopupPrivate));
/* virtual methods */
object_class->set_property = nmt_newt_popup_set_property;
@ -325,21 +320,22 @@ nmt_newt_popup_class_init (NmtNewtPopupClass *popup_class)
*
* The index of the currently-active entry.
*/
g_object_class_install_property
(object_class, PROP_ACTIVE,
g_param_spec_uint ("active", "", "",
0, G_MAXUINT, 0,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(object_class,
PROP_ACTIVE,
g_param_spec_uint("active",
"",
"",
0,
G_MAXUINT,
0,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
* NmtNewtPopup:active-id:
*
* The textual ID of the currently-active entry.
*/
g_object_class_install_property
(object_class, PROP_ACTIVE_ID,
g_param_spec_string ("active-id", "", "",
NULL,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
object_class,
PROP_ACTIVE_ID,
g_param_spec_string("active-id", "", "", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
}

View file

@ -8,16 +8,17 @@
#include "nmt-newt-button.h"
#define NMT_TYPE_NEWT_POPUP (nmt_newt_popup_get_type ())
#define NMT_NEWT_POPUP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMT_TYPE_NEWT_POPUP, NmtNewtPopup))
#define NMT_NEWT_POPUP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NMT_TYPE_NEWT_POPUP, NmtNewtPopupClass))
#define NMT_IS_NEWT_POPUP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NMT_TYPE_NEWT_POPUP))
#define NMT_IS_NEWT_POPUP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NMT_TYPE_NEWT_POPUP))
#define NMT_NEWT_POPUP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NMT_TYPE_NEWT_POPUP, NmtNewtPopupClass))
#define NMT_TYPE_NEWT_POPUP (nmt_newt_popup_get_type())
#define NMT_NEWT_POPUP(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), NMT_TYPE_NEWT_POPUP, NmtNewtPopup))
#define NMT_NEWT_POPUP_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), NMT_TYPE_NEWT_POPUP, NmtNewtPopupClass))
#define NMT_IS_NEWT_POPUP(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), NMT_TYPE_NEWT_POPUP))
#define NMT_IS_NEWT_POPUP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NMT_TYPE_NEWT_POPUP))
#define NMT_NEWT_POPUP_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), NMT_TYPE_NEWT_POPUP, NmtNewtPopupClass))
struct _NmtNewtPopup {
NmtNewtButton parent;
};
typedef struct {
@ -25,21 +26,19 @@ typedef struct {
} NmtNewtPopupClass;
GType nmt_newt_popup_get_type (void);
GType nmt_newt_popup_get_type(void);
typedef struct {
char *label;
char *id;
} NmtNewtPopupEntry;
NmtNewtWidget *nmt_newt_popup_new (NmtNewtPopupEntry *entries);
NmtNewtWidget *nmt_newt_popup_new(NmtNewtPopupEntry *entries);
int nmt_newt_popup_get_active (NmtNewtPopup *popup);
void nmt_newt_popup_set_active (NmtNewtPopup *popup,
int active);
int nmt_newt_popup_get_active(NmtNewtPopup *popup);
void nmt_newt_popup_set_active(NmtNewtPopup *popup, int active);
const char *nmt_newt_popup_get_active_id (NmtNewtPopup *popup);
void nmt_newt_popup_set_active_id (NmtNewtPopup *popup,
const char *active_id);
const char *nmt_newt_popup_get_active_id(NmtNewtPopup *popup);
void nmt_newt_popup_set_active_id(NmtNewtPopup *popup, const char *active_id);
#endif /* NMT_NEWT_POPUP_H */

View file

@ -30,9 +30,10 @@
#include "nmt-newt-label.h"
#include "nmt-newt-utils.h"
G_DEFINE_TYPE (NmtNewtSection, nmt_newt_section, NMT_TYPE_NEWT_CONTAINER)
G_DEFINE_TYPE(NmtNewtSection, nmt_newt_section, NMT_TYPE_NEWT_CONTAINER)
#define NMT_NEWT_SECTION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NMT_TYPE_NEWT_SECTION, NmtNewtSectionPrivate))
#define NMT_NEWT_SECTION_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE((o), NMT_TYPE_NEWT_SECTION, NmtNewtSectionPrivate))
typedef struct {
NmtNewtWidget *header;
@ -46,7 +47,7 @@ typedef struct {
NmtNewtWidget *border_open_label;
NmtNewtWidget *border_closed_label;
NmtNewtWidget *border_end_label;
GPtrArray *border_line_labels;
GPtrArray * border_line_labels;
gboolean open;
} NmtNewtSectionPrivate;
@ -71,46 +72,44 @@ enum {
* Returns: a new #NmtNewtSection
*/
NmtNewtWidget *
nmt_newt_section_new (gboolean show_border)
nmt_newt_section_new(gboolean show_border)
{
return g_object_new (NMT_TYPE_NEWT_SECTION,
"show-border", show_border,
NULL);
return g_object_new(NMT_TYPE_NEWT_SECTION, "show-border", show_border, NULL);
}
static void
nmt_newt_section_init (NmtNewtSection *section)
nmt_newt_section_init(NmtNewtSection *section)
{
NmtNewtSectionPrivate *priv = NMT_NEWT_SECTION_GET_PRIVATE (section);
NmtNewtContainerClass *parent_class = NMT_NEWT_CONTAINER_CLASS (nmt_newt_section_parent_class);
NmtNewtSectionPrivate *priv = NMT_NEWT_SECTION_GET_PRIVATE(section);
NmtNewtContainerClass *parent_class = NMT_NEWT_CONTAINER_CLASS(nmt_newt_section_parent_class);
priv->show_border = TRUE;
priv->border_grid = nmt_newt_grid_new ();
parent_class->add (NMT_NEWT_CONTAINER (section), priv->border_grid);
priv->border_grid = nmt_newt_grid_new();
parent_class->add(NMT_NEWT_CONTAINER(section), priv->border_grid);
priv->border_open_label = nmt_newt_label_new (open_glyph);
nmt_newt_widget_set_visible (priv->border_open_label, FALSE);
nmt_newt_grid_add (NMT_NEWT_GRID (priv->border_grid), priv->border_open_label, 0, 0);
priv->border_open_label = nmt_newt_label_new(open_glyph);
nmt_newt_widget_set_visible(priv->border_open_label, FALSE);
nmt_newt_grid_add(NMT_NEWT_GRID(priv->border_grid), priv->border_open_label, 0, 0);
priv->border_closed_label = nmt_newt_label_new (closed_glyph);
nmt_newt_grid_add (NMT_NEWT_GRID (priv->border_grid), priv->border_closed_label, 0, 0);
priv->border_closed_label = nmt_newt_label_new(closed_glyph);
nmt_newt_grid_add(NMT_NEWT_GRID(priv->border_grid), priv->border_closed_label, 0, 0);
priv->border_end_label = nmt_newt_label_new (end_glyph);
nmt_newt_widget_set_visible (priv->border_open_label, FALSE);
nmt_newt_grid_add (NMT_NEWT_GRID (priv->border_grid), priv->border_end_label, 0, 1);
priv->border_end_label = nmt_newt_label_new(end_glyph);
nmt_newt_widget_set_visible(priv->border_open_label, FALSE);
nmt_newt_grid_add(NMT_NEWT_GRID(priv->border_grid), priv->border_end_label, 0, 1);
priv->border_line_labels = g_ptr_array_new ();
priv->border_line_labels = g_ptr_array_new();
}
static void
nmt_newt_section_finalize (GObject *object)
nmt_newt_section_finalize(GObject *object)
{
NmtNewtSectionPrivate *priv = NMT_NEWT_SECTION_GET_PRIVATE (object);
NmtNewtSectionPrivate *priv = NMT_NEWT_SECTION_GET_PRIVATE(object);
g_ptr_array_unref (priv->border_line_labels);
g_ptr_array_unref(priv->border_line_labels);
G_OBJECT_CLASS (nmt_newt_section_parent_class)->finalize (object);
G_OBJECT_CLASS(nmt_newt_section_parent_class)->finalize(object);
}
/**
@ -121,17 +120,16 @@ nmt_newt_section_finalize (GObject *object)
* Sets @section's header widget.
*/
void
nmt_newt_section_set_header (NmtNewtSection *section,
NmtNewtWidget *header)
nmt_newt_section_set_header(NmtNewtSection *section, NmtNewtWidget *header)
{
NmtNewtSectionPrivate *priv = NMT_NEWT_SECTION_GET_PRIVATE (section);
NmtNewtContainerClass *parent_class = NMT_NEWT_CONTAINER_CLASS (nmt_newt_section_parent_class);
NmtNewtContainer *container = NMT_NEWT_CONTAINER (section);
NmtNewtSectionPrivate *priv = NMT_NEWT_SECTION_GET_PRIVATE(section);
NmtNewtContainerClass *parent_class = NMT_NEWT_CONTAINER_CLASS(nmt_newt_section_parent_class);
NmtNewtContainer * container = NMT_NEWT_CONTAINER(section);
if (priv->header)
parent_class->remove (container, priv->header);
parent_class->remove(container, priv->header);
priv->header = header;
parent_class->add (container, header);
parent_class->add(container, header);
}
/**
@ -143,9 +141,9 @@ nmt_newt_section_set_header (NmtNewtSection *section,
* Returns: @section's header widget.
*/
NmtNewtWidget *
nmt_newt_section_get_header (NmtNewtSection *section)
nmt_newt_section_get_header(NmtNewtSection *section)
{
NmtNewtSectionPrivate *priv = NMT_NEWT_SECTION_GET_PRIVATE (section);
NmtNewtSectionPrivate *priv = NMT_NEWT_SECTION_GET_PRIVATE(section);
return priv->header;
}
@ -158,17 +156,16 @@ nmt_newt_section_get_header (NmtNewtSection *section)
* Sets @section's body widget.
*/
void
nmt_newt_section_set_body (NmtNewtSection *section,
NmtNewtWidget *body)
nmt_newt_section_set_body(NmtNewtSection *section, NmtNewtWidget *body)
{
NmtNewtSectionPrivate *priv = NMT_NEWT_SECTION_GET_PRIVATE (section);
NmtNewtContainerClass *parent_class = NMT_NEWT_CONTAINER_CLASS (nmt_newt_section_parent_class);
NmtNewtContainer *container = NMT_NEWT_CONTAINER (section);
NmtNewtSectionPrivate *priv = NMT_NEWT_SECTION_GET_PRIVATE(section);
NmtNewtContainerClass *parent_class = NMT_NEWT_CONTAINER_CLASS(nmt_newt_section_parent_class);
NmtNewtContainer * container = NMT_NEWT_CONTAINER(section);
if (priv->body)
parent_class->remove (container, priv->body);
parent_class->remove(container, priv->body);
priv->body = body;
parent_class->add (container, body);
parent_class->add(container, body);
}
/**
@ -180,20 +177,19 @@ nmt_newt_section_set_body (NmtNewtSection *section,
* Returns: @section's body widget.
*/
NmtNewtWidget *
nmt_newt_section_get_body (NmtNewtSection *section)
nmt_newt_section_get_body(NmtNewtSection *section)
{
NmtNewtSectionPrivate *priv = NMT_NEWT_SECTION_GET_PRIVATE (section);
NmtNewtSectionPrivate *priv = NMT_NEWT_SECTION_GET_PRIVATE(section);
return priv->body;
}
static void
nmt_newt_section_remove (NmtNewtContainer *container,
NmtNewtWidget *widget)
nmt_newt_section_remove(NmtNewtContainer *container, NmtNewtWidget *widget)
{
NmtNewtSection *section = NMT_NEWT_SECTION (container);
NmtNewtSectionPrivate *priv = NMT_NEWT_SECTION_GET_PRIVATE (section);
NmtNewtContainerClass *parent_class = NMT_NEWT_CONTAINER_CLASS (nmt_newt_section_parent_class);
NmtNewtSection * section = NMT_NEWT_SECTION(container);
NmtNewtSectionPrivate *priv = NMT_NEWT_SECTION_GET_PRIVATE(section);
NmtNewtContainerClass *parent_class = NMT_NEWT_CONTAINER_CLASS(nmt_newt_section_parent_class);
if (widget == priv->header)
priv->header = NULL;
@ -202,60 +198,58 @@ nmt_newt_section_remove (NmtNewtContainer *container,
else if (widget == priv->border_grid)
priv->border_grid = NULL;
parent_class->remove (container, widget);
parent_class->remove(container, widget);
}
static newtComponent *
nmt_newt_section_get_components (NmtNewtWidget *widget)
nmt_newt_section_get_components(NmtNewtWidget *widget)
{
NmtNewtSectionPrivate *priv = NMT_NEWT_SECTION_GET_PRIVATE (widget);
newtComponent *child_cos;
GPtrArray *cos;
NmtNewtSectionPrivate *priv = NMT_NEWT_SECTION_GET_PRIVATE(widget);
newtComponent * child_cos;
GPtrArray * cos;
int i;
g_return_val_if_fail (priv->header != NULL && priv->body != NULL, NULL);
g_return_val_if_fail(priv->header != NULL && priv->body != NULL, NULL);
cos = g_ptr_array_new ();
cos = g_ptr_array_new();
if (priv->show_border) {
child_cos = nmt_newt_widget_get_components (priv->border_grid);
child_cos = nmt_newt_widget_get_components(priv->border_grid);
for (i = 0; child_cos[i]; i++)
g_ptr_array_add (cos, child_cos[i]);
g_free (child_cos);
g_ptr_array_add(cos, child_cos[i]);
g_free(child_cos);
}
child_cos = nmt_newt_widget_get_components (priv->header);
child_cos = nmt_newt_widget_get_components(priv->header);
for (i = 0; child_cos[i]; i++)
g_ptr_array_add (cos, child_cos[i]);
g_free (child_cos);
g_ptr_array_add(cos, child_cos[i]);
g_free(child_cos);
if (priv->open) {
child_cos = nmt_newt_widget_get_components (priv->body);
child_cos = nmt_newt_widget_get_components(priv->body);
for (i = 0; child_cos[i]; i++)
g_ptr_array_add (cos, child_cos[i]);
g_free (child_cos);
g_ptr_array_add(cos, child_cos[i]);
g_free(child_cos);
}
g_ptr_array_add (cos, NULL);
return (newtComponent *) g_ptr_array_free (cos, FALSE);
g_ptr_array_add(cos, NULL);
return (newtComponent *) g_ptr_array_free(cos, FALSE);
}
static void
nmt_newt_section_size_request (NmtNewtWidget *widget,
int *width,
int *height)
nmt_newt_section_size_request(NmtNewtWidget *widget, int *width, int *height)
{
NmtNewtSectionPrivate *priv = NMT_NEWT_SECTION_GET_PRIVATE (widget);
NmtNewtSectionPrivate *priv = NMT_NEWT_SECTION_GET_PRIVATE(widget);
int w_ignore, h_ignore;
g_return_if_fail (priv->header != NULL && priv->body != NULL);
g_return_if_fail(priv->header != NULL && priv->body != NULL);
if (priv->show_border)
nmt_newt_widget_size_request (priv->border_grid, &w_ignore, &h_ignore);
nmt_newt_widget_size_request (priv->header, &priv->hwidth_req, &priv->hheight_req);
nmt_newt_widget_size_request (priv->body, &priv->bwidth_req, &priv->bheight_req);
nmt_newt_widget_size_request(priv->border_grid, &w_ignore, &h_ignore);
nmt_newt_widget_size_request(priv->header, &priv->hwidth_req, &priv->hheight_req);
nmt_newt_widget_size_request(priv->body, &priv->bwidth_req, &priv->bheight_req);
*width = MAX (priv->hwidth_req, priv->bwidth_req) + 2;
*width = MAX(priv->hwidth_req, priv->bwidth_req) + 2;
if (priv->open)
*height = priv->hheight_req + priv->bheight_req + (priv->show_border ? 1 : 0);
else
@ -263,8 +257,7 @@ nmt_newt_section_size_request (NmtNewtWidget *widget,
}
static void
adjust_border_for_allocation (NmtNewtSectionPrivate *priv,
int height)
adjust_border_for_allocation(NmtNewtSectionPrivate *priv, int height)
{
int i;
@ -275,106 +268,102 @@ adjust_border_for_allocation (NmtNewtSectionPrivate *priv,
*/
if (height == 1) {
nmt_newt_widget_set_visible (priv->border_closed_label, TRUE);
nmt_newt_widget_set_visible (priv->border_open_label, FALSE);
nmt_newt_widget_set_visible(priv->border_closed_label, TRUE);
nmt_newt_widget_set_visible(priv->border_open_label, FALSE);
for (i = 0; i < priv->border_line_labels->len; i++)
nmt_newt_widget_set_visible (priv->border_line_labels->pdata[i], FALSE);
nmt_newt_widget_set_visible (priv->border_end_label, FALSE);
nmt_newt_widget_set_visible(priv->border_line_labels->pdata[i], FALSE);
nmt_newt_widget_set_visible(priv->border_end_label, FALSE);
} else {
nmt_newt_widget_set_visible (priv->border_closed_label, FALSE);
nmt_newt_widget_set_visible (priv->border_open_label, TRUE);
nmt_newt_widget_set_visible(priv->border_closed_label, FALSE);
nmt_newt_widget_set_visible(priv->border_open_label, TRUE);
for (i = 0; i < height - 2; i++) {
if (i >= priv->border_line_labels->len) {
NmtNewtWidget *label;
label = nmt_newt_label_new (line_glyph);
g_ptr_array_add (priv->border_line_labels, label);
nmt_newt_grid_add (NMT_NEWT_GRID (priv->border_grid), label, 0, i + 1);
label = nmt_newt_label_new(line_glyph);
g_ptr_array_add(priv->border_line_labels, label);
nmt_newt_grid_add(NMT_NEWT_GRID(priv->border_grid), label, 0, i + 1);
} else
nmt_newt_widget_set_visible (priv->border_line_labels->pdata[i], TRUE);
nmt_newt_widget_set_visible(priv->border_line_labels->pdata[i], TRUE);
}
nmt_newt_widget_set_visible (priv->border_end_label, TRUE);
nmt_newt_grid_move (NMT_NEWT_GRID (priv->border_grid), priv->border_end_label, 0, height - 1);
nmt_newt_widget_set_visible(priv->border_end_label, TRUE);
nmt_newt_grid_move(NMT_NEWT_GRID(priv->border_grid), priv->border_end_label, 0, height - 1);
}
}
static void
nmt_newt_section_size_allocate (NmtNewtWidget *widget,
int x,
int y,
int width,
int height)
nmt_newt_section_size_allocate(NmtNewtWidget *widget, int x, int y, int width, int height)
{
NmtNewtSectionPrivate *priv = NMT_NEWT_SECTION_GET_PRIVATE (widget);
NmtNewtSectionPrivate *priv = NMT_NEWT_SECTION_GET_PRIVATE(widget);
if (priv->show_border) {
int w_ignore, h_ignore;
adjust_border_for_allocation (priv, height);
nmt_newt_widget_size_request (priv->border_grid, &w_ignore, &h_ignore);
nmt_newt_widget_size_allocate (priv->border_grid, x, y, 1, height);
nmt_newt_widget_size_allocate (priv->header, x + 2, y, width, priv->hheight_req);
adjust_border_for_allocation(priv, height);
nmt_newt_widget_size_request(priv->border_grid, &w_ignore, &h_ignore);
nmt_newt_widget_size_allocate(priv->border_grid, x, y, 1, height);
nmt_newt_widget_size_allocate(priv->header, x + 2, y, width, priv->hheight_req);
} else
nmt_newt_widget_size_allocate (priv->header, x, y, width, priv->hheight_req);
nmt_newt_widget_size_allocate(priv->header, x, y, width, priv->hheight_req);
if (priv->open) {
nmt_newt_widget_size_allocate (priv->body, x + 2, y + priv->hheight_req,
width, height - priv->hheight_req);
nmt_newt_widget_size_allocate(priv->body,
x + 2,
y + priv->hheight_req,
width,
height - priv->hheight_req);
}
}
static void
nmt_newt_section_set_property (GObject *object,
nmt_newt_section_set_property(GObject * object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
GParamSpec * pspec)
{
NmtNewtSectionPrivate *priv = NMT_NEWT_SECTION_GET_PRIVATE (object);
NmtNewtSectionPrivate *priv = NMT_NEWT_SECTION_GET_PRIVATE(object);
switch (prop_id) {
case PROP_SHOW_BORDER:
priv->show_border = g_value_get_boolean (value);
nmt_newt_widget_needs_rebuild (NMT_NEWT_WIDGET (object));
priv->show_border = g_value_get_boolean(value);
nmt_newt_widget_needs_rebuild(NMT_NEWT_WIDGET(object));
break;
case PROP_OPEN:
priv->open = g_value_get_boolean (value);
nmt_newt_widget_needs_rebuild (NMT_NEWT_WIDGET (object));
priv->open = g_value_get_boolean(value);
nmt_newt_widget_needs_rebuild(NMT_NEWT_WIDGET(object));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_newt_section_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
nmt_newt_section_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
{
NmtNewtSectionPrivate *priv = NMT_NEWT_SECTION_GET_PRIVATE (object);
NmtNewtSectionPrivate *priv = NMT_NEWT_SECTION_GET_PRIVATE(object);
switch (prop_id) {
case PROP_SHOW_BORDER:
g_value_set_boolean (value, priv->show_border);
g_value_set_boolean(value, priv->show_border);
break;
case PROP_OPEN:
g_value_set_boolean (value, priv->open);
g_value_set_boolean(value, priv->open);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_newt_section_class_init (NmtNewtSectionClass *section_class)
nmt_newt_section_class_init(NmtNewtSectionClass *section_class)
{
GObjectClass *object_class = G_OBJECT_CLASS (section_class);
NmtNewtWidgetClass *widget_class = NMT_NEWT_WIDGET_CLASS (section_class);
NmtNewtContainerClass *container_class = NMT_NEWT_CONTAINER_CLASS (section_class);
GObjectClass * object_class = G_OBJECT_CLASS(section_class);
NmtNewtWidgetClass * widget_class = NMT_NEWT_WIDGET_CLASS(section_class);
NmtNewtContainerClass *container_class = NMT_NEWT_CONTAINER_CLASS(section_class);
g_type_class_add_private (section_class, sizeof (NmtNewtSectionPrivate));
g_type_class_add_private(section_class, sizeof(NmtNewtSectionPrivate));
/* virtual methods */
object_class->set_property = nmt_newt_section_set_property;
@ -394,12 +383,14 @@ nmt_newt_section_class_init (NmtNewtSectionClass *section_class)
*
* %TRUE if the section should show a border along the left side.
*/
g_object_class_install_property
(object_class, PROP_SHOW_BORDER,
g_param_spec_boolean ("show-border", "", "",
g_object_class_install_property(
object_class,
PROP_SHOW_BORDER,
g_param_spec_boolean("show-border",
"",
"",
TRUE,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
* NmtNewtSection:open:
@ -407,27 +398,25 @@ nmt_newt_section_class_init (NmtNewtSectionClass *section_class)
* %TRUE if the section is open (ie, its body is visible), %FALSE
* if not.
*/
g_object_class_install_property
(object_class, PROP_OPEN,
g_param_spec_boolean ("open", "", "",
FALSE,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
object_class,
PROP_OPEN,
g_param_spec_boolean("open", "", "", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/* globals */
closed_glyph = nmt_newt_locale_from_utf8 ("\342\225\220"); /* ═ */
open_glyph = nmt_newt_locale_from_utf8 ("\342\225\244"); /* ╤ */
line_glyph = nmt_newt_locale_from_utf8 ("\342\224\202"); /* │ */
end_glyph = nmt_newt_locale_from_utf8 ("\342\224\224"); /* └ */
closed_glyph = nmt_newt_locale_from_utf8("\342\225\220"); /* ═ */
open_glyph = nmt_newt_locale_from_utf8("\342\225\244"); /* ╤ */
line_glyph = nmt_newt_locale_from_utf8("\342\224\202"); /* │ */
end_glyph = nmt_newt_locale_from_utf8("\342\224\224"); /* └ */
if (!*closed_glyph || !*open_glyph || !*line_glyph || !*end_glyph) {
g_free (closed_glyph);
g_free (open_glyph);
g_free (line_glyph);
g_free (end_glyph);
g_free(closed_glyph);
g_free(open_glyph);
g_free(line_glyph);
g_free(end_glyph);
closed_glyph = g_strdup ("-");
open_glyph = g_strdup ("+");
line_glyph = g_strdup ("|");
end_glyph = g_strdup ("\\");
closed_glyph = g_strdup("-");
open_glyph = g_strdup("+");
line_glyph = g_strdup("|");
end_glyph = g_strdup("\\");
}
}

View file

@ -8,16 +8,18 @@
#include "nmt-newt-container.h"
#define NMT_TYPE_NEWT_SECTION (nmt_newt_section_get_type ())
#define NMT_NEWT_SECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMT_TYPE_NEWT_SECTION, NmtNewtSection))
#define NMT_NEWT_SECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NMT_TYPE_NEWT_SECTION, NmtNewtSectionClass))
#define NMT_IS_NEWT_SECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NMT_TYPE_NEWT_SECTION))
#define NMT_IS_NEWT_SECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NMT_TYPE_NEWT_SECTION))
#define NMT_NEWT_SECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NMT_TYPE_NEWT_SECTION, NmtNewtSectionClass))
#define NMT_TYPE_NEWT_SECTION (nmt_newt_section_get_type())
#define NMT_NEWT_SECTION(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), NMT_TYPE_NEWT_SECTION, NmtNewtSection))
#define NMT_NEWT_SECTION_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), NMT_TYPE_NEWT_SECTION, NmtNewtSectionClass))
#define NMT_IS_NEWT_SECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), NMT_TYPE_NEWT_SECTION))
#define NMT_IS_NEWT_SECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NMT_TYPE_NEWT_SECTION))
#define NMT_NEWT_SECTION_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), NMT_TYPE_NEWT_SECTION, NmtNewtSectionClass))
struct _NmtNewtSection {
NmtNewtContainer parent;
};
typedef struct {
@ -25,16 +27,14 @@ typedef struct {
} NmtNewtSectionClass;
GType nmt_newt_section_get_type (void);
GType nmt_newt_section_get_type(void);
NmtNewtWidget *nmt_newt_section_new (gboolean show_border);
NmtNewtWidget *nmt_newt_section_new(gboolean show_border);
void nmt_newt_section_set_header (NmtNewtSection *section,
NmtNewtWidget *header);
NmtNewtWidget *nmt_newt_section_get_header (NmtNewtSection *section);
void nmt_newt_section_set_header(NmtNewtSection *section, NmtNewtWidget *header);
NmtNewtWidget *nmt_newt_section_get_header(NmtNewtSection *section);
void nmt_newt_section_set_body (NmtNewtSection *section,
NmtNewtWidget *body);
NmtNewtWidget *nmt_newt_section_get_body (NmtNewtSection *section);
void nmt_newt_section_set_body(NmtNewtSection *section, NmtNewtWidget *body);
NmtNewtWidget *nmt_newt_section_get_body(NmtNewtSection *section);
#endif /* NMT_NEWT_SECTION_H */

View file

@ -16,7 +16,7 @@
#include "nmt-newt-separator.h"
G_DEFINE_TYPE (NmtNewtSeparator, nmt_newt_separator, NMT_TYPE_NEWT_COMPONENT)
G_DEFINE_TYPE(NmtNewtSeparator, nmt_newt_separator, NMT_TYPE_NEWT_COMPONENT)
/**
* nmt_newt_separator_new:
@ -26,27 +26,25 @@ G_DEFINE_TYPE (NmtNewtSeparator, nmt_newt_separator, NMT_TYPE_NEWT_COMPONENT)
* Returns: a new #NmtNewtSeparator
*/
NmtNewtWidget *
nmt_newt_separator_new (void)
nmt_newt_separator_new(void)
{
return g_object_new (NMT_TYPE_NEWT_SEPARATOR, NULL);
return g_object_new(NMT_TYPE_NEWT_SEPARATOR, NULL);
}
static void
nmt_newt_separator_init (NmtNewtSeparator *separator)
{
}
nmt_newt_separator_init(NmtNewtSeparator *separator)
{}
static newtComponent
nmt_newt_separator_build_component (NmtNewtComponent *component,
gboolean sensitive)
nmt_newt_separator_build_component(NmtNewtComponent *component, gboolean sensitive)
{
return newtLabel (-1, -1, " ");
return newtLabel(-1, -1, " ");
}
static void
nmt_newt_separator_class_init (NmtNewtSeparatorClass *separator_class)
nmt_newt_separator_class_init(NmtNewtSeparatorClass *separator_class)
{
NmtNewtComponentClass *component_class = NMT_NEWT_COMPONENT_CLASS (separator_class);
NmtNewtComponentClass *component_class = NMT_NEWT_COMPONENT_CLASS(separator_class);
/* virtual methods */
component_class->build_component = nmt_newt_separator_build_component;

View file

@ -8,16 +8,19 @@
#include "nmt-newt-component.h"
#define NMT_TYPE_NEWT_SEPARATOR (nmt_newt_separator_get_type ())
#define NMT_NEWT_SEPARATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMT_TYPE_NEWT_SEPARATOR, NmtNewtSeparator))
#define NMT_NEWT_SEPARATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NMT_TYPE_NEWT_SEPARATOR, NmtNewtSeparatorClass))
#define NMT_IS_NEWT_SEPARATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NMT_TYPE_NEWT_SEPARATOR))
#define NMT_IS_NEWT_SEPARATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NMT_TYPE_NEWT_SEPARATOR))
#define NMT_NEWT_SEPARATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NMT_TYPE_NEWT_SEPARATOR, NmtNewtSeparatorClass))
#define NMT_TYPE_NEWT_SEPARATOR (nmt_newt_separator_get_type())
#define NMT_NEWT_SEPARATOR(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), NMT_TYPE_NEWT_SEPARATOR, NmtNewtSeparator))
#define NMT_NEWT_SEPARATOR_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), NMT_TYPE_NEWT_SEPARATOR, NmtNewtSeparatorClass))
#define NMT_IS_NEWT_SEPARATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), NMT_TYPE_NEWT_SEPARATOR))
#define NMT_IS_NEWT_SEPARATOR_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass), NMT_TYPE_NEWT_SEPARATOR))
#define NMT_NEWT_SEPARATOR_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), NMT_TYPE_NEWT_SEPARATOR, NmtNewtSeparatorClass))
struct _NmtNewtSeparator {
NmtNewtComponent parent;
};
typedef struct {
@ -25,8 +28,8 @@ typedef struct {
} NmtNewtSeparatorClass;
GType nmt_newt_separator_get_type (void);
GType nmt_newt_separator_get_type(void);
NmtNewtWidget *nmt_newt_separator_new (void);
NmtNewtWidget *nmt_newt_separator_new(void);
#endif /* NMT_NEWT_SEPARATOR_H */

View file

@ -20,9 +20,10 @@
#include "nmt-newt-stack.h"
G_DEFINE_TYPE (NmtNewtStack, nmt_newt_stack, NMT_TYPE_NEWT_CONTAINER)
G_DEFINE_TYPE(NmtNewtStack, nmt_newt_stack, NMT_TYPE_NEWT_CONTAINER)
#define NMT_NEWT_STACK_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NMT_TYPE_NEWT_STACK, NmtNewtStackPrivate))
#define NMT_NEWT_STACK_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE((o), NMT_TYPE_NEWT_STACK, NmtNewtStackPrivate))
typedef struct {
GPtrArray *children;
@ -47,49 +48,47 @@ enum {
* Returns: a new #NmtNewtStack
*/
NmtNewtWidget *
nmt_newt_stack_new (void)
nmt_newt_stack_new(void)
{
return g_object_new (NMT_TYPE_NEWT_STACK, NULL);
return g_object_new(NMT_TYPE_NEWT_STACK, NULL);
}
static void
nmt_newt_stack_init (NmtNewtStack *stack)
nmt_newt_stack_init(NmtNewtStack *stack)
{
NmtNewtStackPrivate *priv = NMT_NEWT_STACK_GET_PRIVATE (stack);
NmtNewtStackPrivate *priv = NMT_NEWT_STACK_GET_PRIVATE(stack);
priv->children = g_ptr_array_new ();
priv->ids = g_ptr_array_new_with_free_func (g_free);
priv->children = g_ptr_array_new();
priv->ids = g_ptr_array_new_with_free_func(g_free);
}
static void
nmt_newt_stack_finalize (GObject *object)
nmt_newt_stack_finalize(GObject *object)
{
NmtNewtStackPrivate *priv = NMT_NEWT_STACK_GET_PRIVATE (object);
NmtNewtStackPrivate *priv = NMT_NEWT_STACK_GET_PRIVATE(object);
g_ptr_array_unref (priv->children);
g_ptr_array_unref (priv->ids);
g_ptr_array_unref(priv->children);
g_ptr_array_unref(priv->ids);
G_OBJECT_CLASS (nmt_newt_stack_parent_class)->finalize (object);
G_OBJECT_CLASS(nmt_newt_stack_parent_class)->finalize(object);
}
static newtComponent *
nmt_newt_stack_get_components (NmtNewtWidget *widget)
nmt_newt_stack_get_components(NmtNewtWidget *widget)
{
NmtNewtStackPrivate *priv = NMT_NEWT_STACK_GET_PRIVATE (widget);
NmtNewtStackPrivate *priv = NMT_NEWT_STACK_GET_PRIVATE(widget);
if (priv->active > priv->children->len)
return NULL;
return nmt_newt_widget_get_components (priv->children->pdata[priv->active]);
return nmt_newt_widget_get_components(priv->children->pdata[priv->active]);
}
static void
nmt_newt_stack_size_request (NmtNewtWidget *widget,
int *width,
int *height)
nmt_newt_stack_size_request(NmtNewtWidget *widget, int *width, int *height)
{
NmtNewtStack *stack = NMT_NEWT_STACK (widget);
NmtNewtStackPrivate *priv = NMT_NEWT_STACK_GET_PRIVATE (stack);
NmtNewtStack * stack = NMT_NEWT_STACK(widget);
NmtNewtStackPrivate *priv = NMT_NEWT_STACK_GET_PRIVATE(stack);
int i, child_width, child_height;
if (priv->active > priv->children->len) {
@ -102,7 +101,7 @@ nmt_newt_stack_size_request (NmtNewtWidget *widget,
* won't result in the column widths changing).
*/
for (i = 0; i < priv->children->len; i++) {
nmt_newt_widget_size_request (priv->children->pdata[i], &child_width, &child_height);
nmt_newt_widget_size_request(priv->children->pdata[i], &child_width, &child_height);
if (i == priv->active) {
*width = child_width;
*height = child_height;
@ -111,18 +110,14 @@ nmt_newt_stack_size_request (NmtNewtWidget *widget,
}
static void
nmt_newt_stack_size_allocate (NmtNewtWidget *widget,
int x,
int y,
int width,
int height)
nmt_newt_stack_size_allocate(NmtNewtWidget *widget, int x, int y, int width, int height)
{
NmtNewtStackPrivate *priv = NMT_NEWT_STACK_GET_PRIVATE (widget);
NmtNewtStackPrivate *priv = NMT_NEWT_STACK_GET_PRIVATE(widget);
if (priv->active > priv->children->len)
return;
nmt_newt_widget_size_allocate (priv->children->pdata[priv->active], x, y, width, height);
nmt_newt_widget_size_allocate(priv->children->pdata[priv->active], x, y, width, height);
}
/**
@ -134,49 +129,45 @@ nmt_newt_stack_size_allocate (NmtNewtWidget *widget,
* Adds @widget to @stack with the given @id.
*/
void
nmt_newt_stack_add (NmtNewtStack *stack,
const char *id,
NmtNewtWidget *widget)
nmt_newt_stack_add(NmtNewtStack *stack, const char *id, NmtNewtWidget *widget)
{
NmtNewtStackPrivate *priv = NMT_NEWT_STACK_GET_PRIVATE (stack);
NmtNewtStackPrivate *priv = NMT_NEWT_STACK_GET_PRIVATE(stack);
g_ptr_array_add (priv->children, widget);
g_ptr_array_add (priv->ids, g_strdup (id));
g_ptr_array_add(priv->children, widget);
g_ptr_array_add(priv->ids, g_strdup(id));
NMT_NEWT_CONTAINER_CLASS (nmt_newt_stack_parent_class)->add (NMT_NEWT_CONTAINER (stack), widget);
NMT_NEWT_CONTAINER_CLASS(nmt_newt_stack_parent_class)->add(NMT_NEWT_CONTAINER(stack), widget);
}
static void
nmt_newt_stack_remove (NmtNewtContainer *container,
NmtNewtWidget *widget)
nmt_newt_stack_remove(NmtNewtContainer *container, NmtNewtWidget *widget)
{
NmtNewtStack *stack = NMT_NEWT_STACK (container);
NmtNewtStackPrivate *priv = NMT_NEWT_STACK_GET_PRIVATE (stack);
NmtNewtStack * stack = NMT_NEWT_STACK(container);
NmtNewtStackPrivate *priv = NMT_NEWT_STACK_GET_PRIVATE(stack);
int i;
NMT_NEWT_CONTAINER_CLASS (nmt_newt_stack_parent_class)->remove (container, widget);
NMT_NEWT_CONTAINER_CLASS(nmt_newt_stack_parent_class)->remove(container, widget);
for (i = 0; i < priv->children->len; i++) {
if (priv->children->pdata[i] == widget) {
g_ptr_array_remove_index (priv->children, i);
g_ptr_array_remove_index (priv->ids, i);
g_ptr_array_remove_index(priv->children, i);
g_ptr_array_remove_index(priv->ids, i);
return;
}
}
}
static void
nmt_newt_stack_child_validity_changed (NmtNewtContainer *container,
NmtNewtWidget *widget)
nmt_newt_stack_child_validity_changed(NmtNewtContainer *container, NmtNewtWidget *widget)
{
NmtNewtStackPrivate *priv = NMT_NEWT_STACK_GET_PRIVATE (container);
NmtNewtStackPrivate *priv = NMT_NEWT_STACK_GET_PRIVATE(container);
if (priv->active > priv->children->len)
return;
if (priv->children->pdata[priv->active] == (gpointer) widget) {
NMT_NEWT_CONTAINER_CLASS (nmt_newt_stack_parent_class)->
child_validity_changed (container, widget);
NMT_NEWT_CONTAINER_CLASS(nmt_newt_stack_parent_class)
->child_validity_changed(container, widget);
}
}
@ -188,18 +179,17 @@ nmt_newt_stack_child_validity_changed (NmtNewtContainer *container,
* Sets the active page on @stack to @active.
*/
void
nmt_newt_stack_set_active (NmtNewtStack *stack,
guint active)
nmt_newt_stack_set_active(NmtNewtStack *stack, guint active)
{
NmtNewtStackPrivate *priv = NMT_NEWT_STACK_GET_PRIVATE (stack);
NmtNewtStackPrivate *priv = NMT_NEWT_STACK_GET_PRIVATE(stack);
if (priv->active == active)
return;
priv->active = active;
g_object_notify (G_OBJECT (stack), "active");
g_object_notify (G_OBJECT (stack), "active-id");
nmt_newt_widget_needs_rebuild (NMT_NEWT_WIDGET (stack));
g_object_notify(G_OBJECT(stack), "active");
g_object_notify(G_OBJECT(stack), "active-id");
nmt_newt_widget_needs_rebuild(NMT_NEWT_WIDGET(stack));
}
/**
@ -211,9 +201,9 @@ nmt_newt_stack_set_active (NmtNewtStack *stack,
* Returns: the index of the active page on @stack
*/
guint
nmt_newt_stack_get_active (NmtNewtStack *stack)
nmt_newt_stack_get_active(NmtNewtStack *stack)
{
NmtNewtStackPrivate *priv = NMT_NEWT_STACK_GET_PRIVATE (stack);
NmtNewtStackPrivate *priv = NMT_NEWT_STACK_GET_PRIVATE(stack);
return priv->active;
}
@ -226,21 +216,20 @@ nmt_newt_stack_get_active (NmtNewtStack *stack)
* Sets the active page on @stack to @active_id.
*/
void
nmt_newt_stack_set_active_id (NmtNewtStack *stack,
const char *id)
nmt_newt_stack_set_active_id(NmtNewtStack *stack, const char *id)
{
NmtNewtStackPrivate *priv = NMT_NEWT_STACK_GET_PRIVATE (stack);
NmtNewtStackPrivate *priv = NMT_NEWT_STACK_GET_PRIVATE(stack);
int i;
if (!g_strcmp0 (priv->ids->pdata[priv->active], id))
if (!g_strcmp0(priv->ids->pdata[priv->active], id))
return;
for (i = 0; i < priv->ids->len; i++) {
if (!g_strcmp0 (priv->ids->pdata[i], id)) {
if (!g_strcmp0(priv->ids->pdata[i], id)) {
priv->active = i;
g_object_notify (G_OBJECT (stack), "active");
g_object_notify (G_OBJECT (stack), "active-id");
nmt_newt_widget_needs_rebuild (NMT_NEWT_WIDGET (stack));
g_object_notify(G_OBJECT(stack), "active");
g_object_notify(G_OBJECT(stack), "active-id");
nmt_newt_widget_needs_rebuild(NMT_NEWT_WIDGET(stack));
return;
}
}
@ -255,9 +244,9 @@ nmt_newt_stack_set_active_id (NmtNewtStack *stack,
* Returns: the ID of the active page on @stack
*/
const char *
nmt_newt_stack_get_active_id (NmtNewtStack *stack)
nmt_newt_stack_get_active_id(NmtNewtStack *stack)
{
NmtNewtStackPrivate *priv = NMT_NEWT_STACK_GET_PRIVATE (stack);
NmtNewtStackPrivate *priv = NMT_NEWT_STACK_GET_PRIVATE(stack);
if (priv->active > priv->children->len)
return NULL;
@ -266,55 +255,49 @@ nmt_newt_stack_get_active_id (NmtNewtStack *stack)
}
static void
nmt_newt_stack_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
nmt_newt_stack_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
{
NmtNewtStack *stack = NMT_NEWT_STACK (object);
NmtNewtStack *stack = NMT_NEWT_STACK(object);
switch (prop_id) {
case PROP_ACTIVE:
nmt_newt_stack_set_active (stack, g_value_get_uint (value));
nmt_newt_stack_set_active(stack, g_value_get_uint(value));
break;
case PROP_ACTIVE_ID:
nmt_newt_stack_set_active_id (stack, g_value_get_string (value));
nmt_newt_stack_set_active_id(stack, g_value_get_string(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_newt_stack_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
nmt_newt_stack_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
{
NmtNewtStack *stack = NMT_NEWT_STACK (object);
NmtNewtStack *stack = NMT_NEWT_STACK(object);
switch (prop_id) {
case PROP_ACTIVE:
g_value_set_uint (value, nmt_newt_stack_get_active (stack));
g_value_set_uint(value, nmt_newt_stack_get_active(stack));
break;
case PROP_ACTIVE_ID:
g_value_set_string (value, nmt_newt_stack_get_active_id (stack));
g_value_set_string(value, nmt_newt_stack_get_active_id(stack));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_newt_stack_class_init (NmtNewtStackClass *stack_class)
nmt_newt_stack_class_init(NmtNewtStackClass *stack_class)
{
GObjectClass *object_class = G_OBJECT_CLASS (stack_class);
NmtNewtWidgetClass *widget_class = NMT_NEWT_WIDGET_CLASS (stack_class);
NmtNewtContainerClass *container_class = NMT_NEWT_CONTAINER_CLASS (stack_class);
GObjectClass * object_class = G_OBJECT_CLASS(stack_class);
NmtNewtWidgetClass * widget_class = NMT_NEWT_WIDGET_CLASS(stack_class);
NmtNewtContainerClass *container_class = NMT_NEWT_CONTAINER_CLASS(stack_class);
g_type_class_add_private (stack_class, sizeof (NmtNewtStackPrivate));
g_type_class_add_private(stack_class, sizeof(NmtNewtStackPrivate));
/* virtual methods */
object_class->set_property = nmt_newt_stack_set_property;
@ -333,21 +316,22 @@ nmt_newt_stack_class_init (NmtNewtStackClass *stack_class)
*
* The index of the active page
*/
g_object_class_install_property
(object_class, PROP_ACTIVE,
g_param_spec_uint ("active", "", "",
0, G_MAXUINT, 0,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(object_class,
PROP_ACTIVE,
g_param_spec_uint("active",
"",
"",
0,
G_MAXUINT,
0,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
* NmtNewtStack:active-id:
*
* The ID of the active page
*/
g_object_class_install_property
(object_class, PROP_ACTIVE_ID,
g_param_spec_string ("active-id", "", "",
NULL,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
object_class,
PROP_ACTIVE_ID,
g_param_spec_string("active-id", "", "", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
}

View file

@ -8,16 +8,17 @@
#include "nmt-newt-container.h"
#define NMT_TYPE_NEWT_STACK (nmt_newt_stack_get_type ())
#define NMT_NEWT_STACK(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMT_TYPE_NEWT_STACK, NmtNewtStack))
#define NMT_NEWT_STACK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NMT_TYPE_NEWT_STACK, NmtNewtStackClass))
#define NMT_IS_NEWT_STACK(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NMT_TYPE_NEWT_STACK))
#define NMT_IS_NEWT_STACK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NMT_TYPE_NEWT_STACK))
#define NMT_NEWT_STACK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NMT_TYPE_NEWT_STACK, NmtNewtStackClass))
#define NMT_TYPE_NEWT_STACK (nmt_newt_stack_get_type())
#define NMT_NEWT_STACK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), NMT_TYPE_NEWT_STACK, NmtNewtStack))
#define NMT_NEWT_STACK_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), NMT_TYPE_NEWT_STACK, NmtNewtStackClass))
#define NMT_IS_NEWT_STACK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), NMT_TYPE_NEWT_STACK))
#define NMT_IS_NEWT_STACK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NMT_TYPE_NEWT_STACK))
#define NMT_NEWT_STACK_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), NMT_TYPE_NEWT_STACK, NmtNewtStackClass))
struct _NmtNewtStack {
NmtNewtContainer parent;
};
typedef struct {
@ -25,20 +26,16 @@ typedef struct {
} NmtNewtStackClass;
GType nmt_newt_stack_get_type (void);
GType nmt_newt_stack_get_type(void);
NmtNewtWidget *nmt_newt_stack_new (void);
NmtNewtWidget *nmt_newt_stack_new(void);
void nmt_newt_stack_add (NmtNewtStack *stack,
const char *id,
NmtNewtWidget *widget);
void nmt_newt_stack_add(NmtNewtStack *stack, const char *id, NmtNewtWidget *widget);
void nmt_newt_stack_set_active (NmtNewtStack *stack,
guint active);
guint nmt_newt_stack_get_active (NmtNewtStack *stack);
void nmt_newt_stack_set_active(NmtNewtStack *stack, guint active);
guint nmt_newt_stack_get_active(NmtNewtStack *stack);
void nmt_newt_stack_set_active_id (NmtNewtStack *stack,
const char *id);
const char * nmt_newt_stack_get_active_id (NmtNewtStack *stack);
void nmt_newt_stack_set_active_id(NmtNewtStack *stack, const char *id);
const char *nmt_newt_stack_get_active_id(NmtNewtStack *stack);
#endif /* NMT_NEWT_STACK_H */

View file

@ -17,9 +17,10 @@
#include "nmt-newt-utils.h"
G_DEFINE_TYPE (NmtNewtTextbox, nmt_newt_textbox, NMT_TYPE_NEWT_COMPONENT)
G_DEFINE_TYPE(NmtNewtTextbox, nmt_newt_textbox, NMT_TYPE_NEWT_COMPONENT)
#define NMT_NEWT_TEXTBOX_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NMT_TYPE_NEWT_TEXTBOX, NmtNewtTextboxPrivate))
#define NMT_NEWT_TEXTBOX_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE((o), NMT_TYPE_NEWT_TEXTBOX, NmtNewtTextboxPrivate))
typedef struct {
int wrap_width;
@ -58,13 +59,9 @@ enum {
* Returns: a new #NmtNewtTextbox
*/
NmtNewtWidget *
nmt_newt_textbox_new (NmtNewtTextboxFlags flags,
int wrap_width)
nmt_newt_textbox_new(NmtNewtTextboxFlags flags, int wrap_width)
{
return g_object_new (NMT_TYPE_NEWT_TEXTBOX,
"flags", flags,
"wrap-width", wrap_width,
NULL);
return g_object_new(NMT_TYPE_NEWT_TEXTBOX, "flags", flags, "wrap-width", wrap_width, NULL);
}
/**
@ -76,33 +73,32 @@ nmt_newt_textbox_new (NmtNewtTextboxFlags flags,
* Returns: @textbox's text
*/
void
nmt_newt_textbox_set_text (NmtNewtTextbox *textbox,
const char *text)
nmt_newt_textbox_set_text(NmtNewtTextbox *textbox, const char *text)
{
NmtNewtTextboxPrivate *priv = NMT_NEWT_TEXTBOX_GET_PRIVATE (textbox);
char **lines;
NmtNewtTextboxPrivate *priv = NMT_NEWT_TEXTBOX_GET_PRIVATE(textbox);
char ** lines;
int i, width;
if (!text)
text = "";
if (!strcmp (priv->text, text))
if (!strcmp(priv->text, text))
return;
g_free (priv->text);
priv->text = g_strdup (text);
g_free(priv->text);
priv->text = g_strdup(text);
priv->width = priv->height = 0;
lines = g_strsplit (priv->text, "\n", -1);
lines = g_strsplit(priv->text, "\n", -1);
for (i = 0; lines[i]; i++) {
width = nmt_newt_text_width (lines[i]);
width = nmt_newt_text_width(lines[i]);
if (width > priv->width)
priv->width = width;
}
g_free (lines);
priv->height = MIN (i, 1);
g_free(lines);
priv->height = MIN(i, 1);
g_object_notify (G_OBJECT (textbox), "text");
nmt_newt_widget_needs_rebuild (NMT_NEWT_WIDGET (textbox));
g_object_notify(G_OBJECT(textbox), "text");
nmt_newt_widget_needs_rebuild(NMT_NEWT_WIDGET(textbox));
}
/**
@ -114,33 +110,33 @@ nmt_newt_textbox_set_text (NmtNewtTextbox *textbox,
* Returns: @textbox's text
*/
const char *
nmt_newt_textbox_get_text (NmtNewtTextbox *textbox)
nmt_newt_textbox_get_text(NmtNewtTextbox *textbox)
{
NmtNewtTextboxPrivate *priv = NMT_NEWT_TEXTBOX_GET_PRIVATE (textbox);
NmtNewtTextboxPrivate *priv = NMT_NEWT_TEXTBOX_GET_PRIVATE(textbox);
return priv->text;
}
static void
nmt_newt_textbox_init (NmtNewtTextbox *textbox)
nmt_newt_textbox_init(NmtNewtTextbox *textbox)
{
NmtNewtTextboxPrivate *priv = NMT_NEWT_TEXTBOX_GET_PRIVATE (textbox);
NmtNewtTextboxPrivate *priv = NMT_NEWT_TEXTBOX_GET_PRIVATE(textbox);
priv->text = g_strdup ("");
priv->text = g_strdup("");
}
static void
nmt_newt_textbox_finalize (GObject *object)
nmt_newt_textbox_finalize(GObject *object)
{
NmtNewtTextboxPrivate *priv = NMT_NEWT_TEXTBOX_GET_PRIVATE (object);
NmtNewtTextboxPrivate *priv = NMT_NEWT_TEXTBOX_GET_PRIVATE(object);
g_free (priv->text);
g_free(priv->text);
G_OBJECT_CLASS (nmt_newt_textbox_parent_class)->finalize (object);
G_OBJECT_CLASS(nmt_newt_textbox_parent_class)->finalize(object);
}
static guint
convert_flags (NmtNewtTextboxFlags flags)
convert_flags(NmtNewtTextboxFlags flags)
{
guint newt_flags = 0;
@ -151,89 +147,87 @@ convert_flags (NmtNewtTextboxFlags flags)
}
static newtComponent
nmt_newt_textbox_build_component (NmtNewtComponent *component,
gboolean sensitive)
nmt_newt_textbox_build_component(NmtNewtComponent *component, gboolean sensitive)
{
NmtNewtTextboxPrivate *priv = NMT_NEWT_TEXTBOX_GET_PRIVATE (component);
NmtNewtTextboxPrivate *priv = NMT_NEWT_TEXTBOX_GET_PRIVATE(component);
newtComponent co;
const char *text;
char *text_lc;
const char * text;
char * text_lc;
text = priv->text;
if (!*text)
text = "\n";
text_lc = nmt_newt_locale_from_utf8 (text);
text_lc = nmt_newt_locale_from_utf8(text);
if (priv->wrap_width > 0) {
co = newtTextboxReflowed (-1, -1, text_lc, priv->wrap_width, 0, 0, 0);
co = newtTextboxReflowed(-1, -1, text_lc, priv->wrap_width, 0, 0, 0);
} else {
co = newtTextbox (-1, -1, priv->width, priv->height, convert_flags (priv->flags));
newtTextboxSetText (co, text_lc);
co = newtTextbox(-1, -1, priv->width, priv->height, convert_flags(priv->flags));
newtTextboxSetText(co, text_lc);
}
g_free (text_lc);
g_free(text_lc);
if (priv->flags & NMT_NEWT_TEXTBOX_SET_BACKGROUND)
newtTextboxSetColors (co, NMT_NEWT_COLORSET_TEXTBOX_WITH_BACKGROUND, NEWT_COLORSET_ACTTEXTBOX);
newtTextboxSetColors(co,
NMT_NEWT_COLORSET_TEXTBOX_WITH_BACKGROUND,
NEWT_COLORSET_ACTTEXTBOX);
return co;
}
static void
nmt_newt_textbox_set_property (GObject *object,
nmt_newt_textbox_set_property(GObject * object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
GParamSpec * pspec)
{
NmtNewtTextbox *textbox = NMT_NEWT_TEXTBOX (object);
NmtNewtTextboxPrivate *priv = NMT_NEWT_TEXTBOX_GET_PRIVATE (textbox);
NmtNewtTextbox * textbox = NMT_NEWT_TEXTBOX(object);
NmtNewtTextboxPrivate *priv = NMT_NEWT_TEXTBOX_GET_PRIVATE(textbox);
switch (prop_id) {
case PROP_TEXT:
nmt_newt_textbox_set_text (textbox, g_value_get_string (value));
nmt_newt_textbox_set_text(textbox, g_value_get_string(value));
break;
case PROP_FLAGS:
priv->flags = g_value_get_uint (value);
priv->flags = g_value_get_uint(value);
break;
case PROP_WRAP_WIDTH:
priv->wrap_width = g_value_get_int (value);
priv->wrap_width = g_value_get_int(value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_newt_textbox_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
nmt_newt_textbox_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
{
NmtNewtTextboxPrivate *priv = NMT_NEWT_TEXTBOX_GET_PRIVATE (object);
NmtNewtTextboxPrivate *priv = NMT_NEWT_TEXTBOX_GET_PRIVATE(object);
switch (prop_id) {
case PROP_TEXT:
g_value_set_string (value, priv->text);
g_value_set_string(value, priv->text);
break;
case PROP_FLAGS:
g_value_set_uint (value, priv->flags);
g_value_set_uint(value, priv->flags);
break;
case PROP_WRAP_WIDTH:
g_value_set_int (value, priv->wrap_width);
g_value_set_int(value, priv->wrap_width);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_newt_textbox_class_init (NmtNewtTextboxClass *textbox_class)
nmt_newt_textbox_class_init(NmtNewtTextboxClass *textbox_class)
{
GObjectClass *object_class = G_OBJECT_CLASS (textbox_class);
NmtNewtComponentClass *component_class = NMT_NEWT_COMPONENT_CLASS (textbox_class);
GObjectClass * object_class = G_OBJECT_CLASS(textbox_class);
NmtNewtComponentClass *component_class = NMT_NEWT_COMPONENT_CLASS(textbox_class);
g_type_class_add_private (textbox_class, sizeof (NmtNewtTextboxPrivate));
g_type_class_add_private(textbox_class, sizeof(NmtNewtTextboxPrivate));
/* virtual methods */
object_class->set_property = nmt_newt_textbox_set_property;
@ -247,35 +241,39 @@ nmt_newt_textbox_class_init (NmtNewtTextboxClass *textbox_class)
*
* The textbox's text
*/
g_object_class_install_property
(object_class, PROP_TEXT,
g_param_spec_string ("text", "", "",
"",
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
object_class,
PROP_TEXT,
g_param_spec_string("text", "", "", "", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
* NmtNewtTextbox:flags:
*
* The textbox's flags
*/
g_object_class_install_property
(object_class, PROP_FLAGS,
g_param_spec_uint ("flags", "", "",
0, G_MAXUINT, 0,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
object_class,
PROP_FLAGS,
g_param_spec_uint("flags",
"",
"",
0,
G_MAXUINT,
0,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
/**
* NmtNewtTextbox:wrap-width:
*
* The width in characters at which the textbox's text
* will wrap, or 0 if it does not wrap.
*/
g_object_class_install_property
(object_class, PROP_WRAP_WIDTH,
g_param_spec_int ("wrap-width", "", "",
0, G_MAXINT, 0,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
object_class,
PROP_WRAP_WIDTH,
g_param_spec_int("wrap-width",
"",
"",
0,
G_MAXINT,
0,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
}

View file

@ -8,16 +8,18 @@
#include "nmt-newt-component.h"
#define NMT_TYPE_NEWT_TEXTBOX (nmt_newt_textbox_get_type ())
#define NMT_NEWT_TEXTBOX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMT_TYPE_NEWT_TEXTBOX, NmtNewtTextbox))
#define NMT_NEWT_TEXTBOX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NMT_TYPE_NEWT_TEXTBOX, NmtNewtTextboxClass))
#define NMT_IS_NEWT_TEXTBOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NMT_TYPE_NEWT_TEXTBOX))
#define NMT_IS_NEWT_TEXTBOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NMT_TYPE_NEWT_TEXTBOX))
#define NMT_NEWT_TEXTBOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NMT_TYPE_NEWT_TEXTBOX, NmtNewtTextboxClass))
#define NMT_TYPE_NEWT_TEXTBOX (nmt_newt_textbox_get_type())
#define NMT_NEWT_TEXTBOX(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), NMT_TYPE_NEWT_TEXTBOX, NmtNewtTextbox))
#define NMT_NEWT_TEXTBOX_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), NMT_TYPE_NEWT_TEXTBOX, NmtNewtTextboxClass))
#define NMT_IS_NEWT_TEXTBOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), NMT_TYPE_NEWT_TEXTBOX))
#define NMT_IS_NEWT_TEXTBOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NMT_TYPE_NEWT_TEXTBOX))
#define NMT_NEWT_TEXTBOX_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), NMT_TYPE_NEWT_TEXTBOX, NmtNewtTextboxClass))
struct _NmtNewtTextbox {
NmtNewtComponent parent;
};
typedef struct {
@ -25,18 +27,16 @@ typedef struct {
} NmtNewtTextboxClass;
GType nmt_newt_textbox_get_type (void);
GType nmt_newt_textbox_get_type(void);
typedef enum {
NMT_NEWT_TEXTBOX_SCROLLABLE = (1 << 0),
NMT_NEWT_TEXTBOX_SET_BACKGROUND = (1 << 1)
} NmtNewtTextboxFlags;
NmtNewtWidget *nmt_newt_textbox_new (NmtNewtTextboxFlags flags,
int wrap_width);
NmtNewtWidget *nmt_newt_textbox_new(NmtNewtTextboxFlags flags, int wrap_width);
void nmt_newt_textbox_set_text (NmtNewtTextbox *textbox,
const char *text);
const char *nmt_newt_textbox_get_text (NmtNewtTextbox *textbox);
void nmt_newt_textbox_set_text(NmtNewtTextbox *textbox, const char *text);
const char *nmt_newt_textbox_get_text(NmtNewtTextbox *textbox);
#endif /* NMT_NEWT_TEXTBOX_H */

View file

@ -14,12 +14,13 @@
#include "nmt-newt-toggle-button.h"
G_DEFINE_TYPE (NmtNewtToggleButton, nmt_newt_toggle_button, NMT_TYPE_NEWT_BUTTON)
G_DEFINE_TYPE(NmtNewtToggleButton, nmt_newt_toggle_button, NMT_TYPE_NEWT_BUTTON)
#define NMT_NEWT_TOGGLE_BUTTON_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NMT_TYPE_NEWT_TOGGLE_BUTTON, NmtNewtToggleButtonPrivate))
#define NMT_NEWT_TOGGLE_BUTTON_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE((o), NMT_TYPE_NEWT_TOGGLE_BUTTON, NmtNewtToggleButtonPrivate))
typedef struct {
char *on_label, *off_label;
char * on_label, *off_label;
gboolean active;
} NmtNewtToggleButtonPrivate;
@ -42,12 +43,13 @@ enum {
* Returns: a new #NmtNewtToggleButton
*/
NmtNewtWidget *
nmt_newt_toggle_button_new (const char *on_label,
const char *off_label)
nmt_newt_toggle_button_new(const char *on_label, const char *off_label)
{
return g_object_new (NMT_TYPE_NEWT_TOGGLE_BUTTON,
"on-label", on_label,
"off-label", off_label,
return g_object_new(NMT_TYPE_NEWT_TOGGLE_BUTTON,
"on-label",
on_label,
"off-label",
off_label,
NULL);
}
@ -60,9 +62,9 @@ nmt_newt_toggle_button_new (const char *on_label,
* Returns: whether @button is currently "on" (%TRUE) or "off" (%FALSE)
*/
gboolean
nmt_newt_toggle_button_get_active (NmtNewtToggleButton *button)
nmt_newt_toggle_button_get_active(NmtNewtToggleButton *button)
{
NmtNewtToggleButtonPrivate *priv = NMT_NEWT_TOGGLE_BUTTON_GET_PRIVATE (button);
NmtNewtToggleButtonPrivate *priv = NMT_NEWT_TOGGLE_BUTTON_GET_PRIVATE(button);
return priv->active;
}
@ -75,111 +77,105 @@ nmt_newt_toggle_button_get_active (NmtNewtToggleButton *button)
* Sets whether @button is currently "on" or "off"
*/
void
nmt_newt_toggle_button_set_active (NmtNewtToggleButton *button,
gboolean active)
nmt_newt_toggle_button_set_active(NmtNewtToggleButton *button, gboolean active)
{
NmtNewtToggleButtonPrivate *priv = NMT_NEWT_TOGGLE_BUTTON_GET_PRIVATE (button);
NmtNewtToggleButtonPrivate *priv = NMT_NEWT_TOGGLE_BUTTON_GET_PRIVATE(button);
if (priv->active == active)
return;
priv->active = active;
g_object_set (G_OBJECT (button),
"label", active ? priv->on_label : priv->off_label,
NULL);
g_object_notify (G_OBJECT (button), "active");
g_object_set(G_OBJECT(button), "label", active ? priv->on_label : priv->off_label, NULL);
g_object_notify(G_OBJECT(button), "active");
}
static void
nmt_newt_toggle_button_init (NmtNewtToggleButton *button)
nmt_newt_toggle_button_init(NmtNewtToggleButton *button)
{}
static void
nmt_newt_toggle_button_finalize(GObject *object)
{
NmtNewtToggleButtonPrivate *priv = NMT_NEWT_TOGGLE_BUTTON_GET_PRIVATE(object);
g_free(priv->on_label);
g_free(priv->off_label);
G_OBJECT_CLASS(nmt_newt_toggle_button_parent_class)->finalize(object);
}
static void
nmt_newt_toggle_button_finalize (GObject *object)
nmt_newt_toggle_button_activated(NmtNewtWidget *widget)
{
NmtNewtToggleButtonPrivate *priv = NMT_NEWT_TOGGLE_BUTTON_GET_PRIVATE (object);
NmtNewtToggleButton *button = NMT_NEWT_TOGGLE_BUTTON(widget);
g_free (priv->on_label);
g_free (priv->off_label);
nmt_newt_toggle_button_set_active(button, !nmt_newt_toggle_button_get_active(button));
G_OBJECT_CLASS (nmt_newt_toggle_button_parent_class)->finalize (object);
NMT_NEWT_WIDGET_CLASS(nmt_newt_toggle_button_parent_class)->activated(widget);
}
static void
nmt_newt_toggle_button_activated (NmtNewtWidget *widget)
{
NmtNewtToggleButton *button = NMT_NEWT_TOGGLE_BUTTON (widget);
nmt_newt_toggle_button_set_active (button, !nmt_newt_toggle_button_get_active (button));
NMT_NEWT_WIDGET_CLASS (nmt_newt_toggle_button_parent_class)->activated (widget);
}
static void
nmt_newt_toggle_button_set_property (GObject *object,
nmt_newt_toggle_button_set_property(GObject * object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
GParamSpec * pspec)
{
NmtNewtToggleButtonPrivate *priv = NMT_NEWT_TOGGLE_BUTTON_GET_PRIVATE (object);
NmtNewtToggleButtonPrivate *priv = NMT_NEWT_TOGGLE_BUTTON_GET_PRIVATE(object);
switch (prop_id) {
case PROP_ON_LABEL:
g_free (priv->on_label);
priv->on_label = g_value_dup_string (value);
g_free(priv->on_label);
priv->on_label = g_value_dup_string(value);
if (priv->active)
g_object_set (object, "label", priv->on_label, NULL);
g_object_set(object, "label", priv->on_label, NULL);
break;
case PROP_OFF_LABEL:
g_free (priv->off_label);
priv->off_label = g_value_dup_string (value);
g_free(priv->off_label);
priv->off_label = g_value_dup_string(value);
if (!priv->active)
g_object_set (object, "label", priv->off_label, NULL);
g_object_set(object, "label", priv->off_label, NULL);
break;
case PROP_ACTIVE:
priv->active = g_value_get_boolean (value);
g_object_set (object,
"label", priv->active ? priv->on_label : priv->off_label,
NULL);
priv->active = g_value_get_boolean(value);
g_object_set(object, "label", priv->active ? priv->on_label : priv->off_label, NULL);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_newt_toggle_button_get_property (GObject *object,
nmt_newt_toggle_button_get_property(GObject * object,
guint prop_id,
GValue *value,
GValue * value,
GParamSpec *pspec)
{
NmtNewtToggleButtonPrivate *priv = NMT_NEWT_TOGGLE_BUTTON_GET_PRIVATE (object);
NmtNewtToggleButtonPrivate *priv = NMT_NEWT_TOGGLE_BUTTON_GET_PRIVATE(object);
switch (prop_id) {
case PROP_ON_LABEL:
g_value_set_string (value, priv->on_label);
g_value_set_string(value, priv->on_label);
break;
case PROP_OFF_LABEL:
g_value_set_string (value, priv->off_label);
g_value_set_string(value, priv->off_label);
break;
case PROP_ACTIVE:
g_value_set_boolean (value, priv->active);
g_value_set_boolean(value, priv->active);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_newt_toggle_button_class_init (NmtNewtToggleButtonClass *button_class)
nmt_newt_toggle_button_class_init(NmtNewtToggleButtonClass *button_class)
{
GObjectClass *object_class = G_OBJECT_CLASS (button_class);
NmtNewtWidgetClass *widget_class = NMT_NEWT_WIDGET_CLASS (button_class);
GObjectClass * object_class = G_OBJECT_CLASS(button_class);
NmtNewtWidgetClass *widget_class = NMT_NEWT_WIDGET_CLASS(button_class);
g_type_class_add_private (button_class, sizeof (NmtNewtToggleButtonPrivate));
g_type_class_add_private(button_class, sizeof(NmtNewtToggleButtonPrivate));
/* virtual methods */
object_class->set_property = nmt_newt_toggle_button_set_property;
@ -193,32 +189,26 @@ nmt_newt_toggle_button_class_init (NmtNewtToggleButtonClass *button_class)
*
* The label the button displays when it is "on".
*/
g_object_class_install_property
(object_class, PROP_ON_LABEL,
g_param_spec_string ("on-label", "", "",
NULL,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
object_class,
PROP_ON_LABEL,
g_param_spec_string("on-label", "", "", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
* NmtNewtToggleButton:off-label:
*
* The label the button displays when it is "off".
*/
g_object_class_install_property
(object_class, PROP_OFF_LABEL,
g_param_spec_string ("off-label", "", "",
NULL,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
object_class,
PROP_OFF_LABEL,
g_param_spec_string("off-label", "", "", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
* NmtNewtToggleButton:active:
*
* Whether the button is currently "on" (%TRUE) or "off" (%FALSE)
*/
g_object_class_install_property
(object_class, PROP_ACTIVE,
g_param_spec_boolean ("active", "", "",
FALSE,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
object_class,
PROP_ACTIVE,
g_param_spec_boolean("active", "", "", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
}

View file

@ -8,16 +8,20 @@
#include "nmt-newt-button.h"
#define NMT_TYPE_NEWT_TOGGLE_BUTTON (nmt_newt_toggle_button_get_type ())
#define NMT_NEWT_TOGGLE_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMT_TYPE_NEWT_TOGGLE_BUTTON, NmtNewtToggleButton))
#define NMT_NEWT_TOGGLE_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NMT_TYPE_NEWT_TOGGLE_BUTTON, NmtNewtToggleButtonClass))
#define NMT_IS_NEWT_TOGGLE_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NMT_TYPE_NEWT_TOGGLE_BUTTON))
#define NMT_IS_NEWT_TOGGLE_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NMT_TYPE_NEWT_TOGGLE_BUTTON))
#define NMT_NEWT_TOGGLE_BUTTON_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NMT_TYPE_NEWT_TOGGLE_BUTTON, NmtNewtToggleButtonClass))
#define NMT_TYPE_NEWT_TOGGLE_BUTTON (nmt_newt_toggle_button_get_type())
#define NMT_NEWT_TOGGLE_BUTTON(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), NMT_TYPE_NEWT_TOGGLE_BUTTON, NmtNewtToggleButton))
#define NMT_NEWT_TOGGLE_BUTTON_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), NMT_TYPE_NEWT_TOGGLE_BUTTON, NmtNewtToggleButtonClass))
#define NMT_IS_NEWT_TOGGLE_BUTTON(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj), NMT_TYPE_NEWT_TOGGLE_BUTTON))
#define NMT_IS_NEWT_TOGGLE_BUTTON_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass), NMT_TYPE_NEWT_TOGGLE_BUTTON))
#define NMT_NEWT_TOGGLE_BUTTON_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), NMT_TYPE_NEWT_TOGGLE_BUTTON, NmtNewtToggleButtonClass))
struct _NmtNewtToggleButton {
NmtNewtButton parent;
};
typedef struct {
@ -25,13 +29,11 @@ typedef struct {
} NmtNewtToggleButtonClass;
GType nmt_newt_toggle_button_get_type (void);
GType nmt_newt_toggle_button_get_type(void);
NmtNewtWidget *nmt_newt_toggle_button_new (const char *on_label,
const char *off_label);
NmtNewtWidget *nmt_newt_toggle_button_new(const char *on_label, const char *off_label);
gboolean nmt_newt_toggle_button_get_active (NmtNewtToggleButton *button);
void nmt_newt_toggle_button_set_active (NmtNewtToggleButton *button,
gboolean active);
gboolean nmt_newt_toggle_button_get_active(NmtNewtToggleButton *button);
void nmt_newt_toggle_button_set_active(NmtNewtToggleButton *button, gboolean active);
#endif /* NMT_NEWT_TOGGLE_BUTTON_H */

View file

@ -17,18 +17,18 @@
#include "nmt-newt-utils.h"
static void
nmt_newt_dialog_g_log_handler (const char *log_domain,
nmt_newt_dialog_g_log_handler(const char * log_domain,
GLogLevelFlags log_level,
const char *message,
const char * message,
gpointer user_data)
{
const char *level_name;
char *full_message;
const char * level_name;
char * full_message;
int screen_width, screen_height;
newtComponent text, ok, form;
newtGrid grid;
g_assert (!(log_level & G_LOG_FLAG_RECURSION));
g_assert(!(log_level & G_LOG_FLAG_RECURSION));
if (log_level & G_LOG_LEVEL_DEBUG)
return;
@ -50,7 +50,7 @@ nmt_newt_dialog_g_log_handler (const char *log_domain,
level_name = NULL;
}
full_message = g_strdup_printf ("%s%s%s%s%s",
full_message = g_strdup_printf("%s%s%s%s%s",
log_domain ?: "",
log_domain && level_name ? " " : "",
level_name ?: "",
@ -62,44 +62,43 @@ nmt_newt_dialog_g_log_handler (const char *log_domain,
* NmtNewt classes, to avoid possible error recursion.
*/
newtGetScreenSize (&screen_width, &screen_height);
text = newtTextboxReflowed (-1, -1, full_message, MAX (70, screen_width - 10), 0, 0, 0);
g_free (full_message);
newtGetScreenSize(&screen_width, &screen_height);
text = newtTextboxReflowed(-1, -1, full_message, MAX(70, screen_width - 10), 0, 0, 0);
g_free(full_message);
ok = newtButton (-1, -1, "OK");
ok = newtButton(-1, -1, "OK");
grid = newtCreateGrid (1, 2);
newtGridSetField (grid, 0, 0, NEWT_GRID_COMPONENT, text, 0, 0, 0, 0, 0, 0);
newtGridSetField (grid, 0, 1, NEWT_GRID_COMPONENT, ok, 0, 1, 0, 0,
NEWT_ANCHOR_RIGHT, 0);
grid = newtCreateGrid(1, 2);
newtGridSetField(grid, 0, 0, NEWT_GRID_COMPONENT, text, 0, 0, 0, 0, 0, 0);
newtGridSetField(grid, 0, 1, NEWT_GRID_COMPONENT, ok, 0, 1, 0, 0, NEWT_ANCHOR_RIGHT, 0);
newtGridWrappedWindow (grid, (char *) (level_name ?: ""));
newtGridFree (grid, TRUE);
newtGridWrappedWindow(grid, (char *) (level_name ?: ""));
newtGridFree(grid, TRUE);
form = newtForm (NULL, NULL, 0);
newtFormAddComponents (form, text, ok, NULL);
newtRunForm (form);
newtFormDestroy (form);
newtPopWindow ();
form = newtForm(NULL, NULL, 0);
newtFormAddComponents(form, text, ok, NULL);
newtRunForm(form);
newtFormDestroy(form);
newtPopWindow();
}
static void
nmt_newt_basic_g_log_handler (const char *log_domain,
nmt_newt_basic_g_log_handler(const char * log_domain,
GLogLevelFlags log_level,
const char *message,
const char * message,
gpointer user_data)
{
newtSuspend ();
g_log_default_handler (log_domain, log_level, message, NULL);
newtResume ();
newtSuspend();
g_log_default_handler(log_domain, log_level, message, NULL);
newtResume();
}
static void
nmt_newt_suspend_callback (gpointer user_data)
nmt_newt_suspend_callback(gpointer user_data)
{
newtSuspend ();
kill (getpid (), SIGTSTP);
newtResume ();
newtSuspend();
kill(getpid(), SIGTSTP);
newtResume();
}
/**
@ -109,23 +108,23 @@ nmt_newt_suspend_callback (gpointer user_data)
* This should be called once, before any other nmt-newt functions.
*/
void
nmt_newt_init (void)
nmt_newt_init(void)
{
newtInit ();
newtCls ();
newtInit();
newtCls();
newtSetColor (NEWT_COLORSET_CHECKBOX, "black", "lightgray");
newtSetColor (NMT_NEWT_COLORSET_BAD_LABEL, "red", "lightgray");
newtSetColor (NMT_NEWT_COLORSET_PLAIN_LABEL, "black", "lightgray");
newtSetColor (NMT_NEWT_COLORSET_DISABLED_BUTTON, "blue", "lightgray");
newtSetColor (NMT_NEWT_COLORSET_TEXTBOX_WITH_BACKGROUND, "black", "white");
newtSetColor(NEWT_COLORSET_CHECKBOX, "black", "lightgray");
newtSetColor(NMT_NEWT_COLORSET_BAD_LABEL, "red", "lightgray");
newtSetColor(NMT_NEWT_COLORSET_PLAIN_LABEL, "black", "lightgray");
newtSetColor(NMT_NEWT_COLORSET_DISABLED_BUTTON, "blue", "lightgray");
newtSetColor(NMT_NEWT_COLORSET_TEXTBOX_WITH_BACKGROUND, "black", "white");
if (g_getenv ("NMTUI_DEBUG"))
g_log_set_default_handler (nmt_newt_dialog_g_log_handler, NULL);
if (g_getenv("NMTUI_DEBUG"))
g_log_set_default_handler(nmt_newt_dialog_g_log_handler, NULL);
else
g_log_set_default_handler (nmt_newt_basic_g_log_handler, NULL);
g_log_set_default_handler(nmt_newt_basic_g_log_handler, NULL);
newtSetSuspendCallback (nmt_newt_suspend_callback, NULL);
newtSetSuspendCallback(nmt_newt_suspend_callback, NULL);
}
/**
@ -134,10 +133,10 @@ nmt_newt_init (void)
* Wrapper for newtFinished(). Should be called at the end of the program.
*/
void
nmt_newt_finished (void)
nmt_newt_finished(void)
{
newtFinished ();
g_log_set_default_handler (g_log_default_handler, NULL);
newtFinished();
g_log_set_default_handler(g_log_default_handler, NULL);
}
/**
@ -149,23 +148,22 @@ nmt_newt_finished (void)
* button, and returns after the user clicks "OK".
*/
void
nmt_newt_message_dialog (const char *message,
...)
nmt_newt_message_dialog(const char *message, ...)
{
va_list ap;
char *msg, *msg_lc, *ok_lc;
char * msg, *msg_lc, *ok_lc;
va_start (ap, message);
msg = g_strdup_vprintf (message, ap);
va_end (ap);
va_start(ap, message);
msg = g_strdup_vprintf(message, ap);
va_end(ap);
msg_lc = nmt_newt_locale_from_utf8 (msg);
ok_lc = nmt_newt_locale_from_utf8 (_("OK"));
newtWinMessage (NULL, ok_lc, "%s", msg_lc);
msg_lc = nmt_newt_locale_from_utf8(msg);
ok_lc = nmt_newt_locale_from_utf8(_("OK"));
newtWinMessage(NULL, ok_lc, "%s", msg_lc);
g_free (ok_lc);
g_free (msg_lc);
g_free (msg);
g_free(ok_lc);
g_free(msg_lc);
g_free(msg);
}
/**
@ -181,28 +179,25 @@ nmt_newt_message_dialog (const char *message,
* Returns: which button was clicked: 0 for @button1 or 1 for @button2
*/
int
nmt_newt_choice_dialog (const char *button1,
const char *button2,
const char *message,
...)
nmt_newt_choice_dialog(const char *button1, const char *button2, const char *message, ...)
{
va_list ap;
char *msg, *msg_lc, *button1_lc, *button2_lc;
char * msg, *msg_lc, *button1_lc, *button2_lc;
int choice;
va_start (ap, message);
msg = g_strdup_vprintf (message, ap);
va_end (ap);
va_start(ap, message);
msg = g_strdup_vprintf(message, ap);
va_end(ap);
msg_lc = nmt_newt_locale_from_utf8 (msg);
button1_lc = nmt_newt_locale_from_utf8 (button1);
button2_lc = nmt_newt_locale_from_utf8 (button2);
choice = newtWinChoice (NULL, button1_lc, button2_lc, "%s", msg_lc);
msg_lc = nmt_newt_locale_from_utf8(msg);
button1_lc = nmt_newt_locale_from_utf8(button1);
button2_lc = nmt_newt_locale_from_utf8(button2);
choice = newtWinChoice(NULL, button1_lc, button2_lc, "%s", msg_lc);
g_free (button1_lc);
g_free (button2_lc);
g_free (msg_lc);
g_free (msg);
g_free(button1_lc);
g_free(button2_lc);
g_free(msg_lc);
g_free(msg);
return choice;
}
@ -221,13 +216,13 @@ nmt_newt_choice_dialog (const char *button1,
* Returns: @str_lc, converted to UTF-8.
*/
char *
nmt_newt_locale_to_utf8 (const char *str_lc)
nmt_newt_locale_to_utf8(const char *str_lc)
{
char *str_utf8;
str_utf8 = g_locale_to_utf8 (str_lc, -1, NULL, NULL, NULL);
str_utf8 = g_locale_to_utf8(str_lc, -1, NULL, NULL, NULL);
if (!str_utf8)
str_utf8 = g_strdup ("");
str_utf8 = g_strdup("");
return str_utf8;
}
@ -244,13 +239,13 @@ nmt_newt_locale_to_utf8 (const char *str_lc)
* Returns: @str_utf8, converted to the user's locale encoding.
*/
char *
nmt_newt_locale_from_utf8 (const char *str_utf8)
nmt_newt_locale_from_utf8(const char *str_utf8)
{
char *str_lc;
str_lc = g_locale_from_utf8 (str_utf8, -1, NULL, NULL, NULL);
str_lc = g_locale_from_utf8(str_utf8, -1, NULL, NULL, NULL);
if (!str_lc)
str_lc = g_strdup ("");
str_lc = g_strdup("");
return str_lc;
}
@ -263,20 +258,20 @@ nmt_newt_locale_from_utf8 (const char *str_utf8)
* Returns: the width of @str
*/
int
nmt_newt_text_width (const char *str)
nmt_newt_text_width(const char *str)
{
int width;
gunichar ch;
for (width = 0; *str; str = g_utf8_next_char (str)) {
ch = g_utf8_get_char (str);
for (width = 0; *str; str = g_utf8_next_char(str)) {
ch = g_utf8_get_char(str);
/* Based on _vte_iso2022_unichar_width */
if (G_LIKELY (ch < 0x80))
if (G_LIKELY(ch < 0x80))
width += 1;
else if (G_UNLIKELY (g_unichar_iszerowidth (ch)))
else if (G_UNLIKELY(g_unichar_iszerowidth(ch)))
width += 0;
else if (G_UNLIKELY (g_unichar_iswide (ch)))
else if (G_UNLIKELY(g_unichar_iswide(ch)))
width += 2;
else
width += 1;
@ -298,69 +293,74 @@ nmt_newt_text_width (const char *str)
* Returns: the edited data, or %NULL if an error occurred.
*/
char *
nmt_newt_edit_string (const char *data)
nmt_newt_edit_string(const char *data)
{
gssize len, nwrote;
char *filename, *argv[3];
char * filename, *argv[3];
GError *error = NULL;
int fd, status;
char *new_data = NULL;
char * new_data = NULL;
fd = g_file_open_tmp ("XXXXXX.json", &filename, &error);
fd = g_file_open_tmp("XXXXXX.json", &filename, &error);
if (fd == -1) {
nmt_newt_message_dialog (_("Could not create temporary file: %s"), error->message);
g_error_free (error);
nmt_newt_message_dialog(_("Could not create temporary file: %s"), error->message);
g_error_free(error);
return NULL;
}
len = data ? strlen (data) : 0;
len = data ? strlen(data) : 0;
while (len) {
do
nwrote = write (fd, data, len);
nwrote = write(fd, data, len);
while (nwrote == -1 && errno == EINTR);
len -= nwrote;
data += nwrote;
}
nm_close (fd);
nm_close(fd);
argv[0] = (char *) g_getenv ("VISUAL");
argv[0] = (char *) g_getenv("VISUAL");
if (!argv[0])
argv[0] = (char *) g_getenv ("EDITOR");
argv[0] = (char *) g_getenv("EDITOR");
if (!argv[0])
argv[0] = (char *) "vi";
argv[1] = filename;
argv[2] = NULL;
newtSuspend ();
g_spawn_sync (NULL, argv, NULL,
newtSuspend();
g_spawn_sync(NULL,
argv,
NULL,
G_SPAWN_SEARCH_PATH | G_SPAWN_CHILD_INHERITS_STDIN,
NULL, NULL, NULL, NULL,
&status, &error);
newtResume ();
NULL,
NULL,
NULL,
NULL,
&status,
&error);
newtResume();
if (error) {
nmt_newt_message_dialog (_("Could not create temporary file: %s"), error->message);
g_error_free (error);
nmt_newt_message_dialog(_("Could not create temporary file: %s"), error->message);
g_error_free(error);
goto done;
}
if (!g_spawn_check_exit_status (status, &error)) {
nmt_newt_message_dialog (_("Editor failed: %s"), error->message);
g_error_free (error);
if (!g_spawn_check_exit_status(status, &error)) {
nmt_newt_message_dialog(_("Editor failed: %s"), error->message);
g_error_free(error);
goto done;
}
if (!g_file_get_contents (filename, &new_data, NULL, &error)) {
nmt_newt_message_dialog (_("Could not re-read file: %s"), error->message);
g_error_free (error);
if (!g_file_get_contents(filename, &new_data, NULL, &error)) {
nmt_newt_message_dialog(_("Could not re-read file: %s"), error->message);
g_error_free(error);
goto done;
}
done:
unlink (filename);
g_free (filename);
done:
unlink(filename);
g_free(filename);
return new_data;
}

View file

@ -8,28 +8,25 @@
#include <newt.h>
void nmt_newt_init (void);
void nmt_newt_finished (void);
void nmt_newt_init(void);
void nmt_newt_finished(void);
typedef enum {
NMT_NEWT_COLORSET_BAD_LABEL = NEWT_COLORSET_CUSTOM (0),
NMT_NEWT_COLORSET_BAD_LABEL = NEWT_COLORSET_CUSTOM(0),
NMT_NEWT_COLORSET_PLAIN_LABEL,
NMT_NEWT_COLORSET_DISABLED_BUTTON,
NMT_NEWT_COLORSET_TEXTBOX_WITH_BACKGROUND
} NmtNewtColorsets;
char *nmt_newt_locale_to_utf8 (const char *str_lc);
char *nmt_newt_locale_from_utf8 (const char *str_utf8);
char *nmt_newt_locale_to_utf8(const char *str_lc);
char *nmt_newt_locale_from_utf8(const char *str_utf8);
int nmt_newt_text_width (const char *str);
int nmt_newt_text_width(const char *str);
void nmt_newt_message_dialog (const char *message,
...) _nm_printf (1, 2);
int nmt_newt_choice_dialog (const char *button1,
const char *button2,
const char *message,
...) _nm_printf (3, 4);
void nmt_newt_message_dialog(const char *message, ...) _nm_printf(1, 2);
int nmt_newt_choice_dialog(const char *button1, const char *button2, const char *message, ...)
_nm_printf(3, 4);
char *nmt_newt_edit_string (const char *data);
char *nmt_newt_edit_string(const char *data);
#endif /* NMT_NEWT_UTILS_H */

View file

@ -26,9 +26,10 @@
#include "nmt-newt-widget.h"
#include "nmt-newt-form.h"
G_DEFINE_ABSTRACT_TYPE (NmtNewtWidget, nmt_newt_widget, G_TYPE_INITIALLY_UNOWNED)
G_DEFINE_ABSTRACT_TYPE(NmtNewtWidget, nmt_newt_widget, G_TYPE_INITIALLY_UNOWNED)
#define NMT_NEWT_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NMT_TYPE_NEWT_WIDGET, NmtNewtWidgetPrivate))
#define NMT_NEWT_WIDGET_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE((o), NMT_TYPE_NEWT_WIDGET, NmtNewtWidgetPrivate))
typedef struct {
NmtNewtWidget *parent;
@ -56,26 +57,26 @@ enum {
LAST_SIGNAL
};
static guint signals[LAST_SIGNAL] = { 0 };
static guint signals[LAST_SIGNAL] = {0};
static void
nmt_newt_widget_init (NmtNewtWidget *widget)
nmt_newt_widget_init(NmtNewtWidget *widget)
{
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE (widget);
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE(widget);
priv->visible = TRUE;
priv->valid = TRUE;
}
static void
nmt_newt_widget_finalize (GObject *object)
nmt_newt_widget_finalize(GObject *object)
{
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE (object);
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE(object);
nmt_newt_widget_unrealize (NMT_NEWT_WIDGET (object));
g_clear_object (&priv->parent);
nmt_newt_widget_unrealize(NMT_NEWT_WIDGET(object));
g_clear_object(&priv->parent);
G_OBJECT_CLASS (nmt_newt_widget_parent_class)->finalize (object);
G_OBJECT_CLASS(nmt_newt_widget_parent_class)->finalize(object);
}
/**
@ -89,12 +90,12 @@ nmt_newt_widget_finalize (GObject *object)
* cause its children to be realized and unrealized as needed.
*/
void
nmt_newt_widget_realize (NmtNewtWidget *widget)
nmt_newt_widget_realize(NmtNewtWidget *widget)
{
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE (widget);
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE(widget);
if (!priv->realized) {
NMT_NEWT_WIDGET_GET_CLASS (widget)->realize (widget);
NMT_NEWT_WIDGET_GET_CLASS(widget)->realize(widget);
priv->realized = TRUE;
}
}
@ -109,12 +110,12 @@ nmt_newt_widget_realize (NmtNewtWidget *widget)
* cause its children to be realized and unrealized as needed.
*/
void
nmt_newt_widget_unrealize (NmtNewtWidget *widget)
nmt_newt_widget_unrealize(NmtNewtWidget *widget)
{
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE (widget);
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE(widget);
if (priv->realized) {
NMT_NEWT_WIDGET_GET_CLASS (widget)->unrealize (widget);
NMT_NEWT_WIDGET_GET_CLASS(widget)->unrealize(widget);
priv->realized = FALSE;
}
}
@ -128,9 +129,9 @@ nmt_newt_widget_unrealize (NmtNewtWidget *widget)
* Returns: whether @widget is realized.
*/
gboolean
nmt_newt_widget_get_realized (NmtNewtWidget *widget)
nmt_newt_widget_get_realized(NmtNewtWidget *widget)
{
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE (widget);
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE(widget);
return priv->realized;
}
@ -154,11 +155,11 @@ nmt_newt_widget_get_realized (NmtNewtWidget *widget)
* with it.
*/
newtComponent *
nmt_newt_widget_get_components (NmtNewtWidget *widget)
nmt_newt_widget_get_components(NmtNewtWidget *widget)
{
if (nmt_newt_widget_get_visible (widget)) {
nmt_newt_widget_realize (widget);
return NMT_NEWT_WIDGET_GET_CLASS (widget)->get_components (widget);
if (nmt_newt_widget_get_visible(widget)) {
nmt_newt_widget_realize(widget);
return NMT_NEWT_WIDGET_GET_CLASS(widget)->get_components(widget);
} else
return NULL;
}
@ -173,10 +174,9 @@ nmt_newt_widget_get_components (NmtNewtWidget *widget)
* Return value: @co's owner, or %NULL if it was not found.
*/
NmtNewtWidget *
nmt_newt_widget_find_component (NmtNewtWidget *widget,
newtComponent co)
nmt_newt_widget_find_component(NmtNewtWidget *widget, newtComponent co)
{
return NMT_NEWT_WIDGET_GET_CLASS (widget)->find_component (widget, co);
return NMT_NEWT_WIDGET_GET_CLASS(widget)->find_component(widget, co);
}
/**
@ -190,13 +190,13 @@ nmt_newt_widget_find_component (NmtNewtWidget *widget,
* Sets the padding on @widget.
*/
void
nmt_newt_widget_set_padding (NmtNewtWidget *widget,
nmt_newt_widget_set_padding(NmtNewtWidget *widget,
int pad_left,
int pad_top,
int pad_right,
int pad_bottom)
{
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE (widget);
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE(widget);
priv->pad_left = pad_left;
priv->pad_top = pad_top;
@ -215,15 +215,13 @@ nmt_newt_widget_set_padding (NmtNewtWidget *widget,
* will be realized first.
*/
void
nmt_newt_widget_size_request (NmtNewtWidget *widget,
int *width,
int *height)
nmt_newt_widget_size_request(NmtNewtWidget *widget, int *width, int *height)
{
if (nmt_newt_widget_get_visible (widget)) {
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE (widget);
if (nmt_newt_widget_get_visible(widget)) {
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE(widget);
nmt_newt_widget_realize (widget);
NMT_NEWT_WIDGET_GET_CLASS (widget)->size_request (widget, width, height);
nmt_newt_widget_realize(widget);
NMT_NEWT_WIDGET_GET_CLASS(widget)->size_request(widget, width, height);
*width += priv->pad_left + priv->pad_right;
*height += priv->pad_top + priv->pad_bottom;
@ -253,22 +251,18 @@ nmt_newt_widget_size_request (NmtNewtWidget *widget,
* fit.
*/
void
nmt_newt_widget_size_allocate (NmtNewtWidget *widget,
int x,
int y,
int width,
int height)
nmt_newt_widget_size_allocate(NmtNewtWidget *widget, int x, int y, int width, int height)
{
if (nmt_newt_widget_get_visible (widget)) {
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE (widget);
if (nmt_newt_widget_get_visible(widget)) {
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE(widget);
nmt_newt_widget_realize (widget);
nmt_newt_widget_realize(widget);
x += priv->pad_left;
y += priv->pad_top;
width -= priv->pad_left + priv->pad_right;
height -= priv->pad_top + priv->pad_bottom;
NMT_NEWT_WIDGET_GET_CLASS (widget)->size_allocate (widget, x, y, width, height);
NMT_NEWT_WIDGET_GET_CLASS(widget)->size_allocate(widget, x, y, width, height);
}
}
@ -283,21 +277,21 @@ nmt_newt_widget_size_allocate (NmtNewtWidget *widget,
* take the focus.
*/
newtComponent
nmt_newt_widget_get_focus_component (NmtNewtWidget *widget)
nmt_newt_widget_get_focus_component(NmtNewtWidget *widget)
{
if (!NMT_NEWT_WIDGET_GET_CLASS (widget)->get_focus_component)
if (!NMT_NEWT_WIDGET_GET_CLASS(widget)->get_focus_component)
return NULL;
return NMT_NEWT_WIDGET_GET_CLASS (widget)->get_focus_component (widget);
return NMT_NEWT_WIDGET_GET_CLASS(widget)->get_focus_component(widget);
}
static void
nmt_newt_widget_real_activated (NmtNewtWidget *widget)
nmt_newt_widget_real_activated(NmtNewtWidget *widget)
{
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE (widget);
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE(widget);
if (priv->exit_on_activate)
nmt_newt_form_quit (nmt_newt_widget_get_form (widget));
nmt_newt_form_quit(nmt_newt_widget_get_form(widget));
}
/**
@ -311,9 +305,9 @@ nmt_newt_widget_real_activated (NmtNewtWidget *widget)
* will call nmt_newt_form_quit() on the widget's form.
*/
void
nmt_newt_widget_activated (NmtNewtWidget *widget)
nmt_newt_widget_activated(NmtNewtWidget *widget)
{
g_signal_emit (widget, signals[ACTIVATED], 0);
g_signal_emit(widget, signals[ACTIVATED], 0);
}
/**
@ -325,9 +319,9 @@ nmt_newt_widget_activated (NmtNewtWidget *widget)
* Returns: @widget's #NmtNewtWidget:exit-on-activate flag
*/
gboolean
nmt_newt_widget_get_exit_on_activate (NmtNewtWidget *widget)
nmt_newt_widget_get_exit_on_activate(NmtNewtWidget *widget)
{
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE (widget);
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE(widget);
return priv->exit_on_activate;
}
@ -340,15 +334,14 @@ nmt_newt_widget_get_exit_on_activate (NmtNewtWidget *widget)
* Sets @widget's #NmtNewtWidget:exit-on-activate flag, qv.
*/
void
nmt_newt_widget_set_exit_on_activate (NmtNewtWidget *widget,
gboolean exit_on_activate)
nmt_newt_widget_set_exit_on_activate(NmtNewtWidget *widget, gboolean exit_on_activate)
{
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE (widget);
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE(widget);
exit_on_activate = !!exit_on_activate;
if (priv->exit_on_activate != exit_on_activate) {
priv->exit_on_activate = exit_on_activate;
g_object_notify (G_OBJECT (widget), "exit-on-activate");
g_object_notify(G_OBJECT(widget), "exit-on-activate");
}
}
@ -361,9 +354,9 @@ nmt_newt_widget_set_exit_on_activate (NmtNewtWidget *widget,
* Returns: @widget's #NmtNewtWidget:visible flag
*/
gboolean
nmt_newt_widget_get_visible (NmtNewtWidget *widget)
nmt_newt_widget_get_visible(NmtNewtWidget *widget)
{
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE (widget);
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE(widget);
return priv->visible;
}
@ -376,16 +369,15 @@ nmt_newt_widget_get_visible (NmtNewtWidget *widget)
* Sets @widget's #NmtNewtWidget:visible flag, qv.
*/
void
nmt_newt_widget_set_visible (NmtNewtWidget *widget,
gboolean visible)
nmt_newt_widget_set_visible(NmtNewtWidget *widget, gboolean visible)
{
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE (widget);
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE(widget);
visible = !!visible;
if (priv->visible != visible) {
priv->visible = visible;
g_object_notify (G_OBJECT (widget), "visible");
nmt_newt_widget_needs_rebuild (widget);
g_object_notify(G_OBJECT(widget), "visible");
nmt_newt_widget_needs_rebuild(widget);
}
}
@ -399,14 +391,13 @@ nmt_newt_widget_set_visible (NmtNewtWidget *widget,
* container-specific method to actually add a widget to a container.
*/
void
nmt_newt_widget_set_parent (NmtNewtWidget *widget,
NmtNewtWidget *parent)
nmt_newt_widget_set_parent(NmtNewtWidget *widget, NmtNewtWidget *parent)
{
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE (widget);
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE(widget);
g_clear_object (&priv->parent);
priv->parent = parent ? g_object_ref (parent) : NULL;
g_object_notify (G_OBJECT (widget), "parent");
g_clear_object(&priv->parent);
priv->parent = parent ? g_object_ref(parent) : NULL;
g_object_notify(G_OBJECT(widget), "parent");
}
/**
@ -418,9 +409,9 @@ nmt_newt_widget_set_parent (NmtNewtWidget *widget,
* Returns: @widget's parent
*/
NmtNewtWidget *
nmt_newt_widget_get_parent (NmtNewtWidget *widget)
nmt_newt_widget_get_parent(NmtNewtWidget *widget)
{
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE (widget);
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE(widget);
return priv->parent;
}
@ -434,12 +425,12 @@ nmt_newt_widget_get_parent (NmtNewtWidget *widget)
* Returns: @widget's #NmtNewtForm
*/
NmtNewtForm *
nmt_newt_widget_get_form (NmtNewtWidget *widget)
nmt_newt_widget_get_form(NmtNewtWidget *widget)
{
while (widget) {
if (NMT_IS_NEWT_FORM (widget))
return NMT_NEWT_FORM (widget);
widget = nmt_newt_widget_get_parent (widget);
if (NMT_IS_NEWT_FORM(widget))
return NMT_NEWT_FORM(widget);
widget = nmt_newt_widget_get_parent(widget);
}
return NULL;
@ -455,9 +446,9 @@ nmt_newt_widget_get_form (NmtNewtWidget *widget)
* Returns: @widget's #NmtNewtWidget:valid flag
*/
gboolean
nmt_newt_widget_get_valid (NmtNewtWidget *widget)
nmt_newt_widget_get_valid(NmtNewtWidget *widget)
{
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE (widget);
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE(widget);
return priv->valid;
}
@ -475,17 +466,16 @@ nmt_newt_widget_get_valid (NmtNewtWidget *widget)
* point.
*/
void
nmt_newt_widget_set_valid (NmtNewtWidget *widget,
gboolean valid)
nmt_newt_widget_set_valid(NmtNewtWidget *widget, gboolean valid)
{
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE (widget);
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE(widget);
valid = !!valid;
if (priv->valid == valid)
return;
priv->valid = valid;
g_object_notify (G_OBJECT (widget), "valid");
g_object_notify(G_OBJECT(widget), "valid");
}
/**
@ -500,68 +490,62 @@ nmt_newt_widget_set_valid (NmtNewtWidget *widget,
* creating a new one.
*/
void
nmt_newt_widget_needs_rebuild (NmtNewtWidget *widget)
nmt_newt_widget_needs_rebuild(NmtNewtWidget *widget)
{
g_signal_emit (widget, signals[NEEDS_REBUILD], 0);
g_signal_emit(widget, signals[NEEDS_REBUILD], 0);
}
static void
nmt_newt_widget_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
nmt_newt_widget_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
{
NmtNewtWidget *widget = NMT_NEWT_WIDGET (object);
NmtNewtWidget *widget = NMT_NEWT_WIDGET(object);
switch (prop_id) {
case PROP_PARENT:
nmt_newt_widget_set_parent (widget, g_value_get_object (value));
nmt_newt_widget_set_parent(widget, g_value_get_object(value));
break;
case PROP_VISIBLE:
nmt_newt_widget_set_visible (widget, g_value_get_boolean (value));
nmt_newt_widget_set_visible(widget, g_value_get_boolean(value));
break;
case PROP_EXIT_ON_ACTIVATE:
nmt_newt_widget_set_exit_on_activate (widget, g_value_get_boolean (value));
nmt_newt_widget_set_exit_on_activate(widget, g_value_get_boolean(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_newt_widget_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
nmt_newt_widget_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
{
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE (object);
NmtNewtWidgetPrivate *priv = NMT_NEWT_WIDGET_GET_PRIVATE(object);
switch (prop_id) {
case PROP_PARENT:
g_value_set_object (value, priv->parent);
g_value_set_object(value, priv->parent);
break;
case PROP_VISIBLE:
g_value_set_boolean (value, priv->visible);
g_value_set_boolean(value, priv->visible);
break;
case PROP_VALID:
g_value_set_boolean (value, priv->valid);
g_value_set_boolean(value, priv->valid);
break;
case PROP_EXIT_ON_ACTIVATE:
g_value_set_boolean (value, priv->exit_on_activate);
g_value_set_boolean(value, priv->exit_on_activate);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_newt_widget_class_init (NmtNewtWidgetClass *widget_class)
nmt_newt_widget_class_init(NmtNewtWidgetClass *widget_class)
{
GObjectClass *object_class = G_OBJECT_CLASS (widget_class);
GObjectClass *object_class = G_OBJECT_CLASS(widget_class);
g_type_class_add_private (widget_class, sizeof (NmtNewtWidgetPrivate));
g_type_class_add_private(widget_class, sizeof(NmtNewtWidgetPrivate));
/* virtual methods */
object_class->set_property = nmt_newt_widget_set_property;
@ -580,13 +564,15 @@ nmt_newt_widget_class_init (NmtNewtWidgetClass *widget_class)
* or any of its children. This signal propagates up the container
* hierarchy, eventually reaching the top-level #NmtNewtForm.
*/
signals[NEEDS_REBUILD] =
g_signal_new ("needs-rebuild",
G_OBJECT_CLASS_TYPE (object_class),
signals[NEEDS_REBUILD] = g_signal_new("needs-rebuild",
G_OBJECT_CLASS_TYPE(object_class),
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (NmtNewtWidgetClass, needs_rebuild),
NULL, NULL, NULL,
G_TYPE_NONE, 0);
G_STRUCT_OFFSET(NmtNewtWidgetClass, needs_rebuild),
NULL,
NULL,
NULL,
G_TYPE_NONE,
0);
/**
* NmtNewtWidget::activated:
@ -594,13 +580,15 @@ nmt_newt_widget_class_init (NmtNewtWidgetClass *widget_class)
*
* Emitted when the widget's #newtComponent is activated.
*/
signals[ACTIVATED] =
g_signal_new ("activated",
G_OBJECT_CLASS_TYPE (object_class),
signals[ACTIVATED] = g_signal_new("activated",
G_OBJECT_CLASS_TYPE(object_class),
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (NmtNewtWidgetClass, activated),
NULL, NULL, NULL,
G_TYPE_NONE, 0);
G_STRUCT_OFFSET(NmtNewtWidgetClass, activated),
NULL,
NULL,
NULL,
G_TYPE_NONE,
0);
/* properties */
@ -609,24 +597,23 @@ nmt_newt_widget_class_init (NmtNewtWidgetClass *widget_class)
*
* The widget's parent widget, or %NULL if it has no parent.
*/
g_object_class_install_property
(object_class, PROP_PARENT,
g_param_spec_object ("parent", "", "",
g_object_class_install_property(object_class,
PROP_PARENT,
g_param_spec_object("parent",
"",
"",
NMT_TYPE_NEWT_WIDGET,
G_PARAM_READABLE |
G_PARAM_STATIC_STRINGS));
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
/**
* NmtNewtWidget:visible:
*
* Whether the widget is visible. Invisible widgets do not get
* realized or sized.
*/
g_object_class_install_property
(object_class, PROP_VISIBLE,
g_param_spec_boolean ("visible", "", "",
TRUE,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
object_class,
PROP_VISIBLE,
g_param_spec_boolean("visible", "", "", TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
* NmtNewtWidget:valid:
*
@ -634,22 +621,22 @@ nmt_newt_widget_class_init (NmtNewtWidgetClass *widget_class)
* determine their own validity. A container, by default, is
* considered valid if all of its children are valid.
*/
g_object_class_install_property
(object_class, PROP_VALID,
g_param_spec_boolean ("valid", "", "",
TRUE,
G_PARAM_READABLE |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
object_class,
PROP_VALID,
g_param_spec_boolean("valid", "", "", TRUE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
/**
* NmtNewtWidget:exit-on-activate:
*
* If %TRUE, the widget will call nmt_newt_form_quit() on its form
* when it is activated.
*/
g_object_class_install_property
(object_class, PROP_EXIT_ON_ACTIVATE,
g_param_spec_boolean ("exit-on-activate", "", "",
g_object_class_install_property(
object_class,
PROP_EXIT_ON_ACTIVATE,
g_param_spec_boolean("exit-on-activate",
"",
"",
FALSE,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
}

View file

@ -8,94 +8,78 @@
#include "nmt-newt-types.h"
#define NMT_TYPE_NEWT_WIDGET (nmt_newt_widget_get_type ())
#define NMT_NEWT_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMT_TYPE_NEWT_WIDGET, NmtNewtWidget))
#define NMT_NEWT_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NMT_TYPE_NEWT_WIDGET, NmtNewtWidgetClass))
#define NMT_IS_NEWT_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NMT_TYPE_NEWT_WIDGET))
#define NMT_IS_NEWT_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NMT_TYPE_NEWT_WIDGET))
#define NMT_NEWT_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NMT_TYPE_NEWT_WIDGET, NmtNewtWidgetClass))
#define NMT_TYPE_NEWT_WIDGET (nmt_newt_widget_get_type())
#define NMT_NEWT_WIDGET(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), NMT_TYPE_NEWT_WIDGET, NmtNewtWidget))
#define NMT_NEWT_WIDGET_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), NMT_TYPE_NEWT_WIDGET, NmtNewtWidgetClass))
#define NMT_IS_NEWT_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), NMT_TYPE_NEWT_WIDGET))
#define NMT_IS_NEWT_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NMT_TYPE_NEWT_WIDGET))
#define NMT_NEWT_WIDGET_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), NMT_TYPE_NEWT_WIDGET, NmtNewtWidgetClass))
struct _NmtNewtWidget {
GInitiallyUnowned parent;
};
typedef struct {
GInitiallyUnownedClass parent;
/* signals */
void (*needs_rebuild) (NmtNewtWidget *widget);
void (*activated) (NmtNewtWidget *widget);
void (*needs_rebuild)(NmtNewtWidget *widget);
void (*activated)(NmtNewtWidget *widget);
/* methods */
void (*realize) (NmtNewtWidget *widget);
void (*unrealize) (NmtNewtWidget *widget);
void (*realize)(NmtNewtWidget *widget);
void (*unrealize)(NmtNewtWidget *widget);
newtComponent * (*get_components) (NmtNewtWidget *widget);
NmtNewtWidget * (*find_component) (NmtNewtWidget *widget,
newtComponent co);
newtComponent *(*get_components)(NmtNewtWidget *widget);
NmtNewtWidget *(*find_component)(NmtNewtWidget *widget, newtComponent co);
void (*size_request) (NmtNewtWidget *widget,
int *width,
int *height);
void (*size_allocate) (NmtNewtWidget *widget,
int x,
int y,
int width,
int height);
void (*size_request)(NmtNewtWidget *widget, int *width, int *height);
void (*size_allocate)(NmtNewtWidget *widget, int x, int y, int width, int height);
newtComponent (*get_focus_component) (NmtNewtWidget *widget);
newtComponent (*get_focus_component)(NmtNewtWidget *widget);
} NmtNewtWidgetClass;
GType nmt_newt_widget_get_type (void);
GType nmt_newt_widget_get_type(void);
void nmt_newt_widget_realize (NmtNewtWidget *widget);
void nmt_newt_widget_unrealize (NmtNewtWidget *widget);
gboolean nmt_newt_widget_get_realized (NmtNewtWidget *widget);
void nmt_newt_widget_realize(NmtNewtWidget *widget);
void nmt_newt_widget_unrealize(NmtNewtWidget *widget);
gboolean nmt_newt_widget_get_realized(NmtNewtWidget *widget);
newtComponent *nmt_newt_widget_get_components (NmtNewtWidget *widget);
newtComponent *nmt_newt_widget_get_components(NmtNewtWidget *widget);
void nmt_newt_widget_set_padding (NmtNewtWidget *widget,
void nmt_newt_widget_set_padding(NmtNewtWidget *widget,
int pad_left,
int pad_top,
int pad_right,
int pad_bottom);
void nmt_newt_widget_size_request (NmtNewtWidget *widget,
int *width,
int *height);
void nmt_newt_widget_size_allocate (NmtNewtWidget *widget,
int x,
int y,
int width,
int height);
void nmt_newt_widget_size_request(NmtNewtWidget *widget, int *width, int *height);
void nmt_newt_widget_size_allocate(NmtNewtWidget *widget, int x, int y, int width, int height);
void nmt_newt_widget_set_parent (NmtNewtWidget *widget,
NmtNewtWidget *parent);
NmtNewtWidget *nmt_newt_widget_get_parent (NmtNewtWidget *widget);
void nmt_newt_widget_set_parent(NmtNewtWidget *widget, NmtNewtWidget *parent);
NmtNewtWidget *nmt_newt_widget_get_parent(NmtNewtWidget *widget);
NmtNewtForm *nmt_newt_widget_get_form (NmtNewtWidget *widget);
NmtNewtForm *nmt_newt_widget_get_form(NmtNewtWidget *widget);
gboolean nmt_newt_widget_get_visible (NmtNewtWidget *widget);
void nmt_newt_widget_set_visible (NmtNewtWidget *widget,
gboolean visible);
gboolean nmt_newt_widget_get_visible(NmtNewtWidget *widget);
void nmt_newt_widget_set_visible(NmtNewtWidget *widget, gboolean visible);
newtComponent nmt_newt_widget_get_focus_component (NmtNewtWidget *widget);
newtComponent nmt_newt_widget_get_focus_component(NmtNewtWidget *widget);
void nmt_newt_widget_activated (NmtNewtWidget *widget);
gboolean nmt_newt_widget_get_exit_on_activate (NmtNewtWidget *widget);
void nmt_newt_widget_set_exit_on_activate (NmtNewtWidget *widget,
gboolean exit_on_activate);
void nmt_newt_widget_activated(NmtNewtWidget *widget);
gboolean nmt_newt_widget_get_exit_on_activate(NmtNewtWidget *widget);
void nmt_newt_widget_set_exit_on_activate(NmtNewtWidget *widget, gboolean exit_on_activate);
gboolean nmt_newt_widget_get_valid (NmtNewtWidget *widget);
gboolean nmt_newt_widget_get_valid(NmtNewtWidget *widget);
NmtNewtWidget *nmt_newt_widget_find_component (NmtNewtWidget *widget,
newtComponent co);
NmtNewtWidget *nmt_newt_widget_find_component(NmtNewtWidget *widget, newtComponent co);
/* protected */
void nmt_newt_widget_needs_rebuild (NmtNewtWidget *widget);
void nmt_newt_widget_set_valid (NmtNewtWidget *widget,
gboolean valid);
void nmt_newt_widget_needs_rebuild(NmtNewtWidget *widget);
void nmt_newt_widget_set_valid(NmtNewtWidget *widget, gboolean valid);
#endif /* NMT_NEWT_WIDGET_H */

File diff suppressed because it is too large Load diff

View file

@ -6,52 +6,51 @@
#ifndef NM_EDITOR_BINDINGS_H
#define NM_EDITOR_BINDINGS_H
void nm_editor_bindings_init (void);
void nm_editor_bindings_init(void);
void nm_editor_bind_ip_addresses_with_prefix_to_strv (int family,
void nm_editor_bind_ip_addresses_with_prefix_to_strv(int family,
gpointer source,
const char *source_property,
const char * source_property,
gpointer target,
const char *target_property,
const char * target_property,
GBindingFlags flags);
void nm_editor_bind_ip_addresses_to_strv (int family,
void nm_editor_bind_ip_addresses_to_strv(int family,
gpointer source,
const char *source_property,
const char * source_property,
gpointer target,
const char *target_property,
const char * target_property,
GBindingFlags flags);
void nm_editor_bind_ip_gateway_to_string (int family,
void nm_editor_bind_ip_gateway_to_string(int family,
NMSettingIPConfig *source,
gpointer target,
const char *target_property,
const char *target_sensitive_property,
const char * target_property,
const char * target_sensitive_property,
GBindingFlags flags);
void nm_editor_bind_ip_route_to_strings (int family,
void nm_editor_bind_ip_route_to_strings(int family,
gpointer source,
const char *source_property,
const char * source_property,
gpointer dest_target,
const char *dest_target_property,
const char * dest_target_property,
gpointer next_hop_target,
const char *next_hop_target_property,
const char * next_hop_target_property,
gpointer metric_target,
const char *metric_target_property,
const char * metric_target_property,
GBindingFlags flags);
void nm_editor_bind_wireless_security_method (NMConnection *connection,
void nm_editor_bind_wireless_security_method(NMConnection * connection,
NMSettingWirelessSecurity *s_wsec,
gpointer target,
const char *target_property,
const char * target_property,
GBindingFlags flags);
void nm_editor_bind_wireless_security_wep_key (NMSettingWirelessSecurity *s_wsec,
void nm_editor_bind_wireless_security_wep_key(NMSettingWirelessSecurity *s_wsec,
gpointer entry,
const char *entry_property,
const char * entry_property,
gpointer key_selector,
const char *key_selector_property,
const char * key_selector_property,
GBindingFlags flags);
void nm_editor_bind_vlan_name (NMSettingVlan *s_vlan,
NMSettingConnection *s_con);
void nm_editor_bind_vlan_name(NMSettingVlan *s_vlan, NMSettingConnection *s_con);
#endif /* NM_EDITOR_BINDINGS_H */

View file

@ -16,7 +16,7 @@
#include "nm-editor-utils.h"
#if 0
#include "nm-vpn-helpers.h"
#include "nm-vpn-helpers.h"
static GSList *vpn_plugins;
@ -41,23 +41,17 @@ sort_vpn_plugins (gconstpointer a, gconstpointer b)
#endif
static void
wifi_connection_setup_func (NMConnection *connection,
NMSettingConnection *s_con,
NMSetting *s_hw)
wifi_connection_setup_func(NMConnection *connection, NMSettingConnection *s_con, NMSetting *s_hw)
{
g_object_set (G_OBJECT (s_hw),
NM_SETTING_WIRELESS_MODE, NM_SETTING_WIRELESS_MODE_INFRA,
NULL);
g_object_set(G_OBJECT(s_hw), NM_SETTING_WIRELESS_MODE, NM_SETTING_WIRELESS_MODE_INFRA, NULL);
}
static void
bond_connection_setup_func (NMConnection *connection,
NMSettingConnection *s_con,
NMSetting *s_hw)
bond_connection_setup_func(NMConnection *connection, NMSettingConnection *s_con, NMSetting *s_hw)
{
NMSettingBond *s_bond = NM_SETTING_BOND (s_hw);
NMSettingBond * s_bond = NM_SETTING_BOND(s_hw);
guint i;
const char *value;
const char * value;
static const char *const options[] = {
NM_SETTING_BOND_OPTION_MODE,
NM_SETTING_BOND_OPTION_MIIMON,
@ -65,44 +59,43 @@ bond_connection_setup_func (NMConnection *connection,
NM_SETTING_BOND_OPTION_UPDELAY,
};
for (i = 0; i < G_N_ELEMENTS (options); i++) {
value = nm_setting_bond_get_option_default (s_bond, options[i]);
for (i = 0; i < G_N_ELEMENTS(options); i++) {
value = nm_setting_bond_get_option_default(s_bond, options[i]);
if (value)
nm_setting_bond_add_option (s_bond, options[i], value);
nm_setting_bond_add_option(s_bond, options[i], value);
}
}
typedef void (*NMEditorNewConnectionSetupFunc) (NMConnection *connection,
typedef void (*NMEditorNewConnectionSetupFunc)(NMConnection * connection,
NMSettingConnection *s_con,
NMSetting *s_hw);
NMSetting * s_hw);
typedef struct {
NMEditorConnectionTypeData data;
const char *id_format;
const char * id_format;
NMEditorNewConnectionSetupFunc connection_setup_func;
gboolean no_autoconnect;
} NMEditorConnectionTypeDataReal;
static int
sort_types (gconstpointer a, gconstpointer b)
sort_types(gconstpointer a, gconstpointer b)
{
NMEditorConnectionTypeData *typea = *(NMEditorConnectionTypeData **)a;
NMEditorConnectionTypeData *typeb = *(NMEditorConnectionTypeData **)b;
NMEditorConnectionTypeData *typea = *(NMEditorConnectionTypeData **) a;
NMEditorConnectionTypeData *typeb = *(NMEditorConnectionTypeData **) b;
if (typea->virtual && !typeb->virtual)
return 1;
else if (typeb->virtual && !typea->virtual)
return -1;
if (typea->setting_type == NM_TYPE_SETTING_VPN &&
typeb->setting_type != NM_TYPE_SETTING_VPN)
if (typea->setting_type == NM_TYPE_SETTING_VPN && typeb->setting_type != NM_TYPE_SETTING_VPN)
return 1;
else if (typeb->setting_type == NM_TYPE_SETTING_VPN &&
typea->setting_type != NM_TYPE_SETTING_VPN)
else if (typeb->setting_type == NM_TYPE_SETTING_VPN
&& typea->setting_type != NM_TYPE_SETTING_VPN)
return -1;
return g_utf8_collate (typea->name, typeb->name);
return g_utf8_collate(typea->name, typeb->name);
}
/**
@ -116,10 +109,10 @@ sort_types (gconstpointer a, gconstpointer b)
* Returns: the array of connection type information
*/
NMEditorConnectionTypeData **
nm_editor_utils_get_connection_type_list (void)
nm_editor_utils_get_connection_type_list(void)
{
GPtrArray *array;
NMEditorConnectionTypeDataReal *item;
GPtrArray * array;
NMEditorConnectionTypeDataReal * item;
static NMEditorConnectionTypeData **list;
#if 0
GHashTable *vpn_plugins_hash;
@ -129,32 +122,32 @@ nm_editor_utils_get_connection_type_list (void)
if (list)
return list;
array = g_ptr_array_new ();
array = g_ptr_array_new();
item = g_new0 (NMEditorConnectionTypeDataReal, 1);
item = g_new0(NMEditorConnectionTypeDataReal, 1);
item->data.name = _("Ethernet");
item->data.setting_type = NM_TYPE_SETTING_WIRED;
item->data.device_type = NM_TYPE_DEVICE_ETHERNET;
item->data.virtual = FALSE;
item->id_format = _("Ethernet connection %d");
g_ptr_array_add (array, item);
g_ptr_array_add(array, item);
item = g_new0 (NMEditorConnectionTypeDataReal, 1);
item = g_new0(NMEditorConnectionTypeDataReal, 1);
item->data.name = _("Wi-Fi");
item->data.setting_type = NM_TYPE_SETTING_WIRELESS;
item->data.device_type = NM_TYPE_DEVICE_WIFI;
item->data.virtual = FALSE;
item->id_format = _("Wi-Fi connection %d");
item->connection_setup_func = wifi_connection_setup_func;
g_ptr_array_add (array, item);
g_ptr_array_add(array, item);
item = g_new0 (NMEditorConnectionTypeDataReal, 1);
item = g_new0(NMEditorConnectionTypeDataReal, 1);
item->data.name = _("InfiniBand");
item->data.setting_type = NM_TYPE_SETTING_INFINIBAND;
item->data.device_type = NM_TYPE_DEVICE_INFINIBAND;
item->data.virtual = FALSE;
item->id_format = _("InfiniBand connection %d");
g_ptr_array_add (array, item);
g_ptr_array_add(array, item);
#if 0
item = g_new0 (NMEditorConnectionTypeDataReal, 1);
@ -166,57 +159,57 @@ nm_editor_utils_get_connection_type_list (void)
g_ptr_array_add (array, item);
#endif
item = g_new0 (NMEditorConnectionTypeDataReal, 1);
item = g_new0(NMEditorConnectionTypeDataReal, 1);
item->data.name = _("DSL");
item->data.setting_type = NM_TYPE_SETTING_PPPOE;
item->data.device_type = NM_TYPE_DEVICE_ETHERNET;
item->data.virtual = FALSE;
item->id_format = _("DSL connection %d");
item->no_autoconnect = TRUE;
g_ptr_array_add (array, item);
g_ptr_array_add(array, item);
item = g_new0 (NMEditorConnectionTypeDataReal, 1);
item = g_new0(NMEditorConnectionTypeDataReal, 1);
item->data.name = _("Bond");
item->data.setting_type = NM_TYPE_SETTING_BOND;
item->data.device_type = NM_TYPE_DEVICE_BOND;
item->data.virtual = TRUE;
item->id_format = _("Bond connection %d");
item->connection_setup_func = bond_connection_setup_func;
g_ptr_array_add (array, item);
g_ptr_array_add(array, item);
item = g_new0 (NMEditorConnectionTypeDataReal, 1);
item = g_new0(NMEditorConnectionTypeDataReal, 1);
item->data.name = _("Bridge");
item->data.setting_type = NM_TYPE_SETTING_BRIDGE;
item->data.slave_setting_type = NM_TYPE_SETTING_BRIDGE_PORT;
item->data.device_type = NM_TYPE_DEVICE_BRIDGE;
item->data.virtual = TRUE;
item->id_format = _("Bridge connection %d");
g_ptr_array_add (array, item);
g_ptr_array_add(array, item);
item = g_new0 (NMEditorConnectionTypeDataReal, 1);
item = g_new0(NMEditorConnectionTypeDataReal, 1);
item->data.name = _("Team");
item->data.setting_type = NM_TYPE_SETTING_TEAM;
item->data.slave_setting_type = NM_TYPE_SETTING_TEAM_PORT;
item->data.device_type = NM_TYPE_DEVICE_TEAM;
item->data.virtual = TRUE;
item->id_format = _("Team connection %d");
g_ptr_array_add (array, item);
g_ptr_array_add(array, item);
item = g_new0 (NMEditorConnectionTypeDataReal, 1);
item = g_new0(NMEditorConnectionTypeDataReal, 1);
item->data.name = _("VLAN");
item->data.setting_type = NM_TYPE_SETTING_VLAN;
item->data.device_type = NM_TYPE_DEVICE_VLAN;
item->data.virtual = TRUE;
item->id_format = _("VLAN connection %d");
g_ptr_array_add (array, item);
g_ptr_array_add(array, item);
item = g_new0 (NMEditorConnectionTypeDataReal, 1);
item = g_new0(NMEditorConnectionTypeDataReal, 1);
item->data.name = _("IP tunnel");
item->data.setting_type = NM_TYPE_SETTING_IP_TUNNEL;
item->data.device_type = NM_TYPE_DEVICE_IP_TUNNEL;
item->data.virtual = TRUE;
item->id_format = _("IP tunnel connection %d");
g_ptr_array_add (array, item);
g_ptr_array_add(array, item);
#if 0
/* Add "VPN" only if there are plugins */
@ -242,55 +235,54 @@ nm_editor_utils_get_connection_type_list (void)
}
#endif
g_ptr_array_sort (array, sort_types);
g_ptr_array_add (array, NULL);
g_ptr_array_sort(array, sort_types);
g_ptr_array_add(array, NULL);
list = (NMEditorConnectionTypeData **)g_ptr_array_free (array, FALSE);
list = (NMEditorConnectionTypeData **) g_ptr_array_free(array, FALSE);
return list;
}
static gboolean
_assert_format_int (const char *format)
_assert_format_int(const char *format)
{
g_assert (format);
format = strchr (format, '%');
g_assert (format);
g_assert(format);
format = strchr(format, '%');
g_assert(format);
format++;
g_assert (!strchr (format, '%'));
g_assert (format[0] == 'd');
g_assert(!strchr(format, '%'));
g_assert(format[0] == 'd');
return TRUE;
}
static char *
get_available_connection_name (const char *format,
NMClient *client)
get_available_connection_name(const char *format, NMClient *client)
{
const GPtrArray *conns;
GSList *names = NULL, *iter;
char *cname = NULL;
GSList * names = NULL, *iter;
char * cname = NULL;
int i = 0;
nm_assert (_assert_format_int (format));
nm_assert(_assert_format_int(format));
conns = nm_client_get_connections (client);
conns = nm_client_get_connections(client);
for (i = 0; i < conns->len; i++) {
const char *id;
id = nm_connection_get_id (NM_CONNECTION (conns->pdata[i]));
g_assert (id);
names = g_slist_append (names, (gpointer) id);
id = nm_connection_get_id(NM_CONNECTION(conns->pdata[i]));
g_assert(id);
names = g_slist_append(names, (gpointer) id);
}
/* Find the next available unique connection name */
for (i = 1; !cname && i < 10000; i++) {
char *temp;
char * temp;
gboolean found = FALSE;
NM_PRAGMA_WARNING_DISABLE("-Wformat-nonliteral")
temp = g_strdup_printf (format, i);
temp = g_strdup_printf(format, i);
NM_PRAGMA_WARNING_REENABLE
for (iter = names; iter; iter = g_slist_next (iter)) {
if (!strcmp (iter->data, temp)) {
for (iter = names; iter; iter = g_slist_next(iter)) {
if (!strcmp(iter->data, temp)) {
found = TRUE;
break;
}
@ -298,33 +290,32 @@ get_available_connection_name (const char *format,
if (!found)
cname = temp;
else
g_free (temp);
g_free(temp);
}
g_slist_free (names);
g_slist_free(names);
return cname;
}
static char *
get_available_iface_name (const char *try_name,
NMClient *client)
get_available_iface_name(const char *try_name, NMClient *client)
{
const GPtrArray *connections;
NMConnection *connection;
char *new_name;
NMConnection * connection;
char * new_name;
unsigned num = 1;
int i = 0;
const char *ifname = NULL;
const char * ifname = NULL;
connections = nm_client_get_connections (client);
connections = nm_client_get_connections(client);
new_name = g_strdup (try_name);
new_name = g_strdup(try_name);
while (i < connections->len) {
connection = NM_CONNECTION (connections->pdata[i]);
ifname = nm_connection_get_interface_name (connection);
if (g_strcmp0 (new_name, ifname) == 0) {
g_free (new_name);
new_name = g_strdup_printf ("%s%d", try_name, num++);
connection = NM_CONNECTION(connections->pdata[i]);
ifname = nm_connection_get_interface_name(connection);
if (g_strcmp0(new_name, ifname) == 0) {
g_free(new_name);
new_name = g_strdup_printf("%s%d", try_name, num++);
i = 0;
} else
i++;
@ -348,83 +339,87 @@ get_available_iface_name (const char *try_name,
* Returns: a new #NMConnection
*/
NMConnection *
nm_editor_utils_create_connection (GType type,
NMConnection *master,
NMClient *client)
nm_editor_utils_create_connection(GType type, NMConnection *master, NMClient *client)
{
NMEditorConnectionTypeData **types;
NMEditorConnectionTypeData ** types;
NMEditorConnectionTypeDataReal *type_data = NULL;
const char *master_setting_type = NULL, *master_uuid = NULL;
const char * master_setting_type = NULL, *master_uuid = NULL;
GType master_type = G_TYPE_INVALID, slave_setting_type = G_TYPE_INVALID;
NMConnection *connection;
NMConnection * connection;
NMSettingConnection *s_con;
NMSetting *s_hw, *s_slave;
char *uuid, *id, *ifname;
NMSetting * s_hw, *s_slave;
char * uuid, *id, *ifname;
int i;
if (master) {
NMSettingConnection *master_s_con;
master_s_con = nm_connection_get_setting_connection (master);
master_setting_type = nm_setting_connection_get_connection_type (master_s_con);
master_uuid = nm_setting_connection_get_uuid (master_s_con);
master_type = nm_setting_lookup_type (master_setting_type);
master_s_con = nm_connection_get_setting_connection(master);
master_setting_type = nm_setting_connection_get_connection_type(master_s_con);
master_uuid = nm_setting_connection_get_uuid(master_s_con);
master_type = nm_setting_lookup_type(master_setting_type);
}
types = nm_editor_utils_get_connection_type_list ();
types = nm_editor_utils_get_connection_type_list();
for (i = 0; types[i]; i++) {
if (types[i]->setting_type == type)
type_data = (NMEditorConnectionTypeDataReal *)types[i];
type_data = (NMEditorConnectionTypeDataReal *) types[i];
if (types[i]->setting_type == master_type)
slave_setting_type = types[i]->slave_setting_type;
}
if (!type_data) {
g_return_val_if_reached (NULL);
g_return_val_if_reached(NULL);
return NULL;
}
connection = nm_simple_connection_new ();
connection = nm_simple_connection_new();
s_con = NM_SETTING_CONNECTION (nm_setting_connection_new ());
nm_connection_add_setting (connection, NM_SETTING (s_con));
s_con = NM_SETTING_CONNECTION(nm_setting_connection_new());
nm_connection_add_setting(connection, NM_SETTING(s_con));
s_hw = g_object_new (type, NULL);
nm_connection_add_setting (connection, s_hw);
s_hw = g_object_new(type, NULL);
nm_connection_add_setting(connection, s_hw);
if (type == NM_TYPE_SETTING_BOND)
ifname = get_available_iface_name ("nm-bond", client);
ifname = get_available_iface_name("nm-bond", client);
else if (type == NM_TYPE_SETTING_TEAM)
ifname = get_available_iface_name ("nm-team", client);
ifname = get_available_iface_name("nm-team", client);
else if (type == NM_TYPE_SETTING_BRIDGE)
ifname = get_available_iface_name ("nm-bridge", client);
ifname = get_available_iface_name("nm-bridge", client);
else
ifname = NULL;
if (slave_setting_type != G_TYPE_INVALID) {
s_slave = g_object_new (slave_setting_type, NULL);
nm_connection_add_setting (connection, s_slave);
s_slave = g_object_new(slave_setting_type, NULL);
nm_connection_add_setting(connection, s_slave);
}
uuid = nm_utils_uuid_generate ();
id = get_available_connection_name (type_data->id_format, client);
uuid = nm_utils_uuid_generate();
id = get_available_connection_name(type_data->id_format, client);
g_object_set (s_con,
NM_SETTING_CONNECTION_UUID, uuid,
NM_SETTING_CONNECTION_ID, id,
NM_SETTING_CONNECTION_TYPE, nm_setting_get_name (s_hw),
NM_SETTING_CONNECTION_AUTOCONNECT, !type_data->no_autoconnect,
NM_SETTING_CONNECTION_MASTER, master_uuid,
NM_SETTING_CONNECTION_SLAVE_TYPE, master_setting_type,
NM_SETTING_CONNECTION_INTERFACE_NAME, ifname,
g_object_set(s_con,
NM_SETTING_CONNECTION_UUID,
uuid,
NM_SETTING_CONNECTION_ID,
id,
NM_SETTING_CONNECTION_TYPE,
nm_setting_get_name(s_hw),
NM_SETTING_CONNECTION_AUTOCONNECT,
!type_data->no_autoconnect,
NM_SETTING_CONNECTION_MASTER,
master_uuid,
NM_SETTING_CONNECTION_SLAVE_TYPE,
master_setting_type,
NM_SETTING_CONNECTION_INTERFACE_NAME,
ifname,
NULL);
g_free (uuid);
g_free (id);
g_free (ifname);
g_free(uuid);
g_free(id);
g_free(ifname);
if (type_data->connection_setup_func)
type_data->connection_setup_func (connection, s_con, s_hw);
type_data->connection_setup_func(connection, s_con, s_hw);
return connection;
}
@ -439,22 +434,22 @@ nm_editor_utils_create_connection (GType type,
* Returns: the #NMEditorConnectionTypeData
*/
NMEditorConnectionTypeData *
nm_editor_utils_get_connection_type_data (NMConnection *conn)
nm_editor_utils_get_connection_type_data(NMConnection *conn)
{
NMSettingConnection *s_con;
const char *conn_type;
NMSettingConnection * s_con;
const char * conn_type;
GType conn_gtype;
NMEditorConnectionTypeData **types;
int i;
s_con = nm_connection_get_setting_connection (conn);
g_return_val_if_fail (s_con != NULL, NULL);
s_con = nm_connection_get_setting_connection(conn);
g_return_val_if_fail(s_con != NULL, NULL);
conn_type = nm_setting_connection_get_connection_type (s_con);
conn_gtype = nm_setting_lookup_type (conn_type);
g_return_val_if_fail (conn_gtype != G_TYPE_INVALID, NULL);
conn_type = nm_setting_connection_get_connection_type(s_con);
conn_gtype = nm_setting_lookup_type(conn_type);
g_return_val_if_fail(conn_gtype != G_TYPE_INVALID, NULL);
types = nm_editor_utils_get_connection_type_list ();
types = nm_editor_utils_get_connection_type_list();
for (i = 0; types[i]; i++) {
if (types[i]->setting_type == conn_gtype)
return types[i];

View file

@ -14,11 +14,9 @@ typedef struct {
gboolean virtual;
} NMEditorConnectionTypeData;
NMEditorConnectionTypeData **nm_editor_utils_get_connection_type_list (void);
NMEditorConnectionTypeData *nm_editor_utils_get_connection_type_data (NMConnection *conn);
NMEditorConnectionTypeData **nm_editor_utils_get_connection_type_list(void);
NMEditorConnectionTypeData * nm_editor_utils_get_connection_type_data(NMConnection *conn);
NMConnection *nm_editor_utils_create_connection (GType type,
NMConnection *master,
NMClient *client);
NMConnection *nm_editor_utils_create_connection(GType type, NMConnection *master, NMClient *client);
#endif /* NM_EDITOR_UTILS_H */

View file

@ -25,13 +25,14 @@
#include "nmt-ip-entry.h"
G_DEFINE_TYPE (NmtAddressList, nmt_address_list, NMT_TYPE_WIDGET_LIST)
G_DEFINE_TYPE(NmtAddressList, nmt_address_list, NMT_TYPE_WIDGET_LIST)
#define NMT_ADDRESS_LIST_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NMT_TYPE_ADDRESS_LIST, NmtAddressListPrivate))
#define NMT_ADDRESS_LIST_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE((o), NMT_TYPE_ADDRESS_LIST, NmtAddressListPrivate))
typedef struct {
NmtAddressListType list_type;
char **strings;
char ** strings;
} NmtAddressListPrivate;
enum {
@ -62,179 +63,170 @@ enum {
* Returns: a new #NmtAddressList
*/
NmtNewtWidget *
nmt_address_list_new (NmtAddressListType list_type)
nmt_address_list_new(NmtAddressListType list_type)
{
return g_object_new (NMT_TYPE_ADDRESS_LIST,
"list-type", list_type,
NULL);
return g_object_new(NMT_TYPE_ADDRESS_LIST, "list-type", list_type, NULL);
}
static void
nmt_address_list_init (NmtAddressList *list)
{
}
nmt_address_list_init(NmtAddressList *list)
{}
static gboolean
strings_transform_to_entry (GBinding *binding,
strings_transform_to_entry(GBinding * binding,
const GValue *source_value,
GValue *target_value,
GValue * target_value,
gpointer user_data)
{
int n = GPOINTER_TO_INT (user_data);
int n = GPOINTER_TO_INT(user_data);
char **strings;
strings = g_value_get_boxed (source_value);
if (n >= g_strv_length (strings))
strings = g_value_get_boxed(source_value);
if (n >= g_strv_length(strings))
return FALSE;
g_value_set_string (target_value, strings[n]);
g_value_set_string(target_value, strings[n]);
return TRUE;
}
static gboolean
strings_transform_from_entry (GBinding *binding,
strings_transform_from_entry(GBinding * binding,
const GValue *source_value,
GValue *target_value,
GValue * target_value,
gpointer user_data)
{
NmtAddressList *list = NMT_ADDRESS_LIST (g_binding_get_source (binding));
NmtAddressListPrivate *priv = NMT_ADDRESS_LIST_GET_PRIVATE (list);
int n = GPOINTER_TO_INT (user_data);
NmtAddressList * list = NMT_ADDRESS_LIST(g_binding_get_source(binding));
NmtAddressListPrivate *priv = NMT_ADDRESS_LIST_GET_PRIVATE(list);
int n = GPOINTER_TO_INT(user_data);
if (n >= g_strv_length (priv->strings))
if (n >= g_strv_length(priv->strings))
return FALSE;
g_free (priv->strings[n]);
priv->strings[n] = g_value_dup_string (source_value);
g_free(priv->strings[n]);
priv->strings[n] = g_value_dup_string(source_value);
g_value_set_boxed (target_value, priv->strings);
g_value_set_boxed(target_value, priv->strings);
return TRUE;
}
static gboolean
hostname_filter (NmtNewtEntry *entry,
const char *text,
int ch,
int position,
gpointer user_data)
hostname_filter(NmtNewtEntry *entry, const char *text, int ch, int position, gpointer user_data)
{
return g_ascii_isalnum (ch) || ch == '.' || ch == '-';
return g_ascii_isalnum(ch) || ch == '.' || ch == '-';
}
static NmtNewtWidget *
nmt_address_list_create_widget (NmtWidgetList *list,
int num)
nmt_address_list_create_widget(NmtWidgetList *list, int num)
{
NmtAddressListPrivate *priv = NMT_ADDRESS_LIST_GET_PRIVATE (list);
NmtNewtWidget *entry;
NmtAddressListPrivate *priv = NMT_ADDRESS_LIST_GET_PRIVATE(list);
NmtNewtWidget * entry;
if (priv->list_type == NMT_ADDRESS_LIST_IP4_WITH_PREFIX)
entry = nmt_ip_entry_new (25, AF_INET, TRUE, FALSE);
entry = nmt_ip_entry_new(25, AF_INET, TRUE, FALSE);
else if (priv->list_type == NMT_ADDRESS_LIST_IP4)
entry = nmt_ip_entry_new (25, AF_INET, FALSE, FALSE);
entry = nmt_ip_entry_new(25, AF_INET, FALSE, FALSE);
else if (priv->list_type == NMT_ADDRESS_LIST_IP6_WITH_PREFIX)
entry = nmt_ip_entry_new (25, AF_INET6, TRUE, FALSE);
entry = nmt_ip_entry_new(25, AF_INET6, TRUE, FALSE);
else if (priv->list_type == NMT_ADDRESS_LIST_IP6)
entry = nmt_ip_entry_new (25, AF_INET6, FALSE, FALSE);
entry = nmt_ip_entry_new(25, AF_INET6, FALSE, FALSE);
else if (priv->list_type == NMT_ADDRESS_LIST_HOSTNAME) {
entry = nmt_newt_entry_new (25, NMT_NEWT_ENTRY_NONEMPTY);
nmt_newt_entry_set_filter (NMT_NEWT_ENTRY (entry), hostname_filter, list);
entry = nmt_newt_entry_new(25, NMT_NEWT_ENTRY_NONEMPTY);
nmt_newt_entry_set_filter(NMT_NEWT_ENTRY(entry), hostname_filter, list);
} else
g_assert_not_reached ();
g_assert_not_reached();
g_object_bind_property_full (list, "strings", entry, "text",
g_object_bind_property_full(list,
"strings",
entry,
"text",
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE,
strings_transform_to_entry,
strings_transform_from_entry,
GINT_TO_POINTER (num), NULL);
GINT_TO_POINTER(num),
NULL);
return entry;
}
static void
nmt_address_list_add_clicked (NmtWidgetList *list)
nmt_address_list_add_clicked(NmtWidgetList *list)
{
NmtAddressListPrivate *priv = NMT_ADDRESS_LIST_GET_PRIVATE (list);
NmtAddressListPrivate *priv = NMT_ADDRESS_LIST_GET_PRIVATE(list);
int len;
len = priv->strings ? g_strv_length (priv->strings) : 0;
priv->strings = g_renew (char *, priv->strings, len + 2);
priv->strings[len] = g_strdup ("");
len = priv->strings ? g_strv_length(priv->strings) : 0;
priv->strings = g_renew(char *, priv->strings, len + 2);
priv->strings[len] = g_strdup("");
priv->strings[len + 1] = NULL;
nmt_widget_list_set_length (list, len + 1);
g_object_notify (G_OBJECT (list), "strings");
nmt_widget_list_set_length(list, len + 1);
g_object_notify(G_OBJECT(list), "strings");
}
static void
nmt_address_list_remove_clicked (NmtWidgetList *list,
int num)
nmt_address_list_remove_clicked(NmtWidgetList *list, int num)
{
NmtAddressListPrivate *priv = NMT_ADDRESS_LIST_GET_PRIVATE (list);
NmtAddressListPrivate *priv = NMT_ADDRESS_LIST_GET_PRIVATE(list);
int len;
len = g_strv_length (priv->strings);
g_free (priv->strings[num]);
memmove (priv->strings + num, priv->strings + num + 1, (len - num) * sizeof (char *));
len = g_strv_length(priv->strings);
g_free(priv->strings[num]);
memmove(priv->strings + num, priv->strings + num + 1, (len - num) * sizeof(char *));
nmt_widget_list_set_length (list, len - 1);
g_object_notify (G_OBJECT (list), "strings");
nmt_widget_list_set_length(list, len - 1);
g_object_notify(G_OBJECT(list), "strings");
}
static void
nmt_address_list_set_property (GObject *object,
nmt_address_list_set_property(GObject * object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
GParamSpec * pspec)
{
NmtAddressListPrivate *priv = NMT_ADDRESS_LIST_GET_PRIVATE (object);
NmtAddressListPrivate *priv = NMT_ADDRESS_LIST_GET_PRIVATE(object);
switch (prop_id) {
case PROP_LIST_TYPE:
priv->list_type = g_value_get_uint (value);
priv->list_type = g_value_get_uint(value);
break;
case PROP_STRINGS:
g_strfreev (priv->strings);
priv->strings = g_value_dup_boxed (value);
g_strfreev(priv->strings);
priv->strings = g_value_dup_boxed(value);
if (!priv->strings)
priv->strings = g_new0 (char *, 1);
nmt_widget_list_set_length (NMT_WIDGET_LIST (object),
g_strv_length (priv->strings));
priv->strings = g_new0(char *, 1);
nmt_widget_list_set_length(NMT_WIDGET_LIST(object), g_strv_length(priv->strings));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_address_list_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
nmt_address_list_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
{
NmtAddressListPrivate *priv = NMT_ADDRESS_LIST_GET_PRIVATE (object);
NmtAddressListPrivate *priv = NMT_ADDRESS_LIST_GET_PRIVATE(object);
switch (prop_id) {
case PROP_LIST_TYPE:
g_value_set_uint (value, priv->list_type);
g_value_set_uint(value, priv->list_type);
break;
case PROP_STRINGS:
g_value_set_boxed (value, priv->strings);
g_value_set_boxed(value, priv->strings);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_address_list_class_init (NmtAddressListClass *list_class)
nmt_address_list_class_init(NmtAddressListClass *list_class)
{
GObjectClass *object_class = G_OBJECT_CLASS (list_class);
NmtWidgetListClass *widget_list_class = NMT_WIDGET_LIST_CLASS (list_class);
GObjectClass * object_class = G_OBJECT_CLASS(list_class);
NmtWidgetListClass *widget_list_class = NMT_WIDGET_LIST_CLASS(list_class);
g_type_class_add_private (list_class, sizeof (NmtAddressListPrivate));
g_type_class_add_private(list_class, sizeof(NmtAddressListPrivate));
/* virtual methods */
object_class->set_property = nmt_address_list_set_property;
@ -249,22 +241,26 @@ nmt_address_list_class_init (NmtAddressListClass *list_class)
*
* The type of address the list holds.
*/
g_object_class_install_property
(object_class, PROP_LIST_TYPE,
g_param_spec_uint ("list-type", "", "",
0, G_MAXUINT, 0,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
object_class,
PROP_LIST_TYPE,
g_param_spec_uint("list-type",
"",
"",
0,
G_MAXUINT,
0,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
/**
* NmtAddressList:strings:
*
* The strings in the list's entries.
*/
g_object_class_install_property
(object_class, PROP_STRINGS,
g_param_spec_boxed ("strings", "", "",
g_object_class_install_property(object_class,
PROP_STRINGS,
g_param_spec_boxed("strings",
"",
"",
G_TYPE_STRV,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
}

View file

@ -8,12 +8,15 @@
#include "nmt-widget-list.h"
#define NMT_TYPE_ADDRESS_LIST (nmt_address_list_get_type ())
#define NMT_ADDRESS_LIST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMT_TYPE_ADDRESS_LIST, NmtAddressList))
#define NMT_ADDRESS_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NMT_TYPE_ADDRESS_LIST, NmtAddressListClass))
#define NMT_IS_ADDRESS_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NMT_TYPE_ADDRESS_LIST))
#define NMT_IS_ADDRESS_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NMT_TYPE_ADDRESS_LIST))
#define NMT_ADDRESS_LIST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NMT_TYPE_ADDRESS_LIST, NmtAddressListClass))
#define NMT_TYPE_ADDRESS_LIST (nmt_address_list_get_type())
#define NMT_ADDRESS_LIST(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), NMT_TYPE_ADDRESS_LIST, NmtAddressList))
#define NMT_ADDRESS_LIST_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), NMT_TYPE_ADDRESS_LIST, NmtAddressListClass))
#define NMT_IS_ADDRESS_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), NMT_TYPE_ADDRESS_LIST))
#define NMT_IS_ADDRESS_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NMT_TYPE_ADDRESS_LIST))
#define NMT_ADDRESS_LIST_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), NMT_TYPE_ADDRESS_LIST, NmtAddressListClass))
typedef struct {
NmtWidgetList parent;
@ -25,7 +28,7 @@ typedef struct {
} NmtAddressListClass;
GType nmt_address_list_get_type (void);
GType nmt_address_list_get_type(void);
typedef enum {
NMT_ADDRESS_LIST_IP4_WITH_PREFIX,
@ -35,6 +38,6 @@ typedef enum {
NMT_ADDRESS_LIST_HOSTNAME
} NmtAddressListType;
NmtNewtWidget *nmt_address_list_new (NmtAddressListType list_type);
NmtNewtWidget *nmt_address_list_new(NmtAddressListType list_type);
#endif /* NMT_ADDRESS_LIST_H */

View file

@ -19,12 +19,15 @@
#include "nmt-connect-connection-list.h"
#include "nm-client-utils.h"
G_DEFINE_TYPE (NmtConnectConnectionList, nmt_connect_connection_list, NMT_TYPE_NEWT_LISTBOX)
G_DEFINE_TYPE(NmtConnectConnectionList, nmt_connect_connection_list, NMT_TYPE_NEWT_LISTBOX)
#define NMT_CONNECT_CONNECTION_LIST_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NMT_TYPE_CONNECT_CONNECTION_LIST, NmtConnectConnectionListPrivate))
#define NMT_CONNECT_CONNECTION_LIST_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE((o), \
NMT_TYPE_CONNECT_CONNECTION_LIST, \
NmtConnectConnectionListPrivate))
typedef struct {
char *name;
char * name;
NMDevice *device;
int sort_order;
@ -34,11 +37,11 @@ typedef struct {
typedef struct {
const char *name;
char *ssid;
char * ssid;
NMConnection *conn;
NMAccessPoint *ap;
NMDevice *device;
NMConnection * conn;
NMAccessPoint * ap;
NMDevice * device;
NMActiveConnection *active;
} NmtConnectConnection;
@ -54,41 +57,41 @@ typedef struct {
* Returns: a new #NmtConnectConnectionList
*/
NmtNewtWidget *
nmt_connect_connection_list_new (void)
nmt_connect_connection_list_new(void)
{
return g_object_new (NMT_TYPE_CONNECT_CONNECTION_LIST,
"flags", NMT_NEWT_LISTBOX_SCROLL | NMT_NEWT_LISTBOX_BORDER,
"skip-null-keys", TRUE,
return g_object_new(NMT_TYPE_CONNECT_CONNECTION_LIST,
"flags",
NMT_NEWT_LISTBOX_SCROLL | NMT_NEWT_LISTBOX_BORDER,
"skip-null-keys",
TRUE,
NULL);
}
static void
nmt_connect_connection_list_init (NmtConnectConnectionList *list)
nmt_connect_connection_list_init(NmtConnectConnectionList *list)
{}
static void
nmt_connect_connection_free(NmtConnectConnection *nmtconn)
{
g_clear_object(&nmtconn->conn);
g_clear_object(&nmtconn->ap);
g_clear_object(&nmtconn->active);
g_free(nmtconn->ssid);
g_slice_free(NmtConnectConnection, nmtconn);
}
static void
nmt_connect_connection_free (NmtConnectConnection *nmtconn)
nmt_connect_device_free(NmtConnectDevice *nmtdev)
{
g_clear_object (&nmtconn->conn);
g_clear_object (&nmtconn->ap);
g_clear_object (&nmtconn->active);
g_free (nmtconn->ssid);
g_slice_free (NmtConnectConnection, nmtconn);
nm_clear_g_free(&nmtdev->name);
g_clear_object(&nmtdev->device);
g_slist_free_full(nmtdev->conns, (GDestroyNotify) nmt_connect_connection_free);
g_slice_free(NmtConnectDevice, nmtdev);
}
static void
nmt_connect_device_free (NmtConnectDevice *nmtdev)
{
nm_clear_g_free (&nmtdev->name);
g_clear_object (&nmtdev->device);
g_slist_free_full (nmtdev->conns, (GDestroyNotify) nmt_connect_connection_free);
g_slice_free (NmtConnectDevice, nmtdev);
}
static const char *device_sort_order[] = {
"NMDeviceEthernet",
static const char *device_sort_order[] = {"NMDeviceEthernet",
"NMDeviceInfiniband",
"NMDeviceWifi",
NM_SETTING_VLAN_SETTING_NAME,
@ -97,19 +100,18 @@ static const char *device_sort_order[] = {
NM_SETTING_BRIDGE_SETTING_NAME,
NM_SETTING_IP_TUNNEL_SETTING_NAME,
"NMDeviceModem",
"NMDeviceBt"
};
static const int device_sort_order_len = G_N_ELEMENTS (device_sort_order);
"NMDeviceBt"};
static const int device_sort_order_len = G_N_ELEMENTS(device_sort_order);
static int
get_sort_order_for_device (NMDevice *device)
get_sort_order_for_device(NMDevice *device)
{
const char *type;
int i;
type = G_OBJECT_TYPE_NAME (device);
type = G_OBJECT_TYPE_NAME(device);
for (i = 0; i < device_sort_order_len; i++) {
if (!strcmp (type, device_sort_order[i]))
if (!strcmp(type, device_sort_order[i]))
return i;
}
@ -117,17 +119,17 @@ get_sort_order_for_device (NMDevice *device)
}
static int
get_sort_order_for_connection (NMConnection *conn)
get_sort_order_for_connection(NMConnection *conn)
{
NMSettingConnection *s_con;
const char *type;
const char * type;
int i;
s_con = nm_connection_get_setting_connection (conn);
type = nm_setting_connection_get_connection_type (s_con);
s_con = nm_connection_get_setting_connection(conn);
type = nm_setting_connection_get_connection_type(s_con);
for (i = 0; i < device_sort_order_len; i++) {
if (!strcmp (type, device_sort_order[i]))
if (!strcmp(type, device_sort_order[i]))
return i;
}
@ -135,22 +137,21 @@ get_sort_order_for_connection (NMConnection *conn)
}
static int
sort_connections (gconstpointer a,
gconstpointer b)
sort_connections(gconstpointer a, gconstpointer b)
{
NmtConnectConnection *nmta = (NmtConnectConnection *)a;
NmtConnectConnection *nmtb = (NmtConnectConnection *)b;
NmtConnectConnection *nmta = (NmtConnectConnection *) a;
NmtConnectConnection *nmtb = (NmtConnectConnection *) b;
/* If nmta and nmtb both have NMConnections, sort them by timestamp */
if (nmta->conn && nmtb->conn) {
NMSettingConnection *s_con_a, *s_con_b;
guint64 time_a, time_b;
s_con_a = nm_connection_get_setting_connection (nmta->conn);
s_con_b = nm_connection_get_setting_connection (nmtb->conn);
s_con_a = nm_connection_get_setting_connection(nmta->conn);
s_con_b = nm_connection_get_setting_connection(nmtb->conn);
time_a = nm_setting_connection_get_timestamp (s_con_a);
time_b = nm_setting_connection_get_timestamp (s_con_b);
time_a = nm_setting_connection_get_timestamp(s_con_a);
time_b = nm_setting_connection_get_timestamp(s_con_b);
return (int) (time_b - time_a);
}
@ -163,55 +164,54 @@ sort_connections (gconstpointer a,
else if (nmtb->conn)
return 1;
g_return_val_if_fail (nmta->ap && nmtb->ap, 0);
g_return_val_if_fail(nmta->ap && nmtb->ap, 0);
/* If both are access points, then sort by strength */
return nm_access_point_get_strength (nmtb->ap) - nm_access_point_get_strength (nmta->ap);
return nm_access_point_get_strength(nmtb->ap) - nm_access_point_get_strength(nmta->ap);
}
static void
add_connections_for_device (NmtConnectDevice *nmtdev,
const GPtrArray *connections)
add_connections_for_device(NmtConnectDevice *nmtdev, const GPtrArray *connections)
{
int i;
for (i = 0; i < connections->len; i++) {
NMConnection *conn = connections->pdata[i];
NMConnection * conn = connections->pdata[i];
NMSettingConnection *s_con;
s_con = nm_connection_get_setting_connection (conn);
if (nm_setting_connection_get_master (s_con))
s_con = nm_connection_get_setting_connection(conn);
if (nm_setting_connection_get_master(s_con))
continue;
if (nm_device_connection_valid (nmtdev->device, conn)) {
NmtConnectConnection *nmtconn = g_slice_new0 (NmtConnectConnection);
if (nm_device_connection_valid(nmtdev->device, conn)) {
NmtConnectConnection *nmtconn = g_slice_new0(NmtConnectConnection);
nmtconn->name = nm_connection_get_id (conn);
nmtconn->name = nm_connection_get_id(conn);
nmtconn->device = nmtdev->device;
nmtconn->conn = g_object_ref (conn);
nmtdev->conns = g_slist_prepend (nmtdev->conns, nmtconn);
nmtconn->conn = g_object_ref(conn);
nmtdev->conns = g_slist_prepend(nmtdev->conns, nmtconn);
}
}
}
/* stolen from nm-applet */
static char *
hash_ap (NMAccessPoint *ap)
hash_ap(NMAccessPoint *ap)
{
unsigned char input[66];
GBytes *ssid;
GBytes * ssid;
NM80211Mode mode;
guint32 flags;
guint32 wpa_flags;
guint32 rsn_flags;
memset (&input[0], 0, sizeof (input));
memset(&input[0], 0, sizeof(input));
ssid = nm_access_point_get_ssid (ap);
ssid = nm_access_point_get_ssid(ap);
if (ssid)
memcpy (input, g_bytes_get_data (ssid, NULL), g_bytes_get_size (ssid));
memcpy(input, g_bytes_get_data(ssid, NULL), g_bytes_get_size(ssid));
mode = nm_access_point_get_mode (ap);
mode = nm_access_point_get_mode(ap);
if (mode == NM_802_11_MODE_INFRA)
input[32] |= (1 << 0);
else if (mode == NM_802_11_MODE_ADHOC)
@ -220,75 +220,71 @@ hash_ap (NMAccessPoint *ap)
input[32] |= (1 << 2);
/* Separate out no encryption, WEP-only, and WPA-capable */
flags = nm_access_point_get_flags (ap);
wpa_flags = nm_access_point_get_wpa_flags (ap);
rsn_flags = nm_access_point_get_rsn_flags (ap);
if ( !(flags & NM_802_11_AP_FLAGS_PRIVACY)
&& (wpa_flags == NM_802_11_AP_SEC_NONE)
flags = nm_access_point_get_flags(ap);
wpa_flags = nm_access_point_get_wpa_flags(ap);
rsn_flags = nm_access_point_get_rsn_flags(ap);
if (!(flags & NM_802_11_AP_FLAGS_PRIVACY) && (wpa_flags == NM_802_11_AP_SEC_NONE)
&& (rsn_flags == NM_802_11_AP_SEC_NONE))
input[32] |= (1 << 3);
else if ( (flags & NM_802_11_AP_FLAGS_PRIVACY)
&& (wpa_flags == NM_802_11_AP_SEC_NONE)
else if ((flags & NM_802_11_AP_FLAGS_PRIVACY) && (wpa_flags == NM_802_11_AP_SEC_NONE)
&& (rsn_flags == NM_802_11_AP_SEC_NONE))
input[32] |= (1 << 4);
else if ( !(flags & NM_802_11_AP_FLAGS_PRIVACY)
&& (wpa_flags != NM_802_11_AP_SEC_NONE)
else if (!(flags & NM_802_11_AP_FLAGS_PRIVACY) && (wpa_flags != NM_802_11_AP_SEC_NONE)
&& (rsn_flags != NM_802_11_AP_SEC_NONE))
input[32] |= (1 << 5);
else
input[32] |= (1 << 6);
/* duplicate it */
memcpy (&input[33], &input[0], 32);
return g_compute_checksum_for_data (G_CHECKSUM_MD5, input, sizeof (input));
memcpy(&input[33], &input[0], 32);
return g_compute_checksum_for_data(G_CHECKSUM_MD5, input, sizeof(input));
}
static void
add_connections_for_aps (NmtConnectDevice *nmtdev,
const GPtrArray *connections)
add_connections_for_aps(NmtConnectDevice *nmtdev, const GPtrArray *connections)
{
NmtConnectConnection *nmtconn;
NMConnection *conn;
NMAccessPoint *ap;
const GPtrArray *aps;
GHashTable *seen_ssids;
GBytes *ssid;
char *ap_hash;
NMConnection * conn;
NMAccessPoint * ap;
const GPtrArray * aps;
GHashTable * seen_ssids;
GBytes * ssid;
char * ap_hash;
int i, c;
aps = nm_device_wifi_get_access_points (NM_DEVICE_WIFI (nmtdev->device));
aps = nm_device_wifi_get_access_points(NM_DEVICE_WIFI(nmtdev->device));
if (!aps->len)
return;
seen_ssids = g_hash_table_new_full (nm_str_hash, g_str_equal, g_free, NULL);
seen_ssids = g_hash_table_new_full(nm_str_hash, g_str_equal, g_free, NULL);
for (i = 0; i < aps->len; i++) {
ap = aps->pdata[i];
if (!nm_access_point_get_ssid (ap))
if (!nm_access_point_get_ssid(ap))
continue;
ap_hash = hash_ap (ap);
if (g_hash_table_contains (seen_ssids, ap_hash)) {
g_free (ap_hash);
ap_hash = hash_ap(ap);
if (g_hash_table_contains(seen_ssids, ap_hash)) {
g_free(ap_hash);
continue;
}
g_hash_table_add (seen_ssids, ap_hash);
g_hash_table_add(seen_ssids, ap_hash);
nmtconn = g_slice_new0 (NmtConnectConnection);
nmtconn = g_slice_new0(NmtConnectConnection);
nmtconn->device = nmtdev->device;
nmtconn->ap = g_object_ref (ap);
ssid = nm_access_point_get_ssid (ap);
nmtconn->ap = g_object_ref(ap);
ssid = nm_access_point_get_ssid(ap);
if (ssid)
nmtconn->ssid = nm_utils_ssid_to_utf8 (g_bytes_get_data (ssid, NULL),
g_bytes_get_size (ssid));
nmtconn->ssid =
nm_utils_ssid_to_utf8(g_bytes_get_data(ssid, NULL), g_bytes_get_size(ssid));
for (c = 0; c < connections->len; c++) {
conn = connections->pdata[c];
if ( nm_device_connection_valid (nmtdev->device, conn)
&& nm_access_point_connection_valid (ap, conn)) {
nmtconn->name = nm_connection_get_id (conn);
nmtconn->conn = g_object_ref (conn);
if (nm_device_connection_valid(nmtdev->device, conn)
&& nm_access_point_connection_valid(ap, conn)) {
nmtconn->name = nm_connection_get_id(conn);
nmtconn->conn = g_object_ref(conn);
break;
}
}
@ -296,140 +292,136 @@ add_connections_for_aps (NmtConnectDevice *nmtdev,
if (!nmtconn->name)
nmtconn->name = nmtconn->ssid ?: "<unknown>";
nmtdev->conns = g_slist_prepend (nmtdev->conns, nmtconn);
nmtdev->conns = g_slist_prepend(nmtdev->conns, nmtconn);
}
g_hash_table_unref (seen_ssids);
g_hash_table_unref(seen_ssids);
}
static GSList *
append_nmt_devices_for_devices (GSList *nmt_devices,
append_nmt_devices_for_devices(GSList * nmt_devices,
const GPtrArray *devices,
char **names,
char ** names,
const GPtrArray *connections)
{
NmtConnectDevice *nmtdev;
NMDevice *device;
NMDevice * device;
int i, sort_order;
for (i = 0; i < devices->len; i++) {
device = devices->pdata[i];
sort_order = get_sort_order_for_device (device);
sort_order = get_sort_order_for_device(device);
if (sort_order == -1)
continue;
nmtdev = g_slice_new0 (NmtConnectDevice);
nmtdev->name = g_strdup (names[i]);
nmtdev->device = g_object_ref (device);
nmtdev = g_slice_new0(NmtConnectDevice);
nmtdev->name = g_strdup(names[i]);
nmtdev->device = g_object_ref(device);
nmtdev->sort_order = sort_order;
if (NM_IS_DEVICE_WIFI (device))
add_connections_for_aps (nmtdev, connections);
if (NM_IS_DEVICE_WIFI(device))
add_connections_for_aps(nmtdev, connections);
else
add_connections_for_device (nmtdev, connections);
nmtdev->conns = g_slist_sort (nmtdev->conns, sort_connections);
add_connections_for_device(nmtdev, connections);
nmtdev->conns = g_slist_sort(nmtdev->conns, sort_connections);
nmt_devices = g_slist_prepend (nmt_devices, nmtdev);
nmt_devices = g_slist_prepend(nmt_devices, nmtdev);
}
return nmt_devices;
}
static GSList *
append_nmt_devices_for_virtual_devices (GSList *nmt_devices,
const GPtrArray *connections)
append_nmt_devices_for_virtual_devices(GSList *nmt_devices, const GPtrArray *connections)
{
NmtConnectDevice *nmtdev = NULL;
NmtConnectDevice * nmtdev = NULL;
int i;
GHashTable *devices_by_name;
char *name;
NMConnection *conn;
GHashTable * devices_by_name;
char * name;
NMConnection * conn;
NmtConnectConnection *nmtconn;
int sort_order;
devices_by_name = g_hash_table_new (nm_str_hash, g_str_equal);
devices_by_name = g_hash_table_new(nm_str_hash, g_str_equal);
for (i = 0; i < connections->len; i++) {
conn = connections->pdata[i];
sort_order = get_sort_order_for_connection (conn);
sort_order = get_sort_order_for_connection(conn);
if (sort_order == -1)
continue;
name = nm_connection_get_virtual_device_description (conn);
name = nm_connection_get_virtual_device_description(conn);
if (name)
nmtdev = g_hash_table_lookup (devices_by_name, name);
nmtdev = g_hash_table_lookup(devices_by_name, name);
if (nmtdev)
g_free (name);
g_free(name);
else {
nmtdev = g_slice_new0 (NmtConnectDevice);
nmtdev = g_slice_new0(NmtConnectDevice);
nmtdev->name = name ?: g_strdup("Unknown");
nmtdev->sort_order = sort_order;
g_hash_table_insert (devices_by_name, nmtdev->name, nmtdev);
nmt_devices = g_slist_prepend (nmt_devices, nmtdev);
g_hash_table_insert(devices_by_name, nmtdev->name, nmtdev);
nmt_devices = g_slist_prepend(nmt_devices, nmtdev);
}
nmtconn = g_slice_new0 (NmtConnectConnection);
nmtconn->name = nm_connection_get_id (conn);
nmtconn->conn = g_object_ref (conn);
nmtconn = g_slice_new0(NmtConnectConnection);
nmtconn->name = nm_connection_get_id(conn);
nmtconn->conn = g_object_ref(conn);
nmtdev->conns = g_slist_insert_sorted (nmtdev->conns, nmtconn, sort_connections);
nmtdev->conns = g_slist_insert_sorted(nmtdev->conns, nmtconn, sort_connections);
}
g_hash_table_destroy (devices_by_name);
g_hash_table_destroy(devices_by_name);
return nmt_devices;
}
static GSList *
append_nmt_devices_for_vpns (GSList *nmt_devices,
const GPtrArray *connections)
append_nmt_devices_for_vpns(GSList *nmt_devices, const GPtrArray *connections)
{
NmtConnectDevice *nmtdev;
NmtConnectDevice * nmtdev;
int i;
NMConnection *conn;
NMConnection * conn;
NmtConnectConnection *nmtconn;
nmtdev = g_slice_new0 (NmtConnectDevice);
nmtdev->name = g_strdup (_("VPN"));
nmtdev = g_slice_new0(NmtConnectDevice);
nmtdev->name = g_strdup(_("VPN"));
nmtdev->sort_order = 100;
for (i = 0; i < connections->len; i++) {
conn = connections->pdata[i];
if (!nm_connection_is_type (conn, NM_SETTING_VPN_SETTING_NAME))
if (!nm_connection_is_type(conn, NM_SETTING_VPN_SETTING_NAME))
continue;
nmtconn = g_slice_new0 (NmtConnectConnection);
nmtconn->name = nm_connection_get_id (conn);
nmtconn->conn = g_object_ref (conn);
nmtconn = g_slice_new0(NmtConnectConnection);
nmtconn->name = nm_connection_get_id(conn);
nmtconn->conn = g_object_ref(conn);
nmtdev->conns = g_slist_insert_sorted (nmtdev->conns, nmtconn, sort_connections);
nmtdev->conns = g_slist_insert_sorted(nmtdev->conns, nmtconn, sort_connections);
}
if (nmtdev->conns)
nmt_devices = g_slist_prepend (nmt_devices, nmtdev);
nmt_devices = g_slist_prepend(nmt_devices, nmtdev);
else
nmt_connect_device_free (nmtdev);
nmt_connect_device_free(nmtdev);
return nmt_devices;
}
static int
sort_nmt_devices (gconstpointer a,
gconstpointer b)
sort_nmt_devices(gconstpointer a, gconstpointer b)
{
NmtConnectDevice *nmta = (NmtConnectDevice *)a;
NmtConnectDevice *nmtb = (NmtConnectDevice *)b;
NmtConnectDevice *nmta = (NmtConnectDevice *) a;
NmtConnectDevice *nmtb = (NmtConnectDevice *) b;
if (nmta->sort_order != nmtb->sort_order)
return nmta->sort_order - nmtb->sort_order;
return strcmp (nmta->name, nmtb->name);
return strcmp(nmta->name, nmtb->name);
}
static NMActiveConnection *
connection_find_ac (NMConnection *conn,
const GPtrArray *acs)
connection_find_ac(NMConnection *conn, const GPtrArray *acs)
{
NMActiveConnection *ac;
NMRemoteConnection *ac_conn;
@ -437,9 +429,9 @@ connection_find_ac (NMConnection *conn,
for (i = 0; i < acs->len; i++) {
ac = acs->pdata[i];
ac_conn = nm_active_connection_get_connection (ac);
ac_conn = nm_active_connection_get_connection(ac);
if (conn == NM_CONNECTION (ac_conn))
if (conn == NM_CONNECTION(ac_conn))
return ac;
}
@ -447,36 +439,36 @@ connection_find_ac (NMConnection *conn,
}
static void
nmt_connect_connection_list_rebuild (NmtConnectConnectionList *list)
nmt_connect_connection_list_rebuild(NmtConnectConnectionList *list)
{
NmtConnectConnectionListPrivate *priv = NMT_CONNECT_CONNECTION_LIST_GET_PRIVATE (list);
NmtNewtListbox *listbox = NMT_NEWT_LISTBOX (list);
const GPtrArray *devices, *acs, *connections;
NmtConnectConnectionListPrivate *priv = NMT_CONNECT_CONNECTION_LIST_GET_PRIVATE(list);
NmtNewtListbox * listbox = NMT_NEWT_LISTBOX(list);
const GPtrArray * devices, *acs, *connections;
int max_width;
char **names, *row, active_col;
const char *strength_col;
GSList *nmt_devices, *diter, *citer;
NmtConnectDevice *nmtdev;
NmtConnectConnection *nmtconn;
char ** names, *row, active_col;
const char * strength_col;
GSList * nmt_devices, *diter, *citer;
NmtConnectDevice * nmtdev;
NmtConnectConnection * nmtconn;
g_slist_free_full (priv->nmt_devices, (GDestroyNotify) nmt_connect_device_free);
g_slist_free_full(priv->nmt_devices, (GDestroyNotify) nmt_connect_device_free);
priv->nmt_devices = NULL;
nmt_newt_listbox_clear (listbox);
nmt_newt_listbox_clear(listbox);
devices = nm_client_get_devices (nm_client);
acs = nm_client_get_active_connections (nm_client);
connections = nm_client_get_connections (nm_client);
devices = nm_client_get_devices(nm_client);
acs = nm_client_get_active_connections(nm_client);
connections = nm_client_get_connections(nm_client);
nmt_devices = NULL;
names = nm_device_disambiguate_names ((NMDevice **) devices->pdata, devices->len);
nmt_devices = append_nmt_devices_for_devices (nmt_devices, devices, names, connections);
g_strfreev (names);
names = nm_device_disambiguate_names((NMDevice **) devices->pdata, devices->len);
nmt_devices = append_nmt_devices_for_devices(nmt_devices, devices, names, connections);
g_strfreev(names);
nmt_devices = append_nmt_devices_for_virtual_devices (nmt_devices, connections);
nmt_devices = append_nmt_devices_for_vpns (nmt_devices, connections);
nmt_devices = append_nmt_devices_for_virtual_devices(nmt_devices, connections);
nmt_devices = append_nmt_devices_for_vpns(nmt_devices, connections);
nmt_devices = g_slist_sort (nmt_devices, sort_nmt_devices);
nmt_devices = g_slist_sort(nmt_devices, sort_nmt_devices);
max_width = 0;
for (diter = nmt_devices; diter; diter = diter->next) {
@ -484,7 +476,7 @@ nmt_connect_connection_list_rebuild (NmtConnectConnectionList *list)
for (citer = nmtdev->conns; citer; citer = citer->next) {
nmtconn = citer->data;
max_width = MAX (max_width, nmt_newt_text_width (nmtconn->name));
max_width = MAX(max_width, nmt_newt_text_width(nmtconn->name));
}
}
@ -493,89 +485,96 @@ nmt_connect_connection_list_rebuild (NmtConnectConnectionList *list)
if (nmtdev->conns) {
if (diter != nmt_devices)
nmt_newt_listbox_append (listbox, "", NULL);
nmt_newt_listbox_append (listbox, nmtdev->name, NULL);
nmt_newt_listbox_append(listbox, "", NULL);
nmt_newt_listbox_append(listbox, nmtdev->name, NULL);
}
for (citer = nmtdev->conns; citer; citer = citer->next) {
nmtconn = citer->data;
if (nmtconn->conn)
nmtconn->active = connection_find_ac (nmtconn->conn, acs);
nmtconn->active = connection_find_ac(nmtconn->conn, acs);
if (nmtconn->active) {
g_object_ref (nmtconn->active);
g_object_ref(nmtconn->active);
active_col = '*';
} else
active_col = ' ';
if (nmtconn->ap) {
guint8 strength = nm_access_point_get_strength (nmtconn->ap);
guint8 strength = nm_access_point_get_strength(nmtconn->ap);
strength_col = nmc_wifi_strength_bars (strength);
strength_col = nmc_wifi_strength_bars(strength);
} else
strength_col = NULL;
row = g_strdup_printf ("%c %s%-*s%s%s",
row = g_strdup_printf("%c %s%-*s%s%s",
active_col,
nmtconn->name,
(int)(max_width - nmt_newt_text_width (nmtconn->name)), "",
(int) (max_width - nmt_newt_text_width(nmtconn->name)),
"",
strength_col ? " " : "",
strength_col ?: "");
nmt_newt_listbox_append (listbox, row, nmtconn);
g_free (row);
nmt_newt_listbox_append(listbox, row, nmtconn);
g_free(row);
}
}
priv->nmt_devices = nmt_devices;
g_object_notify (G_OBJECT (listbox), "active");
g_object_notify (G_OBJECT (listbox), "active-key");
g_object_notify(G_OBJECT(listbox), "active");
g_object_notify(G_OBJECT(listbox), "active-key");
}
static void
rebuild_on_property_changed (GObject *object,
GParamSpec *spec,
gpointer list)
rebuild_on_property_changed(GObject *object, GParamSpec *spec, gpointer list)
{
nmt_connect_connection_list_rebuild (list);
nmt_connect_connection_list_rebuild(list);
}
static void
nmt_connect_connection_list_constructed (GObject *object)
nmt_connect_connection_list_constructed(GObject *object)
{
NmtConnectConnectionList *list = NMT_CONNECT_CONNECTION_LIST (object);
NmtConnectConnectionList *list = NMT_CONNECT_CONNECTION_LIST(object);
g_signal_connect (nm_client, "notify::" NM_CLIENT_ACTIVE_CONNECTIONS,
G_CALLBACK (rebuild_on_property_changed), list);
g_signal_connect (nm_client, "notify::" NM_CLIENT_CONNECTIONS,
G_CALLBACK (rebuild_on_property_changed), list);
g_signal_connect (nm_client, "notify::" NM_CLIENT_DEVICES,
G_CALLBACK (rebuild_on_property_changed), list);
g_signal_connect(nm_client,
"notify::" NM_CLIENT_ACTIVE_CONNECTIONS,
G_CALLBACK(rebuild_on_property_changed),
list);
g_signal_connect(nm_client,
"notify::" NM_CLIENT_CONNECTIONS,
G_CALLBACK(rebuild_on_property_changed),
list);
g_signal_connect(nm_client,
"notify::" NM_CLIENT_DEVICES,
G_CALLBACK(rebuild_on_property_changed),
list);
nmt_connect_connection_list_rebuild (list);
nmt_connect_connection_list_rebuild(list);
G_OBJECT_CLASS (nmt_connect_connection_list_parent_class)->constructed (object);
G_OBJECT_CLASS(nmt_connect_connection_list_parent_class)->constructed(object);
}
static void
nmt_connect_connection_list_finalize (GObject *object)
nmt_connect_connection_list_finalize(GObject *object)
{
NmtConnectConnectionListPrivate *priv = NMT_CONNECT_CONNECTION_LIST_GET_PRIVATE (object);
NmtConnectConnectionListPrivate *priv = NMT_CONNECT_CONNECTION_LIST_GET_PRIVATE(object);
g_slist_free_full (priv->nmt_devices, (GDestroyNotify) nmt_connect_device_free);
g_slist_free_full(priv->nmt_devices, (GDestroyNotify) nmt_connect_device_free);
g_signal_handlers_disconnect_by_func (nm_client, G_CALLBACK (rebuild_on_property_changed), object);
g_signal_handlers_disconnect_by_func(nm_client,
G_CALLBACK(rebuild_on_property_changed),
object);
G_OBJECT_CLASS (nmt_connect_connection_list_parent_class)->finalize (object);
G_OBJECT_CLASS(nmt_connect_connection_list_parent_class)->finalize(object);
}
static void
nmt_connect_connection_list_class_init (NmtConnectConnectionListClass *list_class)
nmt_connect_connection_list_class_init(NmtConnectConnectionListClass *list_class)
{
GObjectClass *object_class = G_OBJECT_CLASS (list_class);
GObjectClass *object_class = G_OBJECT_CLASS(list_class);
g_type_class_add_private (list_class, sizeof (NmtConnectConnectionListPrivate));
g_type_class_add_private(list_class, sizeof(NmtConnectConnectionListPrivate));
/* virtual methods */
object_class->constructed = nmt_connect_connection_list_constructed;
@ -597,25 +596,25 @@ nmt_connect_connection_list_class_init (NmtConnectConnectionListClass *list_clas
* Returns: %TRUE if there was a match, %FALSE if not.
*/
gboolean
nmt_connect_connection_list_get_connection (NmtConnectConnectionList *list,
const char *identifier,
NMConnection **connection,
NMDevice **device,
NMObject **specific_object,
NMActiveConnection **active)
nmt_connect_connection_list_get_connection(NmtConnectConnectionList *list,
const char * identifier,
NMConnection ** connection,
NMDevice ** device,
NMObject ** specific_object,
NMActiveConnection ** active)
{
NmtConnectConnectionListPrivate *priv = NMT_CONNECT_CONNECTION_LIST_GET_PRIVATE (list);
GSList *diter, *citer;
NmtConnectDevice *nmtdev;
NmtConnectConnection *nmtconn = NULL;
NMConnection *conn = NULL;
NmtConnectConnectionListPrivate *priv = NMT_CONNECT_CONNECTION_LIST_GET_PRIVATE(list);
GSList * diter, *citer;
NmtConnectDevice * nmtdev;
NmtConnectConnection * nmtconn = NULL;
NMConnection * conn = NULL;
g_return_val_if_fail (identifier, FALSE);
g_return_val_if_fail(identifier, FALSE);
if (nm_utils_is_uuid (identifier))
conn = NM_CONNECTION (nm_client_get_connection_by_uuid (nm_client, identifier));
if (nm_utils_is_uuid(identifier))
conn = NM_CONNECTION(nm_client_get_connection_by_uuid(nm_client, identifier));
if (!conn)
conn = NM_CONNECTION (nm_client_get_connection_by_id (nm_client, identifier));
conn = NM_CONNECTION(nm_client_get_connection_by_id(nm_client, identifier));
for (diter = priv->nmt_devices; diter; diter = diter->next) {
nmtdev = diter->data;
@ -627,13 +626,12 @@ nmt_connect_connection_list_get_connection (NmtConnectConnectionList *list,
if (conn) {
if (conn == nmtconn->conn)
goto found;
} else if (nm_streq0 (identifier, nmtconn->ssid))
} else if (nm_streq0(identifier, nmtconn->ssid))
goto found;
}
if ( !conn
&& nmtdev->device
&& nm_streq0 (identifier, nm_device_get_ip_iface (nmtdev->device))) {
if (!conn && nmtdev->device
&& nm_streq0(identifier, nm_device_get_ip_iface(nmtdev->device))) {
nmtconn = nmtdev->conns->data;
goto found;
}
@ -647,7 +645,7 @@ found:
if (device)
*device = nmtconn->device;
if (specific_object)
*specific_object = NM_OBJECT (nmtconn->ap);
*specific_object = NM_OBJECT(nmtconn->ap);
if (active)
*active = nmtconn->active;
@ -668,15 +666,15 @@ found:
* Returns: %TRUE if there is a selection, %FALSE if not.
*/
gboolean
nmt_connect_connection_list_get_selection (NmtConnectConnectionList *list,
NMConnection **connection,
NMDevice **device,
NMObject **specific_object,
NMActiveConnection **active)
nmt_connect_connection_list_get_selection(NmtConnectConnectionList *list,
NMConnection ** connection,
NMDevice ** device,
NMObject ** specific_object,
NMActiveConnection ** active)
{
NmtConnectConnection *nmtconn;
nmtconn = nmt_newt_listbox_get_active_key (NMT_NEWT_LISTBOX (list));
nmtconn = nmt_newt_listbox_get_active_key(NMT_NEWT_LISTBOX(list));
if (!nmtconn)
return FALSE;
@ -685,7 +683,7 @@ nmt_connect_connection_list_get_selection (NmtConnectConnectionList *list,
if (device)
*device = nmtconn->device;
if (specific_object)
*specific_object = NM_OBJECT (nmtconn->ap);
*specific_object = NM_OBJECT(nmtconn->ap);
if (active)
*active = nmtconn->active;

View file

@ -8,12 +8,21 @@
#include "nmt-newt.h"
#define NMT_TYPE_CONNECT_CONNECTION_LIST (nmt_connect_connection_list_get_type ())
#define NMT_CONNECT_CONNECTION_LIST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMT_TYPE_CONNECT_CONNECTION_LIST, NmtConnectConnectionList))
#define NMT_CONNECT_CONNECTION_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NMT_TYPE_CONNECT_CONNECTION_LIST, NmtConnectConnectionListClass))
#define NMT_IS_CONNECT_CONNECTION_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NMT_TYPE_CONNECT_CONNECTION_LIST))
#define NMT_IS_CONNECT_CONNECTION_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NMT_TYPE_CONNECT_CONNECTION_LIST))
#define NMT_CONNECT_CONNECTION_LIST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NMT_TYPE_CONNECT_CONNECTION_LIST, NmtConnectConnectionListClass))
#define NMT_TYPE_CONNECT_CONNECTION_LIST (nmt_connect_connection_list_get_type())
#define NMT_CONNECT_CONNECTION_LIST(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), NMT_TYPE_CONNECT_CONNECTION_LIST, NmtConnectConnectionList))
#define NMT_CONNECT_CONNECTION_LIST_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), \
NMT_TYPE_CONNECT_CONNECTION_LIST, \
NmtConnectConnectionListClass))
#define NMT_IS_CONNECT_CONNECTION_LIST(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj), NMT_TYPE_CONNECT_CONNECTION_LIST))
#define NMT_IS_CONNECT_CONNECTION_LIST_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass), NMT_TYPE_CONNECT_CONNECTION_LIST))
#define NMT_CONNECT_CONNECTION_LIST_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), \
NMT_TYPE_CONNECT_CONNECTION_LIST, \
NmtConnectConnectionListClass))
typedef struct {
NmtNewtListbox parent;
@ -25,20 +34,20 @@ typedef struct {
} NmtConnectConnectionListClass;
GType nmt_connect_connection_list_get_type (void);
GType nmt_connect_connection_list_get_type(void);
NmtNewtWidget *nmt_connect_connection_list_new (void);
NmtNewtWidget *nmt_connect_connection_list_new(void);
gboolean nmt_connect_connection_list_get_connection (NmtConnectConnectionList *list,
const char *identifier,
NMConnection **connection,
NMDevice **device,
NMObject **specific_object,
NMActiveConnection **active);
gboolean nmt_connect_connection_list_get_selection (NmtConnectConnectionList *list,
NMConnection **connection,
NMDevice **device,
NMObject **specific_object,
NMActiveConnection **active);
gboolean nmt_connect_connection_list_get_connection(NmtConnectConnectionList *list,
const char * identifier,
NMConnection ** connection,
NMDevice ** device,
NMObject ** specific_object,
NMActiveConnection ** active);
gboolean nmt_connect_connection_list_get_selection(NmtConnectConnectionList *list,
NMConnection ** connection,
NMDevice ** device,
NMObject ** specific_object,
NMActiveConnection ** active);
#endif /* NMT_CONNECT_CONNECTION_LIST_H */

View file

@ -30,9 +30,10 @@
#include "nmtui.h"
G_DEFINE_TYPE (NmtDeviceEntry, nmt_device_entry, NMT_TYPE_EDITOR_GRID)
G_DEFINE_TYPE(NmtDeviceEntry, nmt_device_entry, NMT_TYPE_EDITOR_GRID)
#define NMT_DEVICE_ENTRY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NMT_TYPE_DEVICE_ENTRY, NmtDeviceEntryPrivate))
#define NMT_DEVICE_ENTRY_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE((o), NMT_TYPE_DEVICE_ENTRY, NmtDeviceEntryPrivate))
typedef struct {
GType hardware_type;
@ -43,8 +44,8 @@ typedef struct {
char *interface_name;
char *mac_address;
char *label;
NmtNewtEntry *entry;
char * label;
NmtNewtEntry * entry;
NmtNewtWidget *button;
gboolean updating;
@ -76,26 +77,27 @@ enum {
* Returns: a new #NmtDeviceEntry.
*/
NmtNewtWidget *
nmt_device_entry_new (const char *label,
int width,
GType hardware_type)
nmt_device_entry_new(const char *label, int width, GType hardware_type)
{
return g_object_new (NMT_TYPE_DEVICE_ENTRY,
"label", label,
"width", width,
"hardware-type", hardware_type,
return g_object_new(NMT_TYPE_DEVICE_ENTRY,
"label",
label,
"width",
width,
"hardware-type",
hardware_type,
NULL);
}
static gboolean
device_entry_parse (NmtDeviceEntry *deventry,
const char *text,
char **interface_name,
char **mac_address)
device_entry_parse(NmtDeviceEntry *deventry,
const char * text,
char ** interface_name,
char ** mac_address)
{
NmtDeviceEntryPrivate *priv = NMT_DEVICE_ENTRY_GET_PRIVATE (deventry);
NmtDeviceEntryPrivate *priv = NMT_DEVICE_ENTRY_GET_PRIVATE(deventry);
guint8 buf[NM_UTILS_HWADDR_LEN_MAX];
char **words;
char ** words;
int len;
*interface_name = *mac_address = NULL;
@ -103,86 +105,83 @@ device_entry_parse (NmtDeviceEntry *deventry,
return TRUE;
if (priv->hardware_type == G_TYPE_NONE && !priv->device_filter) {
if (nm_utils_ifname_valid_kernel (text, NULL)) {
*interface_name = g_strdup (text);
if (nm_utils_ifname_valid_kernel(text, NULL)) {
*interface_name = g_strdup(text);
return TRUE;
} else
return FALSE;
}
words = g_strsplit (text, " ", -1);
if (g_strv_length (words) > 2) {
g_strfreev (words);
words = g_strsplit(text, " ", -1);
if (g_strv_length(words) > 2) {
g_strfreev(words);
return FALSE;
}
if (words[1]) {
len = strlen (words[1]);
len = strlen(words[1]);
if (len < 3 || words[1][0] != '(' || words[1][len - 1] != ')')
goto fail;
memmove (words[1], words[1] + 1, len - 2);
memmove(words[1], words[1] + 1, len - 2);
words[1][len - 2] = '\0';
}
len = nm_utils_hwaddr_len (priv->arptype);
if ( nm_utils_hwaddr_aton (words[0], buf, len)
&& (!words[1] || nm_utils_ifname_valid_kernel (words[1], NULL))) {
len = nm_utils_hwaddr_len(priv->arptype);
if (nm_utils_hwaddr_aton(words[0], buf, len)
&& (!words[1] || nm_utils_ifname_valid_kernel(words[1], NULL))) {
*mac_address = words[0];
*interface_name = NULL;
g_free (words);
g_free(words);
return TRUE;
} else if ( nm_utils_ifname_valid_kernel (words[0], NULL)
&& (!words[1] || nm_utils_hwaddr_aton (words[1], buf, len))) {
} else if (nm_utils_ifname_valid_kernel(words[0], NULL)
&& (!words[1] || nm_utils_hwaddr_aton(words[1], buf, len))) {
*interface_name = words[0];
*mac_address = NULL;
g_free (words);
g_free(words);
return TRUE;
}
fail:
g_strfreev (words);
fail:
g_strfreev(words);
return FALSE;
}
static gboolean
device_entry_validate (NmtNewtEntry *entry,
const char *text,
gpointer user_data)
device_entry_validate(NmtNewtEntry *entry, const char *text, gpointer user_data)
{
NmtDeviceEntry *deventry = user_data;
char *ifname, *mac;
char * ifname, *mac;
if (!device_entry_parse (deventry, text, &ifname, &mac))
if (!device_entry_parse(deventry, text, &ifname, &mac))
return FALSE;
g_free (ifname);
g_free (mac);
g_free(ifname);
g_free(mac);
return TRUE;
}
static NMDevice *
find_device_by_interface_name (NmtDeviceEntry *deventry,
const char *interface_name)
find_device_by_interface_name(NmtDeviceEntry *deventry, const char *interface_name)
{
NmtDeviceEntryPrivate *priv = NMT_DEVICE_ENTRY_GET_PRIVATE (deventry);
const GPtrArray *devices;
NMDevice *device = NULL;
NmtDeviceEntryPrivate *priv = NMT_DEVICE_ENTRY_GET_PRIVATE(deventry);
const GPtrArray * devices;
NMDevice * device = NULL;
int i;
devices = nm_client_get_devices (nm_client);
devices = nm_client_get_devices(nm_client);
for (i = 0; i < devices->len && !device; i++) {
NMDevice *candidate = devices->pdata[i];
if ( priv->hardware_type != G_TYPE_NONE
&& !G_TYPE_CHECK_INSTANCE_TYPE (candidate, priv->hardware_type))
if (priv->hardware_type != G_TYPE_NONE
&& !G_TYPE_CHECK_INSTANCE_TYPE(candidate, priv->hardware_type))
continue;
if ( priv->device_filter
&& !priv->device_filter (deventry, candidate, priv->device_filter_data))
if (priv->device_filter
&& !priv->device_filter(deventry, candidate, priv->device_filter_data))
continue;
if (!g_strcmp0 (interface_name, nm_device_get_iface (candidate)))
if (!g_strcmp0(interface_name, nm_device_get_iface(candidate)))
device = candidate;
}
@ -190,166 +189,160 @@ find_device_by_interface_name (NmtDeviceEntry *deventry,
}
static NMDevice *
find_device_by_mac_address (NmtDeviceEntry *deventry,
const char *mac_address)
find_device_by_mac_address(NmtDeviceEntry *deventry, const char *mac_address)
{
NmtDeviceEntryPrivate *priv = NMT_DEVICE_ENTRY_GET_PRIVATE (deventry);
const GPtrArray *devices;
NMDevice *device = NULL;
NmtDeviceEntryPrivate *priv = NMT_DEVICE_ENTRY_GET_PRIVATE(deventry);
const GPtrArray * devices;
NMDevice * device = NULL;
int i;
devices = nm_client_get_devices (nm_client);
devices = nm_client_get_devices(nm_client);
for (i = 0; i < devices->len && !device; i++) {
NMDevice *candidate = devices->pdata[i];
char *hwaddr;
char * hwaddr;
if ( priv->hardware_type != G_TYPE_NONE
&& !G_TYPE_CHECK_INSTANCE_TYPE (candidate, priv->hardware_type))
if (priv->hardware_type != G_TYPE_NONE
&& !G_TYPE_CHECK_INSTANCE_TYPE(candidate, priv->hardware_type))
continue;
if ( priv->device_filter
&& !priv->device_filter (deventry, candidate, priv->device_filter_data))
if (priv->device_filter
&& !priv->device_filter(deventry, candidate, priv->device_filter_data))
continue;
g_object_get (G_OBJECT (candidate), "hw-address", &hwaddr, NULL);
if (hwaddr && !g_ascii_strcasecmp (mac_address, hwaddr))
g_object_get(G_OBJECT(candidate), "hw-address", &hwaddr, NULL);
if (hwaddr && !g_ascii_strcasecmp(mac_address, hwaddr))
device = candidate;
g_free (hwaddr);
g_free(hwaddr);
}
return device;
}
static void
update_entry (NmtDeviceEntry *deventry)
update_entry(NmtDeviceEntry *deventry)
{
NmtDeviceEntryPrivate *priv = NMT_DEVICE_ENTRY_GET_PRIVATE (deventry);
const char *ifname;
char *mac, *text;
NMDevice *ifname_device, *mac_device;
NmtDeviceEntryPrivate *priv = NMT_DEVICE_ENTRY_GET_PRIVATE(deventry);
const char * ifname;
char * mac, *text;
NMDevice * ifname_device, *mac_device;
if (priv->interface_name) {
ifname = priv->interface_name;
ifname_device = find_device_by_interface_name (deventry, priv->interface_name);
ifname_device = find_device_by_interface_name(deventry, priv->interface_name);
} else {
ifname = NULL;
ifname_device = NULL;
}
if (priv->mac_address) {
mac = g_strdup (priv->mac_address);
mac_device = find_device_by_mac_address (deventry, priv->mac_address);
mac = g_strdup(priv->mac_address);
mac_device = find_device_by_mac_address(deventry, priv->mac_address);
} else {
mac = NULL;
mac_device = NULL;
}
if (!ifname && mac_device)
ifname = nm_device_get_iface (mac_device);
ifname = nm_device_get_iface(mac_device);
if (!mac && ifname_device && (priv->hardware_type != G_TYPE_NONE))
g_object_get (G_OBJECT (ifname_device), "hw-address", &mac, NULL);
g_object_get(G_OBJECT(ifname_device), "hw-address", &mac, NULL);
if (ifname_device && mac_device && ifname_device != mac_device) {
/* Mismatch! */
text = g_strdup_printf ("%s != %s", priv->interface_name, mac);
text = g_strdup_printf("%s != %s", priv->interface_name, mac);
} else if (ifname && mac) {
if (ifname_device)
text = g_strdup_printf ("%s (%s)", ifname, mac);
text = g_strdup_printf("%s (%s)", ifname, mac);
else
text = g_strdup_printf ("%s (%s)", mac, ifname);
text = g_strdup_printf("%s (%s)", mac, ifname);
} else if (ifname)
text = g_strdup (ifname);
text = g_strdup(ifname);
else if (mac)
text = g_strdup (mac);
text = g_strdup(mac);
else
text = g_strdup ("");
text = g_strdup("");
priv->updating = TRUE;
g_object_set (G_OBJECT (priv->entry), "text", text, NULL);
g_object_set(G_OBJECT(priv->entry), "text", text, NULL);
priv->updating = FALSE;
g_free (text);
g_free(text);
g_free (mac);
g_free(mac);
}
static gboolean
nmt_device_entry_set_interface_name (NmtDeviceEntry *deventry,
const char *interface_name)
nmt_device_entry_set_interface_name(NmtDeviceEntry *deventry, const char *interface_name)
{
NmtDeviceEntryPrivate *priv = NMT_DEVICE_ENTRY_GET_PRIVATE (deventry);
NmtDeviceEntryPrivate *priv = NMT_DEVICE_ENTRY_GET_PRIVATE(deventry);
if (g_strcmp0 (interface_name, priv->interface_name) != 0) {
g_free (priv->interface_name);
priv->interface_name = g_strdup (interface_name);
if (g_strcmp0(interface_name, priv->interface_name) != 0) {
g_free(priv->interface_name);
priv->interface_name = g_strdup(interface_name);
g_object_notify (G_OBJECT (deventry), "interface-name");
g_object_notify(G_OBJECT(deventry), "interface-name");
return TRUE;
} else
return FALSE;
}
static gboolean
nmt_device_entry_set_mac_address (NmtDeviceEntry *deventry,
const char *mac_address)
nmt_device_entry_set_mac_address(NmtDeviceEntry *deventry, const char *mac_address)
{
NmtDeviceEntryPrivate *priv = NMT_DEVICE_ENTRY_GET_PRIVATE (deventry);
NmtDeviceEntryPrivate *priv = NMT_DEVICE_ENTRY_GET_PRIVATE(deventry);
gboolean changed;
if (mac_address && !priv->mac_address) {
priv->mac_address = g_strdup (mac_address);
priv->mac_address = g_strdup(mac_address);
changed = TRUE;
} else if (!mac_address && priv->mac_address) {
nm_clear_g_free (&priv->mac_address);
nm_clear_g_free(&priv->mac_address);
changed = TRUE;
} else if ( mac_address && priv->mac_address
&& !nm_utils_hwaddr_matches (mac_address, -1, priv->mac_address, -1)) {
g_free (priv->mac_address);
priv->mac_address = g_strdup (mac_address);
} else if (mac_address && priv->mac_address
&& !nm_utils_hwaddr_matches(mac_address, -1, priv->mac_address, -1)) {
g_free(priv->mac_address);
priv->mac_address = g_strdup(mac_address);
changed = TRUE;
} else
changed = FALSE;
if (changed)
g_object_notify (G_OBJECT (deventry), "mac-address");
g_object_notify(G_OBJECT(deventry), "mac-address");
return changed;
}
static void
entry_text_changed (GObject *object,
GParamSpec *pspec,
gpointer deventry)
entry_text_changed(GObject *object, GParamSpec *pspec, gpointer deventry)
{
NmtDeviceEntryPrivate *priv = NMT_DEVICE_ENTRY_GET_PRIVATE (deventry);
const char *text;
char *ifname, *mac;
NmtDeviceEntryPrivate *priv = NMT_DEVICE_ENTRY_GET_PRIVATE(deventry);
const char * text;
char * ifname, *mac;
if (priv->updating)
return;
text = nmt_newt_entry_get_text (priv->entry);
if (!device_entry_parse (deventry, text, &ifname, &mac))
text = nmt_newt_entry_get_text(priv->entry);
if (!device_entry_parse(deventry, text, &ifname, &mac))
return;
nmt_device_entry_set_interface_name (deventry, ifname);
g_free (ifname);
nmt_device_entry_set_interface_name(deventry, ifname);
g_free(ifname);
nmt_device_entry_set_mac_address (deventry, mac);
g_free (mac);
nmt_device_entry_set_mac_address(deventry, mac);
g_free(mac);
}
static void
nmt_device_entry_init (NmtDeviceEntry *deventry)
nmt_device_entry_init(NmtDeviceEntry *deventry)
{
NmtDeviceEntryPrivate *priv = NMT_DEVICE_ENTRY_GET_PRIVATE (deventry);
NmtNewtWidget *entry;
NmtDeviceEntryPrivate *priv = NMT_DEVICE_ENTRY_GET_PRIVATE(deventry);
NmtNewtWidget * entry;
priv->hardware_type = G_TYPE_NONE;
entry = nmt_newt_entry_new (-1, 0);
priv->entry = NMT_NEWT_ENTRY (entry);
nmt_newt_entry_set_validator (priv->entry, device_entry_validate, deventry);
g_signal_connect (priv->entry, "notify::text",
G_CALLBACK (entry_text_changed), deventry);
entry = nmt_newt_entry_new(-1, 0);
priv->entry = NMT_NEWT_ENTRY(entry);
nmt_newt_entry_set_validator(priv->entry, device_entry_validate, deventry);
g_signal_connect(priv->entry, "notify::text", G_CALLBACK(entry_text_changed), deventry);
#if 0
priv->button = nmt_newt_button_new (_("Select..."));
@ -359,24 +352,27 @@ nmt_device_entry_init (NmtDeviceEntry *deventry)
}
static void
nmt_device_entry_constructed (GObject *object)
nmt_device_entry_constructed(GObject *object)
{
NmtDeviceEntryPrivate *priv = NMT_DEVICE_ENTRY_GET_PRIVATE (object);
NmtDeviceEntryPrivate *priv = NMT_DEVICE_ENTRY_GET_PRIVATE(object);
nmt_editor_grid_append (NMT_EDITOR_GRID (object), priv->label, NMT_NEWT_WIDGET (priv->entry), NULL);
nmt_editor_grid_append(NMT_EDITOR_GRID(object),
priv->label,
NMT_NEWT_WIDGET(priv->entry),
NULL);
G_OBJECT_CLASS (nmt_device_entry_parent_class)->constructed (object);
G_OBJECT_CLASS(nmt_device_entry_parent_class)->constructed(object);
}
static void
nmt_device_entry_finalize (GObject *object)
nmt_device_entry_finalize(GObject *object)
{
NmtDeviceEntryPrivate *priv = NMT_DEVICE_ENTRY_GET_PRIVATE (object);
NmtDeviceEntryPrivate *priv = NMT_DEVICE_ENTRY_GET_PRIVATE(object);
g_free (priv->interface_name);
g_free (priv->mac_address);
g_free(priv->interface_name);
g_free(priv->mac_address);
G_OBJECT_CLASS (nmt_device_entry_parent_class)->finalize (object);
G_OBJECT_CLASS(nmt_device_entry_parent_class)->finalize(object);
}
/**
@ -405,90 +401,88 @@ nmt_device_entry_finalize (GObject *object)
* accepted by the filter will be allowed.
*/
void
nmt_device_entry_set_device_filter (NmtDeviceEntry *deventry,
nmt_device_entry_set_device_filter(NmtDeviceEntry * deventry,
NmtDeviceEntryDeviceFilter filter,
gpointer user_data)
{
NmtDeviceEntryPrivate *priv = NMT_DEVICE_ENTRY_GET_PRIVATE (deventry);
NmtDeviceEntryPrivate *priv = NMT_DEVICE_ENTRY_GET_PRIVATE(deventry);
priv->device_filter = filter;
priv->device_filter_data = user_data;
}
static void
nmt_device_entry_set_property (GObject *object,
nmt_device_entry_set_property(GObject * object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
GParamSpec * pspec)
{
NmtDeviceEntry *deventry = NMT_DEVICE_ENTRY (object);
NmtDeviceEntryPrivate *priv = NMT_DEVICE_ENTRY_GET_PRIVATE (deventry);
const char *interface_name;
const char *mac_address;
NmtDeviceEntry * deventry = NMT_DEVICE_ENTRY(object);
NmtDeviceEntryPrivate *priv = NMT_DEVICE_ENTRY_GET_PRIVATE(deventry);
const char * interface_name;
const char * mac_address;
switch (prop_id) {
case PROP_LABEL:
priv->label = g_value_dup_string (value);
priv->label = g_value_dup_string(value);
break;
case PROP_WIDTH:
nmt_newt_entry_set_width (priv->entry, g_value_get_int (value));
nmt_newt_entry_set_width(priv->entry, g_value_get_int(value));
break;
case PROP_HARDWARE_TYPE:
priv->hardware_type = g_value_get_gtype (value);
priv->arptype = (priv->hardware_type == NM_TYPE_DEVICE_INFINIBAND) ? ARPHRD_INFINIBAND : ARPHRD_ETHER;
priv->hardware_type = g_value_get_gtype(value);
priv->arptype =
(priv->hardware_type == NM_TYPE_DEVICE_INFINIBAND) ? ARPHRD_INFINIBAND : ARPHRD_ETHER;
break;
case PROP_INTERFACE_NAME:
interface_name = g_value_get_string (value);
if (nmt_device_entry_set_interface_name (deventry, interface_name))
update_entry (deventry);
interface_name = g_value_get_string(value);
if (nmt_device_entry_set_interface_name(deventry, interface_name))
update_entry(deventry);
break;
case PROP_MAC_ADDRESS:
mac_address = g_value_get_string (value);
if (nmt_device_entry_set_mac_address (deventry, mac_address))
update_entry (deventry);
mac_address = g_value_get_string(value);
if (nmt_device_entry_set_mac_address(deventry, mac_address))
update_entry(deventry);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_device_entry_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
nmt_device_entry_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
{
NmtDeviceEntryPrivate *priv = NMT_DEVICE_ENTRY_GET_PRIVATE (object);
NmtDeviceEntryPrivate *priv = NMT_DEVICE_ENTRY_GET_PRIVATE(object);
switch (prop_id) {
case PROP_LABEL:
g_value_set_string (value, priv->label);
g_value_set_string(value, priv->label);
break;
case PROP_WIDTH:
g_value_set_int (value, nmt_newt_entry_get_width (priv->entry));
g_value_set_int(value, nmt_newt_entry_get_width(priv->entry));
break;
case PROP_HARDWARE_TYPE:
g_value_set_gtype (value, priv->hardware_type);
g_value_set_gtype(value, priv->hardware_type);
break;
case PROP_INTERFACE_NAME:
g_value_set_string (value, priv->interface_name);
g_value_set_string(value, priv->interface_name);
break;
case PROP_MAC_ADDRESS:
g_value_set_string (value, priv->mac_address);
g_value_set_string(value, priv->mac_address);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_device_entry_class_init (NmtDeviceEntryClass *deventry_class)
nmt_device_entry_class_init(NmtDeviceEntryClass *deventry_class)
{
GObjectClass *object_class = G_OBJECT_CLASS (deventry_class);
GObjectClass *object_class = G_OBJECT_CLASS(deventry_class);
g_type_class_add_private (deventry_class, sizeof (NmtDeviceEntryPrivate));
g_type_class_add_private(deventry_class, sizeof(NmtDeviceEntryPrivate));
/* virtual methods */
object_class->constructed = nmt_device_entry_constructed;
@ -501,24 +495,23 @@ nmt_device_entry_class_init (NmtDeviceEntryClass *deventry_class)
*
* The entry's label
*/
g_object_class_install_property
(object_class, PROP_LABEL,
g_param_spec_string ("label", "", "",
g_object_class_install_property(
object_class,
PROP_LABEL,
g_param_spec_string("label",
"",
"",
NULL,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
/**
* NmtDeviceEntry:width:
*
* The entry's width in characters
*/
g_object_class_install_property
(object_class, PROP_WIDTH,
g_param_spec_int ("width", "", "",
-1, 80, -1,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
object_class,
PROP_WIDTH,
g_param_spec_int("width", "", "", -1, 80, -1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
* NmtDeviceEntry:hardware-type:
*
@ -526,32 +519,37 @@ nmt_device_entry_class_init (NmtDeviceEntryClass *deventry_class)
* if the entry is for a virtual device and should not accept
* hardware addresses.
*/
g_object_class_install_property
(object_class, PROP_HARDWARE_TYPE,
g_param_spec_gtype ("hardware-type", "", "",
g_object_class_install_property(object_class,
PROP_HARDWARE_TYPE,
g_param_spec_gtype("hardware-type",
"",
"",
G_TYPE_NONE,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
* NmtDeviceEntry:interface-name:
*
* The interface name of the device identified by the entry.
*/
g_object_class_install_property
(object_class, PROP_INTERFACE_NAME,
g_param_spec_string ("interface-name", "", "",
g_object_class_install_property(
object_class,
PROP_INTERFACE_NAME,
g_param_spec_string("interface-name",
"",
"",
NULL,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
* NmtDeviceEntry:mac-address:
*
* The hardware address of the device identified by the entry.
*/
g_object_class_install_property
(object_class, PROP_MAC_ADDRESS,
g_param_spec_string ("mac-address", "", "",
g_object_class_install_property(
object_class,
PROP_MAC_ADDRESS,
g_param_spec_string("mac-address",
"",
"",
NULL,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
}

View file

@ -8,12 +8,15 @@
#include "nmt-editor-grid.h"
#define NMT_TYPE_DEVICE_ENTRY (nmt_device_entry_get_type ())
#define NMT_DEVICE_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMT_TYPE_DEVICE_ENTRY, NmtDeviceEntry))
#define NMT_DEVICE_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NMT_TYPE_DEVICE_ENTRY, NmtDeviceEntryClass))
#define NMT_IS_DEVICE_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NMT_TYPE_DEVICE_ENTRY))
#define NMT_IS_DEVICE_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NMT_TYPE_DEVICE_ENTRY))
#define NMT_DEVICE_ENTRY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NMT_TYPE_DEVICE_ENTRY, NmtDeviceEntryClass))
#define NMT_TYPE_DEVICE_ENTRY (nmt_device_entry_get_type())
#define NMT_DEVICE_ENTRY(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), NMT_TYPE_DEVICE_ENTRY, NmtDeviceEntry))
#define NMT_DEVICE_ENTRY_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), NMT_TYPE_DEVICE_ENTRY, NmtDeviceEntryClass))
#define NMT_IS_DEVICE_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), NMT_TYPE_DEVICE_ENTRY))
#define NMT_IS_DEVICE_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NMT_TYPE_DEVICE_ENTRY))
#define NMT_DEVICE_ENTRY_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), NMT_TYPE_DEVICE_ENTRY, NmtDeviceEntryClass))
typedef struct {
NmtEditorGrid parent;
@ -25,16 +28,14 @@ typedef struct {
} NmtDeviceEntryClass;
GType nmt_device_entry_get_type (void);
GType nmt_device_entry_get_type(void);
NmtNewtWidget *nmt_device_entry_new (const char *label,
int width,
GType hardware_type);
NmtNewtWidget *nmt_device_entry_new(const char *label, int width, GType hardware_type);
typedef gboolean (*NmtDeviceEntryDeviceFilter) (NmtDeviceEntry *deventry,
NMDevice *device,
typedef gboolean (*NmtDeviceEntryDeviceFilter)(NmtDeviceEntry *deventry,
NMDevice * device,
gpointer user_data);
void nmt_device_entry_set_device_filter (NmtDeviceEntry *deventry,
void nmt_device_entry_set_device_filter(NmtDeviceEntry * deventry,
NmtDeviceEntryDeviceFilter filter,
gpointer user_data);

View file

@ -20,9 +20,10 @@
#include "nm-editor-utils.h"
G_DEFINE_TYPE (NmtEditConnectionList, nmt_edit_connection_list, NMT_TYPE_NEWT_GRID)
G_DEFINE_TYPE(NmtEditConnectionList, nmt_edit_connection_list, NMT_TYPE_NEWT_GRID)
#define NMT_EDIT_CONNECTION_LIST_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NMT_TYPE_EDIT_CONNECTION_LIST, NmtEditConnectionListPrivate))
#define NMT_EDIT_CONNECTION_LIST_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE((o), NMT_TYPE_EDIT_CONNECTION_LIST, NmtEditConnectionListPrivate))
typedef struct {
GSList *connections;
@ -31,7 +32,7 @@ typedef struct {
NmtEditConnectionListFilter connection_filter;
gpointer connection_filter_data;
NmtNewtListbox *listbox;
NmtNewtListbox * listbox;
NmtNewtButtonBox *buttons;
NmtNewtWidget *add;
@ -61,145 +62,146 @@ enum {
LAST_SIGNAL
};
static guint signals[LAST_SIGNAL] = { 0 };
static guint signals[LAST_SIGNAL] = {0};
static void add_clicked (NmtNewtButton *button, gpointer list);
static void edit_clicked (NmtNewtButton *button, gpointer list);
static void delete_clicked (NmtNewtButton *button, gpointer list);
static void listbox_activated (NmtNewtWidget *listbox, gpointer list);
static void add_clicked(NmtNewtButton *button, gpointer list);
static void edit_clicked(NmtNewtButton *button, gpointer list);
static void delete_clicked(NmtNewtButton *button, gpointer list);
static void listbox_activated(NmtNewtWidget *listbox, gpointer list);
static void
nmt_edit_connection_list_init (NmtEditConnectionList *list)
nmt_edit_connection_list_init(NmtEditConnectionList *list)
{
NmtEditConnectionListPrivate *priv = NMT_EDIT_CONNECTION_LIST_GET_PRIVATE (list);
NmtNewtWidget *listbox, *buttons;
NmtNewtGrid *grid = NMT_NEWT_GRID (list);
NmtEditConnectionListPrivate *priv = NMT_EDIT_CONNECTION_LIST_GET_PRIVATE(list);
NmtNewtWidget * listbox, *buttons;
NmtNewtGrid * grid = NMT_NEWT_GRID(list);
listbox = g_object_new (NMT_TYPE_NEWT_LISTBOX,
"flags", NMT_NEWT_LISTBOX_SCROLL | NMT_NEWT_LISTBOX_BORDER,
"skip-null-keys", TRUE,
listbox = g_object_new(NMT_TYPE_NEWT_LISTBOX,
"flags",
NMT_NEWT_LISTBOX_SCROLL | NMT_NEWT_LISTBOX_BORDER,
"skip-null-keys",
TRUE,
NULL);
priv->listbox = NMT_NEWT_LISTBOX (listbox);
nmt_newt_grid_add (grid, listbox, 0, 0);
nmt_newt_grid_set_flags (grid, listbox,
NMT_NEWT_GRID_FILL_X | NMT_NEWT_GRID_FILL_Y |
NMT_NEWT_GRID_EXPAND_X | NMT_NEWT_GRID_EXPAND_Y);
g_signal_connect (priv->listbox, "activated", G_CALLBACK (listbox_activated), list);
priv->listbox = NMT_NEWT_LISTBOX(listbox);
nmt_newt_grid_add(grid, listbox, 0, 0);
nmt_newt_grid_set_flags(grid,
listbox,
NMT_NEWT_GRID_FILL_X | NMT_NEWT_GRID_FILL_Y | NMT_NEWT_GRID_EXPAND_X
| NMT_NEWT_GRID_EXPAND_Y);
g_signal_connect(priv->listbox, "activated", G_CALLBACK(listbox_activated), list);
buttons = nmt_newt_button_box_new (NMT_NEWT_BUTTON_BOX_VERTICAL);
priv->buttons = NMT_NEWT_BUTTON_BOX (buttons);
nmt_newt_grid_add (grid, buttons, 1, 0);
nmt_newt_widget_set_padding (buttons, 1, 1, 0, 1);
nmt_newt_grid_set_flags (grid, buttons,
NMT_NEWT_GRID_FILL_X | NMT_NEWT_GRID_FILL_Y |
NMT_NEWT_GRID_EXPAND_Y);
buttons = nmt_newt_button_box_new(NMT_NEWT_BUTTON_BOX_VERTICAL);
priv->buttons = NMT_NEWT_BUTTON_BOX(buttons);
nmt_newt_grid_add(grid, buttons, 1, 0);
nmt_newt_widget_set_padding(buttons, 1, 1, 0, 1);
nmt_newt_grid_set_flags(grid,
buttons,
NMT_NEWT_GRID_FILL_X | NMT_NEWT_GRID_FILL_Y | NMT_NEWT_GRID_EXPAND_Y);
priv->add = nmt_newt_button_box_add_start (priv->buttons, _("Add"));
g_signal_connect (priv->add, "clicked", G_CALLBACK (add_clicked), list);
priv->add = nmt_newt_button_box_add_start(priv->buttons, _("Add"));
g_signal_connect(priv->add, "clicked", G_CALLBACK(add_clicked), list);
priv->edit = nmt_newt_button_box_add_start (priv->buttons, _("Edit..."));
g_signal_connect (priv->edit, "clicked", G_CALLBACK (edit_clicked), list);
priv->edit = nmt_newt_button_box_add_start(priv->buttons, _("Edit..."));
g_signal_connect(priv->edit, "clicked", G_CALLBACK(edit_clicked), list);
priv->delete = nmt_newt_button_box_add_start (priv->buttons, _("Delete"));
g_signal_connect (priv->delete, "clicked", G_CALLBACK (delete_clicked), list);
priv->delete = nmt_newt_button_box_add_start(priv->buttons, _("Delete"));
g_signal_connect(priv->delete, "clicked", G_CALLBACK(delete_clicked), list);
}
static int
sort_by_timestamp (gconstpointer a,
gconstpointer b)
sort_by_timestamp(gconstpointer a, gconstpointer b)
{
NMSettingConnection *s_con_a, *s_con_b;
guint64 time_a, time_b;
s_con_a = nm_connection_get_setting_connection ((NMConnection *) a);
s_con_b = nm_connection_get_setting_connection ((NMConnection *) b);
s_con_a = nm_connection_get_setting_connection((NMConnection *) a);
s_con_b = nm_connection_get_setting_connection((NMConnection *) b);
time_a = nm_setting_connection_get_timestamp (s_con_a);
time_b = nm_setting_connection_get_timestamp (s_con_b);
time_a = nm_setting_connection_get_timestamp(s_con_a);
time_b = nm_setting_connection_get_timestamp(s_con_b);
return (int) (time_b - time_a);
}
static void nmt_edit_connection_list_rebuild (NmtEditConnectionList *list);
static void nmt_edit_connection_list_rebuild(NmtEditConnectionList *list);
static void
rebuild_on_connection_changed (NMRemoteConnection *connection,
gpointer list)
rebuild_on_connection_changed(NMRemoteConnection *connection, gpointer list)
{
nmt_edit_connection_list_rebuild (list);
nmt_edit_connection_list_rebuild(list);
}
static void
free_connections (NmtEditConnectionList *list)
free_connections(NmtEditConnectionList *list)
{
NmtEditConnectionListPrivate *priv = NMT_EDIT_CONNECTION_LIST_GET_PRIVATE (list);
NMConnection *conn;
GSList *iter;
NmtEditConnectionListPrivate *priv = NMT_EDIT_CONNECTION_LIST_GET_PRIVATE(list);
NMConnection * conn;
GSList * iter;
for (iter = priv->connections; iter; iter = iter->next) {
conn = iter->data;
g_signal_handlers_disconnect_by_func (conn, G_CALLBACK (rebuild_on_connection_changed), list);
g_object_unref (conn);
g_signal_handlers_disconnect_by_func(conn, G_CALLBACK(rebuild_on_connection_changed), list);
g_object_unref(conn);
}
g_slist_free (priv->connections);
g_slist_free(priv->connections);
priv->connections = NULL;
}
static void
nmt_edit_connection_list_rebuild (NmtEditConnectionList *list)
nmt_edit_connection_list_rebuild(NmtEditConnectionList *list)
{
NmtEditConnectionListPrivate *priv = NMT_EDIT_CONNECTION_LIST_GET_PRIVATE (list);
const GPtrArray *connections;
GSList *iter;
NmtEditConnectionListPrivate *priv = NMT_EDIT_CONNECTION_LIST_GET_PRIVATE(list);
const GPtrArray * connections;
GSList * iter;
gboolean did_header = FALSE, did_vpn = FALSE;
NMEditorConnectionTypeData **types;
NMConnection *conn, *selected_conn;
NMEditorConnectionTypeData ** types;
NMConnection * conn, *selected_conn;
int i, row, selected_row;
selected_row = nmt_newt_listbox_get_active (priv->listbox);
selected_conn = nmt_newt_listbox_get_active_key (priv->listbox);
selected_row = nmt_newt_listbox_get_active(priv->listbox);
selected_conn = nmt_newt_listbox_get_active_key(priv->listbox);
free_connections (list);
connections = nm_client_get_connections (nm_client);
free_connections(list);
connections = nm_client_get_connections(nm_client);
for (i = 0; i < connections->len; i++) {
conn = connections->pdata[i];
if ( priv->connection_filter
&& !priv->connection_filter (list, conn, priv->connection_filter_data))
if (priv->connection_filter
&& !priv->connection_filter(list, conn, priv->connection_filter_data))
continue;
g_signal_connect (conn, NM_CONNECTION_CHANGED,
G_CALLBACK (rebuild_on_connection_changed), list);
priv->connections = g_slist_prepend (priv->connections, g_object_ref (conn));
g_signal_connect(conn,
NM_CONNECTION_CHANGED,
G_CALLBACK(rebuild_on_connection_changed),
list);
priv->connections = g_slist_prepend(priv->connections, g_object_ref(conn));
}
priv->connections = g_slist_sort (priv->connections, sort_by_timestamp);
g_object_notify (G_OBJECT (list), "connections");
g_object_notify (G_OBJECT (list), "num-connections");
priv->connections = g_slist_sort(priv->connections, sort_by_timestamp);
g_object_notify(G_OBJECT(list), "connections");
g_object_notify(G_OBJECT(list), "num-connections");
nmt_newt_component_set_sensitive (NMT_NEWT_COMPONENT (priv->edit),
priv->connections != NULL);
nmt_newt_component_set_sensitive (NMT_NEWT_COMPONENT (priv->delete),
priv->connections != NULL);
nmt_newt_component_set_sensitive(NMT_NEWT_COMPONENT(priv->edit), priv->connections != NULL);
nmt_newt_component_set_sensitive(NMT_NEWT_COMPONENT(priv->delete), priv->connections != NULL);
nmt_newt_listbox_clear (priv->listbox);
nmt_newt_listbox_clear(priv->listbox);
if (!priv->grouped) {
/* Just add the connections in order */
for (iter = priv->connections, row = 0; iter; iter = iter->next, row++) {
conn = iter->data;
nmt_newt_listbox_append (priv->listbox, nm_connection_get_id (conn), conn);
nmt_newt_listbox_append(priv->listbox, nm_connection_get_id(conn), conn);
if (conn == selected_conn)
selected_row = row;
}
if (selected_row >= row)
selected_row = row - 1;
nmt_newt_listbox_set_active (priv->listbox, selected_row);
nmt_newt_listbox_set_active(priv->listbox, selected_row);
return;
}
types = nm_editor_utils_get_connection_type_list ();
types = nm_editor_utils_get_connection_type_list();
for (i = row = 0; types[i]; i++) {
if (types[i]->setting_type == NM_TYPE_SETTING_VPN) {
if (did_vpn)
@ -211,26 +213,26 @@ nmt_edit_connection_list_rebuild (NmtEditConnectionList *list)
for (iter = priv->connections; iter; iter = iter->next) {
NMSetting *setting;
char *indented;
char * indented;
conn = iter->data;
setting = nm_connection_get_setting (conn, types[i]->setting_type);
setting = nm_connection_get_setting(conn, types[i]->setting_type);
if (!setting)
continue;
if (!nm_connection_is_type (conn, nm_setting_get_name (setting)))
if (!nm_connection_is_type(conn, nm_setting_get_name(setting)))
continue;
if (!did_header) {
nmt_newt_listbox_append (priv->listbox, types[i]->name, NULL);
nmt_newt_listbox_append(priv->listbox, types[i]->name, NULL);
if (row == selected_row)
selected_row++;
row++;
did_header = TRUE;
}
indented = g_strdup_printf (" %s", nm_connection_get_id (conn));
nmt_newt_listbox_append (priv->listbox, indented, conn);
g_free (indented);
indented = g_strdup_printf(" %s", nm_connection_get_id(conn));
nmt_newt_listbox_append(priv->listbox, indented, conn);
g_free(indented);
if (conn == selected_conn)
selected_row = row;
@ -240,182 +242,182 @@ nmt_edit_connection_list_rebuild (NmtEditConnectionList *list)
if (selected_row >= row)
selected_row = row - 1;
nmt_newt_listbox_set_active (priv->listbox, selected_row);
nmt_newt_listbox_set_active(priv->listbox, selected_row);
}
static void
rebuild_on_connections_changed (GObject *object,
GParamSpec *pspec,
gpointer list)
rebuild_on_connections_changed(GObject *object, GParamSpec *pspec, gpointer list)
{
nmt_edit_connection_list_rebuild (list);
nmt_edit_connection_list_rebuild(list);
}
static void
nmt_edit_connection_list_constructed (GObject *object)
nmt_edit_connection_list_constructed(GObject *object)
{
NmtEditConnectionList *list = NMT_EDIT_CONNECTION_LIST (object);
NmtEditConnectionListPrivate *priv = NMT_EDIT_CONNECTION_LIST_GET_PRIVATE (list);
NmtEditConnectionList * list = NMT_EDIT_CONNECTION_LIST(object);
NmtEditConnectionListPrivate *priv = NMT_EDIT_CONNECTION_LIST_GET_PRIVATE(list);
if (priv->extra)
nmt_newt_button_box_add_widget_end (priv->buttons, priv->extra);
nmt_newt_button_box_add_widget_end(priv->buttons, priv->extra);
g_signal_connect (nm_client, "notify::" NM_CLIENT_CONNECTIONS,
G_CALLBACK (rebuild_on_connections_changed), list);
g_signal_connect(nm_client,
"notify::" NM_CLIENT_CONNECTIONS,
G_CALLBACK(rebuild_on_connections_changed),
list);
nmt_edit_connection_list_rebuild (list);
nmt_edit_connection_list_rebuild(list);
G_OBJECT_CLASS (nmt_edit_connection_list_parent_class)->constructed (object);
G_OBJECT_CLASS(nmt_edit_connection_list_parent_class)->constructed(object);
}
static void
add_clicked (NmtNewtButton *button, gpointer list)
add_clicked(NmtNewtButton *button, gpointer list)
{
g_signal_emit (list, signals[ADD_CONNECTION], 0);
g_signal_emit(list, signals[ADD_CONNECTION], 0);
}
static void
edit_clicked (NmtNewtButton *button, gpointer list)
edit_clicked(NmtNewtButton *button, gpointer list)
{
NmtEditConnectionListPrivate *priv = NMT_EDIT_CONNECTION_LIST_GET_PRIVATE (list);
NMConnection *connection;
NmtEditConnectionListPrivate *priv = NMT_EDIT_CONNECTION_LIST_GET_PRIVATE(list);
NMConnection * connection;
connection = nmt_newt_listbox_get_active_key (priv->listbox);
g_return_if_fail (connection != NULL);
connection = nmt_newt_listbox_get_active_key(priv->listbox);
g_return_if_fail(connection != NULL);
g_signal_emit (list, signals[EDIT_CONNECTION], 0, connection);
g_signal_emit(list, signals[EDIT_CONNECTION], 0, connection);
}
static void
delete_clicked (NmtNewtButton *button, gpointer list)
delete_clicked(NmtNewtButton *button, gpointer list)
{
NmtEditConnectionListPrivate *priv = NMT_EDIT_CONNECTION_LIST_GET_PRIVATE (list);
NMRemoteConnection *connection;
NmtEditConnectionListPrivate *priv = NMT_EDIT_CONNECTION_LIST_GET_PRIVATE(list);
NMRemoteConnection * connection;
connection = nmt_newt_listbox_get_active_key (priv->listbox);
g_return_if_fail (connection != NULL);
connection = nmt_newt_listbox_get_active_key(priv->listbox);
g_return_if_fail(connection != NULL);
g_signal_emit (list, signals[REMOVE_CONNECTION], 0, connection);
g_signal_emit(list, signals[REMOVE_CONNECTION], 0, connection);
}
static void
listbox_activated (NmtNewtWidget *listbox, gpointer list)
listbox_activated(NmtNewtWidget *listbox, gpointer list)
{
NmtEditConnectionListPrivate *priv = NMT_EDIT_CONNECTION_LIST_GET_PRIVATE (list);
NmtEditConnectionListPrivate *priv = NMT_EDIT_CONNECTION_LIST_GET_PRIVATE(list);
edit_clicked (NMT_NEWT_BUTTON (priv->edit), list);
edit_clicked(NMT_NEWT_BUTTON(priv->edit), list);
}
static void
connection_saved (GObject *conn,
GAsyncResult *result,
gpointer user_data)
connection_saved(GObject *conn, GAsyncResult *result, gpointer user_data)
{
nm_remote_connection_save_finish (NM_REMOTE_CONNECTION (conn), result, NULL);
nm_remote_connection_save_finish(NM_REMOTE_CONNECTION(conn), result, NULL);
}
void
nmt_edit_connection_list_recommit (NmtEditConnectionList *list)
nmt_edit_connection_list_recommit(NmtEditConnectionList *list)
{
NmtEditConnectionListPrivate *priv = NMT_EDIT_CONNECTION_LIST_GET_PRIVATE (list);
NMConnection *conn;
GSList *iter;
NmtEditConnectionListPrivate *priv = NMT_EDIT_CONNECTION_LIST_GET_PRIVATE(list);
NMConnection * conn;
GSList * iter;
for (iter = priv->connections; iter; iter = iter->next) {
conn = iter->data;
if ( NM_IS_REMOTE_CONNECTION (conn)
&& (nm_remote_connection_get_unsaved (NM_REMOTE_CONNECTION (conn)) == FALSE)) {
nm_remote_connection_save_async (NM_REMOTE_CONNECTION (conn),
NULL, connection_saved, NULL);
if (NM_IS_REMOTE_CONNECTION(conn)
&& (nm_remote_connection_get_unsaved(NM_REMOTE_CONNECTION(conn)) == FALSE)) {
nm_remote_connection_save_async(NM_REMOTE_CONNECTION(conn),
NULL,
connection_saved,
NULL);
}
}
}
static void
nmt_edit_connection_list_finalize (GObject *object)
nmt_edit_connection_list_finalize(GObject *object)
{
NmtEditConnectionListPrivate *priv = NMT_EDIT_CONNECTION_LIST_GET_PRIVATE (object);
NmtEditConnectionListPrivate *priv = NMT_EDIT_CONNECTION_LIST_GET_PRIVATE(object);
free_connections (NMT_EDIT_CONNECTION_LIST (object));
g_clear_object (&priv->extra);
free_connections(NMT_EDIT_CONNECTION_LIST(object));
g_clear_object(&priv->extra);
G_OBJECT_CLASS (nmt_edit_connection_list_parent_class)->finalize (object);
G_OBJECT_CLASS(nmt_edit_connection_list_parent_class)->finalize(object);
}
static void
nmt_edit_connection_list_set_property (GObject *object,
nmt_edit_connection_list_set_property(GObject * object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
GParamSpec * pspec)
{
NmtEditConnectionListPrivate *priv = NMT_EDIT_CONNECTION_LIST_GET_PRIVATE (object);
NmtEditConnectionListPrivate *priv = NMT_EDIT_CONNECTION_LIST_GET_PRIVATE(object);
switch (prop_id) {
case PROP_GROUPED:
priv->grouped = g_value_get_boolean (value);
priv->grouped = g_value_get_boolean(value);
break;
case PROP_CONNECTION_FILTER:
priv->connection_filter = g_value_get_pointer (value);
priv->connection_filter = g_value_get_pointer(value);
break;
case PROP_CONNECTION_FILTER_DATA:
priv->connection_filter_data = g_value_get_pointer (value);
priv->connection_filter_data = g_value_get_pointer(value);
break;
case PROP_EXTRA_WIDGET:
priv->extra = g_value_get_object (value);
priv->extra = g_value_get_object(value);
if (priv->extra)
g_object_ref_sink (priv->extra);
g_object_ref_sink(priv->extra);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_edit_connection_list_get_property (GObject *object,
nmt_edit_connection_list_get_property(GObject * object,
guint prop_id,
GValue *value,
GValue * value,
GParamSpec *pspec)
{
NmtEditConnectionListPrivate *priv = NMT_EDIT_CONNECTION_LIST_GET_PRIVATE (object);
GPtrArray *connections;
GSList *iter;
NmtEditConnectionListPrivate *priv = NMT_EDIT_CONNECTION_LIST_GET_PRIVATE(object);
GPtrArray * connections;
GSList * iter;
switch (prop_id) {
case PROP_GROUPED:
g_value_set_boolean (value, priv->grouped);
g_value_set_boolean(value, priv->grouped);
break;
case PROP_CONNECTION_FILTER:
g_value_set_pointer (value, priv->connection_filter);
g_value_set_pointer(value, priv->connection_filter);
break;
case PROP_CONNECTION_FILTER_DATA:
g_value_set_pointer (value, priv->connection_filter_data);
g_value_set_pointer(value, priv->connection_filter_data);
break;
case PROP_EXTRA_WIDGET:
g_value_set_object (value, priv->extra);
g_value_set_object(value, priv->extra);
break;
case PROP_CONNECTIONS:
connections = g_ptr_array_new_with_free_func (g_object_unref);
connections = g_ptr_array_new_with_free_func(g_object_unref);
for (iter = priv->connections; iter; iter = iter->next)
g_ptr_array_add (connections, g_object_ref (iter->data));
g_value_take_boxed (value, connections);
g_ptr_array_add(connections, g_object_ref(iter->data));
g_value_take_boxed(value, connections);
break;
case PROP_NUM_CONNECTIONS:
g_value_set_int (value, g_slist_length (priv->connections));
g_value_set_int(value, g_slist_length(priv->connections));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
nmt_edit_connection_list_class_init (NmtEditConnectionListClass *list_class)
nmt_edit_connection_list_class_init(NmtEditConnectionListClass *list_class)
{
GObjectClass *object_class = G_OBJECT_CLASS (list_class);
GObjectClass *object_class = G_OBJECT_CLASS(list_class);
g_type_class_add_private (list_class, sizeof (NmtEditConnectionListPrivate));
g_type_class_add_private(list_class, sizeof(NmtEditConnectionListPrivate));
/* virtual methods */
object_class->constructed = nmt_edit_connection_list_constructed;
@ -432,12 +434,15 @@ nmt_edit_connection_list_class_init (NmtEditConnectionListClass *list_class)
* Emitted when the user clicks the list's "Add" button.
*/
signals[ADD_CONNECTION] =
g_signal_new ("add-connection",
G_OBJECT_CLASS_TYPE (object_class),
g_signal_new("add-connection",
G_OBJECT_CLASS_TYPE(object_class),
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (NmtEditConnectionListClass, add_connection),
NULL, NULL, NULL,
G_TYPE_NONE, 0);
G_STRUCT_OFFSET(NmtEditConnectionListClass, add_connection),
NULL,
NULL,
NULL,
G_TYPE_NONE,
0);
/**
* NmtEditConnectionList::edit-connection:
@ -448,12 +453,15 @@ nmt_edit_connection_list_class_init (NmtEditConnectionListClass *list_class)
* hits "Return" on the listbox.
*/
signals[EDIT_CONNECTION] =
g_signal_new ("edit-connection",
G_OBJECT_CLASS_TYPE (object_class),
g_signal_new("edit-connection",
G_OBJECT_CLASS_TYPE(object_class),
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (NmtEditConnectionListClass, edit_connection),
NULL, NULL, NULL,
G_TYPE_NONE, 1,
G_STRUCT_OFFSET(NmtEditConnectionListClass, edit_connection),
NULL,
NULL,
NULL,
G_TYPE_NONE,
1,
NM_TYPE_CONNECTION);
/**
@ -464,12 +472,15 @@ nmt_edit_connection_list_class_init (NmtEditConnectionListClass *list_class)
* Emitted when the user clicks the list's "Delete" button.
*/
signals[REMOVE_CONNECTION] =
g_signal_new ("remove-connection",
G_OBJECT_CLASS_TYPE (object_class),
g_signal_new("remove-connection",
G_OBJECT_CLASS_TYPE(object_class),
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (NmtEditConnectionListClass, remove_connection),
NULL, NULL, NULL,
G_TYPE_NONE, 1,
G_STRUCT_OFFSET(NmtEditConnectionListClass, remove_connection),
NULL,
NULL,
NULL,
G_TYPE_NONE,
1,
NM_TYPE_CONNECTION);
/* properties */
@ -481,13 +492,14 @@ nmt_edit_connection_list_class_init (NmtEditConnectionListClass *list_class)
* indicating the types (as in the main connection list). If %FALSE,
* they will not be grouped (as in slave connection lists).
*/
g_object_class_install_property
(object_class, PROP_GROUPED,
g_param_spec_boolean ("grouped", "", "",
g_object_class_install_property(
object_class,
PROP_GROUPED,
g_param_spec_boolean("grouped",
"",
"",
TRUE,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
/**
* NmtEditConnectionListFilter:
@ -505,23 +517,25 @@ nmt_edit_connection_list_class_init (NmtEditConnectionListClass *list_class)
* A callback function for filtering which connections appear in
* the list.
*/
g_object_class_install_property
(object_class, PROP_CONNECTION_FILTER,
g_param_spec_pointer ("connection-filter", "", "",
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
object_class,
PROP_CONNECTION_FILTER,
g_param_spec_pointer("connection-filter",
"",
"",
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
/**
* NmtEditConnectionList:connection-filter-data:
*
* Data for the #NmtEditConnectionList:connection-filter.
*/
g_object_class_install_property
(object_class, PROP_CONNECTION_FILTER_DATA,
g_param_spec_pointer ("connection-filter-data", "", "",
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
object_class,
PROP_CONNECTION_FILTER_DATA,
g_param_spec_pointer("connection-filter-data",
"",
"",
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
/**
* NmtEditConnectionList:extra-widget:
@ -529,13 +543,14 @@ nmt_edit_connection_list_class_init (NmtEditConnectionListClass *list_class)
* An extra button widget to display at the bottom of the button
* box.
*/
g_object_class_install_property
(object_class, PROP_EXTRA_WIDGET,
g_param_spec_object ("extra-widget", "", "",
g_object_class_install_property(
object_class,
PROP_EXTRA_WIDGET,
g_param_spec_object("extra-widget",
"",
"",
NMT_TYPE_NEWT_WIDGET,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
/**
* NmtEditConnectionList:connections:
@ -544,22 +559,26 @@ nmt_edit_connection_list_class_init (NmtEditConnectionListClass *list_class)
*
* Element-Type: #NMConnection
*/
g_object_class_install_property
(object_class, PROP_CONNECTIONS,
g_param_spec_boxed ("connections", "", "",
g_object_class_install_property(object_class,
PROP_CONNECTIONS,
g_param_spec_boxed("connections",
"",
"",
G_TYPE_PTR_ARRAY,
G_PARAM_READABLE |
G_PARAM_STATIC_STRINGS));
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
/**
* NmtEditConnectionList:num-connections:
*
* The number of connections in the widget.
*/
g_object_class_install_property
(object_class, PROP_NUM_CONNECTIONS,
g_param_spec_int ("num-connections", "", "",
0, G_MAXINT, 0,
G_PARAM_READABLE |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property(object_class,
PROP_NUM_CONNECTIONS,
g_param_spec_int("num-connections",
"",
"",
0,
G_MAXINT,
0,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
}

View file

@ -8,12 +8,17 @@
#include "nmt-newt.h"
#define NMT_TYPE_EDIT_CONNECTION_LIST (nmt_edit_connection_list_get_type ())
#define NMT_EDIT_CONNECTION_LIST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMT_TYPE_EDIT_CONNECTION_LIST, NmtEditConnectionList))
#define NMT_EDIT_CONNECTION_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NMT_TYPE_EDIT_CONNECTION_LIST, NmtEditConnectionListClass))
#define NMT_IS_EDIT_CONNECTION_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NMT_TYPE_EDIT_CONNECTION_LIST))
#define NMT_IS_EDIT_CONNECTION_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NMT_TYPE_EDIT_CONNECTION_LIST))
#define NMT_EDIT_CONNECTION_LIST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NMT_TYPE_EDIT_CONNECTION_LIST, NmtEditConnectionListClass))
#define NMT_TYPE_EDIT_CONNECTION_LIST (nmt_edit_connection_list_get_type())
#define NMT_EDIT_CONNECTION_LIST(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), NMT_TYPE_EDIT_CONNECTION_LIST, NmtEditConnectionList))
#define NMT_EDIT_CONNECTION_LIST_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), NMT_TYPE_EDIT_CONNECTION_LIST, NmtEditConnectionListClass))
#define NMT_IS_EDIT_CONNECTION_LIST(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj), NMT_TYPE_EDIT_CONNECTION_LIST))
#define NMT_IS_EDIT_CONNECTION_LIST_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass), NMT_TYPE_EDIT_CONNECTION_LIST))
#define NMT_EDIT_CONNECTION_LIST_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), NMT_TYPE_EDIT_CONNECTION_LIST, NmtEditConnectionListClass))
typedef struct {
NmtNewtGrid parent;
@ -24,19 +29,17 @@ typedef struct {
NmtNewtGridClass parent;
/* signals */
void (*add_connection) (NmtEditConnectionList *list);
void (*edit_connection) (NmtEditConnectionList *list,
NMConnection *connection);
void (*remove_connection) (NmtEditConnectionList *list,
NMRemoteConnection *connection);
void (*add_connection)(NmtEditConnectionList *list);
void (*edit_connection)(NmtEditConnectionList *list, NMConnection *connection);
void (*remove_connection)(NmtEditConnectionList *list, NMRemoteConnection *connection);
} NmtEditConnectionListClass;
GType nmt_edit_connection_list_get_type (void);
GType nmt_edit_connection_list_get_type(void);
typedef gboolean (*NmtEditConnectionListFilter) (NmtEditConnectionList *list,
NMConnection *connection,
typedef gboolean (*NmtEditConnectionListFilter)(NmtEditConnectionList *list,
NMConnection * connection,
gpointer user_data);
void nmt_edit_connection_list_recommit (NmtEditConnectionList *list);
void nmt_edit_connection_list_recommit(NmtEditConnectionList *list);
#endif /* NMT_EDIT_CONNECTION_LIST_H */

View file

@ -28,20 +28,21 @@
#include "nmt-editor-grid.h"
G_DEFINE_TYPE (NmtEditorGrid, nmt_editor_grid, NMT_TYPE_NEWT_CONTAINER)
G_DEFINE_TYPE(NmtEditorGrid, nmt_editor_grid, NMT_TYPE_NEWT_CONTAINER)
#define NMT_EDITOR_GRID_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NMT_TYPE_EDITOR_GRID, NmtEditorGridPrivate))
#define NMT_EDITOR_GRID_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE((o), NMT_TYPE_EDITOR_GRID, NmtEditorGridPrivate))
typedef struct {
GArray *rows;
int *row_heights;
int * row_heights;
int indent;
} NmtEditorGridPrivate;
typedef struct {
NmtNewtWidget *label;
NmtNewtWidget *widget;
NmtNewtWidget *extra;
NmtNewtWidget * label;
NmtNewtWidget * widget;
NmtNewtWidget * extra;
NmtEditorGridRowFlags flags;
} NmtEditorGridRow;
@ -57,29 +58,28 @@ typedef struct {
* Returns: a new #NmtEditorGrid
*/
NmtNewtWidget *
nmt_editor_grid_new (void)
nmt_editor_grid_new(void)
{
return g_object_new (NMT_TYPE_EDITOR_GRID,
NULL);
return g_object_new(NMT_TYPE_EDITOR_GRID, NULL);
}
static void
nmt_editor_grid_init (NmtEditorGrid *grid)
nmt_editor_grid_init(NmtEditorGrid *grid)
{
NmtEditorGridPrivate *priv = NMT_EDITOR_GRID_GET_PRIVATE (grid);
NmtEditorGridPrivate *priv = NMT_EDITOR_GRID_GET_PRIVATE(grid);
priv->rows = g_array_new (FALSE, TRUE, sizeof (NmtEditorGridRow));
priv->rows = g_array_new(FALSE, TRUE, sizeof(NmtEditorGridRow));
}
static void
nmt_editor_grid_finalize (GObject *object)
nmt_editor_grid_finalize(GObject *object)
{
NmtEditorGridPrivate *priv = NMT_EDITOR_GRID_GET_PRIVATE (object);
NmtEditorGridPrivate *priv = NMT_EDITOR_GRID_GET_PRIVATE(object);
g_array_unref (priv->rows);
nm_clear_g_free (&priv->row_heights);
g_array_unref(priv->rows);
nm_clear_g_free(&priv->row_heights);
G_OBJECT_CLASS (nmt_editor_grid_parent_class)->finalize (object);
G_OBJECT_CLASS(nmt_editor_grid_parent_class)->finalize(object);
}
/**
@ -101,52 +101,53 @@ nmt_editor_grid_finalize (GObject *object)
* See also nmt_editor_grid_set_row_flags().
*/
void
nmt_editor_grid_append (NmtEditorGrid *grid,
const char *label,
nmt_editor_grid_append(NmtEditorGrid *grid,
const char * label,
NmtNewtWidget *widget,
NmtNewtWidget *extra)
{
NmtEditorGridPrivate *priv = NMT_EDITOR_GRID_GET_PRIVATE (grid);
NmtNewtContainerClass *parent_class = NMT_NEWT_CONTAINER_CLASS (nmt_editor_grid_parent_class);
NmtNewtContainer *container = NMT_NEWT_CONTAINER (grid);
NmtEditorGridPrivate * priv = NMT_EDITOR_GRID_GET_PRIVATE(grid);
NmtNewtContainerClass *parent_class = NMT_NEWT_CONTAINER_CLASS(nmt_editor_grid_parent_class);
NmtNewtContainer * container = NMT_NEWT_CONTAINER(grid);
NmtEditorGridRow row;
g_return_if_fail (label != NULL || widget != NULL);
g_return_if_fail(label != NULL || widget != NULL);
memset (&row, 0, sizeof (row));
memset(&row, 0, sizeof(row));
if (label && !widget) {
widget = nmt_newt_label_new (label);
widget = nmt_newt_label_new(label);
label = NULL;
}
if (label) {
row.label = nmt_newt_label_new (label);
parent_class->add (container, row.label);
row.label = nmt_newt_label_new(label);
parent_class->add(container, row.label);
}
row.widget = widget;
parent_class->add (container, widget);
parent_class->add(container, widget);
if (row.label) {
g_object_bind_property (row.widget, "valid",
row.label, "highlight",
g_object_bind_property(row.widget,
"valid",
row.label,
"highlight",
G_BINDING_INVERT_BOOLEAN | G_BINDING_SYNC_CREATE);
}
if (extra) {
row.extra = extra;
parent_class->add (container, extra);
parent_class->add(container, extra);
}
g_array_append_val (priv->rows, row);
g_array_append_val(priv->rows, row);
}
static int
nmt_editor_grid_find_widget (NmtEditorGrid *grid,
NmtNewtWidget *widget)
nmt_editor_grid_find_widget(NmtEditorGrid *grid, NmtNewtWidget *widget)
{
NmtEditorGridPrivate *priv = NMT_EDITOR_GRID_GET_PRIVATE (grid);
NmtEditorGridRow *rows = (NmtEditorGridRow *) priv->rows->data;
NmtEditorGridPrivate *priv = NMT_EDITOR_GRID_GET_PRIVATE(grid);
NmtEditorGridRow * rows = (NmtEditorGridRow *) priv->rows->data;
int i;
for (i = 0; i < priv->rows->len; i++) {
@ -176,174 +177,171 @@ nmt_editor_grid_find_widget (NmtEditorGrid *grid,
* Sets flags to adjust the layout of @widget's row in @grid.
*/
void
nmt_editor_grid_set_row_flags (NmtEditorGrid *grid,
NmtNewtWidget *widget,
nmt_editor_grid_set_row_flags(NmtEditorGrid * grid,
NmtNewtWidget * widget,
NmtEditorGridRowFlags flags)
{
NmtEditorGridPrivate *priv = NMT_EDITOR_GRID_GET_PRIVATE (grid);
NmtEditorGridRow *rows = (NmtEditorGridRow *) priv->rows->data;
NmtEditorGridPrivate *priv = NMT_EDITOR_GRID_GET_PRIVATE(grid);
NmtEditorGridRow * rows = (NmtEditorGridRow *) priv->rows->data;
int i;
i = nmt_editor_grid_find_widget (grid, widget);
i = nmt_editor_grid_find_widget(grid, widget);
if (i != -1)
rows[i].flags = flags;
}
static void
nmt_editor_grid_remove (NmtNewtContainer *container,
NmtNewtWidget *widget)
nmt_editor_grid_remove(NmtNewtContainer *container, NmtNewtWidget *widget)
{
NmtEditorGrid *grid = NMT_EDITOR_GRID (container);
NmtEditorGridPrivate *priv = NMT_EDITOR_GRID_GET_PRIVATE (grid);
NmtNewtContainerClass *parent_class = NMT_NEWT_CONTAINER_CLASS (nmt_editor_grid_parent_class);
NmtEditorGridRow *rows = (NmtEditorGridRow *) priv->rows->data;
NmtEditorGrid * grid = NMT_EDITOR_GRID(container);
NmtEditorGridPrivate * priv = NMT_EDITOR_GRID_GET_PRIVATE(grid);
NmtNewtContainerClass *parent_class = NMT_NEWT_CONTAINER_CLASS(nmt_editor_grid_parent_class);
NmtEditorGridRow * rows = (NmtEditorGridRow *) priv->rows->data;
int i;
i = nmt_editor_grid_find_widget (grid, widget);
i = nmt_editor_grid_find_widget(grid, widget);
if (i != -1) {
if (rows[i].label)
parent_class->remove (container, rows[i].label);
parent_class->remove (container, rows[i].widget);
parent_class->remove(container, rows[i].label);
parent_class->remove(container, rows[i].widget);
if (rows[i].extra)
parent_class->remove (container, rows[i].extra);
parent_class->remove(container, rows[i].extra);
g_array_remove_index (priv->rows, i);
g_array_remove_index(priv->rows, i);
return;
}
// FIXME: shouldn't happen
parent_class->remove (container, widget);
parent_class->remove(container, widget);
}
static newtComponent *
nmt_editor_grid_get_components (NmtNewtWidget *widget)
nmt_editor_grid_get_components(NmtNewtWidget *widget)
{
NmtEditorGridPrivate *priv = NMT_EDITOR_GRID_GET_PRIVATE (widget);
NmtEditorGridRow *rows = (NmtEditorGridRow *) priv->rows->data;
newtComponent *child_cos;
GPtrArray *cos;
NmtEditorGridPrivate *priv = NMT_EDITOR_GRID_GET_PRIVATE(widget);
NmtEditorGridRow * rows = (NmtEditorGridRow *) priv->rows->data;
newtComponent * child_cos;
GPtrArray * cos;
int i, c;
cos = g_ptr_array_new ();
cos = g_ptr_array_new();
for (i = 0; i < priv->rows->len; i++) {
if (!nmt_newt_widget_get_visible (rows[i].widget))
if (!nmt_newt_widget_get_visible(rows[i].widget))
continue;
if (rows[i].label) {
child_cos = nmt_newt_widget_get_components (rows[i].label);
g_assert (child_cos[0] && !child_cos[1]);
g_ptr_array_add (cos, child_cos[0]);
g_free (child_cos);
child_cos = nmt_newt_widget_get_components(rows[i].label);
g_assert(child_cos[0] && !child_cos[1]);
g_ptr_array_add(cos, child_cos[0]);
g_free(child_cos);
}
child_cos = nmt_newt_widget_get_components (rows[i].widget);
child_cos = nmt_newt_widget_get_components(rows[i].widget);
for (c = 0; child_cos[c]; c++)
g_ptr_array_add (cos, child_cos[c]);
g_free (child_cos);
g_ptr_array_add(cos, child_cos[c]);
g_free(child_cos);
if (rows[i].extra) {
child_cos = nmt_newt_widget_get_components (rows[i].extra);
child_cos = nmt_newt_widget_get_components(rows[i].extra);
for (c = 0; child_cos[c]; c++)
g_ptr_array_add (cos, child_cos[c]);
g_free (child_cos);
g_ptr_array_add(cos, child_cos[c]);
g_free(child_cos);
}
}
g_ptr_array_add (cos, NULL);
return (newtComponent *) g_ptr_array_free (cos, FALSE);
g_ptr_array_add(cos, NULL);
return (newtComponent *) g_ptr_array_free(cos, FALSE);
}
static NmtEditorGridFormState *
get_form_state (NmtNewtWidget *widget)
get_form_state(NmtNewtWidget *widget)
{
NmtNewtForm *form = nmt_newt_widget_get_form (widget);
NmtNewtForm * form = nmt_newt_widget_get_form(widget);
NmtEditorGridFormState *state;
if (!form)
return NULL;
state = g_object_get_data (G_OBJECT (form), "NmtEditorGridFormState");
state = g_object_get_data(G_OBJECT(form), "NmtEditorGridFormState");
if (state)
return state;
state = g_new0 (NmtEditorGridFormState, 1);
g_object_set_data_full (G_OBJECT (form), "NmtEditorGridFormState", state, g_free);
state = g_new0(NmtEditorGridFormState, 1);
g_object_set_data_full(G_OBJECT(form), "NmtEditorGridFormState", state, g_free);
return state;
}
static void
nmt_editor_grid_realize (NmtNewtWidget *widget)
nmt_editor_grid_realize(NmtNewtWidget *widget)
{
NmtEditorGridPrivate *priv = NMT_EDITOR_GRID_GET_PRIVATE (widget);
NmtNewtWidget *parent;
NmtEditorGridPrivate *priv = NMT_EDITOR_GRID_GET_PRIVATE(widget);
NmtNewtWidget * parent;
NMT_NEWT_WIDGET_CLASS (nmt_editor_grid_parent_class)->realize (widget);
NMT_NEWT_WIDGET_CLASS(nmt_editor_grid_parent_class)->realize(widget);
/* This is a hack, but it's the simplest way to make it work... */
priv->indent = 0;
parent = nmt_newt_widget_get_parent (widget);
parent = nmt_newt_widget_get_parent(widget);
while (parent) {
if (NMT_IS_NEWT_SECTION (parent)) {
if (NMT_IS_NEWT_SECTION(parent)) {
priv->indent = 2;
break;
}
parent = nmt_newt_widget_get_parent (parent);
parent = nmt_newt_widget_get_parent(parent);
}
}
static void
nmt_editor_grid_unrealize (NmtNewtWidget *widget)
nmt_editor_grid_unrealize(NmtNewtWidget *widget)
{
NmtEditorGridFormState *state = get_form_state (widget);
NmtEditorGridFormState *state = get_form_state(widget);
if (state)
memset (state->col_widths, 0, sizeof (state->col_widths));
memset(state->col_widths, 0, sizeof(state->col_widths));
NMT_NEWT_WIDGET_CLASS (nmt_editor_grid_parent_class)->unrealize (widget);
NMT_NEWT_WIDGET_CLASS(nmt_editor_grid_parent_class)->unrealize(widget);
}
static void
nmt_editor_grid_size_request (NmtNewtWidget *widget,
int *width,
int *height)
nmt_editor_grid_size_request(NmtNewtWidget *widget, int *width, int *height)
{
NmtEditorGridPrivate *priv = NMT_EDITOR_GRID_GET_PRIVATE (widget);
NmtEditorGridRow *rows = (NmtEditorGridRow *) priv->rows->data;
NmtEditorGridFormState *state = get_form_state (widget);
NmtEditorGridPrivate * priv = NMT_EDITOR_GRID_GET_PRIVATE(widget);
NmtEditorGridRow * rows = (NmtEditorGridRow *) priv->rows->data;
NmtEditorGridFormState *state = get_form_state(widget);
gboolean add_padding = FALSE;
int i;
g_free (priv->row_heights);
priv->row_heights = g_new0 (int, priv->rows->len);
g_free(priv->row_heights);
priv->row_heights = g_new0(int, priv->rows->len);
*height = 0;
for (i = 0; i < priv->rows->len; i++) {
int lwidth, lheight, wwidth, wheight, ewidth, eheight;
if (!nmt_newt_widget_get_visible (rows[i].widget))
if (!nmt_newt_widget_get_visible(rows[i].widget))
continue;
if (rows[i].label) {
nmt_newt_widget_size_request (rows[i].label, &lwidth, &lheight);
nmt_newt_widget_size_request(rows[i].label, &lwidth, &lheight);
lwidth += priv->indent;
state->col_widths[0] = MAX (state->col_widths[0], lwidth);
state->col_widths[0] = MAX(state->col_widths[0], lwidth);
nmt_newt_widget_size_request (rows[i].widget, &wwidth, &wheight);
state->col_widths[1] = MAX (state->col_widths[1], wwidth);
nmt_newt_widget_size_request(rows[i].widget, &wwidth, &wheight);
state->col_widths[1] = MAX(state->col_widths[1], wwidth);
priv->row_heights[i] = wheight;
add_padding = TRUE;
} else {
nmt_newt_widget_size_request (rows[i].widget, &wwidth, &wheight);
nmt_newt_widget_size_request(rows[i].widget, &wwidth, &wheight);
priv->row_heights[i] = wheight;
}
if (rows[i].extra) {
nmt_newt_widget_size_request (rows[i].extra, &ewidth, &eheight);
state->col_widths[2] = MAX (state->col_widths[2], ewidth);
priv->row_heights[i] = MAX (priv->row_heights[i], eheight);
nmt_newt_widget_size_request(rows[i].extra, &ewidth, &eheight);
state->col_widths[2] = MAX(state->col_widths[2], ewidth);
priv->row_heights[i] = MAX(priv->row_heights[i], eheight);
}
*height += priv->row_heights[i];
@ -355,15 +353,11 @@ nmt_editor_grid_size_request (NmtNewtWidget *widget,
}
static void
nmt_editor_grid_size_allocate (NmtNewtWidget *widget,
int x,
int y,
int width,
int height)
nmt_editor_grid_size_allocate(NmtNewtWidget *widget, int x, int y, int width, int height)
{
NmtEditorGridPrivate *priv = NMT_EDITOR_GRID_GET_PRIVATE (widget);
NmtEditorGridRow *rows = (NmtEditorGridRow *) priv->rows->data;
NmtEditorGridFormState *state = get_form_state (widget);
NmtEditorGridPrivate * priv = NMT_EDITOR_GRID_GET_PRIVATE(widget);
NmtEditorGridRow * rows = (NmtEditorGridRow *) priv->rows->data;
NmtEditorGridFormState *state = get_form_state(widget);
int col0_width, col1_width, col2_width;
int i, row;
@ -372,7 +366,7 @@ nmt_editor_grid_size_allocate (NmtNewtWidget *widget,
col2_width = state->col_widths[2];
for (i = row = 0; i < priv->rows->len; i++) {
if (!nmt_newt_widget_get_visible (rows[i].widget))
if (!nmt_newt_widget_get_visible(rows[i].widget))
continue;
if (rows[i].label) {
@ -381,23 +375,23 @@ nmt_editor_grid_size_allocate (NmtNewtWidget *widget,
if (rows[i].flags & NMT_EDITOR_GRID_ROW_LABEL_ALIGN_LEFT)
lx = x;
else {
nmt_newt_widget_size_request (rows[i].label, &lwidth, &lheight);
nmt_newt_widget_size_request(rows[i].label, &lwidth, &lheight);
lx = x + col0_width - lwidth;
}
nmt_newt_widget_size_allocate (rows[i].label,
nmt_newt_widget_size_allocate(rows[i].label,
lx,
y + row,
col0_width,
priv->row_heights[i]);
nmt_newt_widget_size_allocate (rows[i].widget,
nmt_newt_widget_size_allocate(rows[i].widget,
x + col0_width + 1,
y + row,
col1_width,
priv->row_heights[i]);
} else {
nmt_newt_widget_size_allocate (rows[i].widget,
nmt_newt_widget_size_allocate(rows[i].widget,
x,
y + row,
col0_width + col1_width + 1,
@ -410,11 +404,11 @@ nmt_editor_grid_size_allocate (NmtNewtWidget *widget,
if (rows[i].flags & NMT_EDITOR_GRID_ROW_EXTRA_ALIGN_RIGHT)
ex = x + col0_width + col1_width + 2;
else {
nmt_newt_widget_size_request (rows[i].widget, &wwidth, &wheight);
nmt_newt_widget_size_request(rows[i].widget, &wwidth, &wheight);
ex = x + col0_width + wwidth + 2;
}
nmt_newt_widget_size_allocate (rows[i].extra,
nmt_newt_widget_size_allocate(rows[i].extra,
ex,
y + row,
col2_width,
@ -426,13 +420,13 @@ nmt_editor_grid_size_allocate (NmtNewtWidget *widget,
}
static void
nmt_editor_grid_class_init (NmtEditorGridClass *grid_class)
nmt_editor_grid_class_init(NmtEditorGridClass *grid_class)
{
GObjectClass *object_class = G_OBJECT_CLASS (grid_class);
NmtNewtWidgetClass *widget_class = NMT_NEWT_WIDGET_CLASS (grid_class);
NmtNewtContainerClass *container_class = NMT_NEWT_CONTAINER_CLASS (grid_class);
GObjectClass * object_class = G_OBJECT_CLASS(grid_class);
NmtNewtWidgetClass * widget_class = NMT_NEWT_WIDGET_CLASS(grid_class);
NmtNewtContainerClass *container_class = NMT_NEWT_CONTAINER_CLASS(grid_class);
g_type_class_add_private (grid_class, sizeof (NmtEditorGridPrivate));
g_type_class_add_private(grid_class, sizeof(NmtEditorGridPrivate));
/* virtual methods */
object_class->finalize = nmt_editor_grid_finalize;

Some files were not shown because too many files have changed in this diff Show more