summaryrefslogtreecommitdiffstats
path: root/oncology/dpfhack_display/lcd4linux/.svn/text-base/plugin_dbus.c.svn-base
diff options
context:
space:
mode:
Diffstat (limited to 'oncology/dpfhack_display/lcd4linux/.svn/text-base/plugin_dbus.c.svn-base')
-rw-r--r--oncology/dpfhack_display/lcd4linux/.svn/text-base/plugin_dbus.c.svn-base857
1 files changed, 0 insertions, 857 deletions
diff --git a/oncology/dpfhack_display/lcd4linux/.svn/text-base/plugin_dbus.c.svn-base b/oncology/dpfhack_display/lcd4linux/.svn/text-base/plugin_dbus.c.svn-base
deleted file mode 100644
index 0647e1ca..00000000
--- a/oncology/dpfhack_display/lcd4linux/.svn/text-base/plugin_dbus.c.svn-base
+++ /dev/null
@@ -1,857 +0,0 @@
-/* $Id: plugin_dbus.c -1 $
- * $URL: https://ssl.bulix.org/svn/lcd4linux/trunk/plugin_dbus.c $
- *
- * plugin template
- *
- * Copyright (C) 2009 Edward Martin <edman007@edman007.com>
- * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 The LCD4Linux Team <lcd4linux-devel@users.sourceforge.net>
- *
- * This file is part of LCD4Linux.
- *
- * LCD4Linux is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * LCD4Linux is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- */
-
-/*
- * exported functions:
- *
- * int plugin_init_dbus (void)
- * adds various functions
- *
- */
-
-
-/* define the include files you need */
-#include "config.h"
-
-#include <stdlib.h>
-#include <stdint.h>
-#include <string.h>
-#include <ctype.h>
-#include <unistd.h>
-
-/* these should always be included */
-#include "debug.h"
-#include "plugin.h"
-#include "cfg.h"
-#include "timer.h"
-
-#ifdef WITH_DMALLOC
-#include <dmalloc.h>
-#endif
-
-#include "event.h"
-#include <dbus/dbus.h>
-#include <stdio.h>
-#include <assert.h>
-/*
- * Internal Text Storage (to catch the events)
- */
-
-//a buffer of the most recent results (store the strings you see on the screen)
-typedef struct {
- int argc;
- char **arguments;
-} dbus_signal_t;
-
-static struct {
- int signals;
- dbus_signal_t *a;
-} dbus_results = {
-0, NULL};
-
-//free all resources for the text of a signal
-static int clear_signal_txt(const int sig);
-
-//return a pointer to the struct of text for the signal
-static dbus_signal_t *get_signal_txt(const int sig);
-
-//set the struct of text for the signal
-static int set_signal_txt(const int sig, const dbus_signal_t * data);
-
-
-/*
- * DBus Functions/types
- */
-
-
-//the max that a message may be in characters (if you have a screen that fits more go crazy)
-static const int LCD_MAX_MSG_LEN = 255;
-#define DBUS_MAX_SIGNALS 64
-static const char *DBUS_PLUGIN_SECTION = "Plugin:DBus";
-
-
-
-/*
- * This connects to dbus and gets relavant things for the LCD
- */
-
-typedef struct lcd_sig_t lcd_sig_t;
-//do not look inside, its private!
-struct lcd_sig_t {
- void *user_data;
- void (*callback) (void *user_data, int argc, char **argv);
- void (*user_free) (void *);
- char *sender;
- char *path;
- char *interface;
- char *member;
- char *rule;
-};
-
-
-typedef struct {
- int id;
- char *event_name;
-} handle_signal_t;
-
-static DBusConnection *sessconn;
-static DBusConnection *sysconn;
-static DBusError err;
-
-static lcd_sig_t *lcd_registered_signals[DBUS_MAX_SIGNALS]; //used mostly for freeing resources
-static int registered_sig_count = 0;
-
-//takes the signal, matches it against a rule, and sends the correct agrument, as a string, to the screen
-static DBusHandlerResult lcd_sig_received(DBusConnection * connection, DBusMessage * message, void *sigv);
-
-//frees all resources for a signal (use lcd_unregister_signal instead)
-static void free_signal(lcd_sig_t * sig);
-//unregisters a signal and frees its resources
-static void lcd_unregister_signal(lcd_sig_t * sig);
-
-//these copy data in/out of dbus
-static void fill_args(DBusMessage * message, int *argcount, char ***argv);
-static void free_args(int argc, char **argv);
-
-//returns 0 on error (no connection opened)
-// 1 when only the system connection was opened
-// 2 when only the session connection was opened
-// 3 both connections were opened
-static int lcd_dbus_init(void);
-
-static void handle_inbound_signal(void *signal, int argc, char **argv);
-static void free_handle_signal(handle_signal_t * sig);
-
-//given a signal, will add a hook so when the signal appears your callback is called
-static lcd_sig_t *lcd_register_signal(const char *sender, const char *path,
- const char *interface, const char *member,
- void (*callback) (void *user_data, int argc, char **argv), void *user_data,
- void (*user_free) (void *));
-
-static void setup_dbus_events(DBusConnection * conn);
-
-//to handle watches through the main loop
-static dbus_bool_t add_watch(DBusWatch * w, void *data);
-static void remove_watch(DBusWatch * w, void *data);
-static void toggle_watch(DBusWatch * w, void *data);
-static void watch_handle(event_flags_t f, void *data);
-
-static void dispatch_dbus(void); //tell dbus to read something
-
-
-//to handle timers through the main loop
-static void timeout_dbus_handle(void *data);
-static dbus_bool_t add_dbus_timeout(DBusTimeout * t, void *data);
-static void remove_dbus_timeout(DBusTimeout * t, void *data);
-static void toggle_dbus_timeout(DBusTimeout * t, void *data);
-
-static lcd_sig_t *create_signal(const char *sender, const char *path,
- const char *interface, const char *member,
- void (*callback) (void *user_data, int argc, char **argv), void *user_data,
- void (*user_free) (void *));
-
-static int clear_signal_txt(const int sig)
-{
- dbus_signal_t *s = get_signal_txt(sig);
- if (s == NULL) {
- return 1;
- }
- int i;
- if (s->arguments != NULL) {
- for (i = 0; i < s->argc; i++) {
- if (s->arguments[i] != NULL) {
- free(s->arguments[i]);
- }
- }
- free(s->arguments);
- s->arguments = NULL;
- }
- s->argc = 0;
- return 0;
-}
-
-static dbus_signal_t *get_signal_txt(const int sig)
-{
- if (sig < 0 || sig >= dbus_results.signals) {
- return NULL;
- }
- return &dbus_results.a[sig];
-}
-
-//sets a signal struct for the given data
-static int set_signal_txt(const int sig, const dbus_signal_t * data)
-{
- if (sig < 0 || sig >= dbus_results.signals) {
- int new_sigs = sig + 1;
- //allocate it
- dbus_results.a = realloc(dbus_results.a, sizeof(dbus_signal_t) * new_sigs);
- int i;
- //clear anything just allocated that we are not writing to right now
- for (i = dbus_results.signals; i < new_sigs; i++) {
- dbus_results.a[i].argc = 0;
- dbus_results.a[i].arguments = NULL;
- }
- dbus_results.signals = new_sigs;
- }
- //free the old version
- if (dbus_results.a[sig].argc != 0) {
- clear_signal_txt(sig);
- }
- dbus_results.a[sig].argc = data->argc;
- //need to dup the strings
- dbus_results.a[sig].arguments = malloc(sizeof(data->arguments) * data->argc);
- int i;
- for (i = 0; i < data->argc; i++) {
- dbus_results.a[sig].arguments[i] = strdup(data->arguments[i]);
- }
- return 0;
-}
-
-
-
-/*
- * lcd4linux interface fucntions
- */
-
-
-static void get_argument(RESULT * result, RESULT * sig, RESULT * arg)
-{
- int signal = (int) R2N(sig);
- int argument = (int) R2N(arg);
-
- dbus_signal_t *signal_value = get_signal_txt(signal);
- char *value = "";
- if (signal_value != NULL && signal_value->argc > argument && signal_value->arguments[argument] != NULL) {
- value = signal_value->arguments[argument];
-
- }
-
- /* store result */
- SetResult(&result, R_STRING, value);
-
-}
-
-static void clear_arguments(RESULT * result, RESULT * sig)
-{
- int signal = (int) R2N(sig);
- dbus_signal_t *signal_value = get_signal_txt(signal);
- int i;
- if (signal_value->arguments != NULL) {
- for (i = 0; i < signal_value->argc; i++) {
- if (signal_value->arguments[i] != NULL) {
- free(signal_value->arguments[i]);
- }
- }
- free(signal_value->arguments);
- signal_value->arguments = NULL;
- }
- signal_value->argc = 0;
-
- /* store result */
- SetResult(&result, R_STRING, "");
-}
-
-static void load_dbus_cfg(void)
-{
- char *sender, *path, *interface, *member, *eventname;
- int i;
- const char *sender_fmt = "signal%dsender";
- const char *path_fmt = "signal%dpath";
- const char *interface_fmt = "signal%dinterface";
- const char *member_fmt = "signal%dmember";
- const char *eventname_fmt = "signal%deventname";
- const int max_cfg_len = 32;
- char cfg_name[max_cfg_len];
- for (i = 0; i < DBUS_MAX_SIGNALS; i++) {
- snprintf(cfg_name, max_cfg_len - 1, sender_fmt, i);
- sender = cfg_get(DBUS_PLUGIN_SECTION, cfg_name, "");
-
- snprintf(cfg_name, max_cfg_len - 1, path_fmt, i);
- path = cfg_get(DBUS_PLUGIN_SECTION, cfg_name, "");
-
- snprintf(cfg_name, max_cfg_len - 1, interface_fmt, i);
- interface = cfg_get(DBUS_PLUGIN_SECTION, cfg_name, "");
-
- snprintf(cfg_name, max_cfg_len - 1, member_fmt, i);
- member = cfg_get(DBUS_PLUGIN_SECTION, cfg_name, "");
-
- snprintf(cfg_name, max_cfg_len - 1, eventname_fmt, i);
- eventname = cfg_get(DBUS_PLUGIN_SECTION, cfg_name, "");
-
- if (*path == '\0' && *interface == '\0' && *member == '\0') {
- goto cleanup;
- } else if (*path == '\0' || *interface == '\0' || *member == '\0') {
- error("[DBus] Incomplete configuration specified for signal%d", i);
- goto cleanup;
- }
-
- handle_signal_t *sig_info = malloc(sizeof(handle_signal_t));
- sig_info->id = i;
- if (*eventname == '\0') {
- sig_info->event_name = NULL;
- } else {
- sig_info->event_name = strdup(eventname);
- }
-
- if (!lcd_register_signal(sender, path, interface, member, handle_inbound_signal,
- sig_info, (void (*)(void *)) free_handle_signal)) {
- error("[DBus] Error Registering signal %d", i);
- }
- cleanup:
- free(sender);
- free(path);
- free(interface);
- free(member);
- free(eventname);
- }
-}
-
-
-static void free_handle_signal(handle_signal_t * sig)
-{
- if (sig->event_name != NULL) {
- free(sig->event_name);
- }
- free(sig);
-}
-
-/* plugin initialization */
-int plugin_init_dbus(void)
-{
- if (!lcd_dbus_init()) {
- error("[DBus] Could not connect to DBus");
- return 1;
- }
- //dbus::argument(<DisplaySignal>, <Argument#>)//displays arg# for signal#
- AddFunction("dbus::argument", 2, get_argument);
- //dbus::clear(<signal>)//sets the arguments for signal#
- AddFunction("dbus::clear", 1, clear_arguments);
-
- //read out config
- load_dbus_cfg();
- return 0;
-}
-
-void plugin_exit_dbus(void)
-{
- int i;
- //remove all known signals
- for (i = registered_sig_count - 1; i >= 0; i--) {
- lcd_unregister_signal(lcd_registered_signals[i]);
- }
- if (sysconn != NULL) {
- dbus_connection_unref(sysconn);
- }
- if (sessconn != NULL) {
- dbus_connection_unref(sessconn);
- }
- //remove all knows signal results
- for (i = dbus_results.signals - 1; i >= 0; i--) {
- clear_signal_txt(i);
- }
-
-#ifdef DEBUG
- //needs to be called to actually free everything, but might free stuff
- //mpris_dbus uses and cause a crash on shutdown, enable for leak debugging
- dbus_shutdown();
-#endif
-}
-
-
-/*
- * From here one out it is all dbus specific funtions,
- * should probably be split into a seperate file, but i
- * keept it here to make the plugin a single file
- *
- */
-
-//watch functions
-static dbus_bool_t add_watch(DBusWatch * w, void *data)
-{
- (void) data; //ignore it
-#if (DBUS_VERSION_MAJOR == 1 && DBUS_VERSION_MINOR == 1 && DBUS_VERSION_MICRO >= 1) || (DBUS_VERSION_MAJOR == 1 && DBUS_VERSION_MINOR > 1) || (DBUS_VERSION_MAJOR > 1)
- int fd = dbus_watch_get_unix_fd(w);
-#else
- int fd = dbus_watch_get_fd(w);
-#endif
- // int fd = dbus_watch_get_unix_fd(w); //we assume we are using unix
- int flags = dbus_watch_get_flags(w);
- event_add(watch_handle, w, fd, flags & DBUS_WATCH_READABLE, flags & DBUS_WATCH_WRITABLE, dbus_watch_get_enabled(w));
- return TRUE;
-}
-
-static void remove_watch(DBusWatch * w, void *data)
-{
- (void) data; //ignore it
-#if (DBUS_VERSION_MAJOR == 1 && DBUS_VERSION_MINOR == 1 && DBUS_VERSION_MICRO >= 1) || (DBUS_VERSION_MAJOR == 1 && DBUS_VERSION_MINOR > 1) || (DBUS_VERSION_MAJOR > 1)
- event_del(dbus_watch_get_unix_fd(w));
-#else
- event_del(dbus_watch_get_fd(w));
-#endif
- // event_del(dbus_watch_get_unix_fd(w));
-}
-
-static void toggle_watch(DBusWatch * w, void *data)
-{
- (void) data;
-#if (DBUS_VERSION_MAJOR == 1 && DBUS_VERSION_MINOR == 1 && DBUS_VERSION_MICRO >= 1) || (DBUS_VERSION_MAJOR == 1 && DBUS_VERSION_MINOR > 1) || (DBUS_VERSION_MAJOR > 1)
- int fd = dbus_watch_get_unix_fd(w);
-#else
- int fd = dbus_watch_get_fd(w);
-#endif
- // int fd = dbus_watch_get_unix_fd(w); //we assume we are using unix
- int flags = dbus_watch_get_flags(w);
- event_modify(fd, flags & DBUS_WATCH_READABLE, flags & DBUS_WATCH_WRITABLE, dbus_watch_get_enabled(w));
-}
-
-static void watch_handle(event_flags_t f, void *data)
-{
- DBusWatch *w = (DBusWatch *) data;
-
- //convert the flags
- unsigned int flags = 0;
-
- flags |= (f & EVENT_READ) ? DBUS_WATCH_READABLE : 0;
- flags |= (f & EVENT_WRITE) ? DBUS_WATCH_WRITABLE : 0;
- flags |= (f & EVENT_HUP) ? DBUS_WATCH_HANGUP : 0;
- flags |= (f & EVENT_ERR) ? DBUS_WATCH_ERROR : 0;
-
- //tell dbus
- if (!dbus_watch_handle(w, flags)) {
- info("[DBus] dbus_watch_handle(): Not enough memory!");
- }
- dispatch_dbus();
-}
-
-static void dispatch_dbus(void)
-{
- if (sessconn != NULL && dbus_connection_get_dispatch_status(sessconn) == DBUS_DISPATCH_DATA_REMAINS) {
- while (DBUS_DISPATCH_DATA_REMAINS == dbus_connection_dispatch(sessconn));
- }
- if (sysconn != NULL && dbus_connection_get_dispatch_status(sysconn) == DBUS_DISPATCH_DATA_REMAINS) {
- while (DBUS_DISPATCH_DATA_REMAINS == dbus_connection_dispatch(sysconn));
- }
-}
-
-static void timeout_dbus_handle(void *data)
-{
- DBusTimeout *t = (DBusTimeout *) data;
- if (!dbus_timeout_handle(t)) {
- info("[DBus] Not enough memory to handle timeout!");
- }
- dispatch_dbus();
-}
-
-static dbus_bool_t add_dbus_timeout(DBusTimeout * t, void *data)
-{
- (void) data; //ignore warning
- if (!timer_add_late(timeout_dbus_handle, t, dbus_timeout_get_interval(t), 0)) {
- return FALSE;
- }
- return TRUE;
-}
-
-
-static void remove_dbus_timeout(DBusTimeout * t, void *data)
-{
- (void) data; //ignore warning
- timer_remove(timeout_dbus_handle, t);
-}
-
-static void toggle_dbus_timeout(DBusTimeout * t, void *data)
-{
- remove_dbus_timeout(t, data);
- add_dbus_timeout(t, data);
-}
-
-//add the proper events/callbacks so we get notified about out messages
-static void setup_dbus_events(DBusConnection * conn)
-{
- if (!dbus_connection_set_watch_functions(conn, add_watch, remove_watch, toggle_watch, NULL, NULL)) {
- error("[DBus] dbus_connection_set_watch_functions(): Not enough memory!");
- }
- if (!dbus_connection_set_timeout_functions
- (conn, add_dbus_timeout, remove_dbus_timeout, toggle_dbus_timeout, NULL, NULL)) {
- error("[DBus] dbus_connection_set_timeout_functions(): Not enough memory!");
- }
-}
-
-static int lcd_dbus_init(void)
-{
-
- int success = 3;
- dbus_error_init(&err); //dbus_error_free(&err);
- sessconn = dbus_bus_get(DBUS_BUS_SESSION, &err);
- if (sessconn == NULL) {
- info("[DBus] Error connecting to the dbus session bus: %s\n", err.message);
- dbus_error_free(&err);
- success &= 1;
- } else {
-#ifdef DEBUG
- dbus_connection_set_exit_on_disconnect(sessconn, FALSE);
-#endif
- setup_dbus_events(sessconn);
- }
-
- sysconn = dbus_bus_get(DBUS_BUS_SYSTEM, &err);
- if (sysconn == NULL) {
- info("[DBus] Error connecting to the dbus system bus: %s\n", err.message);
- success &= 2;
- } else {
-#ifdef DEBUG
- dbus_connection_set_exit_on_disconnect(sysconn, FALSE);
-#endif
- setup_dbus_events(sysconn);
- }
-
- return success;
-}
-
-static lcd_sig_t *create_signal(const char *sender, const char *path,
- const char *interface, const char *member,
- void (*callback) (void *user_data, int argc, char **argv), void *user_data,
- void (*user_free) (void *))
-{
- lcd_sig_t *sig = malloc(sizeof(lcd_sig_t));
- sig->callback = callback;
- sig->user_data = user_data;
- sig->user_free = user_free;
- sig->sender = malloc(sizeof(char) * (1 + strlen(sender)));
- strcpy(sig->sender, sender);
- sig->path = malloc(sizeof(char) * (1 + strlen(path)));
- strcpy(sig->path, path);
- sig->interface = malloc(sizeof(char) * (1 + strlen(interface)));
- strcpy(sig->interface, interface);
- sig->member = malloc(sizeof(char) * (1 + strlen(member)));
- strcpy(sig->member, member);
-
- size_t len = strlen(sender) + strlen(path) + strlen(interface) + strlen(member);
- char *format;
- if (strlen(sig->sender) == 0) {
- format = "type='signal',path='%s',interface='%s',member='%s'";
- } else {
- format = "type='signal',sender='%s',path='%s',interface='%s',member='%s'";
- }
- len += strlen(format);
- len *= sizeof(char);
- sig->rule = malloc(len);
- if (strlen(sig->sender) == 0) {
- sprintf(sig->rule, format, path, interface, member);
- } else {
- sprintf(sig->rule, format, sender, path, interface, member);
- }
- assert(strlen(sig->rule) < len);
- return sig;
-}
-
-static void handle_inbound_signal(void *signal, int argc, char **argv)
-{
- handle_signal_t *signal_info = (handle_signal_t *) signal;
- dbus_signal_t sig;
- sig.argc = argc;
- sig.arguments = argv;
- set_signal_txt(signal_info->id, &sig);
-
- if (signal_info->event_name != NULL) {
- named_event_trigger(signal_info->event_name);
- }
-}
-
-static lcd_sig_t *lcd_register_signal(const char *sender, const char *path,
- const char *interface, const char *member,
- void (*callback) (void *user_data, int argc, char **argv), void *user_data,
- void (*user_free) (void *))
-{
- if (__builtin_expect(registered_sig_count >= DBUS_MAX_SIGNALS, 0)) { //gcc >= 2.96
- //i don't think anything will allow this to ever be hit..in fact It's impossible in the form i wrote the plugin
- error
- ("[DBus] Attempted to add more than %d dus signals, if you actually need more than that edit DBUS_MAX_SIGNALS in plugin_dbus.c",
- DBUS_MAX_SIGNALS);
- return NULL;
- }
- //store everything we need in the singal struct
- lcd_sig_t *sig = create_signal(sender, path, interface, member, callback, user_data, user_free);
- int success = 3;
- if (sessconn != NULL) {
- dbus_bus_add_match(sessconn, sig->rule, &err);
- if (dbus_error_is_set(&err)) {
- info("[DBus] Error adding dbus match to the session bus: %s \n", err.message);
- dbus_error_free(&err);
- success ^= 1;
- }
-
-
- if (!dbus_connection_add_filter(sessconn, lcd_sig_received, sig, NULL) && (success & 1)) {
- info("[DBus] Dbus signal registration failed to the session bus!\n");
- dbus_bus_remove_match(sessconn, sig->rule, &err);
- success ^= 1;
- }
- } else {
- success ^= 1;
- }
- if (sysconn != NULL) {
- dbus_bus_add_match(sysconn, sig->rule, &err);
- if (dbus_error_is_set(&err)) {
- info("[DBus] Error adding dbus match to the system bus: %s \n", err.message);
- success ^= 2;
- }
-
- if (!dbus_connection_add_filter(sysconn, lcd_sig_received, sig, NULL) && (success & 2)) {
- info("[DBus] Dbus signal registration failed to the system bus!\n");
- dbus_bus_remove_match(sysconn, sig->rule, &err);
- success ^= 2;
- }
- } else {
- success ^= 2;
- }
- if (!success) {
- free_signal(sig);
- return NULL;
- }
-
- lcd_registered_signals[registered_sig_count] = sig;
- registered_sig_count++;
- return sig;
-}
-
-static void free_signal(lcd_sig_t * sig)
-{
- if (sig->user_free != NULL) {
- sig->user_free(sig->user_data);
- }
- free(sig->sender);
- free(sig->path);
- free(sig->interface);
- free(sig->member);
- free(sig->rule);
- free(sig);
-}
-
-static void lcd_unregister_signal(lcd_sig_t * sig)
-{
- if (sig == NULL) {
- return;
- }
- //remove filter and match
- if (sessconn != NULL) {
- dbus_connection_remove_filter(sessconn, lcd_sig_received, sig);
- dbus_bus_remove_match(sessconn, sig->rule, NULL);
- }
- if (sysconn != NULL) {
- dbus_connection_remove_filter(sysconn, lcd_sig_received, sig);
- dbus_bus_remove_match(sysconn, sig->rule, NULL);
- }
- //free user data
- free_signal(sig);
-
- //drop it off the list
- int i;
- for (i = 0; i < registered_sig_count; i++) {
- if (lcd_registered_signals[i] == sig) {
- registered_sig_count--;
- lcd_registered_signals[i] = lcd_registered_signals[registered_sig_count];
- break;
- }
- }
-}
-
-
-static void fill_args(DBusMessage * message, int *argcount, char ***argv)
-{
- dbus_message_ref(message);
- int argc = 0;
- char **args = NULL;
-
-
- DBusMessageIter iter;
- int buf_size = 0;
- dbus_message_iter_init(message, &iter);
- int current_type;
-
- //iterate over all arguments, casting all primitaves to strings
- while ((current_type = dbus_message_iter_get_arg_type(&iter)) != DBUS_TYPE_INVALID) {
- assert(argc <= buf_size);
- if (argc >= buf_size) {
- buf_size = argc * 2;
- if (buf_size == 0) {
- buf_size = 1;
- }
- args = realloc(args, sizeof(char **) * buf_size);
- }
- if (dbus_type_is_basic(current_type)) {
- args[argc] = malloc(sizeof(char) * (1 + LCD_MAX_MSG_LEN));
- args[argc][LCD_MAX_MSG_LEN] = '\0';
- //determine the type
- switch (current_type) {
- /* Primitive types */
- case DBUS_TYPE_BYTE:
- {
- char value;
- dbus_message_iter_get_basic(&iter, &value);
- snprintf(args[argc], LCD_MAX_MSG_LEN, "%hhx", value);
- }
-
- break;
- case DBUS_TYPE_BOOLEAN:
- {
- dbus_bool_t value;
- dbus_message_iter_get_basic(&iter, &value);
- if (value) {
- strcpy(args[argc], "true");
- } else {
- strcpy(args[argc], "false");
- }
-
- }
- break;
- case DBUS_TYPE_INT16:
- {
- dbus_int16_t value;
- dbus_message_iter_get_basic(&iter, &value);
- snprintf(args[argc], LCD_MAX_MSG_LEN, "%hd", value);
- }
- break;
- case DBUS_TYPE_UINT16:
- {
- dbus_uint16_t value;
- dbus_message_iter_get_basic(&iter, &value);
- snprintf(args[argc], LCD_MAX_MSG_LEN, "%hu", value);
- }
- break;
- case DBUS_TYPE_INT32:
- {
- dbus_int32_t value;
- dbus_message_iter_get_basic(&iter, &value);
- snprintf(args[argc], LCD_MAX_MSG_LEN, "%d", value);
- }
- break;
- case DBUS_TYPE_UINT32:
- {
- dbus_uint32_t value;
- dbus_message_iter_get_basic(&iter, &value);
- snprintf(args[argc], LCD_MAX_MSG_LEN, "%u", value);
- }
- break;
- case DBUS_TYPE_INT64:
- {
- dbus_int64_t value;
- dbus_message_iter_get_basic(&iter, &value);
- snprintf(args[argc], LCD_MAX_MSG_LEN, "%jd", (intmax_t) value);
- }
- break;
- case DBUS_TYPE_UINT64:
- {
- dbus_uint64_t value;
- dbus_message_iter_get_basic(&iter, &value);
- snprintf(args[argc], LCD_MAX_MSG_LEN, "%ju", (uintmax_t) value);
- }
- break;
- case DBUS_TYPE_DOUBLE:
- {
- double value;
- dbus_message_iter_get_basic(&iter, &value);
- snprintf(args[argc], LCD_MAX_MSG_LEN, "%f", value);
- }
- break;
- case DBUS_TYPE_STRING: //all strings
- case DBUS_TYPE_OBJECT_PATH:
- case DBUS_TYPE_SIGNATURE:
- {
- char *value;
- dbus_message_iter_get_basic(&iter, &value);
- snprintf(args[argc], LCD_MAX_MSG_LEN, "%s", value);
- }
- break;
- case DBUS_TYPE_INVALID:
- default:
- //not supported
- free(args[argc]);
- args[argc] = NULL;
- assert(0); //should never ever happen...
-
- break;
- }
- } else {
- args[argc] = NULL;
- }
-
- argc++;
- dbus_message_iter_next(&iter);
- }
-
-
- *argcount = argc;
- *argv = args;
- dbus_message_unref(message);
-}
-
-
-static DBusHandlerResult lcd_sig_received(DBusConnection * connection, DBusMessage * msg, void *sigv)
-{
- (void) connection;
- dbus_message_ref(msg);
- lcd_sig_t *sig = sigv;
- //compare the signal to the one we were assigned
- if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL) {
- dbus_message_unref(msg);
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
- }
- //we don't check the sender because we (probably) asked by name, not by sender
- if (!dbus_message_has_member(msg, sig->member) ||
- !dbus_message_has_path(msg, sig->path) || !dbus_message_has_interface(msg, sig->interface)) {
- dbus_message_unref(msg);
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
- }
- //call the users function
- if (sig->callback != NULL) {
- char **args;
- int argc;
- fill_args(msg, &argc, &args);
- sig->callback(sig->user_data, argc, args);
- free_args(argc, args);
- }
-
- dbus_message_unref(msg);
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-
-
-static void free_args(int argc, char **argv)
-{
- int i;
- //free args
- for (i = 0; i < argc; i++) {
- if (argv[i] != NULL) {
- free(argv[i]);
- }
- }
-
- if (argv != NULL && argc != 0) {
- free(argv);
- }
-
-}
[cgit] Unable to lock slot /tmp/cgit/13000000.lock: No such file or directory (2)