source: trunk/dll/shadow.c@ 1782

Last change on this file since 1782 was 1782, checked in by Gregg Young, 11 years ago

Addition code issues found based on cppcheck warnings

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