BLIP/BLIPConnection.h
author Jens Alfke <jens@mooseyard.com>
Wed Jun 04 21:09:45 2008 -0700 (2008-06-04)
changeset 14 bb5faa9995d5
parent 3 76f302097a75
child 18 3be241de1630
permissions -rw-r--r--
Python: Optimized frame sending somewhat (frame buffers are generated on the fly as the socket has room.)
jens@0
     1
//
jens@0
     2
//  BLIPConnection.h
jens@0
     3
//  MYNetwork
jens@0
     4
//
jens@0
     5
//  Created by Jens Alfke on 5/10/08.
jens@0
     6
//  Copyright 2008 Jens Alfke. All rights reserved.
jens@0
     7
//
jens@0
     8
jens@0
     9
#import "TCPConnection.h"
jens@0
    10
#import "TCPListener.h"
jens@0
    11
@class BLIPRequest, BLIPResponse, BLIPDispatcher;
jens@0
    12
@protocol BLIPConnectionDelegate;
jens@0
    13
jens@0
    14
jens@5
    15
/** Represents a connection to a peer, using the <a href=".#blipdesc">BLIP</a> protocol over a TCP socket.
jens@0
    16
    Outgoing connections are made simply by instantiating a BLIPConnection via -initToAddress:.
jens@0
    17
    Incoming connections are usually set up by a BLIPListener and passed to the listener's
jens@0
    18
    delegate.
jens@0
    19
    Most of the API is inherited from TCPConnection. */
jens@0
    20
@interface BLIPConnection : TCPConnection
jens@0
    21
{
jens@0
    22
    BLIPDispatcher *_dispatcher;
jens@0
    23
}
jens@0
    24
jens@0
    25
/** The delegate object that will be called when the connection opens, closes or receives messages. */
jens@0
    26
@property (assign) id<BLIPConnectionDelegate> delegate;
jens@0
    27
jens@2
    28
/** The connection's request dispatcher. By default it's not configured to do anything; but you
jens@2
    29
    can add rules to the dispatcher to call specific target methods based on properties of the
jens@2
    30
    incoming requests.
jens@2
    31
 
jens@2
    32
    Requests that aren't handled by the dispatcher (i.e. all of them, by default) will be
jens@2
    33
    passed to the delegate's connection:receivedRequest: method; or if there's no delegate,
jens@2
    34
    a generic error response will be returned. */
jens@0
    35
@property (readonly) BLIPDispatcher *dispatcher;
jens@0
    36
jens@5
    37
/** Creates a new, empty outgoing request.
jens@5
    38
    You should add properties and/or body data to the request, before sending it by
jens@5
    39
    calling its -send method. */
jens@5
    40
- (BLIPRequest*) request;
jens@0
    41
jens@5
    42
/** Creates a new outgoing request.
jens@5
    43
    The body or properties may be nil; you can add additional data or properties by calling
jens@5
    44
    methods on the request itself, before sending it by calling its -send method. */
jens@0
    45
- (BLIPRequest*) requestWithBody: (NSData*)body
jens@0
    46
                      properties: (NSDictionary*)properies;
jens@0
    47
jens@0
    48
/** Sends a request over this connection.
jens@0
    49
    (Actually, it queues it to be sent; this method always returns immediately.)
jens@0
    50
    Call this instead of calling -send on the request itself, if the request was created with
jens@0
    51
    +[BLIPRequest requestWithBody:] and hasn't yet been assigned to any connection.
jens@0
    52
    This method will assign it to this connection before sending it.
jens@0
    53
    The request's matching response object will be returned, or nil if the request couldn't be sent. */
jens@0
    54
- (BLIPResponse*) sendRequest: (BLIPRequest*)request;
jens@0
    55
@end
jens@0
    56
jens@0
    57
jens@0
    58
jens@0
    59
/** The delegate messages that BLIPConnection will send,
jens@3
    60
    in addition to the ones inherited from TCPConnectionDelegate.
jens@3
    61
    All methods are optional. */
jens@0
    62
@protocol BLIPConnectionDelegate <TCPConnectionDelegate>
jens@3
    63
@optional
jens@0
    64
jens@0
    65
/** Called when a BLIPRequest is received from the peer, if there is no BLIPDispatcher
jens@0
    66
    rule to handle it.
jens@0
    67
    The delegate should get the request's response object, fill in its data and properties
jens@0
    68
    or error property, and send it.
jens@0
    69
    If it doesn't explicitly send a response, a default empty one will be sent;
jens@0
    70
    to prevent this, call -deferResponse on the request if you want to send a response later. */
jens@0
    71
- (void) connection: (BLIPConnection*)connection receivedRequest: (BLIPRequest*)request;
jens@0
    72
jens@0
    73
/** Called when a BLIPResponse (to one of your requests) is received from the peer.
jens@3
    74
    This is called <i>after</i> the response object's onComplete target, if any, is invoked.*/
jens@0
    75
- (void) connection: (BLIPConnection*)connection receivedResponse: (BLIPResponse*)response;
jens@0
    76
@end
jens@0
    77
jens@0
    78
jens@0
    79
jens@0
    80
jens@5
    81
/** A "server" that listens on a TCP socket for incoming <a href=".#blipdesc">BLIP</a> connections and creates
jens@0
    82
    BLIPConnection instances to handle them.
jens@0
    83
    Most of the API is inherited from TCPListener. */
jens@0
    84
@interface BLIPListener : TCPListener
jens@0
    85
{
jens@0
    86
    BLIPDispatcher *_dispatcher;
jens@0
    87
}
jens@0
    88
jens@2
    89
/** The default request dispatcher that will be inherited by all BLIPConnections opened by this
jens@2
    90
    listener.
jens@2
    91
    If a connection's own dispatcher doesn't have a rule to match a message, this inherited
jens@2
    92
    dispatcher will be checked next. Only if it fails too will the delegate be called. */
jens@0
    93
@property (readonly) BLIPDispatcher *dispatcher;
jens@0
    94
jens@0
    95
@end