EMASCurlWeb/EMASCurlWebUtils.m (158 lines of code) (raw):
#import "EMASCurlWebUtils.h"
#import <pthread.h>
@implementation EMASCurlWebUtils
+ (BOOL)isValidStr:(NSString *)str {
if (str == nil || ![str isKindOfClass:[NSString class]] || str.length == 0) {
return NO;
}
return YES;
}
+ (BOOL)isEqualURLA:(NSString *)urlStrA withURLB:(NSString *)urlStrB {
if (!urlStrA ||
!urlStrB ||
!EMASCurlValidStr(urlStrA) ||
!EMASCurlValidStr(urlStrB)) {
return NO;
}
if ([urlStrA isEqualToString:urlStrB]) {
return YES;
}
NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"/ "];
NSURL *urlA = [NSURL URLWithString:urlStrA];
NSURL *urlB = [NSURL URLWithString:urlStrB];
if (![urlA.scheme isEqualToString:urlB.scheme]) {
return NO;
}
if (![urlA.host isEqualToString:urlB.host]) {
return NO;
}
if (![[urlA.path stringByTrimmingCharactersInSet:set] isEqualToString:[urlB.path stringByTrimmingCharactersInSet:set]]) {
return NO;
}
return YES;
}
@end
@interface EMASCurlSafeArray ()
@property (nonatomic, strong) NSMutableArray *array;
@property (nonatomic, assign) pthread_mutex_t mutex;
@end
@implementation EMASCurlSafeArray
- (instancetype)init {
self = [super init];
if (self) {
_array = [[NSMutableArray alloc] init];
pthread_mutex_init(&_mutex, NULL);
}
return self;
}
- (NSUInteger)count {
NSUInteger count;
pthread_mutex_lock(&_mutex);
count = _array.count;
pthread_mutex_unlock(&_mutex);
return count;
}
- (void)addObject:(id)anObject {
if (!anObject) {
return;
}
pthread_mutex_lock(&_mutex);
[_array addObject:anObject];
pthread_mutex_unlock(&_mutex);
}
- (void)removeObject:(id)anObject {
if (!anObject) {
return;
}
pthread_mutex_lock(&_mutex);
[_array removeObject:anObject];
pthread_mutex_unlock(&_mutex);
}
- (id)copyWithZone:(NSZone *)zone {
EMASCurlSafeArray *copy = [[[self class] allocWithZone:zone] init];
pthread_mutex_lock(&_mutex);
copy->_array = [_array mutableCopy];
pthread_mutex_unlock(&_mutex);
return copy;
}
- (void)dealloc {
pthread_mutex_destroy(&_mutex);
}
@end
@interface EMASCurlSafeDictionary ()
@property (nonatomic, strong) NSMutableDictionary *dictionary;
@property (nonatomic, assign) pthread_mutex_t mutex;
@end
@implementation EMASCurlSafeDictionary
- (instancetype)init {
self = [super init];
if (self) {
_dictionary = [[NSMutableDictionary alloc] init];
pthread_mutex_init(&_mutex, NULL);
}
return self;
}
- (void)setObject:(id)anObject forKey:(id<NSCopying>)aKey {
if (!aKey) {
return;
}
pthread_mutex_lock(&_mutex);
if (anObject) {
[_dictionary setObject:anObject forKey:aKey];
} else {
[_dictionary removeObjectForKey:aKey];
}
pthread_mutex_unlock(&_mutex);
}
- (void)removeObjectForKey:(id)aKey {
if (!aKey) {
return;
}
pthread_mutex_lock(&_mutex);
[_dictionary removeObjectForKey:aKey];
pthread_mutex_unlock(&_mutex);
}
- (id)objectForKey:(id)aKey {
if (!aKey) {
return nil;
}
id result = nil;
pthread_mutex_lock(&_mutex);
result = [_dictionary objectForKey:aKey];
pthread_mutex_unlock(&_mutex);
return result;
}
- (id)copyWithZone:(NSZone *)zone {
EMASCurlSafeDictionary *copy = [[[self class] allocWithZone:zone] init];
pthread_mutex_lock(&_mutex);
copy->_dictionary = [_dictionary mutableCopy];
pthread_mutex_unlock(&_mutex);
return copy;
}
- (void)dealloc {
pthread_mutex_destroy(&_mutex);
}
@end
@interface EMASCurlWebWeakProxy ()
@property (nonatomic, weak) id theObject;
@end
@implementation EMASCurlWebWeakProxy
- (instancetype)initWithObject:(id)object {
_theObject = object;
return self;
}
- (id)forwardingTargetForSelector:(SEL)aSelector {
return self.theObject;
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
id object = self.theObject;
if (object) {
return [object methodSignatureForSelector:aSelector];
} else {
return [NSMethodSignature signatureWithObjCTypes:"v@:"];
}
}
- (void)forwardInvocation:(NSInvocation *)anInvocation {
[anInvocation invokeWithTarget:self.theObject];
}
@end