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
RevLine 
[92]1
2/***********************************************************************
3
4 $Id: defview.c 570 2007-03-19 03:19:33Z gyoung $
5
6 Copyright (c) 1993-98 M. Kimes
[570]7 Copyright (c) 2003, 2007 Steven H.Levine
[92]8
[347]9 Default file viewer
[92]10
[347]11 20 Nov 03 SHL ShowMultimedia: try to convince fmplay to not play exes (Gregg Young)
12 14 Jul 06 SHL Use Runtime_Error
[570]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
[92]15
16***********************************************************************/
17
[2]18#define INCL_DOS
19#define INCL_WIN
20#define INCL_GPI
21#define INCL_MMIOOS2
22#include <os2.h>
23#include <os2me.h>
[347]24
[2]25#include <stdio.h>
26#include <stdlib.h>
27#include <string.h>
28#include <ctype.h>
[347]29
[2]30#include "fm3dll.h"
31#include "fm3dlg.h"
32
[347]33static PSZ pszSrcFile = __FILE__;
34
[2]35#pragma alloc_text(DEFVIEW,DefaultView,ShowMultimedia,DefaultViewKeys)
36
[551]37BOOL ShowMultimedia(CHAR * filename)
[92]38{
[2]39
[551]40 static BOOL no_mmos2 = FALSE;
41 BOOL played = FALSE;
42 CHAR loaderror[CCHMAXPATH];
43 HMODULE MMIOModHandle = NULLHANDLE;
[92]44 PMMIOIDENTIFYFILE pMMIOIdentifyFile = NULL;
[570]45 PMMIOGETINFO pMMIOGetInfo = NULL;
46 PMMIOCLOSE pMMIOClose = NULL;
47 PMMIOOPEN pMMIOOpen = NULL;
48 MMIOINFO mmioinfo;
49 HMMIO hmmio;
[551]50 FOURCC fccStorageSystem = 0;
51 MMFORMATINFO mmFormatInfo;
[570]52 APIRET rc, rc1;
53 HWND hwnd;
54 char *p;
[2]55
[551]56 if (no_mmos2 || !filename || !*filename)
[92]57 return played;
[2]58
59 /* load MMPM/2, if available. */
60 *loaderror = 0;
[551]61 rc = DosLoadModule(loaderror, sizeof(loaderror), "MMIO", &MMIOModHandle);
[92]62 if (rc) {
63 no_mmos2 = TRUE;
64 return played;
[2]65 }
66 else {
[92]67 if (DosQueryProcAddr(MMIOModHandle,
[551]68 0,
69 "mmioIdentifyFile", (PFN *) & pMMIOIdentifyFile)) {
[2]70 DosFreeModule(MMIOModHandle);
[92]71 no_mmos2 = TRUE;
72 return played;
[2]73 }
[570]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 }
[2]95 }
96
97 /* attempt to identify the file using MMPM/2 */
[570]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);
[551]139 memset(&mmFormatInfo, 0, sizeof(MMFORMATINFO));
[2]140 mmFormatInfo.ulStructLen = sizeof(MMFORMATINFO);
[92]141 rc = pMMIOIdentifyFile(filename,
[570]142 &mmioinfo,
[92]143 &mmFormatInfo,
[570]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);*/
[2]151 /* free module handle */
[570]152 rc1 = pMMIOClose(hmmio, 0L);
[2]153 DosFreeModule(MMIOModHandle);
154
[92]155 /* if identified and not FOURCC_DOS */
[551]156 if (!rc && mmFormatInfo.fccIOProc != FOURCC_DOS) {
[92]157 if (mmFormatInfo.ulMediaType == MMIO_MEDIATYPE_IMAGE &&
[551]158 (mmFormatInfo.ulFlags & MMIO_CANREADTRANSLATED)) {
[92]159 /* is an image that can be translated */
[2]160 runemf2(SEPARATE | WINDOWED,
[92]161 HWND_DESKTOP,
162 NULL,
163 NULL,
164 "%sIMAGE.EXE \"%s\"",
[551]165 (fAddUtils) ? "UTILS\\" : NullStr, filename);
[92]166 played = TRUE;
[2]167 }
[92]168 else if (mmFormatInfo.ulMediaType != MMIO_MEDIATYPE_IMAGE) {
[570]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);
[92]184 played = TRUE;
[2]185 }
186 }
187
[92]188 return played;
[2]189}
190
[551]191VOID DefaultViewKeys(HWND hwnd, HWND hwndFrame, HWND hwndParent,
192 SWP * swp, CHAR * filename)
[347]193{
[551]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);
[2]200 else
[551]201 DefaultView(hwnd, hwndFrame, hwndParent, swp, 0, filename);
[2]202}
203
[551]204VOID DefaultView(HWND hwnd, HWND hwndFrame, HWND hwndParent, SWP * swp,
205 ULONG flags, CHAR * filename)
[347]206{
[2]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
[551]218 HWND hwndArc = (HWND) 0;
219 char *p, *dummy[3];
[2]220
[551]221 if (!hwndParent)
[2]222 hwndParent = HWND_DESKTOP;
223
[551]224 if (flags & 32) {
[2]225 flags &= (~16);
[551]226 if (!IsFile(filename)) {
[347]227 Runtime_Error(pszSrcFile, __LINE__, "%s not found", filename);
[2]228 return;
229 }
230 }
231
[551]232 if (flags & 1) /* directly view the file */
[2]233 goto ViewIt;
234
[551]235 if (flags & 2) { /* open default WPS view of file */
236 OpenObject(filename, Default, hwnd);
[2]237 return;
238 }
239
[551]240 if (flags & 4) { /* open WPS settings notebook for file */
241 OpenObject(filename, Settings, hwnd);
[2]242 return;
243 }
244
[551]245 if ((flags & 16) || !IsFile(filename)) { /* open info for directories */
[2]246
247 char fullname[CCHMAXPATH];
248
[551]249 if (!IsFullName(filename)) {
250 if (!DosQueryPathInfo(filename,
251 FIL_QUERYFULLNAME, fullname, sizeof(fullname)))
[92]252 filename = fullname;
[2]253 }
[551]254 if (IsFullName(filename) &&
255 !(driveflags[toupper(*filename) - 'A'] & DRIVE_INVALID)) {
256 if (!IsRoot(filename)) {
[92]257 dummy[0] = filename;
258 dummy[1] = NULL;
259 WinDlgBox(HWND_DESKTOP,
260 HWND_DESKTOP,
[551]261 FileInfoProc, FM3ModHandle, FLE_FRAME, (PVOID) dummy);
[2]262 }
263 else
[92]264 WinDlgBox(HWND_DESKTOP,
265 HWND_DESKTOP,
[551]266 DrvInfoProc, FM3ModHandle, INFO_FRAME, (PVOID) filename);
[2]267 }
268 return;
269 }
270
[551]271 if (flags & 8) { /* edit file */
[2]272
273 ULONG type = IDM_EDITTEXT;
274
275 dummy[0] = filename;
276 dummy[1] = NULL;
[551]277 if (TestBinary(filename))
[2]278 type = IDM_EDITBINARY;
[551]279 switch (type) {
280 case IDM_EDITBINARY:
281 if (*bined) {
282 ExecOnList((HWND) 0, bined, WINDOWED | SEPARATE, NULL, dummy, NULL);
283 break;
284 }
[2]285 /* else intentional fallthru */
[551]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;
[2]295 }
296 return;
297 }
298
[551]299 if (ExecAssociation(hwnd, filename) == -1) {
[2]300 hwndArc = StartArcCnr((fExternalArcboxes || !swp ||
[551]301 strcmp(realappname, FM3Str)) ?
[92]302 HWND_DESKTOP :
[551]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)
[92]309 p = ".";
[551]310 if (stricmp(p, ".INI") || !StartIniEditor(hwndParent, filename, 4)) {
311 if (stricmp(p, ".HLP") || !ViewHelp(filename)) {
312 ViewIt:
313 if (*viewer) {
[92]314 dummy[0] = filename;
315 dummy[1] = NULL;
316 ExecOnList(hwnd,
317 viewer,
318 WINDOWED | SEPARATE |
[551]319 ((fViewChild) ? CHILD : 0), NULL, dummy, NULL);
[92]320 }
321 else
[551]322 StartMLEEditor(hwndParent, 5, filename, hwndFrame);
[92]323 }
324 }
325 }
[2]326 }
327 }
328 else {
[551]329 if ((swp &&
330 !fExternalArcboxes &&
331 !strcmp(realappname, FM3Str)) &&
332 !ParentIsDesktop(hwnd, hwndParent))
[92]333 WinSetWindowPos(hwndArc,
334 HWND_TOP,
335 swp->x,
336 swp->y,
337 swp->cx,
338 swp->cy,
[551]339 SWP_MOVE | SWP_SIZE | SWP_SHOW |
[92]340 SWP_ZORDER | SWP_ACTIVATE);
[2]341 }
342 }
343}
Note: See TracBrowser for help on using the repository browser.