source: trunk/dll/shadow.c@ 1036

Last change on this file since 1036 was 1009, checked in by Steven Levine, 17 years ago

Add xfree xstrdup Fortify support
Add MT capable Fortify scope logic

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