OSDN Git Service

emulator: Add support for delete a hook
authorEder Ruiz Maria <eder.ruiz@openbossa.org>
Sun, 21 Jul 2013 00:17:16 +0000 (20:17 -0400)
committerJohan Hedberg <johan.hedberg@intel.com>
Wed, 24 Jul 2013 16:03:49 +0000 (09:03 -0700)
emulator/btdev.c
emulator/btdev.h
src/shared/hciemu.c
src/shared/hciemu.h

index 30022d1..b8ac8f6 100644 (file)
@@ -1746,3 +1746,28 @@ int btdev_add_hook(struct btdev *btdev, enum btdev_hook_type type,
 
        return -1;
 }
+
+bool btdev_del_hook(struct btdev *btdev, enum btdev_hook_type type,
+                                                               uint16_t opcode)
+{
+       int i;
+
+       if (!btdev)
+               return false;
+
+       for (i = 0; i < MAX_HOOK_ENTRIES; i++) {
+               if (btdev->hook_list[i] == NULL)
+                       continue;
+
+               if (btdev->hook_list[i]->type != type ||
+                                       btdev->hook_list[i]->opcode != opcode)
+                       continue;
+
+               free(btdev->hook_list[i]);
+               btdev->hook_list[i] = NULL;
+
+               return true;
+       }
+
+       return false;
+}
index 085093f..5118a4a 100644 (file)
@@ -89,3 +89,6 @@ void btdev_receive_h4(struct btdev *btdev, const void *data, uint16_t len);
 int btdev_add_hook(struct btdev *btdev, enum btdev_hook_type type,
                                uint16_t opcode, btdev_hook_func handler,
                                void *user_data);
+
+bool btdev_del_hook(struct btdev *btdev, enum btdev_hook_type type,
+                                                       uint16_t opcode);
index 76fd449..f5648a5 100644 (file)
@@ -419,3 +419,31 @@ int hciemu_add_hook(struct hciemu *hciemu, enum hciemu_hook_type type,
        return btdev_add_hook(hciemu->master_dev, hook_type, opcode, function,
                                                                user_data);
 }
+
+bool hciemu_del_hook(struct hciemu *hciemu, enum hciemu_hook_type type,
+                                                               uint16_t opcode)
+{
+       enum btdev_hook_type hook_type;
+
+       if (!hciemu)
+               return false;
+
+       switch (type) {
+       case HCIEMU_HOOK_PRE_CMD:
+               hook_type = BTDEV_HOOK_PRE_CMD;
+               break;
+       case HCIEMU_HOOK_POST_CMD:
+               hook_type = BTDEV_HOOK_POST_CMD;
+               break;
+       case HCIEMU_HOOK_PRE_EVT:
+               hook_type = BTDEV_HOOK_PRE_EVT;
+               break;
+       case HCIEMU_HOOK_POST_EVT:
+               hook_type = BTDEV_HOOK_POST_EVT;
+               break;
+       default:
+               return false;
+       }
+
+       return btdev_del_hook(hciemu->master_dev, hook_type, opcode);
+}
index 899acb0..7f17831 100644 (file)
@@ -63,3 +63,6 @@ bool hciemu_add_master_post_command_hook(struct hciemu *hciemu,
 int hciemu_add_hook(struct hciemu *hciemu, enum hciemu_hook_type type,
                                uint16_t opcode, hciemu_hook_func_t function,
                                void *user_data);
+
+bool hciemu_del_hook(struct hciemu *hciemu, enum hciemu_hook_type type,
+                                                       uint16_t opcode);