source: trunk/dll/shadow.c@ 1803

Last change on this file since 1803 was 1803, checked in by Gregg Young, 10 years ago

Changes to allow a JAVA executable object to be created using "Real object" menu item on a jar file. (Ticket [37]) Eliminate redundant prompts and error messages when telling FM/2 not to delete a R/O file. (Ticket [548]) Limit attempts to unlock files to exes and dlls. (Ticket [549])

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.7 KB
Line 
1
2/***********************************************************************
3
4 $Id: shadow.c 1803 2015-05-02 21:56:39Z gyoung $
5
6 Desktop shadows
7
8 Copyright (c) 1993-97 M. Kimes
9 Copyright (c) 2006, 2010 Steven H. Levine
10
11 22 Jul 06 SHL Check more run time errors
12 16 Jun 07 SHL Update for OpenWatcom
13 06 Aug 07 SHL Use BldFullPathName
14 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
15 08 Mar 09 GKY Additional strings move to PCSZs declare change
16 12 Jul 09 GKY Add xDosQueryAppType and xDosAlloc... to allow FM/2 to load in high memory
17 17 JAN 10 GKY Changes to get working with Watcom 1.9 Beta (1/16/10). Mostly cast CHAR CONSTANT * as CHAR *.
18 28 Jun 14 GKY Fix errors identified with CPPCheck;
19 02 May 15 GKY Changes to allow a JAVA executable object to be created using "Real object"
20 menu item on a jar file.
21
22***********************************************************************/
23
24#include <stdlib.h>
25#include <string.h>
26
27#define INCL_DOS
28#define INCL_WIN
29#define INCL_LONGLONG
30
31#include "fm3dll.h"
32#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
33#include "filldir.h" // Data declaration(s)
34#include "mainwnd.h" // Data declaration(s)
35#include "fm3dlg.h"
36#include "fm3str.h"
37#include "pathutil.h" // BldFullPathName
38#include "errutil.h" // Dos_Error...
39#include "strutil.h" // GetPString
40#include "shadow.h"
41#include "input.h" // InputDlgProc
42#include "defview.h" // Data declaration(s)
43#include "valid.h" // IsFile
44#include "wrappers.h" // xmalloc
45#include "fortify.h"
46#include "init.h" // Data declaration(s)
47#include "notebook.h" // Data declaration(s)
48#include "getnames.h" // insert_filename
49#include "srchpath.h" // SearchMultiplePathsForFile
50
51#pragma data_seg(DATA1)
52
53static PSZ pszSrcFile = __FILE__;
54
55static HOBJECT CreateDataObject(CHAR * objtitle, CHAR * location, CHAR * path,
56 CHAR * cnr);
57static HOBJECT CreateFolderObject(CHAR * objtitle, CHAR * cnr);
58
59static HOBJECT CreateProgramObject(CHAR * objtitle, CHAR * location, CHAR * path,
60 CHAR * cnr);
61static HOBJECT CreateJAVAProgramObject(CHAR * objtitle, CHAR * location, CHAR * path,
62 CHAR * cnr);
63static HOBJECT CreateShadowObject(CHAR * objtitle, CHAR * location, CHAR * path,
64 BOOL executable, CHAR * cnr);
65
66HOBJECT CreateProgramObject(CHAR * objtitle, CHAR * location, CHAR * path,
67 CHAR * cnr)
68{
69 HOBJECT obj = (HOBJECT) 0;
70 CHAR *s;
71 CHAR objecttmp[CCHMAXPATH];
72
73 if (!cnr)
74 return obj;
75 strcpy(objecttmp, objtitle);
76 s = strchr(objecttmp, '.');
77 if (s)
78 *s = 0;
79 obj = WinCreateObject((CHAR *) WPProgram,
80 objecttmp,
81 "NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO",
82 (location) ? location : cnr, CO_FAILIFEXISTS);
83 if (obj) {
84 s = xmalloc(5192, pszSrcFile, __LINE__);
85 if (s) {
86 sprintf(s,
87 "EXENAME=%s%s%s%s%s;PARAMETERS=%%*;OBJECTID=<FM2_%s>",
88 (path) ? path : NullStr,
89 (path) ? PCSZ_BACKSLASH : NullStr,
90 objtitle,
91 (path) ? ";STARTUPDIR=" : NullStr, (path) ? path : NullStr, objtitle);
92 WinSetObjectData(obj, s);
93 free(s);
94 }
95 }
96 return obj;
97}
98
99HOBJECT CreateJAVAProgramObject(CHAR * objtitle, CHAR * location, CHAR * path,
100 CHAR * cnr)
101{
102 HOBJECT obj = (HOBJECT) 0;
103 CHAR *s;
104 CHAR objecttmp[CCHMAXPATH];
105 CHAR javaexe[CCHMAXPATH] = {0};
106 CHAR icon[CCHMAXPATH] = {0};
107 //PSZ env = 0;
108 //FILESTATUS3 fsa;
109
110 if (!cnr)
111 return obj;
112 if (!PrfQueryProfileString(fmprof, appname, "JavaExe", NULL, javaexe, CCHMAXPATH - 1)) {
113 strcpy(javaexe, PCSZ_STARDOTEXE);
114 if (insert_filename(HWND_DESKTOP, javaexe, TRUE, FALSE) &&
115 *javaexe && !strchr(javaexe, '*') && !strchr(javaexe, '?'))
116 PrfWriteProfileString(fmprof, appname, "JavaExe", javaexe);
117 else
118 return obj;
119 }
120 strcpy(objecttmp, objtitle);
121 s = strchr(objecttmp, '.');
122 if (s)
123 *s = 0;
124 strcpy(icon, path);
125 strcat(icon, "\\*.ico");
126 insert_filename(HWND_DESKTOP, icon, TRUE, FALSE);
127 obj = WinCreateObject((CHAR *) WPProgram,
128 objecttmp,
129 "NOPRINT=YES;DEFAULTVIEW=RUNNING",
130 (location) ? location : cnr, CO_FAILIFEXISTS);
131 if (obj) {
132 s = xmalloc(5192, pszSrcFile, __LINE__);
133 if (s) {
134 sprintf(s,
135 "%s%s;EXENAME=%s%s%s;PARAMETERS= %s%s%s%s %%*;%sOBJECTID=<FM2_%s>",
136 "ICONFILE=",
137 icon,
138 javaexe,
139 (path) ? ";STARTUPDIR=" : NullStr,
140 (path) ? path : NullStr,
141 "-jar ",
142 (path) ? path : NullStr,
143 (path) ? PCSZ_BACKSLASH : NullStr,
144 objtitle,
145 "PROGTYPE=PM;",
146 objecttmp);
147 WinSetObjectData(obj, s);
148 free(s);
149 }
150 }
151 return obj;
152}
153
154HOBJECT CreateDataObject(CHAR * objtitle, CHAR * location, CHAR * path,
155 CHAR * cnr)
156{
157
158 HOBJECT obj = (HOBJECT) 0;
159 CHAR s[1050], s2[1050], *p,
160 *type[] = { "WPDataFile", "WPIcon", "WPBitmap" };
161
162 if (!cnr)
163 return obj;
164 BldFullPathName(s, path, objtitle);
165 p = strrchr(objtitle, '.');
166 if (p) {
167 if (!stricmp(p, PCSZ_DOTICO))
168 p = type[1];
169 else if (!stricmp(p, PCSZ_DOTBMP))
170 p = type[2];
171 else
172 p = type[0];
173 }
174 else
175 p = type[0];
176 obj = WinCreateObject(p,
177 s,
178 "NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO",
179 (location) ? location : cnr, CO_FAILIFEXISTS);
180 if (obj) {
181 sprintf(s2,
182 "%s%s%s%sOBJECTID=<FM2_%s>",
183 objtitle,
184 (p == type[1]) ? "ICONFILE=" : NullStr,
185 (p == type[1]) ? s : NullStr, (p == type[1]) ? ";" : NullStr, objtitle);
186 WinSetObjectData(obj, s2);
187 }
188 return obj;
189}
190
191HOBJECT CreateFolderObject(CHAR * objtitle, CHAR * cnr)
192{
193 HOBJECT obj = (HOBJECT) 0;
194 CHAR s[1050];
195
196 if (!cnr)
197 return obj;
198 obj = WinCreateObject("WPFolder",
199 objtitle,
200 "NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO",
201 cnr, CO_FAILIFEXISTS);
202 if (obj) {
203 sprintf(s, "OBJECTID=<FM2_%s>", objtitle);
204 WinSetObjectData(obj, s);
205 }
206 return obj;
207}
208
209HOBJECT CreateShadowObject(CHAR * objtitle, CHAR * location, CHAR * path,
210 BOOL executable, CHAR * cnr)
211{
212
213 HOBJECT obj = (HOBJECT) 0;
214 CHAR *s;
215
216 if (!cnr)
217 return obj;
218 s = xmalloc(5192, pszSrcFile, __LINE__);
219 if (s) {
220 sprintf(s,
221 "SHADOWID=%s%s%s",
222 (path) ? path : NullStr, (path) ? PCSZ_BACKSLASH : NullStr, objtitle);
223 { // find an icon for it if possible
224 CHAR *p, temp[CCHMAXPATH + 1];
225
226 BldFullPathName(temp, path, objtitle);
227 p = strrchr(temp, '.');
228 if (p) {
229 *p = 0;
230 strcat(p, PCSZ_DOTICO);
231 if (IsFile(temp) == 1)
232 sprintf(&s[strlen(s)], ";ICONFILE=%s", temp);
233 }
234 }
235 if (executable)
236 sprintf(&s[strlen(s)],
237 ";EXENAME=%s%s%s%s%s;PARAMETERS=%%*",
238 (path) ? path : NullStr,
239 (path) ? PCSZ_BACKSLASH : NullStr,
240 objtitle, (path) ? ";STARTUPDIR=" : NullStr, (path) ? path : NullStr);
241 strcat(s, ";NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO");
242 sprintf(&s[strlen(s)], ";OBJECTID=<FM2_%s>", objtitle);
243 obj = WinCreateObject("WPShadow",
244 objtitle,
245 s, (location) ? location : cnr, CO_FAILIFEXISTS);
246 free(s);
247 }
248 return obj;
249}
250
251VOID MakeShadows(HWND hwnd, CHAR ** list, ULONG Shadows, CHAR * cnr,
252 CHAR * foldername)
253{
254 INT x = 0;
255 CHAR szBuff[CCHMAXPATH + 8];
256 HOBJECT obj = (HOBJECT) 0;
257 FILESTATUS3 fsa;
258 BOOL JAVA = FALSE;
259
260 *szBuff = 0;
261 if (foldername)
262 strcpy(szBuff, foldername);
263 if (list) {
264 if ((list[0] && list[1]) || Shadows > 1) {
265
266 STRINGINPARMS sip;
267
268 sip.help = GetPString(IDS_MAKESHADOWHELPTEXT);
269 sip.ret = szBuff;
270 sip.prompt = GetPString(IDS_MAKESHADOWPROMPTTEXT);
271 sip.inputlen = CCHMAXPATHCOMP;
272 sip.title = GetPString(IDS_MAKESHADOWTITLETEXT);
273 if (WinDlgBox(HWND_DESKTOP,
274 hwnd, InputDlgProc, FM3ModHandle, STR_FRAME, &sip)) {
275 if (*szBuff) {
276 obj = CreateFolderObject(szBuff, cnr);
277 if (!obj) {
278 saymsg(MB_CANCEL | MB_ICONEXCLAMATION,
279 hwnd,
280 GetPString(IDS_ERRORTEXT),
281 GetPString(IDS_MAKESHADOWCREATEFAILEDTEXT), szBuff);
282 return;
283 }
284 }
285 }
286 else
287 return;
288 }
289 while (list[x]) {
290 if (!DosQueryPathInfo(list[x],
291 FIL_STANDARD, &fsa,
292 (ULONG) sizeof(FILESTATUS3))) {
293
294 ULONG apt;
295 CHAR *p, *pp, szDir[CCHMAXPATH + 1], szBuffer[CCHMAXPATH + 1];
296
297 if (xDosQueryAppType(list[x], &apt))
298 apt = 0;
299 p = strrchr(list[x], '.');
300 if (p) {
301 if (!stricmp(p, PCSZ_DOTBAT) || !stricmp(p, PCSZ_DOTCMD) ||
302 !stricmp(p, PCSZ_DOTBTM))
303 apt |= FAPPTYP_BOUND;
304 else if(!stricmp(p, ".jar"))
305 JAVA = TRUE;
306 }
307 *szBuffer = 0;
308 p = strrchr(list[x], '\\');
309 if (!p)
310 p = strrchr(list[x], ':');
311 if (p)
312 p++;
313 else
314 p = list[x];
315 strcpy(szDir, list[x]);
316 pp = strrchr(szDir, '\\');
317 if (!pp) {
318 pp = strrchr(szDir, ':');
319 if (pp) {
320 pp++;
321 *pp = '\\';
322 pp++;
323 }
324 }
325 if (pp)
326 *pp = 0;
327 else
328 *szDir = 0;
329 if (obj && *szBuff)
330 sprintf(szBuffer, "<FM2_%s>", szBuff);
331 else
332 *szBuffer = 0;
333 if ((fsa.attrFile & FILE_DIRECTORY) || Shadows)
334 CreateShadowObject(p, (obj) ? szBuffer : NULL, szDir, 0, cnr);
335 else if (JAVA)
336 if (CreateJAVAProgramObject(p, (obj) ? szBuffer : NULL, szDir, cnr))
337 apt |= FAPPTYP_BOUND;
338 else if (!(apt & (FAPPTYP_NOTWINDOWCOMPAT | FAPPTYP_WINDOWCOMPAT | FAPPTYP_WINDOWAPI |
339 FAPPTYP_BOUND | FAPPTYP_DOS | FAPPTYP_WINDOWSREAL |
340 FAPPTYP_WINDOWSPROT | 0x1000))) // not an executable app?
341 CreateDataObject(p, (obj) ? szBuffer : NULL, szDir, cnr);
342 else
343 CreateProgramObject(p, (obj) ? szBuffer : NULL, szDir, cnr);
344 }
345 x++;
346 DosSleep(1);
347 }
348 }
349}
350
351VOID OpenObject(CHAR *filename, PCSZ type, HWND hwnd)
352{
353 HOBJECT hWPSObject;
354
355 if (!type)
356 type = Default;
357 if ((*filename == '<' &&
358 filename[strlen(filename) - 1] == '>') || IsFile(filename) != -1) {
359 hWPSObject = WinQueryObject(filename);
360 if (hWPSObject != NULLHANDLE) { // got something; try to to open it
361
362 CHAR s[CCHMAXPATH];
363 HWND hwndDesktop;
364
365 if (hwnd) {
366 hwndDesktop = WinQueryDesktopWindow((HAB) 0, NULLHANDLE);
367 WinSetFocus(HWND_DESKTOP, hwndDesktop);
368 }
369 sprintf(s, "OPEN=%s", type);
370 if (!WinSetObjectData(hWPSObject, s) && hwnd)
371 WinSetFocus(HWND_DESKTOP, hwnd);
372 }
373 }
374}
375
376BOOL RunSeamless(CHAR * exename, CHAR * args, HWND hwnd)
377{
378 CHAR settings[1024 + CCHMAXPATH + 80];
379 BOOL ret;
380
381 sprintf(settings,
382 "EXENAME=%s;PROGTYPE=SEAMLESS;PARAMETERS=%s;OPEN=DEFAULT",
383 exename, args);
384 if (hwnd)
385 WinSetFocus(HWND_DESKTOP, HWND_DESKTOP);
386 ret = WinCreateObject((CHAR *) WPProgram,
387 exename,
388 settings, "<WP_NOWHERE>", CO_REPLACEIFEXISTS);
389 if (!ret && hwnd)
390 WinSetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_ZORDER | SWP_ACTIVATE);
391 return ret;
392}
393
394#pragma alloc_text(SHADOW,CreateProgramObject,CreateDataObject,CreateFolderObject,CreateShadowObject)
395#pragma alloc_text(SHADOW2,MakeShadows,OpenObject)
Note: See TracBrowser for help on using the repository browser.