Mercurial > emacs
comparison src/dbusbind.c @ 93156:3ef12fa772f2
* dbusbind.c (xd_read_message): Removed extra copying of message
strings. Check for NULL `interface' or `member'.
| author | Michael Albinus <michael.albinus@gmx.de> |
|---|---|
| date | Sun, 23 Mar 2008 16:45:39 +0000 |
| parents | f42bf2712087 |
| children | 629d4147200e |
comparison
equal
deleted
inserted
replaced
| 93155:09cc3d0d41ce | 93156:3ef12fa772f2 |
|---|---|
| 163 ? XD_SYMBOL_TO_DBUS_TYPE (CAR_SAFE (object)) \ | 163 ? XD_SYMBOL_TO_DBUS_TYPE (CAR_SAFE (object)) \ |
| 164 : DBUS_TYPE_ARRAY) \ | 164 : DBUS_TYPE_ARRAY) \ |
| 165 : DBUS_TYPE_INVALID) | 165 : DBUS_TYPE_INVALID) |
| 166 | 166 |
| 167 /* Return a list pointer which does not have a Lisp symbol as car. */ | 167 /* Return a list pointer which does not have a Lisp symbol as car. */ |
| 168 #define XD_NEXT_VALUE(object) \ | 168 #define XD_NEXT_VALUE(object) \ |
| 169 ((XD_DBUS_TYPE_P (CAR_SAFE (object))) ? CDR_SAFE (object) : object) | 169 ((XD_DBUS_TYPE_P (CAR_SAFE (object))) ? CDR_SAFE (object) : object) |
| 170 | 170 |
| 171 /* Compute SIGNATURE of OBJECT. It must have a form that it can be | 171 /* Compute SIGNATURE of OBJECT. It must have a form that it can be |
| 172 used in dbus_message_iter_open_container. DTYPE is the DBusType | 172 used in dbus_message_iter_open_container. DTYPE is the DBusType |
| 173 the object is related to. It is passed as argument, because it | 173 the object is related to. It is passed as argument, because it |
| 1138 DBusConnection *connection; | 1138 DBusConnection *connection; |
| 1139 DBusMessage *dmessage; | 1139 DBusMessage *dmessage; |
| 1140 DBusMessageIter iter; | 1140 DBusMessageIter iter; |
| 1141 unsigned int dtype; | 1141 unsigned int dtype; |
| 1142 int mtype; | 1142 int mtype; |
| 1143 char uname[DBUS_MAXIMUM_NAME_LENGTH]; | 1143 const char *uname, *path, *interface, *member; |
| 1144 char path[DBUS_MAXIMUM_MATCH_RULE_LENGTH]; /* Unlimited in D-Bus spec. */ | |
| 1145 char interface[DBUS_MAXIMUM_NAME_LENGTH]; | |
| 1146 char member[DBUS_MAXIMUM_NAME_LENGTH]; | |
| 1147 | 1144 |
| 1148 /* Open a connection to the bus. */ | 1145 /* Open a connection to the bus. */ |
| 1149 connection = xd_initialize (bus); | 1146 connection = xd_initialize (bus); |
| 1150 | 1147 |
| 1151 /* Non blocking read of the next available message. */ | 1148 /* Non blocking read of the next available message. */ |
| 1173 args = Fnreverse (args); | 1170 args = Fnreverse (args); |
| 1174 } | 1171 } |
| 1175 | 1172 |
| 1176 /* Read message type, unique name, object path, interface and member | 1173 /* Read message type, unique name, object path, interface and member |
| 1177 from the message. */ | 1174 from the message. */ |
| 1178 mtype = dbus_message_get_type (dmessage); | 1175 mtype = dbus_message_get_type (dmessage); |
| 1179 strcpy (uname, dbus_message_get_sender (dmessage)); | 1176 uname = dbus_message_get_sender (dmessage); |
| 1180 strcpy (path, dbus_message_get_path (dmessage)); | 1177 path = dbus_message_get_path (dmessage); |
| 1181 strcpy (interface, dbus_message_get_interface (dmessage)); | 1178 interface = dbus_message_get_interface (dmessage); |
| 1182 strcpy (member, dbus_message_get_member (dmessage)); | 1179 member = dbus_message_get_member (dmessage); |
| 1180 | |
| 1181 /* dbus-registered-functions-table requires non nil interface and member. */ | |
| 1182 if ((NULL == interface) || (NULL == member)) | |
| 1183 goto cleanup; | |
| 1183 | 1184 |
| 1184 XD_DEBUG_MESSAGE ("Event received: %d %s %s %s %s %s", | 1185 XD_DEBUG_MESSAGE ("Event received: %d %s %s %s %s %s", |
| 1185 mtype, uname, path, interface, member, | 1186 mtype, uname, path, interface, member, |
| 1186 SDATA (format2 ("%s", args, Qnil))); | 1187 SDATA (format2 ("%s", args, Qnil))); |
| 1187 | 1188 |
| 1208 event.frame_or_window = Qnil; | 1209 event.frame_or_window = Qnil; |
| 1209 event.arg = Fcons (CAR_SAFE (CDR_SAFE (CDR_SAFE (CDR_SAFE (key)))), | 1210 event.arg = Fcons (CAR_SAFE (CDR_SAFE (CDR_SAFE (CDR_SAFE (key)))), |
| 1210 args); | 1211 args); |
| 1211 | 1212 |
| 1212 /* Add uname, path, interface and member to the event. */ | 1213 /* Add uname, path, interface and member to the event. */ |
| 1213 event.arg = Fcons ((member == NULL ? Qnil : build_string (member)), | 1214 event.arg = Fcons (build_string (member), event.arg); |
| 1214 event.arg); | 1215 event.arg = Fcons (build_string (interface), event.arg); |
| 1215 event.arg = Fcons ((interface == NULL | |
| 1216 ? Qnil : build_string (interface)), | |
| 1217 event.arg); | |
| 1218 event.arg = Fcons ((path == NULL ? Qnil : build_string (path)), | 1216 event.arg = Fcons ((path == NULL ? Qnil : build_string (path)), |
| 1219 event.arg); | 1217 event.arg); |
| 1220 event.arg = Fcons ((uname == NULL ? Qnil : build_string (uname)), | 1218 event.arg = Fcons ((uname == NULL ? Qnil : build_string (uname)), |
| 1221 event.arg); | 1219 event.arg); |
| 1222 | 1220 |
| 1233 kbd_buffer_store_event (&event); | 1231 kbd_buffer_store_event (&event); |
| 1234 } | 1232 } |
| 1235 value = CDR_SAFE (value); | 1233 value = CDR_SAFE (value); |
| 1236 } | 1234 } |
| 1237 | 1235 |
| 1238 /* Cleanup. */ | 1236 cleanup: |
| 1239 dbus_message_unref (dmessage); | 1237 dbus_message_unref (dmessage); |
| 1240 RETURN_UNGCPRO (Qnil); | 1238 RETURN_UNGCPRO (Qnil); |
| 1241 } | 1239 } |
| 1242 | 1240 |
| 1243 /* Read queued incoming messages from the system and session buses. */ | 1241 /* Read queued incoming messages from the system and session buses. */ |
