source: trunk/dll/shadow.c@ 1398

Last change on this file since 1398 was 1398, checked in by Gregg Young, 17 years ago

Move embeded strings to PCSZ variables or string table; Eliminate Error2 functions Runtime_Error with NULL format string returns "No data" error. Change declares from PSZ to PCSZ in functions where the variable isn't changed. Added btm as an executable file type in several additional places. Use fProtectOnly to prevent attempt to execute Dos and Win programs on "Protect only" installs in several additional places.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.9 KB
Line 
1
2/***********************************************************************
3
4 $Id: shadow.c 1398 2009-02-21 17:43:00Z gyoung $
5
6 Desktop shadows
7
8 Copyright (c) 1993-97 M. Kimes
9 Copyright (c) 2006, 2008 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
16***********************************************************************/
17
18#include <stdlib.h>
19#include <string.h>
20
21#define INCL_DOS
22#define INCL_WIN
23#define INCL_LONGLONG
24
25#include "fm3dll.h"
26#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
27#include "filldir.h" // Data declaration(s)
28#include "mainwnd.h" // Data declaration(s)
29#include "fm3dlg.h"
30#include "fm3str.h"
31#include "pathutil.h" // BldFullPathName
32#include "errutil.h" // Dos_Error...
33#include "strutil.h" // GetPString
34#include "shadow.h"
35#include "input.h" // InputDlgProc
36#include "defview.h" // Data declaration(s)
37#include "valid.h" // IsFile
38#include "wrappers.h" // xmalloc
39#include "fortify.h"
40#include "init.h" // Data declaration(s)
41
42#pragma data_seg(DATA1)
43
44static PSZ pszSrcFile = __FILE__;
45
46static HOBJECT CreateDataObject(CHAR * objtitle, CHAR * location, CHAR * path,
47 CHAR * cnr);
48static HOBJECT CreateFolderObject(CHAR * objtitle, CHAR * cnr);
49
50static HOBJECT CreateProgramObject(CHAR * objtitle, CHAR * location, CHAR * path,
51 CHAR * cnr);
52static HOBJECT CreateShadowObject(CHAR * objtitle, CHAR * location, CHAR * path,
53 BOOL executable, CHAR * cnr);
54
55HOBJECT CreateProgramObject(CHAR * objtitle, CHAR * location, CHAR * path,
56 CHAR * cnr)
57{
58 HOBJECT obj = (HOBJECT) 0;
59 CHAR *s;
60
61 if (!cnr)
62 return obj;
63 obj = WinCreateObject(WPProgram,
64 objtitle,
65 "NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO",
66 (location) ? location : cnr, CO_FAILIFEXISTS);
67 if (obj) {
68 s = xmalloc(5192, pszSrcFile, __LINE__);
69 if (s) {
70 sprintf(s,
71 "EXENAME=%s%s%s%s%s;PARAMETERS=%%*;OBJECTID=<FM2_%s>",
72 (path) ? path : "",
73 (path) ? "\\" : "",
74 objtitle,
75 (path) ? ";STARTUPDIR=" : "", (path) ? path : "", objtitle);
76 WinSetObjectData(obj, s);
77 free(s);
78 }
79 }
80 return obj;
81}
82
83HOBJECT CreateDataObject(CHAR * objtitle, CHAR * location, CHAR * path,
84 CHAR * cnr)
85{
86
87 HOBJECT obj = (HOBJECT) 0;
88 CHAR s[1050], s2[1050], *p,
89 *type[] = { "WPDataFile", "WPIcon", "WPBitmap" };
90
91 if (!cnr)
92 return obj;
93 BldFullPathName(s, path, objtitle);
94 p = strrchr(objtitle, '.');
95 if (p) {
96 if (!stricmp(p, PCSZ_DOTICO))
97 p = type[1];
98 else if (!stricmp(p, PCSZ_DOTBMP))
99 p = type[2];
100 else
101 p = type[0];
102 }
103 else
104 p = type[0];
105 obj = WinCreateObject(p,
106 s,
107 "NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO",
108 (location) ? location : cnr, CO_FAILIFEXISTS);
109 if (obj) {
110 sprintf(s2,
111 "%s%s%sOBJECTID=<FM2_%s>",
112 objtitle,
113 (p == type[1]) ? "ICONFILE=" : "",
114 (p == type[1]) ? s : "", (p == type[1]) ? ";" : "", objtitle);
115 WinSetObjectData(obj, s2);
116 }
117 return obj;
118}
119
120HOBJECT CreateFolderObject(CHAR * objtitle, CHAR * cnr)
121{
122 HOBJECT obj = (HOBJECT) 0;
123 CHAR s[1050];
124
125 if (!cnr)
126 return obj;
127 obj = WinCreateObject("WPFolder",
128 objtitle,
129 "NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO",
130 cnr, CO_FAILIFEXISTS);
131 if (obj) {
132 sprintf(s, "OBJECTID=<FM2_%s>", objtitle);
133 WinSetObjectData(obj, s);
134 }
135 return obj;
136}
137
138HOBJECT CreateShadowObject(CHAR * objtitle, CHAR * location, CHAR * path,
139 BOOL executable, CHAR * cnr)
140{
141
142 HOBJECT obj = (HOBJECT) 0;
143 CHAR *s;
144
145 if (!cnr)
146 return obj;
147 s = xmalloc(5192, pszSrcFile, __LINE__);
148 if (s) {
149 sprintf(s,
150 "SHADOWID=%s%s%s",
151 (path) ? path : "", (path) ? "\\" : "", objtitle);
152 { /* find an icon for it if possible */
153 CHAR *p, temp[CCHMAXPATH + 1];
154
155 BldFullPathName(temp, path, objtitle);
156 p = strrchr(temp, '.');
157 if (p) {
158 *p = 0;
159 strcat(p, PCSZ_DOTICO);
160 if (IsFile(temp) == 1)
161 sprintf(&s[strlen(s)], ";ICONFILE=%s", temp);
162 }
163 }
164 if (executable)
165 sprintf(&s[strlen(s)],
166 ";EXENAME=%s%s%s%s%s;PARAMETERS=%%*",
167 (path) ? path : "",
168 (path) ? "\\" : "",
169 objtitle, (path) ? ";STARTUPDIR=" : "", (path) ? path : "");
170 strcat(s, ";NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO");
171 sprintf(&s[strlen(s)], ";OBJECTID=<FM2_%s>", objtitle);
172 obj = WinCreateObject("WPShadow",
173 objtitle,
174 s, (location) ? location : cnr, CO_FAILIFEXISTS);
175 free(s);
176 }
177 return obj;
178}
179
180VOID MakeShadows(HWND hwnd, CHAR ** list, ULONG Shadows, CHAR * cnr,
181 CHAR * foldername)
182{
183 INT x = 0;
184 CHAR szBuff[CCHMAXPATH + 8];
185 HOBJECT obj = (HOBJECT) 0;
186 FILESTATUS3 fsa;
187
188 *szBuff = 0;
189 if (foldername)
190 strcpy(szBuff, foldername);
191 if (list) {
192 if ((list[0] && list[1]) || Shadows > 1) {
193
194 STRINGINPARMS sip;
195
196 sip.help = GetPString(IDS_MAKESHADOWHELPTEXT);
197 sip.ret = szBuff;
198 sip.prompt = GetPString(IDS_MAKESHADOWPROMPTTEXT);
199 sip.inputlen = CCHMAXPATHCOMP;
200 sip.title = GetPString(IDS_MAKESHADOWTITLETEXT);
201 if (WinDlgBox(HWND_DESKTOP,
202 hwnd, InputDlgProc, FM3ModHandle, STR_FRAME, &sip)) {
203 if (*szBuff) {
204 obj = CreateFolderObject(szBuff, cnr);
205 if (!obj) {
206 saymsg(MB_CANCEL | MB_ICONEXCLAMATION,
207 hwnd,
208 GetPString(IDS_ERRORTEXT),
209 GetPString(IDS_MAKESHADOWCREATEFAILEDTEXT), szBuff);
210 return;
211 }
212 }
213 }
214 else
215 return;
216 }
217 while (list[x]) {
218 if (!DosQueryPathInfo(list[x],
219 FIL_STANDARD, &fsa,
220 (ULONG) sizeof(FILESTATUS3))) {
221
222 ULONG apt;
223 CHAR *p, *pp, szDir[CCHMAXPATH + 1], szBuffer[CCHMAXPATH + 1];
224
225 if (DosQueryAppType(list[x], &apt))
226 apt = 0;
227 p = strrchr(list[x], '.');
228 if (p) {
229 if (!stricmp(p, PCSZ_DOTBAT) || !stricmp(p, PCSZ_DOTCMD) ||
230 !stricmp(p, PCSZ_DOTBTM))
231 apt |= FAPPTYP_BOUND;
232 }
233 *szBuffer = 0;
234 p = strrchr(list[x], '\\');
235 if (!p)
236 p = strrchr(list[x], ':');
237 if (p)
238 p++;
239 else
240 p = list[x];
241 strcpy(szDir, list[x]);
242 pp = strrchr(szDir, '\\');
243 if (!pp) {
244 pp = strrchr(szDir, ':');
245 if (pp) {
246 pp++;
247 *pp = '\\';
248 pp++;
249 }
250 }
251 if (pp)
252 *pp = 0;
253 else
254 *szDir = 0;
255 if (obj && *szBuff)
256 sprintf(szBuffer, "<FM2_%s>", szBuff);
257 else
258 *szBuffer = 0;
259 if ((fsa.attrFile & FILE_DIRECTORY) || Shadows)
260 CreateShadowObject(p, (obj) ? szBuffer : NULL, szDir, 0, cnr);
261 else if (!(apt & (FAPPTYP_NOTWINDOWCOMPAT | FAPPTYP_WINDOWCOMPAT | FAPPTYP_WINDOWAPI | FAPPTYP_BOUND | FAPPTYP_DOS | FAPPTYP_WINDOWSREAL | FAPPTYP_WINDOWSPROT | 0x1000))) /* not an executable app? */
262 CreateDataObject(p, (obj) ? szBuffer : NULL, szDir, cnr);
263 else
264 CreateProgramObject(p, (obj) ? szBuffer : NULL, szDir, cnr);
265 }
266 x++;
267 DosSleep(1);
268 }
269 }
270}
271
272VOID OpenObject(CHAR * filename, CHAR * type, HWND hwnd)
273{
274 HOBJECT hWPSObject;
275
276 if (!type)
277 type = Default;
278 if ((*filename == '<' &&
279 filename[strlen(filename) - 1] == '>') || IsFile(filename) != -1) {
280 hWPSObject = WinQueryObject(filename);
281 if (hWPSObject != NULLHANDLE) { /* got something; try to to open it */
282
283 CHAR s[CCHMAXPATH];
284 HWND hwndDesktop;
285
286 if (hwnd) {
287 hwndDesktop = WinQueryDesktopWindow((HAB) 0, NULLHANDLE);
288 WinSetFocus(HWND_DESKTOP, hwndDesktop);
289 }
290 sprintf(s, "OPEN=%s", type);
291 if (!WinSetObjectData(hWPSObject, s) && hwnd)
292 WinSetFocus(HWND_DESKTOP, hwnd);
293 }
294 }
295}
296
297BOOL RunSeamless(CHAR * exename, CHAR * args, HWND hwnd)
298{
299 CHAR settings[1024 + CCHMAXPATH + 80];
300 BOOL ret;
301
302 sprintf(settings,
303 "EXENAME=%s;PROGTYPE=SEAMLESS;PARAMETERS=%s;OPEN=DEFAULT",
304 exename, args);
305 if (hwnd)
306 WinSetFocus(HWND_DESKTOP, HWND_DESKTOP);
307 ret = WinCreateObject(WPProgram,
308 exename,
309 settings, "<WP_NOWHERE>", CO_REPLACEIFEXISTS);
310 if (!ret && hwnd)
311 WinSetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_ZORDER | SWP_ACTIVATE);
312 return ret;
313}
314
315#pragma alloc_text(SHADOW,CreateProgramObject,CreateDataObject,CreateFolderObject,CreateShadowObject)
316#pragma alloc_text(SHADOW2,MakeShadows,OpenObject)
Note: See TracBrowser for help on using the repository browser.