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-2009 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 "magick/studio.h"
44 #include "magick/exception.h"
45 #include "magick/exception-private.h"
46 #include "magick/image.h"
47 #include "magick/list.h"
48 #include "magick/memory_.h"
49 #include "magick/registry.h"
50 #include "magick/splay-tree.h"
51 #include "magick/string_.h"
52 #include "magick/utility.h"
57 typedef struct _RegistryInfo
73 *registry = (SplayTreeInfo *) NULL;
76 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
80 % D e f i n e I m a g e R e g i s t r y %
84 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
86 % DefineImageRegistry() associates a key/value pair with the image registry.
88 % The format of the DefineImageRegistry method is:
90 % MagickBooleanType DefineImageRegistry(const RegistryType type,
91 % const char *option,ExceptionInfo *exception)
93 % A description of each parameter follows:
97 % o option: the option.
99 % o exception: the exception.
102 MagickExport MagickBooleanType DefineImageRegistry(const RegistryType type,
103 const char *option,ExceptionInfo *exception)
107 value[MaxTextExtent];
112 assert(option != (const char *) NULL);
113 (void) CopyMagickString(key,option,MaxTextExtent);
114 for (p=key; *p != '\0'; p++)
119 (void) CopyMagickString(value,p+1,MaxTextExtent);
121 return(SetImageRegistry(type,key,value,exception));
125 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
129 % D e l e t e I m a g e R e g i s t r y %
133 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
135 % DeleteImageRegistry() deletes a key from the image registry.
137 % The format of the DeleteImageRegistry method is:
139 % MagickBooleanType DeleteImageRegistry(const char *key)
141 % A description of each parameter follows:
143 % o key: the registry.
146 MagickExport MagickBooleanType DeleteImageRegistry(const char *key)
148 if (IsEventLogging() != MagickFalse)
149 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",key);
150 if (registry == (void *) NULL)
152 return(DeleteNodeFromSplayTree(registry,key));
156 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
160 % D e s t r o y I m a g e R e g i s t r y %
164 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
166 % DestroyImageRegistry() releases memory associated with the image registry.
168 % The format of the DestroyDefines method is:
170 % void DestroyImageRegistry(void)
173 MagickExport void DestroyImageRegistry(void)
175 if (IsEventLogging() != MagickFalse)
176 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
177 if (registry != (void *) NULL)
178 registry=DestroySplayTree(registry);
182 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
186 % G e t I m a g e R e g i s t r y %
190 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
192 % GetImageRegistry() returns a value associated with an image registry key.
194 % The format of the GetImageRegistry method is:
196 % void *GetImageRegistry(const RegistryType type,const char *key,
197 % ExceptionInfo *exception)
199 % A description of each parameter follows:
205 % o exception: the exception.
208 MagickExport void *GetImageRegistry(const RegistryType type,const char *key,
209 ExceptionInfo *exception)
217 if (IsEventLogging() != MagickFalse)
218 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",key);
219 if (registry == (void *) NULL)
220 return((void *) NULL);
221 registry_info=(RegistryInfo *) GetValueFromSplayTree(registry,key);
222 if (registry_info == (void *) NULL)
224 (void) ThrowMagickException(exception,GetMagickModule(),RegistryError,
225 "UnableToGetRegistryID","`%s'",key);
226 return((void *) NULL);
231 case ImageRegistryType:
233 if (type == registry_info->type)
234 value=(void *) CloneImageList((Image *) registry_info->value,exception);
237 case ImageInfoRegistryType:
239 if (type == registry_info->type)
240 value=(void *) CloneImageInfo((ImageInfo *) registry_info->value);
243 case StringRegistryType:
245 switch (registry_info->type)
247 case ImageRegistryType:
249 value=(Image *) ConstantString(((Image *)
250 registry_info->value)->filename);
253 case ImageInfoRegistryType:
255 value=(Image *) ConstantString(((ImageInfo *)
256 registry_info->value)->filename);
259 case StringRegistryType:
261 value=(void *) ConstantString((char *) registry_info->value);
276 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
280 % G e t N e x t I m a g e R e g i s t r y %
284 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
286 % GetNextImageRegistry() gets the next image registry value.
288 % The format of the GetNextImageRegistry method is:
290 % char *GetNextImageRegistry(void)
293 MagickExport char *GetNextImageRegistry(void)
295 if (IsEventLogging() != MagickFalse)
296 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
297 if (registry == (void *) NULL)
298 return((char *) NULL);
299 return((char *) GetNextKeyInSplayTree(registry));
303 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
307 % R e m o v e I m a g e R e g i s t r y %
311 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
313 % RemoveImageRegistry() removes a key from the image registry and returns its
316 % The format of the RemoveImageRegistry method is:
318 % void *RemoveImageRegistry(const char *key)
320 % A description of each parameter follows:
322 % o key: the registry.
325 MagickExport void *RemoveImageRegistry(const char *key)
327 if (IsEventLogging() != MagickFalse)
328 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",key);
329 if (registry == (void *) NULL)
330 return((void *) NULL);
331 return(RemoveNodeFromSplayTree(registry,key));
335 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
339 % 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 %
343 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
345 % ResetImageRegistryIterator() resets the registry iterator. Use it in
346 % conjunction with GetNextImageRegistry() to iterate over all the values
347 % in the image registry.
349 % The format of the ResetImageRegistryIterator method is:
351 % ResetImageRegistryIterator(void)
354 MagickExport void ResetImageRegistryIterator(void)
356 if (IsEventLogging() != MagickFalse)
357 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
358 if (registry == (void *) NULL)
360 ResetSplayTreeIterator(registry);
364 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
368 % S e t I m a g e R e g i s t r y %
372 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
374 % SetImageRegistry() associates a value with an image registry key.
376 % The format of the SetImageRegistry method is:
378 % MagickBooleanType SetImageRegistry(const RegistryType type,
379 % const char *key,const void *value,ExceptionInfo *exception)
381 % A description of each parameter follows:
387 % o value: the value.
389 % o exception: the exception.
393 static void *DestroyRegistryNode(void *registry_info)
395 register RegistryInfo
398 p=(RegistryInfo *) registry_info;
401 case StringRegistryType:
404 p->value=RelinquishMagickMemory(p->value);
407 case ImageRegistryType:
409 p->value=(void *) DestroyImageList((Image *) p->value);
412 case ImageInfoRegistryType:
414 p->value=(void *) DestroyImageInfo((ImageInfo *) p->value);
418 return(RelinquishMagickMemory(p));
421 MagickExport MagickBooleanType SetImageRegistry(const RegistryType type,
422 const char *key,const void *value,ExceptionInfo *exception)
433 if (IsEventLogging() != MagickFalse)
434 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",key);
435 clone_value=(void *) NULL;
438 case StringRegistryType:
444 string=(const char *) value;
445 clone_value=(void *) ConstantString(string);
448 case ImageRegistryType:
453 image=(const Image *) value;
454 if (image->signature != MagickSignature)
456 (void) ThrowMagickException(exception,GetMagickModule(),RegistryError,
457 "UnableToSetRegistry","%s",key);
460 clone_value=(void *) CloneImageList(image,exception);
463 case ImageInfoRegistryType:
468 image_info=(const ImageInfo *) value;
469 if (image_info->signature != MagickSignature)
471 (void) ThrowMagickException(exception,GetMagickModule(),RegistryError,
472 "UnableToSetRegistry","%s",key);
475 clone_value=(void *) CloneImageInfo(image_info);
479 if (clone_value == (void *) NULL)
481 registry_info=(RegistryInfo *) AcquireMagickMemory(sizeof(*registry_info));
482 if (registry_info == (RegistryInfo *) NULL)
483 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
484 (void) ResetMagickMemory(registry_info,0,sizeof(*registry_info));
485 registry_info->type=type;
486 registry_info->value=clone_value;
487 registry_info->signature=MagickSignature;
488 if (registry == (void *) NULL)
489 registry=NewSplayTree(CompareSplayTreeString,RelinquishMagickMemory,
490 DestroyRegistryNode);
491 status=AddValueToSplayTree(registry,ConstantString(key),registry_info);