2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6 % RRRR EEEEE GGG IIIII SSSSS TTTTT RRRR Y Y %
7 % R R E G I SS T R R Y Y %
8 % RRRR EEE G GGG I SSS T RRRR Y %
9 % R R E G G I SS T R R Y %
10 % R R EEEEE GGG IIIII SSSSS T R R Y %
13 % MagickCore Registry Methods %
20 % Copyright 1999-2014 ImageMagick Studio LLC, a non-profit organization %
21 % dedicated to making software imaging solutions freely available. %
23 % You may not use this file except in compliance with the License. You may %
24 % obtain a copy of the License at %
26 % http://www.imagemagick.org/script/license.php %
28 % Unless required by applicable law or agreed to in writing, software %
29 % distributed under the License is distributed on an "AS IS" BASIS, %
30 % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %
31 % See the License for the specific language governing permissions and %
32 % limitations under the License. %
34 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
43 #include "MagickCore/studio.h"
44 #include "MagickCore/exception.h"
45 #include "MagickCore/exception-private.h"
46 #include "MagickCore/image.h"
47 #include "MagickCore/list.h"
48 #include "MagickCore/memory_.h"
49 #include "MagickCore/registry.h"
50 #include "MagickCore/registry-private.h"
51 #include "MagickCore/splay-tree.h"
52 #include "MagickCore/string_.h"
53 #include "MagickCore/utility.h"
58 typedef struct _RegistryInfo
74 *registry = (SplayTreeInfo *) NULL;
77 *registry_semaphore = (SemaphoreInfo *) NULL;
80 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
84 % D e f i n e I m a g e R e g i s t r y %
88 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
90 % DefineImageRegistry() associates a key/value pair with the image registry.
92 % The format of the DefineImageRegistry method is:
94 % MagickBooleanType DefineImageRegistry(const RegistryType type,
95 % const char *option,ExceptionInfo *exception)
97 % A description of each parameter follows:
101 % o option: the option.
103 % o exception: the exception.
106 MagickExport MagickBooleanType DefineImageRegistry(const RegistryType type,
107 const char *option,ExceptionInfo *exception)
111 value[MaxTextExtent];
116 assert(option != (const char *) NULL);
117 (void) CopyMagickString(key,option,MaxTextExtent);
118 for (p=key; *p != '\0'; p++)
123 (void) CopyMagickString(value,p+1,MaxTextExtent);
125 return(SetImageRegistry(type,key,value,exception));
129 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
133 % D e l e t e I m a g e R e g i s t r y %
137 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
139 % DeleteImageRegistry() deletes a key from the image registry.
141 % The format of the DeleteImageRegistry method is:
143 % MagickBooleanType DeleteImageRegistry(const char *key)
145 % A description of each parameter follows:
147 % o key: the registry.
150 MagickExport MagickBooleanType DeleteImageRegistry(const char *key)
152 if (IsEventLogging() != MagickFalse)
153 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",key);
154 if (registry == (void *) NULL)
156 return(DeleteNodeFromSplayTree(registry,key));
160 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
164 % G e t I m a g e R e g i s t r y %
168 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
170 % GetImageRegistry() returns a value associated with an image registry key.
172 % The format of the GetImageRegistry method is:
174 % void *GetImageRegistry(const RegistryType type,const char *key,
175 % ExceptionInfo *exception)
177 % A description of each parameter follows:
183 % o exception: the exception.
186 MagickExport void *GetImageRegistry(const RegistryType type,const char *key,
187 ExceptionInfo *exception)
195 if (IsEventLogging() != MagickFalse)
196 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",key);
197 if (registry == (void *) NULL)
198 return((void *) NULL);
199 registry_info=(RegistryInfo *) GetValueFromSplayTree(registry,key);
200 if (registry_info == (void *) NULL)
202 (void) ThrowMagickException(exception,GetMagickModule(),RegistryError,
203 "UnableToGetRegistryID","`%s'",key);
204 return((void *) NULL);
209 case ImageRegistryType:
211 if (type == registry_info->type)
212 value=(void *) CloneImageList((Image *) registry_info->value,exception);
215 case ImageInfoRegistryType:
217 if (type == registry_info->type)
218 value=(void *) CloneImageInfo((ImageInfo *) registry_info->value);
221 case StringRegistryType:
223 switch (registry_info->type)
225 case ImageRegistryType:
227 value=(Image *) ConstantString(((Image *)
228 registry_info->value)->filename);
231 case ImageInfoRegistryType:
233 value=(Image *) ConstantString(((ImageInfo *)
234 registry_info->value)->filename);
237 case StringRegistryType:
239 value=(void *) ConstantString((char *) registry_info->value);
254 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
258 % G e t N e x t I m a g e R e g i s t r y %
262 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
264 % GetNextImageRegistry() gets the next image registry value.
266 % The format of the GetNextImageRegistry method is:
268 % char *GetNextImageRegistry(void)
271 MagickExport char *GetNextImageRegistry(void)
273 if (IsEventLogging() != MagickFalse)
274 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
275 if (registry == (void *) NULL)
276 return((char *) NULL);
277 return((char *) GetNextKeyInSplayTree(registry));
281 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
285 + R e g i s t r y C o m p o n e n t G e n e s i s %
289 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
291 % RegistryComponentGenesis() instantiates the registry component.
293 % The format of the RegistryComponentGenesis method is:
295 % MagickBooleanType RegistryComponentGenesis(void)
298 MagickPrivate MagickBooleanType RegistryComponentGenesis(void)
300 if (registry_semaphore == (SemaphoreInfo *) NULL)
301 registry_semaphore=AcquireSemaphoreInfo();
306 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
310 % R e g i s t r y C o m p o n e n t T e r m i n u s %
314 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
316 % RegistryComponentTerminus() destroys the registry component.
318 % The format of the DestroyDefines method is:
320 % void RegistryComponentTerminus(void)
323 MagickPrivate void RegistryComponentTerminus(void)
325 if (registry_semaphore == (SemaphoreInfo *) NULL)
326 ActivateSemaphoreInfo(®istry_semaphore);
327 LockSemaphoreInfo(registry_semaphore);
328 if (IsEventLogging() != MagickFalse)
329 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
330 if (registry != (void *) NULL)
331 registry=DestroySplayTree(registry);
332 UnlockSemaphoreInfo(registry_semaphore);
333 RelinquishSemaphoreInfo(®istry_semaphore);
337 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
341 % R e m o v e I m a g e R e g i s t r y %
345 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
347 % RemoveImageRegistry() removes a key from the image registry and returns its
350 % The format of the RemoveImageRegistry method is:
352 % void *RemoveImageRegistry(const char *key)
354 % A description of each parameter follows:
356 % o key: the registry.
359 MagickExport void *RemoveImageRegistry(const char *key)
361 if (IsEventLogging() != MagickFalse)
362 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",key);
363 if (registry == (void *) NULL)
364 return((void *) NULL);
365 return(RemoveNodeFromSplayTree(registry,key));
369 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
373 % R e s e t I m a g e R e g i s t r y I t e r a t o r %
377 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
379 % ResetImageRegistryIterator() resets the registry iterator. Use it in
380 % conjunction with GetNextImageRegistry() to iterate over all the values
381 % in the image registry.
383 % The format of the ResetImageRegistryIterator method is:
385 % ResetImageRegistryIterator(void)
388 MagickExport void ResetImageRegistryIterator(void)
390 if (IsEventLogging() != MagickFalse)
391 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
392 if (registry == (void *) NULL)
394 ResetSplayTreeIterator(registry);
398 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
402 % S e t I m a g e R e g i s t r y %
406 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
408 % SetImageRegistry() associates a value with an image registry key.
410 % The format of the SetImageRegistry method is:
412 % MagickBooleanType SetImageRegistry(const RegistryType type,
413 % const char *key,const void *value,ExceptionInfo *exception)
415 % A description of each parameter follows:
421 % o value: the value.
423 % o exception: the exception.
427 static void *DestroyRegistryNode(void *registry_info)
429 register RegistryInfo
432 p=(RegistryInfo *) registry_info;
435 case StringRegistryType:
438 p->value=RelinquishMagickMemory(p->value);
441 case ImageRegistryType:
443 p->value=(void *) DestroyImageList((Image *) p->value);
446 case ImageInfoRegistryType:
448 p->value=(void *) DestroyImageInfo((ImageInfo *) p->value);
452 return(RelinquishMagickMemory(p));
455 MagickExport MagickBooleanType SetImageRegistry(const RegistryType type,
456 const char *key,const void *value,ExceptionInfo *exception)
467 if (IsEventLogging() != MagickFalse)
468 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",key);
469 if (value == (const void *) NULL)
471 clone_value=(void *) NULL;
474 case StringRegistryType:
480 string=(const char *) value;
481 clone_value=(void *) ConstantString(string);
484 case ImageRegistryType:
489 image=(const Image *) value;
490 if (image->signature != MagickSignature)
492 (void) ThrowMagickException(exception,GetMagickModule(),RegistryError,
493 "UnableToSetRegistry","%s",key);
496 clone_value=(void *) CloneImageList(image,exception);
499 case ImageInfoRegistryType:
504 image_info=(const ImageInfo *) value;
505 if (image_info->signature != MagickSignature)
507 (void) ThrowMagickException(exception,GetMagickModule(),RegistryError,
508 "UnableToSetRegistry","%s",key);
511 clone_value=(void *) CloneImageInfo(image_info);
515 if (clone_value == (void *) NULL)
517 registry_info=(RegistryInfo *) AcquireMagickMemory(sizeof(*registry_info));
518 if (registry_info == (RegistryInfo *) NULL)
519 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
520 (void) ResetMagickMemory(registry_info,0,sizeof(*registry_info));
521 registry_info->type=type;
522 registry_info->value=clone_value;
523 registry_info->signature=MagickSignature;
524 if (registry == (SplayTreeInfo *) NULL)
526 if (registry_semaphore == (SemaphoreInfo *) NULL)
527 ActivateSemaphoreInfo(®istry_semaphore);
528 LockSemaphoreInfo(registry_semaphore);
529 if (registry == (SplayTreeInfo *) NULL)
530 registry=NewSplayTree(CompareSplayTreeString,RelinquishMagickMemory,
531 DestroyRegistryNode);
532 UnlockSemaphoreInfo(registry_semaphore);
534 status=AddValueToSplayTree(registry,ConstantString(key),registry_info);