You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by lg...@apache.org on 2014/03/17 14:53:06 UTC
svn commit: r1578378 [2/2] - in
/chemistry/objectivecmis/trunk/ObjectiveCMIS: Bindings/ Bindings/AtomPub/
Bindings/AtomPub/AtomPubParser/ Client/ Common/ Utils/
Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Utils/CMISHttpUploadRequest.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Utils/CMISHttpUploadRequest.m?rev=1578378&r1=1578377&r2=1578378&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Utils/CMISHttpUploadRequest.m (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Utils/CMISHttpUploadRequest.m Mon Mar 17 13:53:05 2014
@@ -27,6 +27,8 @@
#import "CMISBase64Encoder.h"
#import "CMISAtomEntryWriter.h"
#import "CMISLog.h"
+#import "CMISErrors.h"
+
/**
this is the buffer size for the input/output stream pair containing the base64 encoded data
*/
@@ -82,7 +84,7 @@ const NSUInteger kRawBufferSize = 24576;
@interface CMISHttpUploadRequest ()
@property (nonatomic, assign) unsigned long long bytesUploaded;
-@property (nonatomic, copy) void (^progressBlock)(unsigned long long bytesUploaded, unsigned long long bytesTotal);
+@property (nonatomic, copy) void (^progressBlock)(unsigned long long bytesUploaded, unsigned long long bytesTotal, BOOL *stop);
@property (nonatomic, assign) BOOL base64Encoding;
@property (nonatomic, strong) NSInputStream *base64InputStream;
@property (nonatomic, strong) NSOutputStream *encoderStream;
@@ -100,7 +102,7 @@ const NSUInteger kRawBufferSize = 24576;
- (id)initWithHttpMethod:(CMISHttpRequestMethod)httpRequestMethod
completionBlock:(void (^)(CMISHttpResponse *httpResponse, NSError *error))completionBlock
- progressBlock:(void (^)(unsigned long long bytesUploaded, unsigned long long bytesTotal))progressBlock;
+ progressBlock:(void (^)(unsigned long long bytesUploaded, unsigned long long bytesTotal, BOOL *stop))progressBlock;
@end
@@ -114,7 +116,7 @@ const NSUInteger kRawBufferSize = 24576;
bytesExpected:(unsigned long long)bytesExpected
authenticationProvider:(id<CMISAuthenticationProvider>) authenticationProvider
completionBlock:(void (^)(CMISHttpResponse *httpResponse, NSError *error))completionBlock
- progressBlock:(void (^)(unsigned long long bytesUploaded, unsigned long long bytesTotal))progressBlock
+ progressBlock:(void (^)(unsigned long long bytesUploaded, unsigned long long bytesTotal, BOOL *stop))progressBlock
{
CMISHttpUploadRequest *httpRequest = [[self alloc] initWithHttpMethod:httpRequestMethod
completionBlock:completionBlock
@@ -143,7 +145,7 @@ authenticationProvider:(id<CMISAuthentic
cmisProperties:(CMISProperties *)cmisProperties
mimeType:(NSString *)mimeType
completionBlock:(void (^)(CMISHttpResponse *httpResponse, NSError *error))completionBlock
- progressBlock:(void (^)(unsigned long long bytesUploaded, unsigned long long bytesTotal))progressBlock
+ progressBlock:(void (^)(unsigned long long bytesUploaded, unsigned long long bytesTotal, BOOL *stop))progressBlock
{
CMISHttpUploadRequest *httpRequest = [[self alloc] initWithHttpMethod:httpRequestMethod
completionBlock:completionBlock
@@ -167,7 +169,7 @@ authenticationProvider:(id<CMISAuthentic
- (id)initWithHttpMethod:(CMISHttpRequestMethod)httpRequestMethod
completionBlock:(void (^)(CMISHttpResponse *httpResponse, NSError *error))completionBlock
- progressBlock:(void (^)(unsigned long long bytesUploaded, unsigned long long bytesTotal))progressBlock
+ progressBlock:(void (^)(unsigned long long bytesUploaded, unsigned long long bytesTotal, BOOL *stop))progressBlock
{
self = [super initWithHttpMethod:httpRequestMethod
completionBlock:completionBlock];
@@ -241,10 +243,17 @@ totalBytesExpectedToWrite:(NSInteger)tot
}
}
+ BOOL cancelled = NO;
if (self.bytesExpected == 0) {
- self.progressBlock((unsigned long long)totalBytesWritten, (unsigned long long)totalBytesExpectedToWrite);
+ self.progressBlock((unsigned long long)totalBytesWritten, (unsigned long long)totalBytesExpectedToWrite, &cancelled);
} else {
- self.progressBlock((unsigned long long)totalBytesWritten, self.bytesExpected);
+ self.progressBlock((unsigned long long)totalBytesWritten, self.bytesExpected, &cancelled);
+ }
+
+ // Cancel Upload Request if requested
+ if (cancelled == YES) {
+ [self cancel];
+ self.progressBlock((unsigned long long)totalBytesWritten, self.bytesExpected, &cancelled);
}
}
}
@@ -385,6 +394,8 @@ totalBytesExpectedToWrite:(NSInteger)tot
bytesWritten = [self.encoderStream write:&buffer[self.bufferOffset] maxLength:self.bufferLimit - self.bufferOffset];
if (bytesWritten <= 0) {
[self stopSendWithStatus:@"Network write error"];
+ NSError *cmisError = [CMISErrors createCMISErrorWithCode:kCMISErrorCodeConnection detailedDescription:@"Network write error"];
+ [self connection:nil didFailWithError:cmisError];
} else {
self.bufferOffset += bytesWritten;
}
@@ -430,8 +441,8 @@ totalBytesExpectedToWrite:(NSInteger)tot
self.streamEndData = [end dataUsingEncoding:NSUTF8StringEncoding];
unsigned long long encodedLength = [CMISHttpUploadRequest base64EncodedLength:self.bytesExpected];
- encodedLength += start.length;
- encodedLength += end.length;
+ encodedLength += self.streamStartData.length;
+ encodedLength += self.streamEndData.length;
self.encodedLength = encodedLength;
}
Modified: chemistry/objectivecmis/trunk/ObjectiveCMIS/Utils/CMISObjectConverter.m
URL: http://svn.apache.org/viewvc/chemistry/objectivecmis/trunk/ObjectiveCMIS/Utils/CMISObjectConverter.m?rev=1578378&r1=1578377&r2=1578378&view=diff
==============================================================================
--- chemistry/objectivecmis/trunk/ObjectiveCMIS/Utils/CMISObjectConverter.m (original)
+++ chemistry/objectivecmis/trunk/ObjectiveCMIS/Utils/CMISObjectConverter.m Mon Mar 17 13:53:05 2014
@@ -25,6 +25,7 @@
#import "CMISPropertyDefinition.h"
#import "CMISSession.h"
#import "CMISDateUtil.h"
+#import "CMISConstants.h"
@interface CMISObjectConverter ()
@property (nonatomic, weak) CMISSession *session;
@@ -63,15 +64,19 @@
{
[self convertObject:[objectDatas objectAtIndex:position]
completionBlock:^(CMISObject *object, NSError *error) {
- if (position == 0) {
- NSMutableArray *objects = [[NSMutableArray alloc] initWithCapacity:objectDatas.count];
- [objects addObject:object];
- completionBlock(objects, error);
+ if(error){
+ completionBlock(nil, error);
} else {
- [self internalConvertObject:objectDatas position:(position - 1) completionBlock:^(NSMutableArray *objects, NSError *error) {
+ if (position == 0) {
+ NSMutableArray *objects = [[NSMutableArray alloc] initWithCapacity:objectDatas.count];
[objects addObject:object];
completionBlock(objects, error);
- }];
+ } else {
+ [self internalConvertObject:objectDatas position:(position - 1) completionBlock:^(NSMutableArray *objects, NSError *error) {
+ [objects addObject:object];
+ completionBlock(objects, error);
+ }];
+ }
}
}];
}
@@ -99,8 +104,15 @@
}
-- (void)internalNormalConvertProperties:(NSDictionary *)properties
- typeDefinition:(CMISTypeDefinition *)typeDefinition
+- (void)internalNormalConvertProperties:(NSDictionary *)properties
+ typeDefinition:(CMISTypeDefinition *)typeDefinition
+ completionBlock:(void (^)(CMISProperties *convertedProperties, NSError *error))completionBlock
+{
+ [self internalNormalConvertProperties:properties typeDefinitions:[NSArray arrayWithObject:typeDefinition] completionBlock:completionBlock];
+}
+
+- (void)internalNormalConvertProperties:(NSDictionary *)properties
+ typeDefinitions:(NSArray *)typeDefinitions
completionBlock:(void (^)(CMISProperties *convertedProperties, NSError *error))completionBlock
{
CMISProperties *convertedProperties = [[CMISProperties alloc] init];
@@ -111,7 +123,7 @@
[convertedProperties addProperty:(CMISPropertyData *)propertyValue];
} else {
// Convert to CMISPropertyData based on the string
- CMISPropertyDefinition *propertyDefinition = [typeDefinition propertyDefinitionForId:propertyId];
+ CMISPropertyDefinition *propertyDefinition = [self propertyDefinitionFromTypeDefinitions:typeDefinitions propertyId:propertyId];
if (propertyDefinition == nil) {
NSError *error = [CMISErrors createCMISErrorWithCode:kCMISErrorCodeInvalidArgument
@@ -310,6 +322,18 @@
completionBlock(convertedProperties, nil);
}
+-(CMISPropertyDefinition*)propertyDefinitionFromTypeDefinitions:(NSArray *)typeDefinitions propertyId:(NSString*)propertyId
+{
+ for (CMISTypeDefinition* typeDefinition in typeDefinitions) {
+ CMISPropertyDefinition *propertyDefinition = [typeDefinition propertyDefinitionForId:propertyId];
+
+ if (propertyDefinition) {
+ return propertyDefinition;
+ }
+ }
+ return nil;
+}
+
- (void)internalNormalConvertProperties:(NSDictionary *)properties
objectTypeId:(NSString *)objectTypeId
@@ -346,16 +370,94 @@
completionBlock:completionBlock];
} else {
- [self.session retrieveTypeDefinition:objectTypeId
- completionBlock:^(CMISTypeDefinition *typeDefinition, NSError *error) {
- if (error) {
- completionBlock(nil, [CMISErrors cmisError:error cmisErrorCode:kCMISErrorCodeRuntime]);
- } else {
- [self internalNormalConvertProperties:properties
- typeDefinition:typeDefinition
- completionBlock:completionBlock];
- }
- }];
+
+ //get secondary object type definitions - if available
+ NSString *propertyId = kCMISPropertySecondaryObjectTypeIds;
+ id secondaryObjectTypeIds = [properties valueForKey:propertyId];
+ if(secondaryObjectTypeIds) {
+ Class expectedType = nil;
+ BOOL validType = YES;
+
+ //verify types
+ expectedType = [NSArray class];
+ if([secondaryObjectTypeIds isKindOfClass:expectedType]){
+ expectedType = [NSString class];
+ for (id secondaryObjectTypeId in secondaryObjectTypeIds) {
+ propertyId = secondaryObjectTypeId;
+ if(![secondaryObjectTypeId isKindOfClass:expectedType]){
+ validType = NO;
+ break;
+ }
+ }
+ } else {
+ validType = NO;
+ }
+
+ if (!validType) {
+ NSError *error = [CMISErrors createCMISErrorWithCode:kCMISErrorCodeInvalidArgument
+ detailedDescription:[NSString stringWithFormat:@"Property value for %@ should be of type '%@'", propertyId, expectedType]];
+ completionBlock(nil, error);
+ return;
+ }
+
+ NSMutableArray *objectTypeIds = [NSMutableArray arrayWithObject:objectTypeId];
+ [objectTypeIds addObjectsFromArray:secondaryObjectTypeIds];
+ [self retrieveTypeDefinitions:objectTypeIds
+ completionBlock:^(NSArray *typeDefinitions, NSError *error) {
+ if (error) {
+ completionBlock(nil, [CMISErrors cmisError:error cmisErrorCode:kCMISErrorCodeRuntime]);
+ } else {
+ [self internalNormalConvertProperties:properties
+ typeDefinitions:typeDefinitions
+ completionBlock:completionBlock];
+ }
+ }];
+ } else {
+ [self.session retrieveTypeDefinition:objectTypeId
+ completionBlock:^(CMISTypeDefinition *typeDefinition, NSError *error) {
+ if (error) {
+ completionBlock(nil, [CMISErrors cmisError:error cmisErrorCode:kCMISErrorCodeRuntime]);
+ } else {
+ [self internalNormalConvertProperties:properties
+ typeDefinition:typeDefinition
+ completionBlock:completionBlock];
+ }
+ }];
+ }
+ }
+}
+
+- (void)retrieveTypeDefinitions:(NSArray *)objectTypeIds position:(NSInteger)position completionBlock:(void (^)(NSMutableArray *typeDefinitions, NSError *error))completionBlock
+{
+ [self.session retrieveTypeDefinition:[objectTypeIds objectAtIndex:position]
+ completionBlock:^(CMISTypeDefinition *typeDefinition, NSError *error) {
+ if(error){
+ completionBlock(nil, error);
+ } else {
+ if (position == 0) {
+ NSMutableArray *typeDefinitions = [[NSMutableArray alloc] initWithCapacity:objectTypeIds.count];
+ [typeDefinitions addObject:typeDefinition];
+ completionBlock(typeDefinitions, error);
+ } else {
+ [self retrieveTypeDefinitions:objectTypeIds position:(position - 1) completionBlock:^(NSMutableArray *typeDefinitions, NSError *error) {
+ [typeDefinitions addObject:typeDefinition];
+ completionBlock(typeDefinitions, error);
+ }];
+ }
+ }
+ }];
+}
+
+- (void)retrieveTypeDefinitions:(NSArray *)objectTypeIds completionBlock:(void (^)(NSArray *typeDefinitions, NSError *error))completionBlock
+{
+ if (objectTypeIds.count > 0) {
+ [self retrieveTypeDefinitions:objectTypeIds
+ position:(objectTypeIds.count - 1) // start recursion with last item
+ completionBlock:^(NSMutableArray *typeDefinitions, NSError *error) {
+ completionBlock(typeDefinitions, error);
+ }];
+ } else {
+ completionBlock([[NSArray alloc] init], nil);
}
}