00001 #ifdef HAVE_CONFIG_H
00002 #include "config.h"
00003 #endif
00004
00005 #ifdef HAVE_ALLOCA_H
00006 # include <alloca.h>
00007 #elif defined __GNUC__
00008 # define alloca __builtin_alloca
00009 #elif defined _AIX
00010 # define alloca __alloca
00011 #elif defined _MSC_VER
00012 # include <malloc.h>
00013 # define alloca _alloca
00014 #else
00015 # include <stddef.h>
00016 # ifdef __cplusplus
00017 extern "C"
00018 # endif
00019 void * alloca (size_t);
00020 #endif
00021
00022 #include <stdio.h>
00023
00024 #include <Eina.h>
00025 #include <eina_safety_checks.h>
00026
00027 #include "E_Bluez.h"
00028
00029 static const char manager_path[] = "/";
00030
00031 extern const char *e_bluez_iface_manager;
00032 extern const char *e_bluez_iface_adapter;
00033 extern const char *e_bluez_iface_device;
00034 extern const char *e_bluez_prop_address;
00035 extern const char *e_bluez_prop_name;
00036 extern const char *e_bluez_prop_alias;
00037 extern const char *e_bluez_prop_class;
00038 extern const char *e_bluez_prop_icon;
00039 extern const char *e_bluez_prop_paired;
00040 extern const char *e_bluez_prop_trusted;
00041 extern const char *e_bluez_prop_connected;
00042 extern const char *e_bluez_prop_uuids;
00043 extern const char *e_bluez_prop_powered;
00044 extern const char *e_bluez_prop_discoverable;
00045 extern const char *e_bluez_prop_pairable;
00046 extern const char *e_bluez_prop_discoverabletimeout;
00047 extern const char *e_bluez_prop_pairabletimeout;
00048 extern const char *e_bluez_prop_discovering;
00049 extern const char *e_bluez_prop_devices;
00050
00051 extern int _e_dbus_bluez_log_dom;
00052
00053 typedef struct _E_Bluez_Element_Dict_Entry E_Bluez_Element_Dict_Entry;
00054
00055 struct _E_Bluez_Element_Dict_Entry
00056 {
00057 const char *name;
00058 int type;
00059 union {
00060 Eina_Bool boolean;
00061 const char *str;
00062 short i16;
00063 unsigned short u16;
00064 unsigned int u32;
00065 unsigned char byte;
00066 const char *path;
00067 } value;
00068 };
00069
00070 #ifndef EINA_LOG_DEFAULT_COLOR
00071 #define EINA_LOG_DEFAULT_COLOR EINA_COLOR_CYAN
00072 #endif
00073
00074 #undef DBG
00075 #undef INF
00076 #undef WRN
00077 #undef ERR
00078
00079 #define DBG(...) EINA_LOG_DOM_DBG(_e_dbus_bluez_log_dom, __VA_ARGS__)
00080 #define INF(...) EINA_LOG_DOM_INFO(_e_dbus_bluez_log_dom, __VA_ARGS__)
00081 #define WRN(...) EINA_LOG_DOM_WARN(_e_dbus_bluez_log_dom, __VA_ARGS__)
00082 #define ERR(...) EINA_LOG_DOM_ERR(_e_dbus_bluez_log_dom, __VA_ARGS__)
00083
00084 static inline Eina_Bool
00085 _dbus_callback_check_and_init(DBusMessage *msg, DBusMessageIter *itr, DBusError *err)
00086 {
00087 if (!msg)
00088 {
00089 if (err)
00090 ERR("an error was reported by server: "
00091 "name=\"%s\", message=\"%s\"",
00092 err->name, err->message);
00093 else
00094 ERR("callback without message arguments!");
00095
00096 return EINA_FALSE;
00097 }
00098
00099 if (!dbus_message_iter_init(msg, itr))
00100 {
00101 ERR("could not init iterator.");
00102 return EINA_FALSE;
00103 }
00104
00105 return EINA_TRUE;
00106 }
00107
00108 static inline Eina_Bool
00109 __dbus_iter_type_check(int type, int expected, const char *expected_name)
00110 {
00111 if (type == expected)
00112 return EINA_TRUE;
00113
00114 ERR("expected type %s (%c) but got %c instead!",
00115 expected_name, expected, type);
00116
00117 return EINA_FALSE;
00118 }
00119
00120 #define _dbus_iter_type_check(t, e) __dbus_iter_type_check(t, e, # e)
00121
00122 extern E_DBus_Connection *e_bluez_conn;
00123
00124 const char * e_bluez_system_bus_name_get(void);
00125
00126 void e_bluez_manager_clear_elements(void);
00127
00128 void e_bluez_elements_init(void);
00129 void e_bluez_elements_shutdown(void);
00130
00131 E_Bluez_Element * e_bluez_element_register(const char *path, const char *interface);
00132 void e_bluez_element_unregister(E_Bluez_Element *element);
00133
00134 Eina_Bool e_bluez_element_message_send(E_Bluez_Element *element, const char *method_name, E_DBus_Method_Return_Cb cb, DBusMessage *msg, Eina_Inlist **pending, E_DBus_Method_Return_Cb user_cb, const void *user_data);
00135 E_Bluez_Array * e_bluez_element_iter_get_array(DBusMessageIter *itr, const char *key);
00136 void e_bluez_element_event_add(int event_type, E_Bluez_Element *element);
00137 E_Bluez_Element_Dict_Entry * e_bluez_element_array_dict_find_stringshared(const E_Bluez_Array *array, const char *key);
00138 void e_bluez_element_array_free(E_Bluez_Array *array, E_Bluez_Array *new __UNUSED__);
00139
00140 Eina_Bool e_bluez_element_call_full(E_Bluez_Element *element, const char *method_name, E_DBus_Method_Return_Cb cb, Eina_Inlist **pending, E_DBus_Method_Return_Cb user_cb, const void *user_data);
00141 Eina_Bool e_bluez_element_call_with_path(E_Bluez_Element *element, const char *method_name, const char *string, E_DBus_Method_Return_Cb cb, Eina_Inlist **pending, E_DBus_Method_Return_Cb user_cb, const void *user_data);
00142 Eina_Bool e_bluez_element_call_with_string(E_Bluez_Element *element, const char *method_name, const char *string, E_DBus_Method_Return_Cb cb, Eina_Inlist **pending, E_DBus_Method_Return_Cb user_cb, const void *user_data);
00143 Eina_Bool e_bluez_element_call_with_path_and_string(E_Bluez_Element *element, const char *method_name, const char *path, const char *string, E_DBus_Method_Return_Cb cb, Eina_Inlist **pending, E_DBus_Method_Return_Cb user_cb, const void *user_data);