From 7fa8c53a503829adf4c75d53accaa4676cc97882 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Tue, 5 Sep 2017 19:36:04 -0400 Subject: [PATCH] @craig-at-rsg add PSPDFThreadSafeMutableDictionary for iOS/macOS PSPDFThreadSafeMutableDictionary.m from https://gist.github.com/steipete/5928916 ref: litehelpers/Cordova-sqlite-storage#716 --- LICENSE.md | 2 + package.json | 2 +- plugin.xml | 2 +- src/ios/PSPDFThreadSafeMutableDictionary.h | 28 ++++ src/ios/PSPDFThreadSafeMutableDictionary.m | 159 +++++++++++++++++++++ 5 files changed, 191 insertions(+), 2 deletions(-) create mode 100644 src/ios/PSPDFThreadSafeMutableDictionary.h create mode 100644 src/ios/PSPDFThreadSafeMutableDictionary.m diff --git a/LICENSE.md b/LICENSE.md index e621188a3..d257c7fcf 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -14,6 +14,8 @@ MIT only based on Phonegap-SQLitePlugin by @davibe (Davide Bertola ) and @joenoon (Joe Noon ) +includes PSPDFThreadSafeMutableDictionary (PSPDFThreadSafeMutableDictionary.m ) MIT license by @steipete () + ## REMOVED from this version branch: Windows (8.1/...) version MIT or Apache 2.0 diff --git a/package.json b/package.json index 65ee03f73..d2050a2d7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cordova-sqlite-legacy-express-core", - "version": "1.0.1", + "version": "1.0.2-pre00", "description": "Native interface to SQLite for PhoneGap/Cordova (legacy express core version)", "cordova": { "id": "cordova-sqlite-legacy-express-core", diff --git a/plugin.xml b/plugin.xml index c67c46975..74aad5c4b 100644 --- a/plugin.xml +++ b/plugin.xml @@ -2,7 +2,7 @@ + version="1.0.2-pre00"> Cordova sqlite storage plugin - legacy express core version diff --git a/src/ios/PSPDFThreadSafeMutableDictionary.h b/src/ios/PSPDFThreadSafeMutableDictionary.h new file mode 100644 index 000000000..05cd9ac1f --- /dev/null +++ b/src/ios/PSPDFThreadSafeMutableDictionary.h @@ -0,0 +1,28 @@ +// PSPDFThreadSafeMutableDictionary.h header copied from +// PSPDFThreadSafeMutableDictionary.m +// +// Copyright (c) 2013 Peter Steinberger, PSPDFKit GmbH. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import + +// Dictionary-Subclasss whose primitive operations are thread safe. +@interface PSPDFThreadSafeMutableDictionary : NSMutableDictionary +@end diff --git a/src/ios/PSPDFThreadSafeMutableDictionary.m b/src/ios/PSPDFThreadSafeMutableDictionary.m new file mode 100644 index 000000000..f8c53e210 --- /dev/null +++ b/src/ios/PSPDFThreadSafeMutableDictionary.m @@ -0,0 +1,159 @@ +// +// PSPDFThreadSafeMutableDictionary.m +// +// Copyright (c) 2013 Peter Steinberger, PSPDFKit GmbH. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import + +// Dictionary-Subclasss whose primitive operations are thread safe. +@interface PSPDFThreadSafeMutableDictionary : NSMutableDictionary +@end + +// ---------------------------------------------------------------- + +// +// PSPDFThreadSafeMutableDictionary.m +// PSPDFKit +// +// Copyright (c) 2013 PSPDFKit GmbH. All rights reserved. +// + +#import "PSPDFThreadSafeMutableDictionary.h" +#import + +#define LOCKED(...) OSSpinLockLock(&_lock); \ +__VA_ARGS__; \ +OSSpinLockUnlock(&_lock); + +@implementation PSPDFThreadSafeMutableDictionary { + OSSpinLock _lock; + NSMutableDictionary *_dictionary; // Class Cluster! +} + +/////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - NSObject + +- (id)init { + return [self initWithCapacity:0]; +} + +- (id)initWithObjects:(NSArray *)objects forKeys:(NSArray *)keys { + if ((self = [self initWithCapacity:objects.count])) { + [objects enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { + _dictionary[keys[idx]] = obj; + }]; + } + return self; +} + +- (id)initWithCapacity:(NSUInteger)capacity { + if ((self = [super init])) { + _dictionary = [[NSMutableDictionary alloc] initWithCapacity:capacity]; + _lock = OS_SPINLOCK_INIT; + } + return self; +} + +/////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - NSMutableDictionary + +- (void)setObject:(id)anObject forKey:(id)aKey { + LOCKED(_dictionary[aKey] = anObject) +} + +- (void)addEntriesFromDictionary:(NSDictionary *)otherDictionary { + LOCKED([_dictionary addEntriesFromDictionary:otherDictionary]); +} + +- (void)setDictionary:(NSDictionary *)otherDictionary { + LOCKED([_dictionary setDictionary:otherDictionary]); +} + +- (void)removeObjectForKey:(id)aKey { + LOCKED([_dictionary removeObjectForKey:aKey]) +} + +- (void)removeAllObjects { + LOCKED([_dictionary removeAllObjects]); +} + +- (NSUInteger)count { + LOCKED(NSUInteger count = _dictionary.count) + return count; +} + +- (NSArray *)allKeys { + LOCKED(NSArray *allKeys = _dictionary.allKeys) + return allKeys; +} + +- (NSArray *)allValues { + LOCKED(NSArray *allValues = _dictionary.allValues) + return allValues; +} + +- (id)objectForKey:(id)aKey { + LOCKED(id obj = _dictionary[aKey]) + return obj; +} + +- (NSEnumerator *)keyEnumerator { + LOCKED(NSEnumerator *keyEnumerator = [_dictionary keyEnumerator]) + return keyEnumerator; +} + +- (id)copyWithZone:(NSZone *)zone { + return [self mutableCopyWithZone:zone]; +} + +- (id)mutableCopyWithZone:(NSZone *)zone { + LOCKED(id copiedDictionary = [[self.class allocWithZone:zone] initWithDictionary:_dictionary]) + return copiedDictionary; +} + +- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state + objects:(id __unsafe_unretained [])stackbuf + count:(NSUInteger)len { + LOCKED(NSUInteger count = [[_dictionary copy] countByEnumeratingWithState:state objects:stackbuf count:len]); + return count; +} + +- (void)performLockedWithDictionary:(void (^)(NSDictionary *dictionary))block { + if (block) LOCKED(block(_dictionary)); +} + +- (BOOL)isEqual:(id)object { + if (object == self) return YES; + + if ([object isKindOfClass:PSPDFThreadSafeMutableDictionary.class]) { + PSPDFThreadSafeMutableDictionary *other = object; + __block BOOL isEqual = NO; + [other performLockedWithDictionary:^(NSDictionary *dictionary) { + [self performLockedWithDictionary:^(NSDictionary *otherDictionary) { + isEqual = [dictionary isEqual:otherDictionary]; + }]; + }]; + return isEqual; + } + return NO; +} + +@end