source: trunk/dll/defview.c@ 627

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

Eliminate global fAddUtils so can search both path and \utils for FM2PLAY.EXE & Image.exe

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