source: trunk/dll/defview.c@ 1164

Last change on this file since 1164 was 1164, checked in by John Small, 17 years ago

Ticket 187: Draft 1: Functions only

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