jens@0: //
jens@0: // BLIPConnection.h
jens@0: // MYNetwork
jens@0: //
jens@0: // Created by Jens Alfke on 5/10/08.
jens@0: // Copyright 2008 Jens Alfke. All rights reserved.
jens@0: //
jens@0:
jens@0: #import "TCPConnection.h"
jens@0: #import "TCPListener.h"
jens@0: @class BLIPRequest, BLIPResponse, BLIPDispatcher;
jens@0: @protocol BLIPConnectionDelegate;
jens@0:
jens@0:
jens@5: /** Represents a connection to a peer, using the BLIP protocol over a TCP socket.
jens@0: Outgoing connections are made simply by instantiating a BLIPConnection via -initToAddress:.
jens@0: Incoming connections are usually set up by a BLIPListener and passed to the listener's
jens@0: delegate.
jens@0: Most of the API is inherited from TCPConnection. */
jens@0: @interface BLIPConnection : TCPConnection
jens@0: {
jens@0: BLIPDispatcher *_dispatcher;
jens@0: }
jens@0:
jens@0: /** The delegate object that will be called when the connection opens, closes or receives messages. */
jens@0: @property (assign) id delegate;
jens@0:
jens@2: /** The connection's request dispatcher. By default it's not configured to do anything; but you
jens@2: can add rules to the dispatcher to call specific target methods based on properties of the
jens@2: incoming requests.
jens@2:
jens@2: Requests that aren't handled by the dispatcher (i.e. all of them, by default) will be
jens@2: passed to the delegate's connection:receivedRequest: method; or if there's no delegate,
jens@2: a generic error response will be returned. */
jens@0: @property (readonly) BLIPDispatcher *dispatcher;
jens@0:
jens@5: /** Creates a new, empty outgoing request.
jens@5: You should add properties and/or body data to the request, before sending it by
jens@5: calling its -send method. */
jens@5: - (BLIPRequest*) request;
jens@0:
jens@5: /** Creates a new outgoing request.
jens@5: The body or properties may be nil; you can add additional data or properties by calling
jens@5: methods on the request itself, before sending it by calling its -send method. */
jens@0: - (BLIPRequest*) requestWithBody: (NSData*)body
jens@0: properties: (NSDictionary*)properies;
jens@0:
jens@0: /** Sends a request over this connection.
jens@0: (Actually, it queues it to be sent; this method always returns immediately.)
jens@0: Call this instead of calling -send on the request itself, if the request was created with
jens@0: +[BLIPRequest requestWithBody:] and hasn't yet been assigned to any connection.
jens@0: This method will assign it to this connection before sending it.
jens@0: The request's matching response object will be returned, or nil if the request couldn't be sent. */
jens@0: - (BLIPResponse*) sendRequest: (BLIPRequest*)request;
jens@0: @end
jens@0:
jens@0:
jens@0:
jens@0: /** The delegate messages that BLIPConnection will send,
jens@3: in addition to the ones inherited from TCPConnectionDelegate.
jens@3: All methods are optional. */
jens@0: @protocol BLIPConnectionDelegate
jens@3: @optional
jens@0:
jens@0: /** Called when a BLIPRequest is received from the peer, if there is no BLIPDispatcher
jens@0: rule to handle it.
jens@0: The delegate should get the request's response object, fill in its data and properties
jens@0: or error property, and send it.
jens@0: If it doesn't explicitly send a response, a default empty one will be sent;
jens@0: to prevent this, call -deferResponse on the request if you want to send a response later. */
jens@0: - (void) connection: (BLIPConnection*)connection receivedRequest: (BLIPRequest*)request;
jens@0:
jens@0: /** Called when a BLIPResponse (to one of your requests) is received from the peer.
jens@3: This is called after the response object's onComplete target, if any, is invoked.*/
jens@0: - (void) connection: (BLIPConnection*)connection receivedResponse: (BLIPResponse*)response;
jens@0: @end
jens@0:
jens@0:
jens@0:
jens@0:
jens@5: /** A "server" that listens on a TCP socket for incoming BLIP connections and creates
jens@0: BLIPConnection instances to handle them.
jens@0: Most of the API is inherited from TCPListener. */
jens@0: @interface BLIPListener : TCPListener
jens@0: {
jens@0: BLIPDispatcher *_dispatcher;
jens@0: }
jens@0:
jens@2: /** The default request dispatcher that will be inherited by all BLIPConnections opened by this
jens@2: listener.
jens@2: If a connection's own dispatcher doesn't have a rule to match a message, this inherited
jens@2: dispatcher will be checked next. Only if it fails too will the delegate be called. */
jens@0: @property (readonly) BLIPDispatcher *dispatcher;
jens@0:
jens@0: @end