CGEchoController.m 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. /******************************************************************
  2. *
  3. * uEcho for ObjC
  4. *
  5. * Copyright (C) Satoshi Konno 2015
  6. *
  7. * This is licensed under BSD-style license, see file COPYING.
  8. *
  9. ******************************************************************/
  10. #import "CGEchoController.h"
  11. #import "CGEchoNode.h"
  12. #include <uecho/controller.h>
  13. static void CGEchoControllerObserver(uEchoController*, uEchoNode*, uEchoNodeStatus, uEchoMessage*);
  14. @implementation CGEchoController {
  15. uEchoController* cObject;
  16. }
  17. @synthesize observer;
  18. - (id)init
  19. {
  20. if ((self = [super init]) == nil)
  21. return nil;
  22. cObject = uecho_controller_new();
  23. if (cObject) {
  24. uecho_controller_setnodelistener(cObject, CGEchoControllerObserver);
  25. uecho_controller_setuserdata(cObject, (__bridge void*)self);
  26. }
  27. else {
  28. self = nil;
  29. }
  30. return self;
  31. }
  32. - (void)dealloc
  33. {
  34. if (cObject) {
  35. uecho_controller_delete(cObject);
  36. }
  37. }
  38. - (NSArray*)nodes
  39. {
  40. if (!cObject)
  41. return [NSArray array];
  42. NSMutableArray* nodes = [NSMutableArray array];
  43. for (uEchoNode* cNode = uecho_controller_getnodes(cObject); cNode; cNode = uecho_node_next(cNode)) {
  44. CGEchoNode* node = [[CGEchoNode alloc] initWithCObject:cNode];
  45. [nodes addObject:node];
  46. }
  47. return nodes;
  48. }
  49. - (BOOL)start
  50. {
  51. if (!cObject)
  52. return NO;
  53. return uecho_controller_start(cObject);
  54. }
  55. - (BOOL)stop
  56. {
  57. if (!cObject)
  58. return NO;
  59. return uecho_controller_stop(cObject);
  60. }
  61. - (BOOL)search
  62. {
  63. if (!cObject)
  64. return NO;
  65. uecho_controller_search(cObject);
  66. return YES;
  67. }
  68. - (BOOL)announceMessage:(CGEchoNode*)node message:(CGEchoMessage*)msg
  69. {
  70. if (!cObject)
  71. return NO;
  72. return uecho_controller_announcemessage(cObject, msg.cObject);
  73. }
  74. - (BOOL)sendMessage:(CGEchoNode*)node object:(CGEchoObject*)obj message:(CGEchoMessage*)msg
  75. {
  76. if (!cObject)
  77. return NO;
  78. uecho_message_setdestinationobjectcode(msg.cObject, obj.code);
  79. return uecho_controller_sendmessage(cObject, node.cObject, msg.cObject);
  80. }
  81. - (CGEchoMessage*)postMessage:(CGEchoNode*)node object:(CGEchoObject*)obj message:(CGEchoMessage*)msg
  82. {
  83. if (!cObject)
  84. return nil;
  85. uEchoMessage* res_msg = uecho_message_new();
  86. if (!res_msg)
  87. return nil;
  88. uecho_message_setdestinationobjectcode(msg.cObject, obj.code);
  89. if (!uecho_controller_postmessage(cObject, node.cObject, msg.cObject, res_msg)) {
  90. uecho_message_delete(res_msg);
  91. return nil;
  92. }
  93. return [[CGEchoMessage alloc] initWithCObject:res_msg];
  94. }
  95. @end
  96. static void CGEchoControllerObserver(uEchoController* cObject, uEchoNode* cNode, uEchoNodeStatus status, uEchoMessage* cMsg)
  97. {
  98. CGEchoController* ctrl = (__bridge CGEchoController*)(uecho_controller_getuserdata(cObject));
  99. if (ctrl == nil)
  100. return;
  101. @autoreleasepool {
  102. CGEchoNode* node = [[CGEchoNode alloc] initWithCObject:cNode];
  103. CGEchoMessage* msg = [[CGEchoMessage alloc] initWithCObject:cMsg];
  104. switch (status) {
  105. case uEchoNodeStatusAdded: {
  106. if ([[ctrl observer] respondsToSelector:@selector(nodeAdded:node:message:)])
  107. [[ctrl observer] nodeAdded:ctrl node:node message:msg];
  108. } break;
  109. case uEchoNodeStatusUpdated: {
  110. if ([[ctrl observer] respondsToSelector:@selector(nodeUpdated:node:message:)])
  111. [[ctrl observer] nodeUpdated:ctrl node:node message:msg];
  112. } break;
  113. case uEchoNodeStatusAnnounced: {
  114. if ([[ctrl observer] respondsToSelector:@selector(nodeAnnounced:node:message:)])
  115. [[ctrl observer] nodeAnnounced:ctrl node:node message:msg];
  116. } break;
  117. case uEchoNodeStatusResponded: {
  118. if ([[ctrl observer] respondsToSelector:@selector(nodeResponsed:node:message:)])
  119. [[ctrl observer] nodeResponsed:ctrl node:node message:msg];
  120. } break;
  121. }
  122. }
  123. }