source: trunk/dll/shadow.c@ 1439

Last change on this file since 1439 was 1439, checked in by Gregg Young, 16 years ago

Changes to allow high mem loading of dll; Refactor .LONGNAME and .SUBJECT EA fetch to FetchCommonEAs. Add szFSType to FillInRecordFromFSA use to bypass EA scan and size formatting for tree container; Fix labels/FS type to work on scan on NOPRESCAN Drives; Fixed dbl directory names on restore of dir cnrs; (Tickets 47, 339, 363, 368, 369, 370)

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