// Delegate ////////////////////////////////////////////////////////////////////
-// The delegate for the message queue. These methods may be called on any thread.
+// The delegate for the message queue. These methods are called from the thread
+// on which the MessageQueue was initialized.
@protocol MessageQueueDelegate <NSObject>
// Callback for any errors that the MessageQueue encounters.
-- (void)messageQueueError:(NSError*)error;
+- (void)messageQueue:(MessageQueue*)queue error:(NSError*)error;
// Called when the listening socket has accepted a child socket.
-- (void)clientDidConnect:(MessageQueue*)queue;
+- (void)messageQueueDidConnect:(MessageQueue*)queue;
// Called when the child socket has been disconnected.
-- (void)clientDidDisconnect:(MessageQueue*)queue;
-
-// If the write stream is ready, the delegate controls whether or not the next
-// pending message should be sent via the result of this method.
-- (BOOL)shouldSendMessage;
+- (void)messageQueueDidDisconnect:(MessageQueue*)queue;
// Callback for when a message has been sent.
-- (void)didSendMessage:(NSString*)message;
+- (void)messageQueue:(MessageQueue*)queue didSendMessage:(NSString*)message;
// Callback with the message content when one has been receieved.
-- (void)didReceiveMessage:(NSString*)message;
+- (void)messageQueue:(MessageQueue*)queue didReceiveMessage:(NSString*)message;
@end
}
_connected = NO;
- [_delegate clientDidDisconnect:self];
+ [_delegate messageQueueDidDisconnect:self];
}
- (void)stopRunLoop {
if (![_queue count])
return;
- if (![(id<MessageQueueDelegate>)_delegate.object shouldSendMessage])
- return;
-
if (!CFWriteStreamCanAcceptBytes(_writeStream))
return;
totalWritten += bytesWritten;
}
- [_delegate didSendMessage:message];
+ [_delegate messageQueue:self didSendMessage:message];
free(buffer);
}
// If this read finished the packet, handle it and reset.
if (_messageSize >= _totalMessageSize) {
- [_delegate didReceiveMessage:[_message autorelease]];
+ [_delegate messageQueue:self didReceiveMessage:[_message autorelease]];
_message = nil;
// Process any outgoing messages.
}
_connected = YES;
- [_delegate clientDidConnect:self];
+ [_delegate messageQueueDidConnect:self];
CFSocketInvalidate(_socket);
CFRelease(_socket);
#import "ProtocolClient.h"
-@interface ProtocolClient (Private)
-- (void)postReceivedMessage:(NSXMLDocument*)message;
-@end
-
@implementation ProtocolClient
- (id)initWithDelegate:(NSObject<ProtocolClientDelegate>*)delegate {
// MessageQueueDelegate ////////////////////////////////////////////////////////
-- (void)messageQueueError:(NSError*)error {
+- (void)messageQueue:(MessageQueue*)queue error:(NSError*)error {
NSLog(@"error = %@", error);
}
-- (void)clientDidConnect:(MessageQueue*)queue {
+- (void)messageQueueDidConnect:(MessageQueue*)queue {
[_lock lock];
_nextID = 0;
_lastReadID = 0;
_lastWrittenID = 0;
[_lock unlock];
- [_delegate performSelector:@selector(debuggerEngineConnected:)
- onThread:_delegateThread
- withObject:self
- waitUntilDone:NO];
+ [_delegate debuggerEngineConnected:self];
}
-- (void)clientDidDisconnect:(MessageQueue*)queue {
- [_delegate performSelector:@selector(debuggerEngineDisconnected:)
- onThread:_delegateThread
- withObject:self
- waitUntilDone:NO];
+- (void)messageQueueDidDisconnect:(MessageQueue*)queue {
[_messageQueue release];
_messageQueue = nil;
+ [_delegate debuggerEngineDisconnected:self];
}
// If the write stream is ready, the delegate controls whether or not the next
}
// Callback for when a message has been sent.
-- (void)didSendMessage:(NSString*)message {
+- (void)messageQueue:(MessageQueue*)queue didSendMessage:(NSString*)message {
NSInteger tag = [self transactionIDFromCommand:message];
[_lock lock];
_lastWrittenID = tag;
}
// Callback with the message content when one has been receieved.
-- (void)didReceiveMessage:(NSString*)message {
+- (void)messageQueue:(MessageQueue*)queue didReceiveMessage:(NSString*)message {
// Test if we can convert it into an NSXMLDocument.
NSError* error = nil;
NSXMLDocument* xml = [[NSXMLDocument alloc] initWithXMLString:message
options:NSXMLDocumentTidyXML
error:&error];
if (error) {
- [self messageQueueError:error];
+ [self messageQueue:queue error:error];
return;
}
_lastReadID = transaction;
- [self performSelector:@selector(postReceivedMessage:)
- onThread:_delegateThread
- withObject:xml
- waitUntilDone:NO
- modes:@[ NSDefaultRunLoopMode ]];
-}
-
-// Private /////////////////////////////////////////////////////////////////////
-
-- (void)postReceivedMessage:(NSXMLDocument*)message {
- [_delegate debuggerEngine:self receivedMessage:message];
+ [_delegate debuggerEngine:self receivedMessage:xml];
}
@end