9 #pragma mark - Basic message channel
18 NSCAssert(newSize >= 0,
@"Channel buffer size must be non-negative");
22 NSArray* args = @[ channel, @(
static_cast<int>(newSize)) ];
26 NSData* message = [codec encodeMethodCall:resizeMethodCall];
44 arguments:@[ channel, @(!warns) ]];
46 NSData* message = [codec encodeMethodCall:overflowMethodCall];
51 NSObject<FlutterBinaryMessenger>* messenger,
54 NSObject<FlutterTaskQueue>* taskQueue) {
58 respondsToSelector:
@selector(
59 setMessageHandlerOnChannel:binaryMessageHandler:taskQueue:)],
61 return [messenger setMessageHandlerOnChannel:name
62 binaryMessageHandler:handler
65 return [messenger setMessageHandlerOnChannel:name binaryMessageHandler:handler];
71 NSObject<FlutterBinaryMessenger>* _messenger;
73 NSObject<FlutterMessageCodec>*
_codec;
77 + (instancetype)messageChannelWithName:(NSString*)name
84 + (instancetype)messageChannelWithName:(NSString*)name
88 binaryMessenger:messenger
92 - (instancetype)initWithName:(NSString*)name
95 self = [
self initWithName:name binaryMessenger:messenger codec:codec taskQueue:nil];
99 - (instancetype)initWithName:(NSString*)name
104 NSAssert(
self,
@"Super init cannot be nil");
106 _messenger = messenger;
112 - (void)sendMessage:(
id)message {
113 [_messenger sendOnChannel:_name message:[_codec encode:message]];
116 - (void)sendMessage:(
id)message reply:(
FlutterReply)callback {
119 callback([
_codec decode:data]);
122 [_messenger sendOnChannel:_name message:[_codec encode:message] binaryReply:reply];
128 [_messenger cleanUpConnection:_connection];
131 [_messenger setMessageHandlerOnChannel:_name binaryMessageHandler:nil];
139 NSObject<FlutterMessageCodec>* codec =
_codec;
141 handler([codec decode:message], ^(
id reply) {
142 callback([codec encode:reply]);
148 + (void)resizeChannelWithName:(NSString*)name
150 size:(NSInteger)newSize {
154 - (void)resizeChannelBuffer:(NSInteger)newSize {
158 + (void)setWarnsOnOverflow:(BOOL)warns
159 forChannelWithName:(NSString*)name
164 - (void)setWarnsOnOverflow:(BOOL)warns {
170 #pragma mark - Method channel
174 + (instancetype)errorWithCode:(NSString*)code message:(NSString*)message details:(
id)details {
175 return [[
FlutterError alloc] initWithCode:code message:message details:details];
178 - (instancetype)initWithCode:(NSString*)code message:(NSString*)message details:(
id)details {
179 NSAssert(
code,
@"Code cannot be nil");
181 NSAssert(
self,
@"Super init cannot be nil");
183 _message = [message copy];
188 - (BOOL)isEqual:(
id)object {
189 if (
self ==
object) {
196 return [
self.code isEqual:other.code] &&
202 return [
self.code hash] ^ [
self.message hash] ^ [
self.details hash];
208 + (instancetype)methodCallWithMethodName:(NSString*)method arguments:(
id)arguments {
209 return [[
FlutterMethodCall alloc] initWithMethodName:method arguments:arguments];
212 - (instancetype)initWithMethodName:(NSString*)method arguments:(
id)arguments {
213 NSAssert(
method,
@"Method name cannot be nil");
215 NSAssert(
self,
@"Super init cannot be nil");
216 _method = [method copy];
221 - (BOOL)isEqual:(
id)object {
222 if (
self ==
object) {
229 return [
self.method isEqual:[other
method]] &&
234 return [
self.method hash] ^ [
self.arguments hash];
242 NSObject<FlutterBinaryMessenger>* _messenger;
244 NSObject<FlutterMethodCodec>*
_codec;
249 + (instancetype)methodChannelWithName:(NSString*)name
255 + (instancetype)methodChannelWithName:(NSString*)name
257 codec:(NSObject<FlutterMethodCodec>*)codec {
261 - (instancetype)initWithName:(NSString*)name
263 codec:(NSObject<FlutterMethodCodec>*)codec {
264 self = [
self initWithName:name binaryMessenger:messenger codec:codec taskQueue:nil];
267 - (instancetype)initWithName:(NSString*)name
269 codec:(NSObject<FlutterMethodCodec>*)codec
272 NSAssert(
self,
@"Super init cannot be nil");
274 _messenger = messenger;
280 - (void)invokeMethod:(NSString*)method arguments:(
id)arguments {
283 NSData* message = [_codec encodeMethodCall:methodCall];
284 [_messenger sendOnChannel:_name message:message];
287 - (void)invokeMethod:(NSString*)method arguments:(
id)arguments result:(
FlutterResult)callback {
290 NSData* message = [_codec encodeMethodCall:methodCall];
296 [_messenger sendOnChannel:_name message:message binaryReply:reply];
302 [_messenger cleanUpConnection:_connection];
305 [_messenger setMessageHandlerOnChannel:_name binaryMessageHandler:nil];
312 NSObject<FlutterMethodCodec>* codec =
_codec;
315 handler(call, ^(
id result) {
318 }
else if ([result isKindOfClass:[
FlutterError class]]) {
319 callback([codec encodeErrorEnvelope:(
FlutterError*)result]);
321 callback([codec encodeSuccessEnvelope:result]);
328 - (void)resizeChannelBuffer:(NSInteger)newSize {
334 #pragma mark - Event channel
340 NSObject<FlutterBinaryMessenger>* _messenger;
342 NSObject<FlutterMethodCodec>*
_codec;
346 + (instancetype)eventChannelWithName:(NSString*)name
352 + (instancetype)eventChannelWithName:(NSString*)name
354 codec:(NSObject<FlutterMethodCodec>*)codec {
355 return [[
FlutterEventChannel alloc] initWithName:name binaryMessenger:messenger codec:codec];
358 - (instancetype)initWithName:(NSString*)name
360 codec:(NSObject<FlutterMethodCodec>*)codec {
361 return [
self initWithName:name binaryMessenger:messenger codec:codec taskQueue:nil];
364 - (instancetype)initWithName:(NSString*)name
366 codec:(NSObject<FlutterMethodCodec>*)codec
369 NSAssert(
self,
@"Super init cannot be nil");
371 _messenger = messenger;
378 NSObject<FlutterStreamHandler>* handler,
380 NSObject<FlutterBinaryMessenger>* messenger,
381 NSObject<FlutterMethodCodec>* codec,
382 NSObject<FlutterTaskQueue>* taskQueue) {
386 if ([call.
method isEqual:
@"listen"]) {
388 FlutterError* error = [handler onCancelWithArguments:nil];
390 NSLog(
@"Failed to cancel existing stream: %@. %@ (%@)", error.
code, error.
message,
394 currentSink = ^(
id event) {
396 [messenger sendOnChannel:name message:nil];
397 }
else if ([event isKindOfClass:[
FlutterError class]]) {
398 [messenger sendOnChannel:name message:[codec encodeErrorEnvelope:(FlutterError*)event]];
400 [messenger sendOnChannel:name message:[codec encodeSuccessEnvelope:event]];
403 FlutterError* error = [handler onListenWithArguments:call.arguments eventSink:currentSink];
405 callback([codec encodeErrorEnvelope:error]);
407 callback([codec encodeSuccessEnvelope:nil]);
409 }
else if ([call.
method isEqual:
@"cancel"]) {
412 [codec encodeErrorEnvelope:[
FlutterError errorWithCode:
@"error"
413 message:
@"No active stream to cancel"
418 FlutterError* error = [handler onCancelWithArguments:call.arguments];
420 callback([codec encodeErrorEnvelope:error]);
422 callback([codec encodeSuccessEnvelope:nil]);
433 [_messenger cleanUpConnection:_connection];
NS_ASSUME_NONNULL_BEGIN typedef void(^ FlutterBinaryReply)(NSData *_Nullable reply)
void(^ FlutterBinaryMessageHandler)(NSData *_Nullable message, FlutterBinaryReply reply)
int64_t FlutterBinaryMessengerConnection
void(^ FlutterResult)(id _Nullable result)
void(^ FlutterMethodCallHandler)(FlutterMethodCall *call, FlutterResult result)
FLUTTER_DARWIN_EXPORT NSObject const * FlutterMethodNotImplemented
void(^ FlutterMessageHandler)(id _Nullable message, FlutterReply callback)
FLUTTER_DARWIN_EXPORT NSObject const * FlutterEndOfEventStream
NS_ASSUME_NONNULL_BEGIN typedef void(^ FlutterReply)(id _Nullable reply)
void(^ FlutterEventSink)(id _Nullable event)
static NSString *const kOverflowMethod
FlutterBinaryMessengerConnection _connection
static void SetWarnsOnOverflow(NSObject< FlutterBinaryMessenger > *binaryMessenger, NSString *channel, BOOL warns)
static FlutterBinaryMessengerConnection SetMessageHandler(NSObject< FlutterBinaryMessenger > *messenger, NSString *name, FlutterBinaryMessageHandler handler, NSObject< FlutterTaskQueue > *taskQueue)
NSObject< FlutterMessageCodec > * _codec
NSObject< FlutterTaskQueue > * _taskQueue
static void ResizeChannelBuffer(NSObject< FlutterBinaryMessenger > *binaryMessenger, NSString *channel, NSInteger newSize)
static NSString *const kResizeMethod
static FLUTTER_ASSERT_ARC NSString *const kFlutterChannelBuffersChannel
#define FLUTTER_ASSERT_ARC
instancetype messageChannelWithName:binaryMessenger:codec:(NSString *name,[binaryMessenger] NSObject< FlutterBinaryMessenger > *messenger,[codec] NSObject< FlutterMessageCodec > *codec)
instancetype eventChannelWithName:binaryMessenger:codec:(NSString *name,[binaryMessenger] NSObject< FlutterBinaryMessenger > *messenger,[codec] NSObject< FlutterMethodCodec > *codec)
instancetype methodCallWithMethodName:arguments:(NSString *method,[arguments] id _Nullable arguments)
instancetype methodChannelWithName:binaryMessenger:codec:(NSString *name,[binaryMessenger] NSObject< FlutterBinaryMessenger > *messenger,[codec] NSObject< FlutterMethodCodec > *codec)
instancetype sharedInstance()