BLIP/BLIPConnection.h
author morrowa
Fri Jul 03 17:50:28 2009 -0700 (2009-07-03)
changeset 58 6577813acf12
parent 19 16454d63d4c2
child 63 5e4855a592ee
permissions -rw-r--r--
Fixed bug which caused PyBLIP to stop sending responses while the connection was closing.
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@26
    22
    @private
jens@0
    23
    BLIPDispatcher *_dispatcher;
jens@18
    24
    BOOL _blipClosing;
jens@0
    25
}
jens@0
    26
jens@0
    27
/** The delegate object that will be called when the connection opens, closes or receives messages. */
jens@0
    28
@property (assign) id<BLIPConnectionDelegate> delegate;
jens@0
    29
jens@2
    30
/** The connection's request dispatcher. By default it's not configured to do anything; but you
jens@2
    31
    can add rules to the dispatcher to call specific target methods based on properties of the
jens@2
    32
    incoming requests.
jens@2
    33
 
jens@2
    34
    Requests that aren't handled by the dispatcher (i.e. all of them, by default) will be
jens@2
    35
    passed to the delegate's connection:receivedRequest: method; or if there's no delegate,
jens@2
    36
    a generic error response will be returned. */
jens@0
    37
@property (readonly) BLIPDispatcher *dispatcher;
jens@0
    38
jens@5
    39
/** Creates a new, empty outgoing request.
jens@5
    40
    You should add properties and/or body data to the request, before sending it by
jens@5
    41
    calling its -send method. */
jens@5
    42
- (BLIPRequest*) request;
jens@0
    43
jens@5
    44
/** Creates a new outgoing request.
jens@5
    45
    The body or properties may be nil; you can add additional data or properties by calling
jens@5
    46
    methods on the request itself, before sending it by calling its -send method. */
jens@0
    47
- (BLIPRequest*) requestWithBody: (NSData*)body
jens@0
    48
                      properties: (NSDictionary*)properies;
jens@0
    49
jens@0
    50
/** Sends a request over this connection.
jens@0
    51
    (Actually, it queues it to be sent; this method always returns immediately.)
jens@0
    52
    Call this instead of calling -send on the request itself, if the request was created with
jens@0
    53
    +[BLIPRequest requestWithBody:] and hasn't yet been assigned to any connection.
jens@0
    54
    This method will assign it to this connection before sending it.
jens@0
    55
    The request's matching response object will be returned, or nil if the request couldn't be sent. */
jens@0
    56
- (BLIPResponse*) sendRequest: (BLIPRequest*)request;
jens@0
    57
@end
jens@0
    58
jens@0
    59
jens@0
    60
jens@0
    61
/** The delegate messages that BLIPConnection will send,
jens@3
    62
    in addition to the ones inherited from TCPConnectionDelegate.
jens@3
    63
    All methods are optional. */
jens@0
    64
@protocol BLIPConnectionDelegate <TCPConnectionDelegate>
jens@3
    65
@optional
jens@0
    66
jens@0
    67
/** Called when a BLIPRequest is received from the peer, if there is no BLIPDispatcher
jens@0
    68
    rule to handle it.
jens@0
    69
    The delegate should get the request's response object, fill in its data and properties
jens@0
    70
    or error property, and send it.
jens@0
    71
    If it doesn't explicitly send a response, a default empty one will be sent;
jens@0
    72
    to prevent this, call -deferResponse on the request if you want to send a response later. */
jens@0
    73
- (void) connection: (BLIPConnection*)connection receivedRequest: (BLIPRequest*)request;
jens@0
    74
jens@0
    75
/** Called when a BLIPResponse (to one of your requests) is received from the peer.
jens@3
    76
    This is called <i>after</i> the response object's onComplete target, if any, is invoked.*/
jens@0
    77
- (void) connection: (BLIPConnection*)connection receivedResponse: (BLIPResponse*)response;
jens@18
    78
jens@18
    79
/** Called when the peer wants to close the connection. Return YES to allow, NO to prevent. */
jens@18
    80
- (BOOL) connectionReceivedCloseRequest: (BLIPConnection*)connection;
jens@18
    81
jens@18
    82
/** Called if the peer refuses a close request. 
jens@19
    83
    The typical error is kBLIPError_Forbidden. */
jens@18
    84
- (void) connection: (BLIPConnection*)connection closeRequestFailedWithError: (NSError*)error;
jens@0
    85
@end
jens@0
    86
jens@0
    87
jens@0
    88
jens@0
    89
jens@5
    90
/** A "server" that listens on a TCP socket for incoming <a href=".#blipdesc">BLIP</a> connections and creates
jens@0
    91
    BLIPConnection instances to handle them.
jens@0
    92
    Most of the API is inherited from TCPListener. */
jens@0
    93
@interface BLIPListener : TCPListener
jens@0
    94
{
jens@0
    95
    BLIPDispatcher *_dispatcher;
jens@0
    96
}
jens@0
    97
jens@2
    98
/** The default request dispatcher that will be inherited by all BLIPConnections opened by this
jens@2
    99
    listener.
jens@2
   100
    If a connection's own dispatcher doesn't have a rule to match a message, this inherited
jens@2
   101
    dispatcher will be checked next. Only if it fails too will the delegate be called. */
jens@0
   102
@property (readonly) BLIPDispatcher *dispatcher;
jens@0
   103
jens@0
   104
@end