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
RevLine 
[334]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
[907]9 Copyright (c) 2006, 2008 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
[1439]16 12 Jul 09 GKY Add xDosQueryAppType and xDoxAlloc... to allow FM/2 to load in high memory
[334]17
18***********************************************************************/
19
[907]20#include <stdlib.h>
21#include <string.h>
22
[2]23#define INCL_DOS
24#define INCL_WIN
[841]25#define INCL_LONGLONG
[2]26
[1212]27#include "fm3dll.h"
[1227]28#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
[1212]29#include "filldir.h" // Data declaration(s)
30#include "mainwnd.h" // Data declaration(s)
[2]31#include "fm3dlg.h"
32#include "fm3str.h"
[907]33#include "pathutil.h" // BldFullPathName
34#include "errutil.h" // Dos_Error...
35#include "strutil.h" // GetPString
[1158]36#include "shadow.h"
[1181]37#include "input.h" // InputDlgProc
[1212]38#include "defview.h" // Data declaration(s)
[1181]39#include "valid.h" // IsFile
40#include "wrappers.h" // xmalloc
[1039]41#include "fortify.h"
[1398]42#include "init.h" // Data declaration(s)
[2]43
44#pragma data_seg(DATA1)
[334]45
46static PSZ pszSrcFile = __FILE__;
47
[1158]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
[551]57HOBJECT CreateProgramObject(CHAR * objtitle, CHAR * location, CHAR * path,
58 CHAR * cnr)
[334]59{
[551]60 HOBJECT obj = (HOBJECT) 0;
61 CHAR *s;
[2]62
[551]63 if (!cnr)
[2]64 return obj;
65 obj = WinCreateObject(WPProgram,
[551]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__);
[334]71 if (s) {
[2]72 sprintf(s,
[551]73 "EXENAME=%s%s%s%s%s;PARAMETERS=%%*;OBJECTID=<FM2_%s>",
[1438]74 (path) ? path : NullStr,
75 (path) ? PCSZ_BACKSLASH : NullStr,
[551]76 objtitle,
[1438]77 (path) ? ";STARTUPDIR=" : NullStr, (path) ? path : NullStr, objtitle);
[551]78 WinSetObjectData(obj, s);
[1039]79 free(s);
[2]80 }
81 }
82 return obj;
83}
84
[551]85HOBJECT CreateDataObject(CHAR * objtitle, CHAR * location, CHAR * path,
86 CHAR * cnr)
87{
[2]88
[551]89 HOBJECT obj = (HOBJECT) 0;
90 CHAR s[1050], s2[1050], *p,
91 *type[] = { "WPDataFile", "WPIcon", "WPBitmap" };
[2]92
[551]93 if (!cnr)
[2]94 return obj;
[773]95 BldFullPathName(s, path, objtitle);
[551]96 p = strrchr(objtitle, '.');
97 if (p) {
[1398]98 if (!stricmp(p, PCSZ_DOTICO))
[2]99 p = type[1];
[1398]100 else if (!stricmp(p, PCSZ_DOTBMP))
[2]101 p = type[2];
102 else
103 p = type[0];
104 }
105 else
106 p = type[0];
107 obj = WinCreateObject(p,
[551]108 s,
109 "NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO",
110 (location) ? location : cnr, CO_FAILIFEXISTS);
111 if (obj) {
[2]112 sprintf(s2,
[551]113 "%s%s%sOBJECTID=<FM2_%s>",
114 objtitle,
[1438]115 (p == type[1]) ? "ICONFILE=" : NullStr,
116 (p == type[1]) ? s : NullStr, (p == type[1]) ? ";" : NullStr, objtitle);
[551]117 WinSetObjectData(obj, s2);
[2]118 }
119 return obj;
120}
121
[551]122HOBJECT CreateFolderObject(CHAR * objtitle, CHAR * cnr)
[334]123{
[551]124 HOBJECT obj = (HOBJECT) 0;
125 CHAR s[1050];
[2]126
[551]127 if (!cnr)
[2]128 return obj;
129 obj = WinCreateObject("WPFolder",
[551]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);
[2]136 }
137 return obj;
138}
139
[551]140HOBJECT CreateShadowObject(CHAR * objtitle, CHAR * location, CHAR * path,
141 BOOL executable, CHAR * cnr)
142{
[2]143
[551]144 HOBJECT obj = (HOBJECT) 0;
145 CHAR *s;
[2]146
[551]147 if (!cnr)
[2]148 return obj;
[551]149 s = xmalloc(5192, pszSrcFile, __LINE__);
[334]150 if (s) {
[2]151 sprintf(s,
[551]152 "SHADOWID=%s%s%s",
[1438]153 (path) ? path : NullStr, (path) ? PCSZ_BACKSLASH : NullStr, objtitle);
[551]154 { /* find an icon for it if possible */
155 CHAR *p, temp[CCHMAXPATH + 1];
[2]156
[773]157 BldFullPathName(temp, path, objtitle);
[551]158 p = strrchr(temp, '.');
159 if (p) {
160 *p = 0;
[1398]161 strcat(p, PCSZ_DOTICO);
[551]162 if (IsFile(temp) == 1)
163 sprintf(&s[strlen(s)], ";ICONFILE=%s", temp);
[2]164 }
165 }
[551]166 if (executable)
[2]167 sprintf(&s[strlen(s)],
[551]168 ";EXENAME=%s%s%s%s%s;PARAMETERS=%%*",
[1438]169 (path) ? path : NullStr,
170 (path) ? PCSZ_BACKSLASH : NullStr,
171 objtitle, (path) ? ";STARTUPDIR=" : NullStr, (path) ? path : NullStr);
[551]172 strcat(s, ";NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO");
173 sprintf(&s[strlen(s)], ";OBJECTID=<FM2_%s>", objtitle);
[2]174 obj = WinCreateObject("WPShadow",
[551]175 objtitle,
176 s, (location) ? location : cnr, CO_FAILIFEXISTS);
[1039]177 free(s);
[2]178 }
179 return obj;
180}
181
[551]182VOID MakeShadows(HWND hwnd, CHAR ** list, ULONG Shadows, CHAR * cnr,
183 CHAR * foldername)
[334]184{
[551]185 INT x = 0;
186 CHAR szBuff[CCHMAXPATH + 8];
187 HOBJECT obj = (HOBJECT) 0;
[847]188 FILESTATUS3 fsa;
[2]189
190 *szBuff = 0;
[551]191 if (foldername)
192 strcpy(szBuff, foldername);
193 if (list) {
194 if ((list[0] && list[1]) || Shadows > 1) {
[2]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);
[551]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 }
[2]215 }
216 else
[551]217 return;
[2]218 }
[551]219 while (list[x]) {
220 if (!DosQueryPathInfo(list[x],
[847]221 FIL_STANDARD, &fsa,
222 (ULONG) sizeof(FILESTATUS3))) {
[2]223
[551]224 ULONG apt;
225 CHAR *p, *pp, szDir[CCHMAXPATH + 1], szBuffer[CCHMAXPATH + 1];
[2]226
[1439]227 if (xDosQueryAppType(list[x], &apt))
[551]228 apt = 0;
229 p = strrchr(list[x], '.');
230 if (p) {
[1398]231 if (!stricmp(p, PCSZ_DOTBAT) || !stricmp(p, PCSZ_DOTCMD) ||
232 !stricmp(p, PCSZ_DOTBTM))
[551]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);
[2]267 }
268 x++;
[766]269 DosSleep(1);
[2]270 }
271 }
272}
273
[1402]274VOID OpenObject(CHAR *filename, PCSZ type, HWND hwnd)
[334]275{
[2]276 HOBJECT hWPSObject;
277
[551]278 if (!type)
[2]279 type = Default;
[551]280 if ((*filename == '<' &&
281 filename[strlen(filename) - 1] == '>') || IsFile(filename) != -1) {
[2]282 hWPSObject = WinQueryObject(filename);
[551]283 if (hWPSObject != NULLHANDLE) { /* got something; try to to open it */
[2]284
285 CHAR s[CCHMAXPATH];
286 HWND hwndDesktop;
287
[551]288 if (hwnd) {
289 hwndDesktop = WinQueryDesktopWindow((HAB) 0, NULLHANDLE);
290 WinSetFocus(HWND_DESKTOP, hwndDesktop);
[2]291 }
[551]292 sprintf(s, "OPEN=%s", type);
293 if (!WinSetObjectData(hWPSObject, s) && hwnd)
294 WinSetFocus(HWND_DESKTOP, hwnd);
[2]295 }
296 }
297}
298
[551]299BOOL RunSeamless(CHAR * exename, CHAR * args, HWND hwnd)
[334]300{
[2]301 CHAR settings[1024 + CCHMAXPATH + 80];
302 BOOL ret;
303
304 sprintf(settings,
[551]305 "EXENAME=%s;PROGTYPE=SEAMLESS;PARAMETERS=%s;OPEN=DEFAULT",
306 exename, args);
307 if (hwnd)
308 WinSetFocus(HWND_DESKTOP, HWND_DESKTOP);
[2]309 ret = WinCreateObject(WPProgram,
[551]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);
[2]314 return ret;
315}
[793]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.