Advertisement
Guest User

Untitled

a guest
Jun 26th, 2017
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.51 KB | None | 0 0
  1. //
  2. //  TCPClient.m
  3. //  ETAMobile
  4. //
  5. //  Created by Daniel Reed on 11/9/10.
  6. //  Copyright 2010 N/a. All rights reserved.
  7. //
  8. #import "TCPClient.h"
  9.  
  10. @interface TCPClient ()
  11. -(void) readStream: (CFReadStreamRef) stream postedEvent: (CFStreamEventType) eventType;
  12. -(void) writeStream: (CFWriteStreamRef) stream postedEvent: (CFStreamEventType) eventType;
  13. @end
  14.  
  15. @implementation TCPClient
  16. static void RSCallback(CFReadStreamRef stream, CFStreamEventType eventType, void* info)
  17. {
  18.     TCPClient* client = (TCPClient*) info;
  19.    
  20.     [client readStream: stream postedEvent: eventType];
  21. }
  22.  
  23. static void WSCallback(CFWriteStreamRef stream, CFStreamEventType eventType, void* info)
  24. {
  25.     TCPClient* client = (TCPClient*) info;
  26.    
  27.     [client writeStream: stream postedEvent: eventType];
  28. }
  29.  
  30. #pragma mark Synthesize directives
  31. @synthesize delegate;
  32.  
  33. #pragma mark -
  34. #pragma mark Initializers
  35. -(id) initWithDelegate: (id <TCPClientDelegate>) theDelegate
  36. {
  37.     if (self = [super init])
  38.     {
  39.         [self setDelegate: theDelegate];
  40.     }
  41.    
  42.     return self;
  43. }
  44. #pragma mark -
  45. #pragma mark Memory management
  46. -(void) dealloc
  47. {
  48.     // Invoke the inherited dealloc method.
  49.     [super dealloc];
  50. }
  51.  
  52. #pragma mark -
  53. #pragma mark Public methods
  54. -(void) connect: (NSString*) host port: (int) port
  55. {
  56.     CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, (CFStringRef) host, port, &readStream, &writeStream);
  57.    
  58.     // Setup the client context:
  59.     ctx.version = 0;
  60.     ctx.info = self;
  61.     ctx.retain = NULL;
  62.     ctx.release = NULL;
  63.     ctx.copyDescription = NULL;
  64.    
  65.     // Determine option flags:
  66.     CFOptionFlags flags = kCFStreamEventNone |
  67.                           kCFStreamEventOpenCompleted |
  68.                           kCFStreamEventHasBytesAvailable |
  69.                           kCFStreamEventCanAcceptBytes |
  70.                           kCFStreamEventErrorOccurred |
  71.                           kCFStreamEventEndEncountered;
  72.    
  73.     // Assign stream clients:
  74.     CFReadStreamSetClient(readStream,   flags, RSCallback, &ctx);
  75.     CFWriteStreamSetClient(writeStream, flags, WSCallback, &ctx);
  76.    
  77. #if TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= 40000
  78.     // Indicate that streams should close the underlying socket when closed:
  79.     CFReadStreamSetProperty(readStream,   kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
  80.     CFWriteStreamSetProperty(writeStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
  81.    
  82.     // Allow the connection to exist in the background on IOS4 devices:
  83.     CFReadStreamSetProperty(readStream,   kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
  84.     CFWriteStreamSetProperty(writeStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
  85. #endif
  86.    
  87.     // Schedule the streams in the main run loop:
  88.     CFReadStreamScheduleWithRunLoop(readStream,   CFRunLoopGetMain(), kCFRunLoopDefaultMode);
  89.     CFWriteStreamScheduleWithRunLoop(writeStream, CFRunLoopGetMain(), kCFRunLoopDefaultMode);
  90.    
  91.     // Open the stream pair:
  92.     CFReadStreamOpen(readStream);
  93.     CFWriteStreamOpen(writeStream);
  94. }
  95.  
  96. -(void) close
  97. {
  98.     // Close the streams:
  99.     CFReadStreamClose(readStream);
  100.     CFWriteStreamClose(writeStream);
  101.    
  102.     // Release the retained streams:
  103.     CFRelease(readStream);
  104.     CFRelease(writeStream);
  105.    
  106.     // Set retained objects to NULL:
  107.     readStream = NULL;
  108.     writeStream = NULL;
  109. }
  110.  
  111. -(int) read: (UInt8*) buffer offset: (int) offset count: (int) count
  112. {
  113.     if (!readStream)
  114.     {
  115.         return -1;
  116.     }
  117.    
  118.     return CFReadStreamRead(readStream, &buffer[offset], count);
  119. }
  120.  
  121. -(int) write: (UInt8*) buffer offset: (int) offset count: (int) count
  122. {
  123.     if (!writeStream)
  124.     {
  125.         return -1;
  126.     }
  127.    
  128.     return CFWriteStreamWrite(writeStream, &buffer[offset], count);
  129. }
  130.  
  131. #pragma mark -
  132. #pragma mark Private methods
  133. -(void) readStream: (CFReadStreamRef) stream postedEvent: (CFStreamEventType) eventType
  134. {
  135.     switch (eventType)
  136.     {
  137.         case kCFStreamEventNone:
  138.             break;
  139.            
  140.         case kCFStreamEventOpenCompleted:
  141.             [delegate clientDidConnect: self];
  142.             break;
  143.            
  144.         case kCFStreamEventHasBytesAvailable:
  145.             [delegate clientHasBytesAvailable: self];
  146.             break;
  147.            
  148.         case kCFStreamEventCanAcceptBytes:
  149.             break;
  150.            
  151.         case kCFStreamEventErrorOccurred:
  152.             break;
  153.            
  154.         case kCFStreamEventEndEncountered:
  155.             break;
  156.     }
  157. }
  158.  
  159. -(void) writeStream: (CFWriteStreamRef) stream postedEvent: (CFStreamEventType) eventType
  160. {
  161.     switch (eventType)
  162.     {
  163.         case kCFStreamEventNone:
  164.             break;
  165.            
  166.         case kCFStreamEventOpenCompleted:
  167.             break;
  168.            
  169.         case kCFStreamEventHasBytesAvailable:
  170.             break;
  171.            
  172.         case kCFStreamEventCanAcceptBytes:
  173.             break;
  174.            
  175.         case kCFStreamEventErrorOccurred:
  176.             break;
  177.            
  178.         case kCFStreamEventEndEncountered:
  179.             break;
  180.     }
  181. }
  182. @end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement