mirror of
https://bitbucket.org/vendoo/vendoo_v1.0.git
synced 2025-12-25 19:57:41 +00:00
115 lines
3.7 KiB
Objective-C
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
|