Whoops forgot to actually svn add Andrew's files
Summary: Tricky svn add command will get you every time
Reviewed By: dreiss
Test Plan: test/ tutorial/ Cocoa code
git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@665277 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lib/cocoa/TApplicationException.m b/lib/cocoa/TApplicationException.m
new file mode 100644
index 0000000..1f658de
--- /dev/null
+++ b/lib/cocoa/TApplicationException.m
@@ -0,0 +1,84 @@
+#import "TApplicationException.h"
+#import "TProtocolUtil.h"
+
+@implementation TApplicationException
+
+- (id) initWithType: (int) type
+ reason: (NSString *) reason
+{
+ NSString * name;
+ switch (type) {
+ case TApplicationException_UNKNOWN_METHOD:
+ name = @"Unknown method";
+ break;
+ case TApplicationException_INVALID_MESSAGE_TYPE:
+ name = @"Invalid message type";
+ break;
+ case TApplicationException_WRONG_METHOD_NAME:
+ name = @"Wrong method name";
+ break;
+ case TApplicationException_BAD_SEQUENCE_ID:
+ name = @"Bad sequence ID";
+ break;
+ case TApplicationException_MISSING_RESULT:
+ name = @"Missing result";
+ break;
+ default:
+ name = @"Unknown";
+ break;
+ }
+
+ self = [super initWithName: name reason: reason userInfo: nil];
+ return self;
+}
+
+
++ (TApplicationException *) read: (id <TProtocol>) protocol
+{
+ NSString * reason = nil;
+ int type = TApplicationException_UNKNOWN;
+ int fieldType;
+ int fieldID;
+
+ while (true) {
+ [protocol readFieldBeginReturningName: NULL
+ type: &fieldType
+ fieldID: &fieldID];
+ if (fieldType == TType_STOP) {
+ break;
+ }
+ switch (fieldID) {
+ case 1:
+ if (fieldType == TType_STRING) {
+ reason = [protocol readString];
+ } else {
+ [TProtocolUtil skipType: fieldType onProtocol: protocol];
+ }
+ break;
+ case 2:
+ if (fieldType == TType_I32) {
+ type = [protocol readI32];
+ } else {
+ [TProtocolUtil skipType: fieldType onProtocol: protocol];
+ }
+ break;
+ default:
+ [TProtocolUtil skipType: fieldType onProtocol: protocol];
+ break;
+ }
+ [protocol readFieldEnd];
+ }
+ [protocol readStructEnd];
+
+ return [TApplicationException exceptionWithType: type reason: reason];
+}
+
+
++ (TApplicationException *) exceptionWithType: (int) type
+ reason: (NSString *) reason
+{
+ return [[[TApplicationException alloc] initWithType: type
+ reason: reason] autorelease];
+}
+
+@end
diff --git a/lib/cocoa/TException.m b/lib/cocoa/TException.m
new file mode 100644
index 0000000..38d00ca
--- /dev/null
+++ b/lib/cocoa/TException.m
@@ -0,0 +1,33 @@
+#import "TException.h"
+
+@implementation TException
+
++ (id) exceptionWithName: (NSString *) name
+{
+ return [self exceptionWithName: name reason: @"unknown" error: nil];
+}
+
+
++ (id) exceptionWithName: (NSString *) name
+ reason: (NSString *) reason
+{
+ return [self exceptionWithName: name reason: reason error: nil];
+}
+
+
++ (id) exceptionWithName: (NSString *) name
+ reason: (NSString *) reason
+ error: (NSError *) error
+{
+ NSDictionary * userInfo = nil;
+ if (error != nil) {
+ userInfo = [NSDictionary dictionaryWithObject: error forKey: @"error"];
+ }
+
+ return [super exceptionWithName: name
+ reason: reason
+ userInfo: userInfo];
+}
+
+
+@end
diff --git a/lib/cocoa/THTTPClient.h b/lib/cocoa/THTTPClient.h
new file mode 100644
index 0000000..98446cd
--- /dev/null
+++ b/lib/cocoa/THTTPClient.h
@@ -0,0 +1,18 @@
+#import <Cocoa/Cocoa.h>
+#import "TTransport.h"
+
+@interface THTTPClient : NSObject <TTransport> {
+ NSURL * mURL;
+ NSMutableURLRequest * mRequest;
+ NSMutableData * mRequestData;
+ NSData * mResponseData;
+ int mResponseDataOffset;
+}
+
+- (id) initWithURL: (NSURL *) aURL;
+
+- (id) initWithURL: (NSURL *) aURL
+ timeout: (int) timeout;
+
+@end
+
diff --git a/lib/cocoa/THTTPClient.m b/lib/cocoa/THTTPClient.m
new file mode 100644
index 0000000..096770d
--- /dev/null
+++ b/lib/cocoa/THTTPClient.m
@@ -0,0 +1,100 @@
+#import "THTTPClient.h"
+#import "TTransportException.h"
+
+@implementation THTTPClient
+
+- (id) initWithURL: (NSURL *) aURL
+{
+ self = [super init];
+ mURL = [aURL retain];
+
+ // set up our request object that we'll use for each request
+ mRequest = [[NSMutableURLRequest alloc] initWithURL: mURL];
+ [mRequest setHTTPMethod: @"POST"];
+ [mRequest setValue: @"application/x-thrift" forHTTPHeaderField: @"Content-Type"];
+ [mRequest setValue: @"application/x-thrift" forHTTPHeaderField: @"Accept"];
+ [mRequest setValue: @"Cocoa/THTTPClient" forHTTPHeaderField: @"User-Agent"];
+ [mRequest setCachePolicy: NSURLRequestReloadIgnoringCacheData];
+
+ // create our request data buffer
+ mRequestData = [[NSMutableData alloc] initWithCapacity: 1024];
+
+ return self;
+}
+
+
+- (id) initWithURL: (NSURL *) aURL
+ timeout: (int) timeout
+{
+ self = [self initWithURL: aURL];
+
+ [mRequest setTimeoutInterval: timeout];
+
+ return self;
+}
+
+
+- (void) dealloc
+{
+ [mURL release];
+ [mRequest release];
+ [mRequestData release];
+ [super dealloc];
+}
+
+
+- (int) readAll: (uint8_t *) buf offset: (int) off length: (int) len
+{
+ NSRange r;
+ r.location = mResponseDataOffset;
+ r.length = len;
+
+ [mResponseData getBytes: buf+off range: r];
+ mResponseDataOffset += len;
+
+ return len;
+}
+
+
+- (void) write: (const uint8_t *) data offset: (unsigned int) offset length: (unsigned int) length
+{
+ [mRequestData appendBytes: data+offset length: length];
+}
+
+
+- (void) flush
+{
+ [mRequest setHTTPBody: mRequestData]; // not sure if it copies the data
+
+ // make the HTTP request
+ NSURLResponse * response;
+ NSError * error;
+ NSData * responseData =
+ [NSURLConnection sendSynchronousRequest: mRequest returningResponse: &response error: &error];
+
+ [mRequestData setLength: 0];
+
+ if (responseData == nil) {
+ @throw [TTransportException exceptionWithName: @"Could not make HTTP request"
+ reason: @"unknown"
+ error: error];
+ }
+ if (![response isKindOfClass: [NSHTTPURLResponse class]]) {
+ @throw [TTransportException exceptionWithName: @"Unexpected NSURLResponse type"];
+ }
+
+ NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *) response;
+ if ([httpResponse statusCode] != 200) {
+ @throw [TTransportException exceptionWithName:
+ [NSString stringWithFormat: @"Bad response from HTTP server: %d",
+ [httpResponse statusCode]]];
+ }
+
+ // phew!
+ [mResponseData release];
+ mResponseData = [responseData retain];
+ mResponseDataOffset = 0;
+}
+
+
+@end
diff --git a/lib/cocoa/TProtocolException.h b/lib/cocoa/TProtocolException.h
new file mode 100644
index 0000000..c49f170
--- /dev/null
+++ b/lib/cocoa/TProtocolException.h
@@ -0,0 +1,6 @@
+#import "TException.h"
+
+@interface TProtocolException : TException {
+}
+
+@end
diff --git a/lib/cocoa/TProtocolException.m b/lib/cocoa/TProtocolException.m
new file mode 100644
index 0000000..ee56bc5
--- /dev/null
+++ b/lib/cocoa/TProtocolException.m
@@ -0,0 +1,4 @@
+#import "TProtocolException.h"
+
+@implementation TProtocolException
+@end
diff --git a/lib/cocoa/TTransportException.h b/lib/cocoa/TTransportException.h
new file mode 100644
index 0000000..5d3802b
--- /dev/null
+++ b/lib/cocoa/TTransportException.h
@@ -0,0 +1,6 @@
+#import "TException.h"
+
+@interface TTransportException : TException {
+}
+
+@end
diff --git a/lib/cocoa/TTransportException.m b/lib/cocoa/TTransportException.m
new file mode 100644
index 0000000..e1102e2
--- /dev/null
+++ b/lib/cocoa/TTransportException.m
@@ -0,0 +1,4 @@
+#import "TTransportException.h"
+
+@implementation TTransportException
+@end