mirror of
https://bitbucket.org/vendoo/vendoo_v1.0.git
synced 2025-12-25 11:47:40 +00:00
143 lines
5.3 KiB
Objective-C
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
|