map-event.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. *
  4. * OBEX
  5. *
  6. * Copyright (C) 2013 BMW Car IT GmbH. All rights reserved.
  7. *
  8. *
  9. */
  10. #ifdef HAVE_CONFIG_H
  11. #include <config.h>
  12. #endif
  13. #include <glib.h>
  14. #include <string.h>
  15. #include <stdbool.h>
  16. #include <inttypes.h>
  17. #include "gdbus/gdbus.h"
  18. #include "obexd/src/log.h"
  19. #include "map-event.h"
  20. #include "transfer.h"
  21. #include "session.h"
  22. static GSList *handlers;
  23. struct mns_handler {
  24. int mas_id;
  25. struct obc_session *session;
  26. map_event_cb cb;
  27. void *user_data;
  28. };
  29. static struct mns_handler *find_handler(int mas_id, const char *device)
  30. {
  31. GSList *list;
  32. for (list = handlers; list; list = list->next) {
  33. struct mns_handler *handler = list->data;
  34. if (mas_id != handler->mas_id)
  35. continue;
  36. if (g_str_equal(device,
  37. obc_session_get_destination(handler->session)))
  38. return handler;
  39. }
  40. return NULL;
  41. }
  42. bool map_register_event_handler(struct obc_session *session,
  43. int mas_id, map_event_cb cb,
  44. void *user_data)
  45. {
  46. struct mns_handler *handler;
  47. handler = find_handler(mas_id, obc_session_get_destination(session));
  48. if (handler != NULL)
  49. return FALSE;
  50. handler = g_new0(struct mns_handler, 1);
  51. handler->mas_id = mas_id;
  52. handler->session = session;
  53. handler->cb = cb;
  54. handler->user_data = user_data;
  55. handlers = g_slist_prepend(handlers, handler);
  56. DBG("Handler %p for %s:%d registered", handler,
  57. obc_session_get_destination(session), mas_id);
  58. return TRUE;
  59. }
  60. void map_unregister_event_handler(struct obc_session *session, int mas_id)
  61. {
  62. struct mns_handler *handler;
  63. handler = find_handler(mas_id, obc_session_get_destination(session));
  64. if (handler == NULL)
  65. return;
  66. handlers = g_slist_remove(handlers, handler);
  67. DBG("Handler %p for %s:%d unregistered", handler,
  68. obc_session_get_destination(session), mas_id);
  69. g_free(handler);
  70. }
  71. void map_dispatch_event(int mas_id, const char *device,
  72. struct map_event *event)
  73. {
  74. struct mns_handler *handler;
  75. handler = find_handler(mas_id, device);
  76. if (handler)
  77. handler->cb(event, handler->user_data);
  78. }