| /* |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| % % |
| % % |
| % % |
| % SSSSS TTTTT AAA TTTTT IIIII CCCC % |
| % SS T A A T I C % |
| % SSS T AAAAA T I C % |
| % SS T A A T I C % |
| % SSSSS T A A T IIIII CCCC % |
| % % |
| % % |
| % MagickCore Static Methods % |
| % % |
| % Software Design % |
| % Cristy % |
| % March 2000 % |
| % % |
| % % |
| % Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % |
| % dedicated to making software imaging solutions freely available. % |
| % % |
| % You may not use this file except in compliance with the License. You may % |
| % obtain a copy of the License at % |
| % % |
| % https://imagemagick.org/script/license.php % |
| % % |
| % Unless required by applicable law or agreed to in writing, software % |
| % distributed under the License is distributed on an "AS IS" BASIS, % |
| % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % |
| % See the License for the specific language governing permissions and % |
| % limitations under the License. % |
| % % |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| % |
| % |
| % |
| */ |
| |
| /* |
| Include declarations. |
| */ |
| #include "MagickCore/studio.h" |
| #include "MagickCore/coder.h" |
| #include "MagickCore/exception-private.h" |
| #include "MagickCore/image.h" |
| #include "MagickCore/module.h" |
| #include "MagickCore/policy.h" |
| #include "MagickCore/static.h" |
| #include "MagickCore/string_.h" |
| #include "coders/coders.h" |
| |
| /* |
| Define declarations. |
| */ |
| #define AddMagickCoder(coder) { #coder, MagickFalse, \ |
| Register ## coder ## Image, Unregister ## coder ## Image }, |
| |
| /* |
| ImageMagick module stub. |
| */ |
| ModuleExport size_t RegisterUndefinedImage(void) |
| { |
| return(MagickImageCoderSignature); |
| } |
| |
| ModuleExport void UnregisterUndefinedImage(void) |
| { |
| } |
| |
| /* |
| ImageMagick modules. |
| */ |
| static struct |
| { |
| const char |
| *module; |
| |
| MagickBooleanType |
| registered; |
| |
| size_t |
| (*register_module)(void); |
| |
| void |
| (*unregister_module)(void); |
| } MagickModules[] = { |
| #if !defined(MAGICKCORE_BUILD_MODULES) |
| #include "coders/coders-list.h" |
| #endif |
| { (const char *) NULL, MagickFalse, RegisterUndefinedImage, UnregisterUndefinedImage } |
| }; |
| |
| /* |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| % % |
| % % |
| % % |
| % I n v o k e S t a t i c I m a g e F i l t e r % |
| % % |
| % % |
| % % |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| % |
| % InvokeStaticImageFilter() invokes a static image filter. |
| % |
| % The format of the InvokeStaticImageFilter method is: |
| % |
| % MagickBooleanType InvokeStaticImageFilter(const char *tag,Image **image, |
| % const int argc,const char **argv) |
| % |
| % A description of each parameter follows: |
| % |
| % o tag: the module tag. |
| % |
| % o image: the image. |
| % |
| % o argc: the number of elements in the argument vector. |
| % |
| % o argv: A text array containing the command line arguments. |
| % |
| % o argv: A text array containing the command line arguments. |
| % |
| % o exception: return any errors or warnings in this structure. |
| % |
| */ |
| #if defined(MAGICKCORE_MODULES_SUPPORT) |
| MagickExport MagickBooleanType InvokeStaticImageFilter(const char *tag, |
| Image **image,const int argc,const char **argv,ExceptionInfo *exception) |
| { |
| PolicyRights |
| rights; |
| |
| assert(image != (Image **) NULL); |
| assert((*image)->signature == MagickCoreSignature); |
| if ((*image)->debug != MagickFalse) |
| (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",(*image)->filename); |
| rights=ReadPolicyRights; |
| if (IsRightsAuthorized(FilterPolicyDomain,rights,tag) == MagickFalse) |
| { |
| errno=EPERM; |
| (void) ThrowMagickException(exception,GetMagickModule(),PolicyError, |
| "NotAuthorized","`%s'",tag); |
| return(MagickFalse); |
| } |
| #if defined(MAGICKCORE_MODULES_SUPPORT) |
| (void) tag; |
| (void) argc; |
| (void) argv; |
| (void) exception; |
| #else |
| { |
| extern size_t |
| analyzeImage(Image **,const int,char **,ExceptionInfo *); |
| |
| ImageFilterHandler |
| *image_filter; |
| |
| image_filter=(ImageFilterHandler *) NULL; |
| if (LocaleCompare("analyze",tag) == 0) |
| image_filter=(ImageFilterHandler *) analyzeImage; |
| if (image_filter == (ImageFilterHandler *) NULL) |
| (void) ThrowMagickException(exception,GetMagickModule(),ModuleError, |
| "UnableToLoadModule","`%s'",tag); |
| else |
| { |
| size_t |
| signature; |
| |
| if ((*image)->debug != MagickFalse) |
| (void) LogMagickEvent(CoderEvent,GetMagickModule(), |
| "Invoking \"%s\" static image filter",tag); |
| signature=image_filter(image,argc,argv,exception); |
| if ((*image)->debug != MagickFalse) |
| (void) LogMagickEvent(CoderEvent,GetMagickModule(),"\"%s\" completes", |
| tag); |
| if (signature != MagickImageFilterSignature) |
| { |
| (void) ThrowMagickException(exception,GetMagickModule(),ModuleError, |
| "ImageFilterSignatureMismatch","'%s': %8lx != %8lx",tag, |
| (unsigned long) signature,(unsigned long) |
| MagickImageFilterSignature); |
| return(MagickFalse); |
| } |
| } |
| } |
| #endif |
| return(MagickTrue); |
| } |
| #endif |
| |
| /* |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| % % |
| % % |
| % % |
| % R e g i s t e r S t a t i c M o d u l e % |
| % % |
| % % |
| % % |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| % |
| % RegisterStaticModule() statically registers a module. |
| % |
| % The format of the RegisterStaticModule method is: |
| % |
| % MagickBooleanType RegisterStaticModule(const char module, |
| % ExceptionInfo *exception) |
| % |
| % A description of each parameter follows: |
| % |
| % o module: the want to register. |
| % |
| % o exception: return any errors or warnings in this structure. |
| % |
| */ |
| MagickExport MagickBooleanType RegisterStaticModule(const char *module, |
| ExceptionInfo *exception) |
| { |
| char |
| module_name[MagickPathExtent]; |
| |
| PolicyRights |
| rights; |
| |
| const CoderInfo |
| *p; |
| |
| size_t |
| extent; |
| |
| ssize_t |
| i; |
| |
| /* |
| Assign module name from alias. |
| */ |
| assert(module != (const char *) NULL); |
| rights=ReadPolicyRights; |
| if (IsRightsAuthorized(ModulePolicyDomain,rights,module) == MagickFalse) |
| { |
| errno=EPERM; |
| (void) ThrowMagickException(exception,GetMagickModule(),PolicyError, |
| "NotAuthorized","`%s'",module); |
| return(MagickFalse); |
| } |
| (void) CopyMagickString(module_name,module,MagickPathExtent); |
| p=GetCoderInfo(module,exception); |
| if (p != (CoderInfo *) NULL) |
| (void) CopyMagickString(module_name,p->name,MagickPathExtent); |
| extent=sizeof(MagickModules)/sizeof(MagickModules[0]); |
| for (i=0; i < (ssize_t) extent; i++) |
| if (LocaleCompare(MagickModules[i].module,module_name) == 0) |
| { |
| if (MagickModules[i].registered == MagickFalse) |
| { |
| (void) (MagickModules[i].register_module)(); |
| MagickModules[i].registered=MagickTrue; |
| } |
| return(MagickTrue); |
| } |
| return(MagickFalse); |
| } |
| |
| /* |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| % % |
| % % |
| % % |
| % R e g i s t e r S t a t i c M o d u l e s % |
| % % |
| % % |
| % % |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| % |
| % RegisterStaticModules() statically registers all the available module |
| % handlers. |
| % |
| % The format of the RegisterStaticModules method is: |
| % |
| % (void) RegisterStaticModules(void) |
| % |
| */ |
| MagickExport void RegisterStaticModules(void) |
| { |
| size_t |
| extent; |
| |
| ssize_t |
| i; |
| |
| extent=sizeof(MagickModules)/sizeof(MagickModules[0]); |
| for (i=0; i < (ssize_t) extent; i++) |
| { |
| if (MagickModules[i].registered == MagickFalse) |
| { |
| (void) (MagickModules[i].register_module)(); |
| MagickModules[i].registered=MagickTrue; |
| } |
| } |
| } |
| |
| /* |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| % % |
| % % |
| % % |
| % U n r e g i s t e r S t a t i c M o d u l e % |
| % % |
| % % |
| % % |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| % |
| % UnregisterStaticModule() statically unregisters the named module. |
| % |
| % The format of the UnregisterStaticModule method is: |
| % |
| % MagickBooleanType UnregisterStaticModule(const char *module) |
| % |
| % A description of each parameter follows: |
| % |
| % o module: the module we want to unregister. |
| % |
| */ |
| MagickExport MagickBooleanType UnregisterStaticModule(const char *module) |
| { |
| size_t |
| extent; |
| |
| ssize_t |
| i; |
| |
| extent=sizeof(MagickModules)/sizeof(MagickModules[0]); |
| for (i=0; i < (ssize_t) extent; i++) |
| if (LocaleCompare(MagickModules[i].module,module) == 0) |
| { |
| if (MagickModules[i].registered != MagickFalse) |
| { |
| (MagickModules[i].unregister_module)(); |
| MagickModules[i].registered=MagickFalse; |
| } |
| return(MagickTrue); |
| } |
| return(MagickFalse); |
| } |
| |
| /* |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| % % |
| % % |
| % % |
| % U n r e g i s t e r S t a t i c M o d u l e s % |
| % % |
| % % |
| % % |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| % |
| % UnregisterStaticModules() statically unregisters all the available module |
| % handlers. |
| % |
| % The format of the UnregisterStaticModules method is: |
| % |
| % UnregisterStaticModules(void) |
| % |
| */ |
| MagickExport void UnregisterStaticModules(void) |
| { |
| size_t |
| extent; |
| |
| ssize_t |
| i; |
| |
| extent=sizeof(MagickModules)/sizeof(MagickModules[0]); |
| for (i=0; i < (ssize_t) extent; i++) |
| { |
| if (MagickModules[i].registered != MagickFalse) |
| { |
| (MagickModules[i].unregister_module)(); |
| MagickModules[i].registered=MagickFalse; |
| } |
| } |
| } |