This whole thing could use a rewrite but whatever
[ITFoundation.git] / ITInetSocket.h
index 94d102f..592cc5d 100755 (executable)
 //
 
 #import <Foundation/Foundation.h>
+#import <netinet/in.h>
+#import <netdb.h>
+#import "ITByteStream.h"
 
-@protocol ITInetSocketOwner
-- (void)requestCompleted:(NSString*)data;
-@end
+/*!
+ * @header ITInetSocket
+ * @abstract Definitions for the ITInetSocket class
+ */
+
+
+/*!
+ * @enum ITInetSocketState
+ * @abstract Possible states of a socket
+ * @constant ITInetSocketConnecting The socket is negotiating a connection.
+ * @constant ITInetSocketListening The socket is a server socket.
+ * @constant ITInetSocketReading The socket is reading data from the other side.
+ * @constant ITInetSocketWriting The socket is sending data to the other side.
+ * @constant ITInetSocketDisconnected The socket does not have a connection.
+ */
+typedef enum {
+    ITInetSocketConnecting,
+    ITInetSocketListening,
+    ITInetSocketReading,
+    ITInetSocketWriting,
+    ITInetSocketDisconnected
+} ITInetSocketState;
+
+/*!
+ * @enum ITInetSocketError
+ * @abstract Possible error conditions of a socket
+ * @constant ITInetHostNotFound The host specified does not actually exist.
+ * @constant ITInetConnectionDropped The remote side dropped the connection.
+ * @constant ITInetCouldNotConnect The socket was unable to connect for some reason
+ */
+typedef enum {
+    ITInetHostNotFound,
+    ITInetConnectionDropped,
+    ITInetCouldNotConnect
+} ITInetSocketError;
 
-enum {
-    ITInetMaxConnections = 36;
-};
+@class ITInetSocket;
 
-@interface ITInetSocket : NSObject {
+/*!
+ * @protocol ITInetSocketDelegate
+ * @abstract Delegate methods for ITInetSocket
+ * @discussion ITInetSockets use these methods to communicate with their delegates
+ */
+@protocol ITInetSocketDelegate <DataReciever>
+/*!
+ * @method errorOccured:during:onSocket:
+ * @abstract Alerts the delegate of an error condition.
+ * @discussion The delegate can try retryCondition.
+ * @param err The error class.
+ * @param state What the socket was doing when the error occured.
+ * @param sender The socket the error occured on.
+ */
+- (oneway void) errorOccured:(ITInetSocketError)err during:(ITInetSocketState)state onSocket:(ITInetSocket*)sender;
+/*!
+ * @method finishedConnecting:
+ * @abstract Alerts the delegate of a successful connection attempt.
+ * @discussion The delegate should send whatever initial data is required for the protocol (nickname for IRC, etc.)
+ * @param sender The socket that established the connection.
+ */
+- (oneway void) finishedConnecting:(ITInetSocket *)sender;
+@end
+
+/*!
+ * @class ITInetSocket
+ * @abstract An Internet socket class.
+ * @discussion ITInetSocket is an Internet socket class supporting IPv6 and Rendezvous.
+ */
+@interface ITInetSocket : NSObject <DataReciever> {
     int sockfd;
     int port;
-    NSString *destAddr;
+    int nc;
+    unsigned short bufs;
+    volatile int dieflag;
+    volatile int actionflag;
+    id <ITInetSocketDelegate> delegate;
+    struct addrinfo *ai, *ai_cur;
+    ITByteStream *readPipe, *writePipe;
+    ITInetSocketState state;
+    NSArray *sarr;
 }
-// Init
--(id) initWithFD:(int)fd;
--(id) initWithFD:(int)fd delegate:(id)d;
--(id) initWithDelegate:(id)d;
-
-+(NSArray*) socketsForRendezvousScan; //need args
+/*!
+ * @method startAutoconnectingToService:delegate:
+ * @abstract Automatically creates sockets whenever a certain type of Rendezvous service appears.
+ * @discussion The auto-created sockets will send finishedConnecting: to the delegate.
+ * @param type The type of Rendezvous service to listen on.
+ * @param d The delegate that the sockets will belong to.
+ */
++(void)startAutoconnectingToService:(NSString*)type delegate:(id <ITInetSocketDelegate>)d;
+/*!
+ * @method initWithFD:delegate:
+ * @abstract Wraps a socket around an existing socket descriptor.
+ * @discussion The socket will start listening on the descriptor as normal.
+ * @param fd The descriptor.
+ * @param d The delegate for the socket.
+ */
+-(id) initWithFD:(int)fd delegate:(id <ITInetSocketDelegate>)d;
+/*!
+ * @method initWithDelegate:
+ * @abstract Creates a new socket.
+ * @discussion The socket will not be connected to anything.
+ * @param d The delegate of the socket.
+ */
+-(id) initWithDelegate:(id <ITInetSocketDelegate>)d;
 
-// Mutators (some of these must be set before you can connect)
--(void) setPort:(int)port;
--(void) setPortViaServiceName:(NSString*)name;
--(void) setDest:(NSString*)dst;
+-(id <ITInetSocketDelegate>)delegate;
+-(unsigned short)bufferSize;
+-(void)setBufferSize:(unsigned short)bufs;
+-(void) connectToHost:(NSString*)host onPort:(short)port;
+-(void) connectToHost:(NSString*)host onNamedPort:(NSString*)port;
+-(void) connectWithSockaddrArray:(NSArray*)arr;
+-(ITInetSocketState) state;
+-(void) retryConnection;
+-(void) disconnect;
+-(ITByteStream *)readPipe;
+-(ITByteStream *)writePipe;
 @end