Rev 558 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
259 | daniel-mar | 1 | /* |
2 | This file is part of "Filter Foundry", a filter plugin for Adobe Photoshop |
||
536 | daniel-mar | 3 | Copyright (C) 2003-2009 Toby Thain, toby@telegraphics.net |
550 | daniel-mar | 4 | Copyright (C) 2018-2023 Daniel Marschall, ViaThinkSoft |
259 | daniel-mar | 5 | |
6 | This program is free software; you can redistribute it and/or modify |
||
7 | it under the terms of the GNU General Public License as published by |
||
8 | the Free Software Foundation; either version 2 of the License, or |
||
9 | (at your option) any later version. |
||
10 | |||
11 | This program is distributed in the hope that it will be useful, |
||
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
14 | GNU General Public License for more details. |
||
15 | |||
16 | You should have received a copy of the GNU General Public License |
||
17 | along with this program; if not, write to the Free Software |
||
18 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||
19 | */ |
||
20 | |||
21 | #include "ff.h" |
||
22 | |||
23 | #include <Resources.h> |
||
24 | |||
25 | #include "file_compat.h" |
||
26 | |||
552 | daniel-mar | 27 | FFLoadingResult readPARMresource(HMODULE hm){ |
28 | FFLoadingResult res = MSG_LOADFILE_UNKNOWN_FORMAT_ID; |
||
259 | daniel-mar | 29 | Handle h; |
30 | |||
440 | daniel-mar | 31 | if( (h = Get1Resource(PARM_TYPE,PARM_ID_NEW)) || |
32 | (h = Get1Resource(PARM_TYPE,PARM_ID_OLD)) ) |
||
33 | { |
||
259 | daniel-mar | 34 | HLock(h); |
271 | daniel-mar | 35 | if(GetHandleSize(h) == sizeof(PARM_T)) { |
558 | daniel-mar | 36 | res = readPARM(&gdata->parm, *h); |
440 | daniel-mar | 37 | gdata->obfusc = false; |
38 | ReleaseResource(h); |
||
39 | } else { |
||
40 | // PARM has wrong size. Should not happen |
||
41 | gdata->obfusc = false; |
||
42 | ReleaseResource(h); |
||
552 | daniel-mar | 43 | return MSG_INVALID_FILE_SIGNATURE_ID; |
440 | daniel-mar | 44 | } |
45 | } |
||
46 | else if( ((h = Get1Resource(OBFUSCDATA_TYPE_NEW,OBFUSCDATA_ID_NEW)) || |
||
47 | (h = Get1Resource(OBFUSCDATA_TYPE_OLD,OBFUSCDATA_ID_OLD))) ) |
||
48 | { |
||
49 | HLock(h); |
||
50 | if(GetHandleSize(h) == sizeof(PARM_T)) { |
||
271 | daniel-mar | 51 | deobfusc((PARM_T*)*h); |
558 | daniel-mar | 52 | res = readPARM(&gdata->parm, *h); |
271 | daniel-mar | 53 | gdata->obfusc = true; |
440 | daniel-mar | 54 | ReleaseResource(h); |
271 | daniel-mar | 55 | } else { |
56 | // Obfuscated PARM has wrong size. Should not happen |
||
57 | gdata->obfusc = false; |
||
58 | ReleaseResource(h); |
||
552 | daniel-mar | 59 | return MSG_INCOMPATIBLE_OBFUSCATION_ID; |
271 | daniel-mar | 60 | } |
259 | daniel-mar | 61 | } |
559 | daniel-mar | 62 | if (res != LOADING_OK) { |
259 | daniel-mar | 63 | gdata->obfusc = false; |
64 | } |
||
65 | return res; |
||
66 | } |
||
67 | |||
552 | daniel-mar | 68 | FFLoadingResult Boolean readmacplugin(StandardFileReply *sfr){ |
69 | FFLoadingResult res = MSG_LOADFILE_UNKNOWN_FORMAT_ID; |
||
259 | daniel-mar | 70 | short rrn = FSpOpenResFile(&sfr->sfFile,fsRdPerm); |
71 | |||
72 | if(rrn != -1){ |
||
552 | daniel-mar | 73 | res = readPARMresource(NULL); |
259 | daniel-mar | 74 | CloseResFile(rrn); |
552 | daniel-mar | 75 | } |
76 | else |
||
77 | res = MSG_CANNOT_OPEN_FILE_ID; |
||
259 | daniel-mar | 78 | return res; |
79 | } |
||
80 | |||
552 | daniel-mar | 81 | FFLoadingResult loadfile(StandardFileReply *sfr){ |
259 | daniel-mar | 82 | Boolean readok = false; |
83 | FInfo fndrInfo; |
||
552 | daniel-mar | 84 | FFLoadingResult res = MSG_LOADFILE_UNKNOWN_FORMAT_ID; |
259 | daniel-mar | 85 | |
86 | if(FSpGetFInfo(&sfr->sfFile,&fndrInfo) == noErr){ |
||
87 | // first try to read text parameters (AFS, TXT, PFF) |
||
552 | daniel-mar | 88 | if (res == MSG_LOADFILE_UNKNOWN_FORMAT_ID) { |
558 | daniel-mar | 89 | if (LOADING_OK == (res = readfile_afs_pff(sfr))) { |
550 | daniel-mar | 90 | parm_reset(true, false, true, false); |
408 | daniel-mar | 91 | gdata->obfusc = false; |
558 | daniel-mar | 92 | return LOADING_OK; |
408 | daniel-mar | 93 | } |
554 | daniel-mar | 94 | if (res == MSG_INVALID_FILE_SIGNATURE_ID) res = MSG_LOADFILE_UNKNOWN_FORMAT_ID; |
408 | daniel-mar | 95 | } |
440 | daniel-mar | 96 | |
544 | daniel-mar | 97 | // Try to read the file as FFL file |
552 | daniel-mar | 98 | if (res == MSG_LOADFILE_UNKNOWN_FORMAT_ID) { |
558 | daniel-mar | 99 | if (LOADING_OK == (res = (readfile_ffl(sfr)))) { |
550 | daniel-mar | 100 | parm_reset(true, true, true, true); |
544 | daniel-mar | 101 | gdata->obfusc = false; |
558 | daniel-mar | 102 | return LOADING_OK; |
544 | daniel-mar | 103 | } |
554 | daniel-mar | 104 | if (res == MSG_INVALID_FILE_SIGNATURE_ID) res = MSG_LOADFILE_UNKNOWN_FORMAT_ID; |
544 | daniel-mar | 105 | } |
106 | |||
408 | daniel-mar | 107 | // then try "Filters Unlimited" file (FFX) |
552 | daniel-mar | 108 | if (res == MSG_LOADFILE_UNKNOWN_FORMAT_ID) { |
558 | daniel-mar | 109 | if (LOADING_OK == (res = (readfile_ffx(sfr)))) { |
408 | daniel-mar | 110 | gdata->obfusc = false; |
558 | daniel-mar | 111 | return LOADING_OK; |
408 | daniel-mar | 112 | } |
554 | daniel-mar | 113 | if (res == MSG_INVALID_FILE_SIGNATURE_ID) res = MSG_LOADFILE_UNKNOWN_FORMAT_ID; |
408 | daniel-mar | 114 | } |
440 | daniel-mar | 115 | |
408 | daniel-mar | 116 | // then try "PluginCommander TXT" file (TXT) |
552 | daniel-mar | 117 | if (res == MSG_LOADFILE_UNKNOWN_FORMAT_ID) { |
558 | daniel-mar | 118 | if (LOADING_OK == (res = (readfile_picotxt(sfr)))) { |
408 | daniel-mar | 119 | gdata->obfusc = false; |
558 | daniel-mar | 120 | return LOADING_OK; |
408 | daniel-mar | 121 | } |
122 | } |
||
440 | daniel-mar | 123 | |
544 | daniel-mar | 124 | // Is it a "GIMP UserFilter (GUF)" file? (Only partially compatible with Filter Factory!!!) |
552 | daniel-mar | 125 | if (res == MSG_LOADFILE_UNKNOWN_FORMAT_ID) { |
558 | daniel-mar | 126 | if (LOADING_OK == (res = (readfile_guf(sfr)))) { |
127 | return LOADING_OK; |
||
544 | daniel-mar | 128 | } |
129 | } |
||
130 | |||
408 | daniel-mar | 131 | // Try Mac plugin resource |
552 | daniel-mar | 132 | if (res == MSG_LOADFILE_UNKNOWN_FORMAT_ID) { |
558 | daniel-mar | 133 | if (LOADING_OK == (res = (readmacplugin(sfr)))) { |
408 | daniel-mar | 134 | if (gdata->parm.iProtected) { |
550 | daniel-mar | 135 | parm_reset(true, true, true, true); |
552 | daniel-mar | 136 | res = MSG_FILTER_PROTECTED_ID; |
408 | daniel-mar | 137 | } else { |
558 | daniel-mar | 138 | return LOADING_OK; |
408 | daniel-mar | 139 | } |
140 | } |
||
141 | } |
||
440 | daniel-mar | 142 | |
408 | daniel-mar | 143 | // Try Windows resources (we need to do a binary scan) |
144 | // Note that we cannot detect obfuscated filters here! |
||
552 | daniel-mar | 145 | if (res == MSG_LOADFILE_UNKNOWN_FORMAT_ID) { |
558 | daniel-mar | 146 | if (LOADING_OK == (res = (readfile_8bf(sfr)))) { |
408 | daniel-mar | 147 | if (gdata->parm.iProtected) { |
550 | daniel-mar | 148 | parm_reset(true, true, true, true); |
552 | daniel-mar | 149 | res = MSG_FILTER_PROTECTED_ID; |
408 | daniel-mar | 150 | } else { |
558 | daniel-mar | 151 | return LOADING_OK; |
408 | daniel-mar | 152 | } |
153 | } |
||
154 | } |
||
375 | daniel-mar | 155 | |
552 | daniel-mar | 156 | return res; |
408 | daniel-mar | 157 | } else { |
552 | daniel-mar | 158 | return MSG_CANNOT_OPEN_FILE_ID; |
259 | daniel-mar | 159 | } |
160 | } |