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