1// Protocol Buffers - Google's data interchange format 2// Copyright 2008 Google Inc. All rights reserved. 3// https://developers.google.com/protocol-buffers/ 4// 5// Redistribution and use in source and binary forms, with or without 6// modification, are permitted provided that the following conditions are 7// met: 8// 9// * Redistributions of source code must retain the above copyright 10// notice, this list of conditions and the following disclaimer. 11// * Redistributions in binary form must reproduce the above 12// copyright notice, this list of conditions and the following disclaimer 13// in the documentation and/or other materials provided with the 14// distribution. 15// * Neither the name of Google Inc. nor the names of its 16// contributors may be used to endorse or promote products derived from 17// this software without specific prior written permission. 18// 19// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 31#import "GPBExtensionRegistry.h" 32 33#import "GPBBootstrap.h" 34#import "GPBDescriptor.h" 35 36@implementation GPBExtensionRegistry { 37 // TODO(dmaclach): Reimplement with CFDictionaries that don't use 38 // objects as keys. 39 NSMutableDictionary *mutableClassMap_; 40} 41 42- (instancetype)init { 43 if ((self = [super init])) { 44 mutableClassMap_ = [[NSMutableDictionary alloc] init]; 45 } 46 return self; 47} 48 49- (void)dealloc { 50 [mutableClassMap_ release]; 51 [super dealloc]; 52} 53 54- (instancetype)copyWithZone:(NSZone *)zone { 55 GPBExtensionRegistry *result = [[[self class] allocWithZone:zone] init]; 56 if (result && mutableClassMap_.count) { 57 [result->mutableClassMap_ addEntriesFromDictionary:mutableClassMap_]; 58 } 59 return result; 60} 61 62- (NSMutableDictionary *)extensionMapForContainingMessageClass: 63 (Class)containingMessageClass { 64 NSMutableDictionary *extensionMap = 65 [mutableClassMap_ objectForKey:containingMessageClass]; 66 if (extensionMap == nil) { 67 extensionMap = [NSMutableDictionary dictionary]; 68 [mutableClassMap_ setObject:extensionMap 69 forKey:(id<NSCopying>)containingMessageClass]; 70 } 71 return extensionMap; 72} 73 74- (void)addExtension:(GPBExtensionDescriptor *)extension { 75 if (extension == nil) { 76 return; 77 } 78 79 Class containingMessageClass = extension.containingMessageClass; 80 NSMutableDictionary *extensionMap = 81 [self extensionMapForContainingMessageClass:containingMessageClass]; 82 [extensionMap setObject:extension forKey:@(extension.fieldNumber)]; 83} 84 85- (GPBExtensionDescriptor *)extensionForDescriptor:(GPBDescriptor *)descriptor 86 fieldNumber:(NSInteger)fieldNumber { 87 Class messageClass = descriptor.messageClass; 88 NSDictionary *extensionMap = 89 [mutableClassMap_ objectForKey:messageClass]; 90 return [extensionMap objectForKey:@(fieldNumber)]; 91} 92 93- (void)addExtensions:(GPBExtensionRegistry *)registry { 94 if (registry == nil) { 95 // In the case where there are no extensions just ignore. 96 return; 97 } 98 NSMutableDictionary *otherClassMap = registry->mutableClassMap_; 99 for (Class containingMessageClass in otherClassMap) { 100 NSMutableDictionary *extensionMap = 101 [self extensionMapForContainingMessageClass:containingMessageClass]; 102 NSMutableDictionary *otherExtensionMap = 103 [registry extensionMapForContainingMessageClass:containingMessageClass]; 104 [extensionMap addEntriesFromDictionary:otherExtensionMap]; 105 } 106} 107 108@end 109