vendoo_v1.0/Pods/PicoKit/Pod/WebService/PicoSOAPRequestOperation.m
Okechi Onyeje 031a354996 Ebay Listing Now Posts both information and single image
need to rework on categories since subcategory workflow added some complications, but that will be taken care of in a bug fix task
2016-08-23 13:48:34 -04:00

143 lines
5.3 KiB
Objective-C

//
// PicoRequestOperation.m
// Pico
//
// Created by bulldog on 13-3-15.
// Copyright (c) 2013 LeanSoft Technology. All rights reserved.
//
#import "PicoSOAPRequestOperation.h"
#import "PicoSOAPReader.h"
#import "SOAP11Envelope.h"
#import "SOAP12Envelope.h"
#import "SOAP11Body.h"
#import "SOAP12Body.h"
static dispatch_queue_t ls_soap_request_operation_processing_queue;
static dispatch_queue_t soap_request_operation_processing_queue() {
if (ls_soap_request_operation_processing_queue == NULL) {
ls_soap_request_operation_processing_queue = dispatch_queue_create("com.leansoft.pico.networking.soap-request.processing", 0);
}
return ls_soap_request_operation_processing_queue;
}
@interface PicoSOAPRequestOperation ()
@property (readwrite, nonatomic, strong) NSError *PicoError;
@property (readwrite, nonatomic, strong) id responseObj;
@end
@implementation PicoSOAPRequestOperation
@synthesize responseObj = _responseObj;
@synthesize PicoError = _PicoError;
@synthesize responseClazz = _responseClazz;
@synthesize soapVersion = _soapVersion;
@synthesize debug = _debug;
@synthesize config = _config;
-(id)responseObj {
if (!_responseObj && [self isFinished] && [self.responseData length] > 0 && !self.PicoError) {
if (self.debug) {
NSLog(@"Response message : ");
NSString *message = [[NSString alloc] initWithData:self.responseData encoding:CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding((CFStringRef)self.config.encoding))];
NSLog(@"%@", message);
}
PicoSOAPReader *soapReader = nil;
@try {
// unmarshall to object
soapReader = [[PicoSOAPReader alloc] initWithConfig:self.config];
if (self.soapVersion == SOAP11) {
SOAP11Envelope *soap11Envelope = [soapReader fromData:self.responseData withSOAPClass:[SOAP11Envelope class] innerClass:self.responseClazz];
if (soap11Envelope && soap11Envelope.body && soap11Envelope.body.any.count > 0) {
self.responseObj = (soap11Envelope.body.any)[0];
}
} else {
SOAP12Envelope *soap12Envelope = [soapReader fromData:self.responseData withSOAPClass:[SOAP12Envelope class] innerClass:self.responseClazz];
if (soap12Envelope && soap12Envelope.body && soap12Envelope.body.any.count > 0) {
self.responseObj = (soap12Envelope.body.any)[0];
}
}
} @catch (NSException *ex) {
NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithObject:@"Error to read soap response" forKey:NSLocalizedDescriptionKey];
[userInfo setValue:ex.reason forKey:NSLocalizedFailureReasonErrorKey];
[userInfo setValue:ex forKey:NSUnderlyingErrorKey];
self.PicoError = [NSError errorWithDomain:PicoErrorDomain code:ReaderError userInfo:userInfo];
if (self.debug) {
NSLog(@"Error to read response message : \n%@", [self.PicoError localizedDescription]);
}
}
}
return _responseObj;
}
- (NSError *)error {
if (_PicoError) {
return _PicoError;
} else {
return [super error];
}
}
#pragma mark - AFHTTPRequestOperation
+ (NSSet *)acceptableContentTypes {
return [NSSet setWithObjects:@"application/soap+xml", @"text/xml", nil];
}
- (void)setCompletionBlockWithSuccess:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
{
__weak typeof(self) weakSelf = self;
self.completionBlock = ^ {
if ([weakSelf isCancelled]) {
return;
}
if (weakSelf.error) {
if (weakSelf.debug) {
NSLog(@"Response HTTP Error:\n%@", [weakSelf.error localizedDescription]);
}
if (failure) {
dispatch_async(weakSelf.completionQueue ? weakSelf.completionQueue : dispatch_get_main_queue(), ^{
failure(weakSelf, weakSelf.error);
});
}
} else {
if (weakSelf.debug) {
if (weakSelf.response) {
NSLog(@"Response HTTP status : \n%ld", (long)[weakSelf.response statusCode]);
NSLog(@"Response HTTP headers : \n%@", [weakSelf.response allHeaderFields]);
}
}
dispatch_async(soap_request_operation_processing_queue(), ^{
id obj = weakSelf.responseObj;
if (weakSelf.PicoError) {
if (failure) {
dispatch_async(weakSelf.completionQueue ? weakSelf.completionQueue : dispatch_get_main_queue(), ^{
failure(weakSelf, weakSelf.error);
});
}
} else {
if (success) {
dispatch_async(weakSelf.completionQueue ? weakSelf.completionQueue : dispatch_get_main_queue(), ^{
success(weakSelf, obj);
});
}
}
});
}
};
}
@end