Subversion Repositories filter_foundry

Rev

Rev 18 | Rev 35 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /*
  2.     This file is part of "Filter Foundry", a filter plugin for Adobe Photoshop
  3.     Copyright (C) 2003-5 Toby Thain, toby@telegraphics.com.au
  4.  
  5.     This program is free software; you can redistribute it and/or modify
  6.     it under the terms of the GNU General Public License as published by  
  7.     the Free Software Foundation; either version 2 of the License, or
  8.     (at your option) any later version.
  9.  
  10.     This program is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.     GNU General Public License for more details.
  14.  
  15.     You should have received a copy of the GNU General Public License  
  16.     along with this program; if not, write to the Free Software
  17.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18. */
  19.  
  20. #include "ff.h"
  21.  
  22. #include "file_compat.h"
  23. #include "compat_string.h"
  24.  
  25. //#include "UpdateResource.h"
  26.  
  27. extern HANDLE hDllInstance;
  28.  
  29. Boolean doresources(HMODULE srcmod,char *dstname);
  30.  
  31. void dbglasterror(char *func){
  32.         char s[0x100];
  33.         strcpy(s,func);
  34.         strcat(s," failed: ");
  35.         FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM,NULL,GetLastError(),0,s+strlen(s),0x100,NULL );
  36.         DBG(s);
  37. }
  38.  
  39. /*
  40. BOOL CALLBACK enumfunc(HMODULE hModule,LPCTSTR lpszType,LPCTSTR lpszName,WORD wIDLanguage,LONG lParam){
  41.         char s[0x100];
  42.         sprintf(s,"EnumResourceLanguages callback: module=%#x type=%s name=%s lang=%d",
  43.                 hModule,lpszType,lpszName,wIDLanguage);
  44.         dbg(s);
  45.         return TRUE;
  46. }
  47. */
  48.  
  49. Boolean doresources(HMODULE srcmod,char *dstname){
  50.         int i;
  51.  
  52.         HRSRC datarsrc,aetersrc;
  53.         HANDLE datah,aeteh,hupdate;
  54.         Ptr newpipl = NULL,newaete = NULL,datap,aetep;
  55.         PARM_T *pparm = NULL;
  56.  
  57.         long piplsize,aetesize,origsize;
  58.         Str255 title;
  59.         //char s[0x100];
  60.        
  61.         Boolean discard = true;
  62.  
  63. //      if(!EnumResourceLanguages(srcmod,"PiPL",MAKEINTRESOURCE(16000),enumfunc,0))
  64. //              dbglasterror("EnumResourceLanguages");
  65.  
  66.         if( (hupdate = BeginUpdateResource(dstname,false)) ){
  67.                 DBG("BeginUpdateResource OK");
  68.                 if( (datarsrc = FindResource(srcmod,MAKEINTRESOURCE(16000),RT_RCDATA))
  69.                         && (datah = LoadResource(srcmod,datarsrc))
  70.                         && (datap = LockResource(datah))
  71.                         && (aetersrc = FindResource(srcmod,MAKEINTRESOURCE(16000),"AETE"))
  72.                         && (aeteh = LoadResource(srcmod,aetersrc))
  73.                         && (aetep = LockResource(aeteh))
  74.                 ){
  75.                         DBG("loaded DATA, PiPL");
  76.  
  77.                         PLstrcpy(title,gdata->parm.title);
  78.                         if(gdata->parm.popDialog)
  79.                                 PLstrcat(title,(StringPtr)"\003...");
  80.  
  81.                         origsize = SizeofResource(srcmod,datarsrc);
  82.                         aetesize = SizeofResource(srcmod,aetersrc);
  83.  
  84.                         if( (newpipl = malloc(origsize+0x300))
  85.                          && (newaete = malloc(aetesize+0x100))
  86.                          && (pparm = malloc(sizeof(PARM_T))) ){
  87.  
  88.                                 /* add user-specified title and category to new PiPL */
  89.                                 memcpy(newpipl,datap,origsize);
  90.                                 /* note that Windows PiPLs have 2 byte version datum in front
  91.                                    that isn't reflected in struct definition or Mac resource template: */
  92.  
  93.                                 piplsize = fixpipl((PIPropertyList*)(newpipl+2),origsize-2,title) + 2;
  94. //sprintf(s,"origsize=%d titlesize=%d catsize=%d piplsize=%d",origsize,titlesize,catsize,piplsize);dbg(s);
  95.  
  96.                                 /* copy old aete data to new block */
  97.                                 /* Windows 'aete' also has 2 byte version prefix */
  98.                                 memcpy(newaete,aetep,aetesize);
  99.  
  100.                                 aetesize = fixaete((unsigned char*)newaete+2,aetesize-2,gdata->parm.title) + 2;
  101.  
  102.                                 /* set up the PARM resource with saved parameters */
  103.                                 memcpy(pparm,&gdata->parm,sizeof(PARM_T));
  104.  
  105.                                 /* convert to C strings for Windows PARM resource */
  106.                                 myp2cstr(pparm->category);
  107.                                 myp2cstr(pparm->title);
  108.                                 myp2cstr(pparm->copyright);
  109.                                 myp2cstr(pparm->author);
  110.                                 for(i=0;i<4;++i)
  111.                                         myp2cstr(pparm->map[i]);
  112.                                 for(i=0;i<8;++i)
  113.                                         myp2cstr(pparm->ctl[i]);
  114.  
  115.                                 if( UpdateResource(hupdate,"PIPL" /* note: caps!! */,MAKEINTRESOURCE(16000),
  116.                                                                    MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL),newpipl,piplsize)
  117.                                  && UpdateResource(hupdate,"AETE" /* note: caps!! */,MAKEINTRESOURCE(16000),
  118.                                                                    MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL),newaete,aetesize)
  119.                                  && UpdateResource(hupdate,"PARM",MAKEINTRESOURCE(PARM_ID),
  120.                                                                    MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL),pparm,sizeof(PARM_T)) )
  121.                                         discard = false;
  122.                                 else
  123.                                         dbglasterror("UpdateResource");
  124.                                
  125.                         }
  126.  
  127.                 }else dbglasterror("Find-, Load- or LockResource");
  128.  
  129.                 if(!EndUpdateResource(hupdate,discard))
  130.                         dbglasterror("EndUpdateResource");     
  131.  
  132.                 if(pparm) free(pparm);
  133.                 if(newpipl) free(newpipl);
  134.                 if(newaete) free(newaete);
  135.         }else
  136.                 dbglasterror("BeginUpdateResource");
  137.         return !discard;
  138. }
  139.  
  140. OSErr make_standalone(StandardFileReply *sfr){
  141.         Boolean res;
  142.         char dstname[0x100],srcname[MAX_PATH+1];
  143.  
  144.         //FSpDelete(&sfr->sfFile);
  145.         myp2cstrcpy(dstname,sfr->sfFile.name);
  146.         res = GetModuleFileName(hDllInstance,srcname,MAX_PATH)
  147.                 && CopyFile(srcname,dstname,false)
  148.                 && doresources(hDllInstance,dstname);
  149.  
  150.         if(!res)
  151.                 alertuser("Could not create standalone plugin.","");
  152.  
  153.         return res ? ioErr : noErr;
  154. }
  155.