vendoo_v1.0/Pods/PicoKit/Pod/SOAP/PicoSOAPWriter.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

115 lines
3.7 KiB
Objective-C

//
// PicoSOAPWriter.m
// Pico
//
// Created by bulldog on 13-3-14.
// Copyright (c) 2013 LeanSoft Technology. All rights reserved.
//
#import "PicoSOAPWriter.h"
#import "XMLWriter.h"
#import "PicoBindingSchema.h"
#import "PicoClassSchema.h"
#import "PicoConfig.h"
#import "SOAP11Envelope.h"
#import "SOAP12Envelope.h"
#import "SOAP11Body.h"
#import "SOAP12Body.h"
@interface PicoXMLWriter (Private)
-(void)writeObject:(XMLWriter *)xmlWriter source:(id)source;
@end
@implementation PicoSOAPWriter
static NSString *SOAP_PREFIX = @"soapenv";
static NSString *XSI_PREFIX = @"xsi";
static NSString *XSI_NAMESPACE = @"http://www.w3.org/2001/XMLSchema-instance";
static NSString *XSD_PREFIX = @"xsd";
static NSString *XSD_NAMESPACE = @"http://www.w3.org/2001/XMLSchema";
-(NSString *)toString:(id)obj {
if (obj == nil) {
@throw [NSException exceptionWithName:@"WriterException" reason:@"Can't write nil object." userInfo:nil];
}
if (![obj isMemberOfClass:[SOAP11Envelope class]] && ![obj isMemberOfClass:[SOAP12Envelope class]]) {
@throw [NSException exceptionWithName:@"WriterException" reason:[NSString stringWithFormat:@"can't write non-soap object of type : %@", NSStringFromClass([obj class])] userInfo:nil];
}
XMLWriter *xmlWriter = [[XMLWriter alloc] init];
_autoPrefixCount = 0;
[xmlWriter writeStartDocumentWithEncodingAndVersion:self.config.encoding version:@"1.0"];
PicoBindingSchema *bindingSchema = [PicoBindingSchema fromObject:obj];
PicoClassSchema *classSchema = [bindingSchema classSchema];
NSString *xmlName = classSchema.xmlName;
NSString *namespace = classSchema.nsURI;
// set soap prefix
[xmlWriter setPrefix:SOAP_PREFIX namespaceURI:namespace];
[xmlWriter setPrefix:XSI_PREFIX namespaceURI:XSI_NAMESPACE];
[xmlWriter setPrefix:XSD_PREFIX namespaceURI:XSD_NAMESPACE];
NSString *innerNamespace = [self findInnerClassNamespace:obj];
// set default namespace without prefix
if (innerNamespace.length > 0 && ![xmlWriter getPrefix:innerNamespace]) {
[xmlWriter setDefaultNamespace:innerNamespace];
}
[xmlWriter writeStartElementWithNamespace:namespace localName:xmlName];
[super writeObject:xmlWriter source:obj];
[xmlWriter writeEndElementWithNamespace:namespace localName:xmlName];
[xmlWriter writeEndDocument];
NSString *xmlString = [xmlWriter toString];
xmlString = [NSMutableString stringWithString:xmlString];
return xmlString;
}
-(NSString *) findInnerClassNamespace:(id)obj {
id innerObj = nil;
if ([obj isMemberOfClass:[SOAP11Envelope class]]) {
SOAP11Envelope *soap11Envelope = obj;
SOAP11Body *soap11Body = soap11Envelope.body;
if (soap11Body && soap11Body.any.count > 0) {
innerObj = (soap11Body.any)[0];
}
} else { //soap 12
SOAP12Envelope *soap12Envelope = obj;
SOAP12Body *soap12Body = soap12Envelope.body;
if (soap12Body && soap12Body.any.count > 0) {
innerObj = (soap12Body.any)[0];
}
}
if (innerObj) {
PicoBindingSchema *innerBindingSchema = [PicoBindingSchema fromObject:innerObj];
PicoClassSchema *innerClassSchema = [innerBindingSchema classSchema];
NSString *innerNamespace = innerClassSchema.nsURI;
return innerNamespace;
}
return nil;
}
-(NSData *)toData:(id)obj {
NSString *xmlString = [self toString:obj];
NSData *data = [xmlString dataUsingEncoding: CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding((CFStringRef)self.config.encoding)) allowLossyConversion:NO];
return data;
}
@end