123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- #ifdef SHOULD_COMPILE_LOOKIN_SERVER
- //
- // Represents a communication channel between two endpoints talking the same
- // Lookin_PTProtocol.
- //
- #import <Foundation/Foundation.h>
- #import <dispatch/dispatch.h>
- #import <netinet/in.h>
- #import <sys/socket.h>
- #import "Lookin_PTProtocol.h"
- #import "Lookin_PTUSBHub.h"
- @class Lookin_PTData, Lookin_PTAddress;
- @protocol Lookin_PTChannelDelegate;
- @interface Lookin_PTChannel : NSObject
- // Delegate
- @property (strong) id<Lookin_PTChannelDelegate> delegate;
- // Communication protocol. Must not be nil.
- @property Lookin_PTProtocol *protocol;
- // YES if this channel is a listening server
- @property (readonly) BOOL isListening;
- // YES if this channel is a connected peer
- @property (readonly) BOOL isConnected;
- // Arbitrary attachment. Note that if you set this, the object will grow by
- // 8 bytes (64 bits).
- @property (strong) id userInfo;
- // Create a new channel using the shared Lookin_PTProtocol for the current dispatch
- // queue, with *delegate*.
- + (Lookin_PTChannel*)channelWithDelegate:(id<Lookin_PTChannelDelegate>)delegate;
- // Initialize a new frame channel, configuring it to use the calling queue's
- // protocol instance (as returned by [Lookin_PTProtocol sharedProtocolForQueue:
- // dispatch_get_current_queue()])
- - (id)init;
- // Initialize a new frame channel with a specific protocol.
- - (id)initWithProtocol:(Lookin_PTProtocol*)protocol;
- // Initialize a new frame channel with a specific protocol and delegate.
- - (id)initWithProtocol:(Lookin_PTProtocol*)protocol delegate:(id<Lookin_PTChannelDelegate>)delegate;
- // Connect to a TCP port on a device connected over USB
- - (void)connectToPort:(int)port overUSBHub:(Lookin_PTUSBHub*)usbHub deviceID:(NSNumber*)deviceID callback:(void(^)(NSError *error))callback;
- // Connect to a TCP port at IPv4 address. Provided port must NOT be in network
- // byte order. Provided in_addr_t must NOT be in network byte order. A value returned
- // from inet_aton() will be in network byte order. You can use a value of inet_aton()
- // as the address parameter here, but you must flip the byte order before passing the
- // in_addr_t to this function.
- - (void)connectToPort:(in_port_t)port IPv4Address:(in_addr_t)address callback:(void(^)(NSError *error, Lookin_PTAddress *address))callback;
- // Listen for connections on port and address, effectively starting a socket
- // server. Provided port must NOT be in network byte order. Provided in_addr_t
- // must NOT be in network byte order.
- // For this to make sense, you should provide a onAccept block handler
- // or a delegate implementing ioFrameChannel:didAcceptConnection:.
- - (void)listenOnPort:(in_port_t)port IPv4Address:(in_addr_t)address callback:(void(^)(NSError *error))callback;
- // Send a frame with an optional payload and optional callback.
- // If *callback* is not NULL, the block is invoked when either an error occured
- // or when the frame (and payload, if any) has been completely sent.
- - (void)sendFrameOfType:(uint32_t)frameType tag:(uint32_t)tag withPayload:(dispatch_data_t)payload callback:(void(^)(NSError *error))callback;
- // Lower-level method to assign a connected dispatch IO channel to this channel
- - (BOOL)startReadingFromConnectedChannel:(dispatch_io_t)channel error:(__autoreleasing NSError**)error;
- // Close the channel, preventing further reading and writing. Any ongoing and
- // queued reads and writes will be aborted.
- - (void)close;
- // "graceful" close -- any ongoing and queued reads and writes will complete
- // before the channel ends.
- - (void)cancel;
- @end
- // Wraps a mapped dispatch_data_t object. The memory pointed to by *data* is
- // valid until *dispatchData* is deallocated (normally when the receiver is
- // deallocated).
- @interface Lookin_PTData : NSObject
- @property (readonly) dispatch_data_t dispatchData;
- @property (readonly) void *data;
- @property (readonly) size_t length;
- @end
- // Represents a peer's address
- @interface Lookin_PTAddress : NSObject
- // For network addresses, this is the IP address in textual format
- @property (readonly) NSString *name;
- // For network addresses, this is the port number. Otherwise 0 (zero).
- @property (readonly) NSInteger port;
- @end
- // Protocol for Lookin_PTChannel delegates
- @protocol Lookin_PTChannelDelegate <NSObject>
- @required
- // Invoked when a new frame has arrived on a channel.
- - (void)ioFrameChannel:(Lookin_PTChannel*)channel didReceiveFrameOfType:(uint32_t)type tag:(uint32_t)tag payload:(Lookin_PTData*)payload;
- @optional
- // Invoked to accept an incoming frame on a channel. Reply NO ignore the
- // incoming frame. If not implemented by the delegate, all frames are accepted.
- - (BOOL)ioFrameChannel:(Lookin_PTChannel*)channel shouldAcceptFrameOfType:(uint32_t)type tag:(uint32_t)tag payloadSize:(uint32_t)payloadSize;
- // Invoked when the channel closed. If it closed because of an error, *error* is
- // a non-nil NSError object.
- - (void)ioFrameChannel:(Lookin_PTChannel*)channel didEndWithError:(NSError*)error;
- // For listening channels, this method is invoked when a new connection has been
- // accepted.
- - (void)ioFrameChannel:(Lookin_PTChannel*)channel didAcceptConnection:(Lookin_PTChannel*)otherChannel fromAddress:(Lookin_PTAddress*)address;
- @end
- #endif /* SHOULD_COMPILE_LOOKIN_SERVER */
|