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
|