Saturday, April 30, 2016

iOS how pass Context Data between Objective C and C code in networking

In the below example, the NetworkRequester is a class which is in Objective C needs to pass in the CTX information 
in the initiateRequest method, the makeRequest function passes the self references as the context data. 

Now in the makeRequest method, using the CFStreamClientContext CTX = { 1, ctxData, NULL, NULL, NULL };
it sets the context data to the stream so that when readCallBack( called back, the data will be present. 

@implementation NetworkRequester

@synthesize requestListener;

-(void) initiateRequest
{
    testFinished = 0;
    NSLog(@"Makign network request call");
    makeRequest("http://s3.amazonaws.com/test/samplefiles/est_4mb.txt",(__bridge void *)(self));
}

int makeRequest(const char *requestURL, void* ctxData)
{
    NSLog(@"totalRead starting make request %ld",(long)totalRead);
    CFReadStreamRef readStream;
    CFHTTPMessageRef request;
    CFStreamClientContext CTX = { 1, ctxData, NULL, NULL, NULL };
    
    NSString* requestURLString = [ [ NSString alloc ] initWithCString:requestURL ];
    NSURL *url = [ NSURL URLWithString: requestURLString ];
    
    CFStringRef requestMessage = CFSTR("");
    
    request = CFHTTPMessageCreateRequest(kCFAllocatorDefault, CFSTR("GET"),
                                         (__bridge CFURLRef) url, kCFHTTPVersion1_1);
    if (!request) {
        return -1;
    }
    CFHTTPMessageSetBody(request, (CFDataRef) requestMessage);
    readStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, request);
    
    CFRelease(request);
    
    if (!readStream) {
        return -1;
    }
    
    if (!CFReadStreamSetClient(readStream, kCFStreamEventOpenCompleted |
                               kCFStreamEventHasBytesAvailable |
                               kCFStreamEventEndEncountered |
                               kCFStreamEventErrorOccurred,
                               readCallBack, &CTX))
    {
        CFRelease(readStream);
        return -1;
    }




void readCallBack(
                  CFReadStreamRef stream,
                  CFStreamEventType eventType,
                  void *clientCallBackInfo)
{
    UInt8 buffer[204800];
    CFIndex bytes_recvd = 0;
    NetworkRequester* requester = (__bridge NetworkRequester*)clientCallBackInfo;
    

NOW 



references:

No comments:

Post a Comment