Revert "oc: NGImap4Connection:fetchUids don't delete RawResponse"

This reverts commit c410a9fc3f.
pull/78/head
Julio García 2015-04-20 13:15:13 +02:00
parent 1d9e085658
commit 255b3d2d00
2 changed files with 27 additions and 80 deletions

View File

@ -24,20 +24,12 @@
#import <Foundation/NSArray.h> #import <Foundation/NSArray.h>
#import <NGImap4/NGImap4Client.h> #import <NGImap4/NGImap4Client.h>
#import <NGImap4/NGImap4Connection.h> #import <NGImap4/NGImap4Connection.h>
#import <NGExtensions/NGHashMap.h>
@interface NGImap4Connection (Monkeypatching) @interface NGImap4Connection (Monkeypatching)
- (NSArray *) fetchUIDs: (NSArray *) _uids - (NSArray *)fetchUIDs:(NSArray *)_uids inURL:(NSURL *)_url
inURL: (NSURL *) _url parts:(NSArray *)_parts;
parts: (NSArray *) _parts;
- (void) _mergeDict: (NSDictionary *) source
into: (NSMutableDictionary *) target;
- (void) _mergeNGHashMap: (NGMutableHashMap *) source
into: (NGMutableHashMap *) target;
@end @end

View File

@ -20,7 +20,7 @@
#import "NGImap4Connection+Monkeypatching.h" #import "NGImap4Connection+Monkeypatching.h"
#import <Foundation/NSValue.h> #import <Foundation/NSObject.h>
#import <Foundation/NSDictionary.h> #import <Foundation/NSDictionary.h>
#import <NGExtensions/NSObject+Logs.h> #import <NGExtensions/NSObject+Logs.h>
@ -28,9 +28,8 @@
@implementation NGImap4Connection (Monkeypatching) @implementation NGImap4Connection (Monkeypatching)
- (NSArray *) fetchUIDs: (NSArray *) _uids - (NSArray *)fetchUIDs:(NSArray *)_uids inURL:(NSURL *)_url
inURL: (NSURL *) _url parts:(NSArray *)_parts
parts: (NSArray *) _parts
{ {
// currently returns a dict?! // currently returns a dict?!
/* /*
@ -73,81 +72,37 @@
partial_result = [[self client] fetchUids:partial_uids parts:_parts]; partial_result = [[self client] fetchUids:partial_uids parts:_parts];
if (![[partial_result valueForKey:@"result"] boolValue]) { if (![[partial_result valueForKey:@"result"] boolValue]) {
[self errorWithFormat: @"could not fetch %d uids for url: %@", [self errorWithFormat: @"could not fetch %d uids for url: %@", [_uids count], _url];
[_uids count], _url];
return nil; return nil;
} }
if (result == nil) { if (!result) {
/* First iteration, first result */ /* First iteration, first result */
result = [[partial_result mutableCopy] autorelease]; result = [[partial_result mutableCopy] autorelease];
} else { /* RawResponse has already been processed, ignore it */
/* Merge partial_result into previous result */ [result removeObjectForKey: @"RawResponse"];
[self _mergeDict: partial_result into: result]; continue;
}
/* Merge partial_result into previous result */
for (id key in [partial_result keyEnumerator]) {
id obj, current_obj;
current_obj = [result objectForKey: key];
if (!current_obj) continue;
obj = [partial_result objectForKey: key];
if ([obj isKindOfClass: [NSArray class]]) {
NSArray *data, *current_data, *new_data;
data = obj;
current_data = current_obj;
new_data = [current_data arrayByAddingObjectsFromArray: data];
[result setObject: new_data forKey: key];
}
} }
} }
return (id)result; return (id)result;
} }
- (void) _mergeDict: (NSDictionary *) source
into: (NSMutableDictionary *) target
{
for (id key in [source keyEnumerator]) {
id obj, current_obj;
current_obj = [target objectForKey: key];
if (current_obj == nil) {
/* This should never happen but just in case... */
[self errorWithFormat: @"Error while merging results: nonexistent key "
@"%@ on current target", key];
continue;
}
obj = [source objectForKey: key];
if ([obj isKindOfClass: [NSArray class]]) {
NSArray *data, *current_data, *new_data;
data = obj;
current_data = current_obj;
new_data = [current_data arrayByAddingObjectsFromArray: data];
[target setObject: new_data forKey: key];
} else if ([obj isKindOfClass: [NGMutableHashMap class]]) {
[self _mergeNGHashMap: obj into: current_obj];
} else if ([obj isKindOfClass: [NSNumber class]]) {
if (obj != current_obj) {
[self errorWithFormat: @"While fetching uids problem happened "
@"merging results for key %@: %@ != %@",
key, obj, current_obj];
}
} else {
[self errorWithFormat: @"While fetching uids and mergin results ignored "
@"%@ (%@) key", key, [key class]];
}
}
}
- (void) _mergeNGHashMap: (NGMutableHashMap *) source
into: (NGMutableHashMap *) target
{
for (id key in [source keyEnumerator]) {
NSArray *obj, *current_obj;
current_obj = [target objectsForKey: key];
if (current_obj == nil) {
/* This should never happen but just in case... */
[self errorWithFormat: @"Error while merging results: nonexistent key "
@"%@ on current target", key];
continue;
}
if ([current_obj count] == 1) {
/* Merge only results, that means fields with more than 1 object */
continue;
}
obj = [source objectsForKey: key];
[target addObjects: obj forKey: key];
}
}
@end @end