source: trunk/dll/defview.c@ 878

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

Added "Save as" and readonly file handling to internal editor; clean up ext path not checked on start up; Updated history.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 9.5 KB
Line 
1
2/***********************************************************************
3
4 $Id: defview.c 878 2007-11-26 13:20:00Z 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 hmmio = pMMIOOpen(filename,
116 &mmioinfo,
117 MMIO_READ | MMIO_NOIDENTIFY);
118 if (!hmmio){
119 DosFreeModule(MMIOModHandle);
120 printf("%s %d\n ", __FILE__, __LINE__); fflush(stdout);
121 return played;
122 }
123 }
124 else {
125 DosFreeModule(MMIOModHandle);
126 // printf("%s %d\n ", __FILE__, __LINE__); fflush(stdout);
127 return played;
128 }
129 }
130 if (!hmmio){
131 DosFreeModule(MMIOModHandle);
132 // printf("%s %d\n ", __FILE__, __LINE__); fflush(stdout);
133 return played;
134 }
135
136 rc1 = pMMIOGetInfo( hmmio,
137 &mmioinfo,
138 0L); //
139 //printf("%s %d\n ", __FILE__, __LINE__); fflush(stdout);
140 memset(&mmFormatInfo, 0, sizeof(MMFORMATINFO));
141 mmFormatInfo.ulStructLen = sizeof(MMFORMATINFO);
142 rc = pMMIOIdentifyFile(filename,
143 &mmioinfo,
144 &mmFormatInfo,
145 &fccStorageSystem, 0L,
146 MMIO_FORCE_IDENTIFY_FF);
147 /*printf("%s %d %d %d %d\n %d %d %d %s\n",
148 __FILE__, __LINE__,mmioinfo.ulFlags,
149 mmioinfo.pIOProc, mmioinfo.aulInfo,
150 mmFormatInfo.fccIOProc, mmFormatInfo.fccIOProc,
151 mmFormatInfo.ulIOProcType, mmFormatInfo.szDefaultFormatExt); fflush(stdout);*/
152 /* free module handle */
153 rc1 = pMMIOClose(hmmio, 0L);
154 DosFreeModule(MMIOModHandle);
155
156 /* if identified and not FOURCC_DOS */
157 if (!rc && mmFormatInfo.fccIOProc != FOURCC_DOS) {
158 if (mmFormatInfo.ulMediaType == MMIO_MEDIATYPE_IMAGE &&
159 (mmFormatInfo.ulFlags & MMIO_CANREADTRANSLATED)) {
160 // is an image that can be translated
161 RunFM2Util("IMAGE.EXE", filename);
162 played = TRUE;
163 }
164 else if (mmFormatInfo.ulMediaType != MMIO_MEDIATYPE_IMAGE) {
165 /* is a multimedia file (WAV, MID, AVI, etc.) */
166 p = strrchr(filename, '.');
167 if (!p)
168 p = ".";
169 /* printf("%s %d %s\n",
170 __FILE__, __LINE__, p); fflush(stdout);*/
171 if (!stricmp(p, ".OGG") || !stricmp(p, ".MP3") || !stricmp(p, ".FLAC"))
172 OpenObject(filename, Default, hwnd); //FM2Play fails to play these
173 else
174 RunFM2Util("FM2PLAY.EXE", filename);
175 played = TRUE;
176 }
177 }
178
179 return played;
180}
181
182VOID DefaultViewKeys(HWND hwnd, HWND hwndFrame, HWND hwndParent,
183 SWP * swp, CHAR * filename)
184{
185 if ((shiftstate & (KC_CTRL | KC_SHIFT)) == (KC_CTRL | KC_SHIFT))
186 DefaultView(hwnd, hwndFrame, hwndParent, swp, 4, filename);
187 else if (shiftstate & KC_CTRL)
188 DefaultView(hwnd, hwndFrame, hwndParent, swp, 2, filename);
189 else if (shiftstate & KC_SHIFT)
190 DefaultView(hwnd, hwndFrame, hwndParent, swp, 1, filename);
191 else
192 DefaultView(hwnd, hwndFrame, hwndParent, swp, 0, filename);
193}
194
195VOID DefaultView(HWND hwnd, HWND hwndFrame, HWND hwndParent, SWP * swp,
196 ULONG flags, CHAR * filename)
197{
198 /*
199 * bitmapped flags:
200 * ---------------
201 * 1 = View directly
202 * 2 = Open WPS default view
203 * 4 = Open WPS settings view
204 * 8 = Edit
205 * 16 = Info
206 * 32 = No view info
207 */
208
209 HWND hwndArc = (HWND) 0;
210 char *p, *dummy[3];
211
212 if (!hwndParent)
213 hwndParent = HWND_DESKTOP;
214
215 if (flags & 32) {
216 flags &= (~16);
217 if (!IsFile(filename)) {
218 Runtime_Error(pszSrcFile, __LINE__, "%s not found", filename);
219 return;
220 }
221 }
222
223 if (flags & 1) /* directly view the file */
224 goto ViewIt;
225
226 if (flags & 2) { /* open default WPS view of file */
227 OpenObject(filename, Default, hwnd);
228 return;
229 }
230
231 if (flags & 4) { /* open WPS settings notebook for file */
232 OpenObject(filename, Settings, hwnd);
233 return;
234 }
235
236 if ((flags & 16) || !IsFile(filename)) { /* open info for directories */
237
238 char fullname[CCHMAXPATH];
239
240 if (!IsFullName(filename)) {
241 if (!DosQueryPathInfo(filename,
242 FIL_QUERYFULLNAME, fullname, sizeof(fullname)))
243 filename = fullname;
244 }
245 if (IsFullName(filename) &&
246 !(driveflags[toupper(*filename) - 'A'] & DRIVE_INVALID)) {
247 if (!IsRoot(filename)) {
248 dummy[0] = filename;
249 dummy[1] = NULL;
250 WinDlgBox(HWND_DESKTOP,
251 HWND_DESKTOP,
252 FileInfoProc, FM3ModHandle, FLE_FRAME, (PVOID) dummy);
253 }
254 else
255 WinDlgBox(HWND_DESKTOP,
256 HWND_DESKTOP,
257 DrvInfoProc, FM3ModHandle, INFO_FRAME, (PVOID) filename);
258 }
259 return;
260 }
261
262 if (flags & 8) { /* edit file */
263
264 ULONG type = IDM_EDITTEXT;
265
266 dummy[0] = filename;
267 dummy[1] = NULL;
268 if (TestBinary(filename))
269 type = IDM_EDITBINARY;
270 switch (type) {
271 case IDM_EDITBINARY:
272 if (*bined) {
273 ExecOnList((HWND) 0, bined, WINDOWED | SEPARATE, NULL, dummy, NULL);
274 break;
275 }
276 /* else intentional fallthru */
277 case IDM_EDITTEXT:
278 if (*editor)
279 ExecOnList((HWND) 0, editor, WINDOWED | SEPARATE, NULL, dummy, NULL);
280 else {
281 type = (type == IDM_EDITTEXT) ? 8 : (type == IDM_EDITBINARY) ? 16 : 0;
282 type |= 4;
283 StartMLEEditor(hwndParent, type, filename, hwndFrame);
284 }
285 break;
286 }
287 return;
288 }
289
290 if (ExecAssociation(hwnd, filename) == -1) {
291 hwndArc = StartArcCnr((fExternalArcboxes || !swp ||
292 strcmp(realappname, FM3Str)) ?
293 HWND_DESKTOP :
294 hwndParent, hwndFrame, filename, 4, NULL);
295 if (!hwndArc) {
296 if (!fCheckMM || !ShowMultimedia(filename)) {
297 if (!IsExecutable(filename) || !ExecFile(hwnd, filename)) {
298 p = strrchr(filename, '.');
299 if (!p)
300 p = ".";
301 if (stricmp(p, ".INI") || !StartIniEditor(hwndParent, filename, 4)) {
302 if (stricmp(p, ".HLP") || !ViewHelp(filename)) {
303 ViewIt:
304 if (*viewer) {
305 dummy[0] = filename;
306 dummy[1] = NULL;
307 ExecOnList(hwnd,
308 viewer,
309 WINDOWED | SEPARATE |
310 ((fViewChild) ? CHILD : 0), NULL, dummy, NULL);
311 }
312 else if (fUseNewViewer) {
313 if (fExternalViewer || strcmp(realappname, FM3Str))
314 hwndParent = HWND_DESKTOP;
315 StartViewer(hwndParent, 5, filename, hwndFrame);
316 }
317 else
318 StartMLEEditor(hwndParent, 5, filename, hwndFrame);
319 }
320 }
321 }
322 }
323 }
324 else {
325 if ((swp &&
326 !fExternalArcboxes &&
327 !strcmp(realappname, FM3Str)) &&
328 !ParentIsDesktop(hwnd, hwndParent))
329 WinSetWindowPos(hwndArc,
330 HWND_TOP,
331 swp->x,
332 swp->y,
333 swp->cx,
334 swp->cy,
335 SWP_MOVE | SWP_SIZE | SWP_SHOW |
336 SWP_ZORDER | SWP_ACTIVATE);
337 }
338 }
339}
340
341#pragma alloc_text(DEFVIEW,DefaultView,ShowMultimedia,DefaultViewKeys)
Note: See TracBrowser for help on using the repository browser.