source: trunk/dll/defview.c@ 570

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

Updated arc visible viewer child hang fix; fixed 70 misid of files by showMM

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