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
RevLine 
[334]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
[1498]9 Copyright (c) 2006, 2010 Steven H. Levine
[334]10
11 22 Jul 06 SHL Check more run time errors
[697]12 16 Jun 07 SHL Update for OpenWatcom
[773]13 06 Aug 07 SHL Use BldFullPathName
[793]14 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
[1402]15 08 Mar 09 GKY Additional strings move to PCSZs declare change
[1480]16 12 Jul 09 GKY Add xDosQueryAppType and xDosAlloc... to allow FM/2 to load in high memory
[1498]17 17 JAN 10 GKY Changes to get working with Watcom 1.9 Beta (1/16/10). Mostly cast CHAR CONSTANT * as CHAR *.
[1782]18 28 Jun 14 GKY Fix errors identified with CPPCheck;
[1803]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.
[334]21
22***********************************************************************/
23
[907]24#include <stdlib.h>
25#include <string.h>
26
[2]27#define INCL_DOS
28#define INCL_WIN
[841]29#define INCL_LONGLONG
[2]30
[1212]31#include "fm3dll.h"
[1227]32#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
[1212]33#include "filldir.h" // Data declaration(s)
34#include "mainwnd.h" // Data declaration(s)
[2]35#include "fm3dlg.h"
36#include "fm3str.h"
[907]37#include "pathutil.h" // BldFullPathName
38#include "errutil.h" // Dos_Error...
39#include "strutil.h" // GetPString
[1158]40#include "shadow.h"
[1181]41#include "input.h" // InputDlgProc
[1212]42#include "defview.h" // Data declaration(s)
[1181]43#include "valid.h" // IsFile
44#include "wrappers.h" // xmalloc
[1039]45#include "fortify.h"
[1398]46#include "init.h" // Data declaration(s)
[1803]47#include "notebook.h" // Data declaration(s)
48#include "getnames.h" // insert_filename
49#include "srchpath.h" // SearchMultiplePathsForFile
[2]50
51#pragma data_seg(DATA1)
[334]52
53static PSZ pszSrcFile = __FILE__;
54
[1158]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,
[1803]60 CHAR * cnr);
61static HOBJECT CreateJAVAProgramObject(CHAR * objtitle, CHAR * location, CHAR * path,
[1158]62 CHAR * cnr);
63static HOBJECT CreateShadowObject(CHAR * objtitle, CHAR * location, CHAR * path,
64 BOOL executable, CHAR * cnr);
65
[551]66HOBJECT CreateProgramObject(CHAR * objtitle, CHAR * location, CHAR * path,
67 CHAR * cnr)
[334]68{
[551]69 HOBJECT obj = (HOBJECT) 0;
70 CHAR *s;
[1803]71 CHAR objecttmp[CCHMAXPATH];
[2]72
[551]73 if (!cnr)
[2]74 return obj;
[1803]75 strcpy(objecttmp, objtitle);
76 s = strchr(objecttmp, '.');
77 if (s)
78 *s = 0;
[1498]79 obj = WinCreateObject((CHAR *) WPProgram,
[1803]80 objecttmp,
[551]81 "NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO",
82 (location) ? location : cnr, CO_FAILIFEXISTS);
83 if (obj) {
84 s = xmalloc(5192, pszSrcFile, __LINE__);
[334]85 if (s) {
[2]86 sprintf(s,
[551]87 "EXENAME=%s%s%s%s%s;PARAMETERS=%%*;OBJECTID=<FM2_%s>",
[1438]88 (path) ? path : NullStr,
89 (path) ? PCSZ_BACKSLASH : NullStr,
[551]90 objtitle,
[1438]91 (path) ? ";STARTUPDIR=" : NullStr, (path) ? path : NullStr, objtitle);
[551]92 WinSetObjectData(obj, s);
[1039]93 free(s);
[2]94 }
95 }
96 return obj;
97}
98
[1803]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
[551]154HOBJECT CreateDataObject(CHAR * objtitle, CHAR * location, CHAR * path,
155 CHAR * cnr)
156{
[2]157
[551]158 HOBJECT obj = (HOBJECT) 0;
159 CHAR s[1050], s2[1050], *p,
160 *type[] = { "WPDataFile", "WPIcon", "WPBitmap" };
[2]161
[551]162 if (!cnr)
[2]163 return obj;
[773]164 BldFullPathName(s, path, objtitle);
[551]165 p = strrchr(objtitle, '.');
166 if (p) {
[1398]167 if (!stricmp(p, PCSZ_DOTICO))
[2]168 p = type[1];
[1398]169 else if (!stricmp(p, PCSZ_DOTBMP))
[2]170 p = type[2];
171 else
172 p = type[0];
173 }
174 else
175 p = type[0];
176 obj = WinCreateObject(p,
[551]177 s,
178 "NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO",
179 (location) ? location : cnr, CO_FAILIFEXISTS);
180 if (obj) {
[2]181 sprintf(s2,
[1782]182 "%s%s%s%sOBJECTID=<FM2_%s>",
[551]183 objtitle,
[1438]184 (p == type[1]) ? "ICONFILE=" : NullStr,
185 (p == type[1]) ? s : NullStr, (p == type[1]) ? ";" : NullStr, objtitle);
[551]186 WinSetObjectData(obj, s2);
[2]187 }
188 return obj;
189}
190
[551]191HOBJECT CreateFolderObject(CHAR * objtitle, CHAR * cnr)
[334]192{
[551]193 HOBJECT obj = (HOBJECT) 0;
194 CHAR s[1050];
[2]195
[551]196 if (!cnr)
[2]197 return obj;
198 obj = WinCreateObject("WPFolder",
[551]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);
[2]205 }
206 return obj;
207}
208
[551]209HOBJECT CreateShadowObject(CHAR * objtitle, CHAR * location, CHAR * path,
210 BOOL executable, CHAR * cnr)
211{
[2]212
[551]213 HOBJECT obj = (HOBJECT) 0;
214 CHAR *s;
[2]215
[551]216 if (!cnr)
[2]217 return obj;
[551]218 s = xmalloc(5192, pszSrcFile, __LINE__);
[334]219 if (s) {
[2]220 sprintf(s,
[551]221 "SHADOWID=%s%s%s",
[1438]222 (path) ? path : NullStr, (path) ? PCSZ_BACKSLASH : NullStr, objtitle);
[1673]223 { // find an icon for it if possible
[551]224 CHAR *p, temp[CCHMAXPATH + 1];
[2]225
[773]226 BldFullPathName(temp, path, objtitle);
[551]227 p = strrchr(temp, '.');
228 if (p) {
229 *p = 0;
[1398]230 strcat(p, PCSZ_DOTICO);
[551]231 if (IsFile(temp) == 1)
232 sprintf(&s[strlen(s)], ";ICONFILE=%s", temp);
[2]233 }
234 }
[551]235 if (executable)
[2]236 sprintf(&s[strlen(s)],
[551]237 ";EXENAME=%s%s%s%s%s;PARAMETERS=%%*",
[1438]238 (path) ? path : NullStr,
239 (path) ? PCSZ_BACKSLASH : NullStr,
240 objtitle, (path) ? ";STARTUPDIR=" : NullStr, (path) ? path : NullStr);
[551]241 strcat(s, ";NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO");
242 sprintf(&s[strlen(s)], ";OBJECTID=<FM2_%s>", objtitle);
[2]243 obj = WinCreateObject("WPShadow",
[551]244 objtitle,
245 s, (location) ? location : cnr, CO_FAILIFEXISTS);
[1039]246 free(s);
[2]247 }
248 return obj;
249}
250
[551]251VOID MakeShadows(HWND hwnd, CHAR ** list, ULONG Shadows, CHAR * cnr,
252 CHAR * foldername)
[334]253{
[551]254 INT x = 0;
255 CHAR szBuff[CCHMAXPATH + 8];
256 HOBJECT obj = (HOBJECT) 0;
[847]257 FILESTATUS3 fsa;
[1803]258 BOOL JAVA = FALSE;
[2]259
260 *szBuff = 0;
[551]261 if (foldername)
262 strcpy(szBuff, foldername);
263 if (list) {
264 if ((list[0] && list[1]) || Shadows > 1) {
[2]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);
[551]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 }
[2]285 }
286 else
[551]287 return;
[2]288 }
[551]289 while (list[x]) {
290 if (!DosQueryPathInfo(list[x],
[847]291 FIL_STANDARD, &fsa,
292 (ULONG) sizeof(FILESTATUS3))) {
[2]293
[551]294 ULONG apt;
295 CHAR *p, *pp, szDir[CCHMAXPATH + 1], szBuffer[CCHMAXPATH + 1];
[2]296
[1439]297 if (xDosQueryAppType(list[x], &apt))
[551]298 apt = 0;
299 p = strrchr(list[x], '.');
300 if (p) {
[1398]301 if (!stricmp(p, PCSZ_DOTBAT) || !stricmp(p, PCSZ_DOTCMD) ||
302 !stricmp(p, PCSZ_DOTBTM))
[1803]303 apt |= FAPPTYP_BOUND;
304 else if(!stricmp(p, ".jar"))
305 JAVA = TRUE;
[551]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)
[1803]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;
[1673]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?
[551]341 CreateDataObject(p, (obj) ? szBuffer : NULL, szDir, cnr);
342 else
343 CreateProgramObject(p, (obj) ? szBuffer : NULL, szDir, cnr);
[2]344 }
345 x++;
[766]346 DosSleep(1);
[2]347 }
348 }
349}
350
[1402]351VOID OpenObject(CHAR *filename, PCSZ type, HWND hwnd)
[334]352{
[2]353 HOBJECT hWPSObject;
354
[551]355 if (!type)
[2]356 type = Default;
[551]357 if ((*filename == '<' &&
358 filename[strlen(filename) - 1] == '>') || IsFile(filename) != -1) {
[2]359 hWPSObject = WinQueryObject(filename);
[1673]360 if (hWPSObject != NULLHANDLE) { // got something; try to to open it
[2]361
362 CHAR s[CCHMAXPATH];
363 HWND hwndDesktop;
364
[551]365 if (hwnd) {
366 hwndDesktop = WinQueryDesktopWindow((HAB) 0, NULLHANDLE);
367 WinSetFocus(HWND_DESKTOP, hwndDesktop);
[2]368 }
[551]369 sprintf(s, "OPEN=%s", type);
370 if (!WinSetObjectData(hWPSObject, s) && hwnd)
371 WinSetFocus(HWND_DESKTOP, hwnd);
[2]372 }
373 }
374}
375
[551]376BOOL RunSeamless(CHAR * exename, CHAR * args, HWND hwnd)
[334]377{
[2]378 CHAR settings[1024 + CCHMAXPATH + 80];
379 BOOL ret;
380
381 sprintf(settings,
[551]382 "EXENAME=%s;PROGTYPE=SEAMLESS;PARAMETERS=%s;OPEN=DEFAULT",
383 exename, args);
384 if (hwnd)
385 WinSetFocus(HWND_DESKTOP, HWND_DESKTOP);
[1498]386 ret = WinCreateObject((CHAR *) WPProgram,
[551]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);
[2]391 return ret;
392}
[793]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.