source: trunk/dll/defview.c@ 907

Last change on this file since 907 was 907, checked in by Steven Levine, 18 years ago

Avoid out of memory traps in Compare Directories
Rework Compare Directories progress display for 2 second update rate
Start refactoring to reduce dependence on fm3dll.h
Add timer services (IsITimerExpired etc.)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 9.8 KB
Line 
1
2/***********************************************************************
3
4 $Id: defview.c 907 2008-01-06 07:26:17Z stevenhl $
5
6 Copyright (c) 1993-98 M. Kimes
7 Copyright (c) 2003, 2008 Steven H.Levine
8
9 Default file viewer
10
11 20 Nov 03 SHL ShowMultimedia: try to convince fmplay to not play exes (Gregg Young)
12 14 Jul 06 SHL Use Runtime_Error
13 18 Mar 07 GKY Fixed misindentifycation of nonmultimedia files by ShowMultiMedia
14 18 Mar 07 GKY Open mp3, ogg & flac files with OS2 object default since fm2play fails
15 21 Apr 07 GKY Find FM2Utils by path or utils directory
16 09 Jun 07 SHL ShowMultimedia: Initialize hwnd so that OpenObject might work
17 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
18 20 Dec 07 GKY Open jpg files with OS2 object default since image.exe fails
19
20***********************************************************************/
21
22#include <string.h>
23#include <ctype.h>
24
25#define INCL_DOS
26#define INCL_WIN
27#define INCL_GPI
28#define INCL_MMIOOS2
29#define INCL_LONGLONG // dircnrs.h
30#include <os2.h>
31#include <os2me.h>
32
33#include "fm3dlg.h"
34#include "arccnrs.h" // StartArcCnr
35#include "errutil.h" // Dos_Error...
36#include "fm3dll.h"
37
38static PSZ pszSrcFile = __FILE__;
39
40BOOL ShowMultimedia(CHAR * filename)
41{
42
43 static BOOL no_mmos2 = FALSE;
44 BOOL played = FALSE;
45 CHAR loaderror[CCHMAXPATH];
46 HMODULE MMIOModHandle = NULLHANDLE;
47 PMMIOIDENTIFYFILE pMMIOIdentifyFile = NULL;
48 PMMIOGETINFO pMMIOGetInfo = NULL;
49 PMMIOCLOSE pMMIOClose = NULL;
50 PMMIOOPEN pMMIOOpen = NULL;
51 MMIOINFO mmioinfo;
52 HMMIO hmmio;
53 FOURCC fccStorageSystem = 0;
54 MMFORMATINFO mmFormatInfo;
55 APIRET rc, rc1;
56 HWND hwnd = HWND_DESKTOP;
57 char *p;
58
59 if (no_mmos2 || !filename || !*filename)
60 return played;
61
62 /* load MMPM/2, if available. */
63 *loaderror = 0;
64 rc = DosLoadModule(loaderror, sizeof(loaderror), "MMIO", &MMIOModHandle);
65 if (rc) {
66 no_mmos2 = TRUE;
67 return played;
68 }
69 else {
70 if (DosQueryProcAddr(MMIOModHandle,
71 0,
72 "mmioIdentifyFile", (PFN *) & pMMIOIdentifyFile)) {
73 DosFreeModule(MMIOModHandle);
74 no_mmos2 = TRUE;
75 return played;
76 }
77 if (DosQueryProcAddr(MMIOModHandle,
78 0,
79 "mmioGetInfo", (PFN *) & pMMIOGetInfo)) {
80 DosFreeModule(MMIOModHandle);
81 no_mmos2 = TRUE;
82 return played;
83 }
84 if (DosQueryProcAddr(MMIOModHandle,
85 0,
86 "mmioClose", (PFN *) & pMMIOClose)) {
87 DosFreeModule(MMIOModHandle);
88 no_mmos2 = TRUE;
89 return played;
90 }
91 if (DosQueryProcAddr(MMIOModHandle,
92 0,
93 "mmioOpen", (PFN *) & pMMIOOpen)) {
94 DosFreeModule(MMIOModHandle);
95 no_mmos2 = TRUE;
96 return played;
97 }
98 }
99
100 /* attempt to identify the file using MMPM/2 */
101 //printf("%s %d\n ", __FILE__, __LINE__); fflush(stdout);
102 memset( &mmioinfo, '\0', sizeof(MMIOINFO) );
103 /*Eliminate non multimedia files*/
104 hmmio = pMMIOOpen(filename,
105 &mmioinfo,
106 MMIO_READ);
107#if 0
108 printf("%s %d %d %d %d %d\n",
109 __FILE__, __LINE__,mmioinfo.ulFlags, mmioinfo.ulErrorRet,
110 mmioinfo.pIOProc, mmioinfo.aulInfo); fflush(stdout);
111#endif
112 if (!hmmio) {
113 p = strrchr(filename, '.'); //Added to save mp3, ogg & flac which fail above test
114 if (!p)
115 p = ".";
116 /* printf("%s %d %s\n",
117 __FILE__, __LINE__, p); fflush(stdout);*/
118 if (!stricmp(p, ".OGG") || !stricmp(p, ".MP3") || !stricmp(p, ".FLAC") ||
119 !stricmp(p, ".JPG") || !stricmp(p, ".JPEG")){
120 hmmio = pMMIOOpen(filename,
121 &mmioinfo,
122 MMIO_READ | MMIO_NOIDENTIFY);
123 if (!hmmio){
124 DosFreeModule(MMIOModHandle);
125 printf("%s %d\n ", __FILE__, __LINE__); fflush(stdout);
126 return played;
127 }
128 }
129 else {
130 DosFreeModule(MMIOModHandle);
131 // printf("%s %d\n ", __FILE__, __LINE__); fflush(stdout);
132 return played;
133 }
134 }
135 if (!hmmio) {
136 DosFreeModule(MMIOModHandle);
137 // printf("%s %d\n ", __FILE__, __LINE__); fflush(stdout);
138 return played;
139 }
140
141 rc1 = pMMIOGetInfo(hmmio, &mmioinfo, 0L);
142 // printf("%s %d\n ", __FILE__, __LINE__); fflush(stdout);
143 memset(&mmFormatInfo, 0, sizeof(MMFORMATINFO));
144 mmFormatInfo.ulStructLen = sizeof(MMFORMATINFO);
145 rc = pMMIOIdentifyFile(filename,
146 &mmioinfo,
147 &mmFormatInfo,
148 &fccStorageSystem, 0L,
149 MMIO_FORCE_IDENTIFY_FF);
150#if 0
151 printf("%s %d %d %d %d\n %d %d %d %s\n",
152 __FILE__, __LINE__,mmioinfo.ulFlags,
153 mmioinfo.pIOProc, mmioinfo.aulInfo,
154 mmFormatInfo.fccIOProc, mmFormatInfo.fccIOProc,
155 mmFormatInfo.ulIOProcType, mmFormatInfo.szDefaultFormatExt); fflush(stdout);
156#endif
157 /* free module handle */
158 rc1 = pMMIOClose(hmmio, 0L);
159 DosFreeModule(MMIOModHandle);
160
161 /* if identified and not FOURCC_DOS */
162 if (!rc && mmFormatInfo.fccIOProc != FOURCC_DOS) {
163 if (mmFormatInfo.ulMediaType == MMIO_MEDIATYPE_IMAGE &&
164 (mmFormatInfo.ulFlags & MMIO_CANREADTRANSLATED)) {
165 p = strrchr(filename, '.');
166 if (!p)
167 p = ".";
168 /* printf("%s %d %s\n",
169 __FILE__, __LINE__, p); fflush(stdout);*/
170 if (!stricmp(p, ".JPG") || !stricmp(p, ".JPEG"))
171 OpenObject(filename, Default, hwnd); //Image fails to display these
172 else // is an image that can be translated
173 RunFM2Util("IMAGE.EXE", filename);
174 played = TRUE;
175 }
176 else if (mmFormatInfo.ulMediaType != MMIO_MEDIATYPE_IMAGE) {
177 /* is a multimedia file (WAV, MID, AVI, etc.) */
178 p = strrchr(filename, '.');
179 if (!p)
180 p = ".";
181 /* printf("%s %d %s\n",
182 __FILE__, __LINE__, p); fflush(stdout);*/
183 if (!stricmp(p, ".OGG") || !stricmp(p, ".MP3") || !stricmp(p, ".FLAC"))
184 OpenObject(filename, Default, hwnd); //FM2Play fails to play these
185 else
186 RunFM2Util("FM2PLAY.EXE", filename);
187 played = TRUE;
188 }
189 }
190
191 return played;
192}
193
194VOID DefaultViewKeys(HWND hwnd, HWND hwndFrame, HWND hwndParent,
195 SWP * swp, CHAR * filename)
196{
197 if ((shiftstate & (KC_CTRL | KC_SHIFT)) == (KC_CTRL | KC_SHIFT))
198 DefaultView(hwnd, hwndFrame, hwndParent, swp, 4, filename);
199 else if (shiftstate & KC_CTRL)
200 DefaultView(hwnd, hwndFrame, hwndParent, swp, 2, filename);
201 else if (shiftstate & KC_SHIFT)
202 DefaultView(hwnd, hwndFrame, hwndParent, swp, 1, filename);
203 else
204 DefaultView(hwnd, hwndFrame, hwndParent, swp, 0, filename);
205}
206
207VOID DefaultView(HWND hwnd, HWND hwndFrame, HWND hwndParent, SWP * swp,
208 ULONG flags, CHAR * filename)
209{
210 /*
211 * bitmapped flags:
212 * ---------------
213 * 1 = View directly
214 * 2 = Open WPS default view
215 * 4 = Open WPS settings view
216 * 8 = Edit
217 * 16 = Info
218 * 32 = No view info
219 */
220
221 HWND hwndArc = (HWND) 0;
222 char *p, *dummy[3];
223
224 if (!hwndParent)
225 hwndParent = HWND_DESKTOP;
226
227 if (flags & 32) {
228 flags &= (~16);
229 if (!IsFile(filename)) {
230 Runtime_Error(pszSrcFile, __LINE__, "%s not found", filename);
231 return;
232 }
233 }
234
235 if (flags & 1) /* directly view the file */
236 goto ViewIt;
237
238 if (flags & 2) { /* open default WPS view of file */
239 OpenObject(filename, Default, hwnd);
240 return;
241 }
242
243 if (flags & 4) { /* open WPS settings notebook for file */
244 OpenObject(filename, Settings, hwnd);
245 return;
246 }
247
248 if ((flags & 16) || !IsFile(filename)) { /* open info for directories */
249
250 char fullname[CCHMAXPATH];
251
252 if (!IsFullName(filename)) {
253 if (!DosQueryPathInfo(filename,
254 FIL_QUERYFULLNAME, fullname, sizeof(fullname)))
255 filename = fullname;
256 }
257 if (IsFullName(filename) &&
258 !(driveflags[toupper(*filename) - 'A'] & DRIVE_INVALID)) {
259 if (!IsRoot(filename)) {
260 dummy[0] = filename;
261 dummy[1] = NULL;
262 WinDlgBox(HWND_DESKTOP,
263 HWND_DESKTOP,
264 FileInfoProc, FM3ModHandle, FLE_FRAME, (PVOID) dummy);
265 }
266 else
267 WinDlgBox(HWND_DESKTOP,
268 HWND_DESKTOP,
269 DrvInfoProc, FM3ModHandle, INFO_FRAME, (PVOID) filename);
270 }
271 return;
272 }
273
274 if (flags & 8) { /* edit file */
275
276 ULONG type = IDM_EDITTEXT;
277
278 dummy[0] = filename;
279 dummy[1] = NULL;
280 if (TestBinary(filename))
281 type = IDM_EDITBINARY;
282 switch (type) {
283 case IDM_EDITBINARY:
284 if (*bined) {
285 ExecOnList((HWND) 0, bined, WINDOWED | SEPARATE, NULL, dummy, NULL,
286 pszSrcFile, __LINE__);
287 break;
288 }
289 /* else intentional fallthru */
290 case IDM_EDITTEXT:
291 if (*editor)
292 ExecOnList((HWND) 0, editor, WINDOWED | SEPARATE, NULL, dummy, NULL,
293 pszSrcFile, __LINE__);
294 else {
295 type = (type == IDM_EDITTEXT) ? 8 : (type == IDM_EDITBINARY) ? 16 : 0;
296 type |= 4;
297 StartMLEEditor(hwndParent, type, filename, hwndFrame);
298 }
299 break;
300 }
301 return;
302 }
303
304 if (ExecAssociation(hwnd, filename) == -1) {
305 hwndArc = StartArcCnr((fExternalArcboxes || !swp ||
306 strcmp(realappname, FM3Str)) ?
307 HWND_DESKTOP :
308 hwndParent, hwndFrame, filename, 4, NULL);
309 if (!hwndArc) {
310 if (!fCheckMM || !ShowMultimedia(filename)) {
311 if (!IsExecutable(filename) || !ExecFile(hwnd, filename)) {
312 p = strrchr(filename, '.');
313 if (!p)
314 p = ".";
315 if (stricmp(p, ".INI") || !StartIniEditor(hwndParent, filename, 4)) {
316 if (stricmp(p, ".HLP") || !ViewHelp(filename)) {
317 ViewIt:
318 if (*viewer) {
319 dummy[0] = filename;
320 dummy[1] = NULL;
321 ExecOnList(hwnd,
322 viewer,
323 WINDOWED | SEPARATE |
324 ((fViewChild) ? CHILD : 0), NULL, dummy, NULL,
325 pszSrcFile, __LINE__);
326 }
327 else if (fUseNewViewer) {
328 if (fExternalViewer || strcmp(realappname, FM3Str))
329 hwndParent = HWND_DESKTOP;
330 StartViewer(hwndParent, 5, filename, hwndFrame);
331 }
332 else
333 StartMLEEditor(hwndParent, 5, filename, hwndFrame);
334 }
335 }
336 }
337 }
338 }
339 else {
340 if ((swp &&
341 !fExternalArcboxes &&
342 !strcmp(realappname, FM3Str)) &&
343 !ParentIsDesktop(hwnd, hwndParent))
344 WinSetWindowPos(hwndArc,
345 HWND_TOP,
346 swp->x,
347 swp->y,
348 swp->cx,
349 swp->cy,
350 SWP_MOVE | SWP_SIZE | SWP_SHOW |
351 SWP_ZORDER | SWP_ACTIVATE);
352 }
353 }
354}
355
356#pragma alloc_text(DEFVIEW,DefaultView,ShowMultimedia,DefaultViewKeys)
Note: See TracBrowser for help on using the repository browser.