source: trunk/dll/defview.c@ 887

Last change on this file since 887 was 887, checked in by Gregg Young, 18 years ago

Work around to fix MMPM code not opening .jpg files (ticket 105)

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