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
RevLine 
[92]1
2/***********************************************************************
3
4 $Id: defview.c 878 2007-11-26 13:20:00Z 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
[689]16 09 Jun 07 SHL ShowMultimedia: Initialize hwnd so that OpenObject might work
[793]17 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
[92]18
19***********************************************************************/
20
[2]21#define INCL_DOS
22#define INCL_WIN
23#define INCL_GPI
24#define INCL_MMIOOS2
25#include <os2.h>
26#include <os2me.h>
[347]27
[2]28#include <stdio.h>
29#include <stdlib.h>
30#include <string.h>
31#include <ctype.h>
[347]32
[2]33#include "fm3dll.h"
34#include "fm3dlg.h"
35
[347]36static PSZ pszSrcFile = __FILE__;
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];
44 HMODULE MMIOModHandle = NULLHANDLE;
[92]45 PMMIOIDENTIFYFILE pMMIOIdentifyFile = NULL;
[570]46 PMMIOGETINFO pMMIOGetInfo = NULL;
47 PMMIOCLOSE pMMIOClose = NULL;
48 PMMIOOPEN pMMIOOpen = NULL;
49 MMIOINFO mmioinfo;
50 HMMIO hmmio;
[551]51 FOURCC fccStorageSystem = 0;
52 MMFORMATINFO mmFormatInfo;
[570]53 APIRET rc, rc1;
[689]54 HWND hwnd = HWND_DESKTOP;
[570]55 char *p;
[2]56
[551]57 if (no_mmos2 || !filename || !*filename)
[92]58 return played;
[2]59
60 /* load MMPM/2, if available. */
61 *loaderror = 0;
[551]62 rc = DosLoadModule(loaderror, sizeof(loaderror), "MMIO", &MMIOModHandle);
[92]63 if (rc) {
64 no_mmos2 = TRUE;
65 return played;
[2]66 }
67 else {
[92]68 if (DosQueryProcAddr(MMIOModHandle,
[551]69 0,
70 "mmioIdentifyFile", (PFN *) & pMMIOIdentifyFile)) {
[2]71 DosFreeModule(MMIOModHandle);
[92]72 no_mmos2 = TRUE;
73 return played;
[2]74 }
[570]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 }
[2]96 }
97
98 /* attempt to identify the file using MMPM/2 */
[570]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);
[551]140 memset(&mmFormatInfo, 0, sizeof(MMFORMATINFO));
[2]141 mmFormatInfo.ulStructLen = sizeof(MMFORMATINFO);
[92]142 rc = pMMIOIdentifyFile(filename,
[570]143 &mmioinfo,
[92]144 &mmFormatInfo,
[570]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);*/
[2]152 /* free module handle */
[570]153 rc1 = pMMIOClose(hmmio, 0L);
[2]154 DosFreeModule(MMIOModHandle);
155
[92]156 /* if identified and not FOURCC_DOS */
[551]157 if (!rc && mmFormatInfo.fccIOProc != FOURCC_DOS) {
[92]158 if (mmFormatInfo.ulMediaType == MMIO_MEDIATYPE_IMAGE &&
[630]159 (mmFormatInfo.ulFlags & MMIO_CANREADTRANSLATED)) {
160 // is an image that can be translated
161 RunFM2Util("IMAGE.EXE", filename);
[92]162 played = TRUE;
[2]163 }
[92]164 else if (mmFormatInfo.ulMediaType != MMIO_MEDIATYPE_IMAGE) {
[570]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
[630]173 else
174 RunFM2Util("FM2PLAY.EXE", filename);
175 played = TRUE;
[2]176 }
177 }
178
[92]179 return played;
[2]180}
181
[551]182VOID DefaultViewKeys(HWND hwnd, HWND hwndFrame, HWND hwndParent,
183 SWP * swp, CHAR * filename)
[347]184{
[551]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);
[2]191 else
[551]192 DefaultView(hwnd, hwndFrame, hwndParent, swp, 0, filename);
[2]193}
194
[551]195VOID DefaultView(HWND hwnd, HWND hwndFrame, HWND hwndParent, SWP * swp,
196 ULONG flags, CHAR * filename)
[347]197{
[2]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
[551]209 HWND hwndArc = (HWND) 0;
210 char *p, *dummy[3];
[2]211
[551]212 if (!hwndParent)
[2]213 hwndParent = HWND_DESKTOP;
214
[551]215 if (flags & 32) {
[2]216 flags &= (~16);
[551]217 if (!IsFile(filename)) {
[347]218 Runtime_Error(pszSrcFile, __LINE__, "%s not found", filename);
[2]219 return;
220 }
221 }
222
[551]223 if (flags & 1) /* directly view the file */
[2]224 goto ViewIt;
225
[551]226 if (flags & 2) { /* open default WPS view of file */
227 OpenObject(filename, Default, hwnd);
[2]228 return;
229 }
230
[551]231 if (flags & 4) { /* open WPS settings notebook for file */
232 OpenObject(filename, Settings, hwnd);
[2]233 return;
234 }
235
[551]236 if ((flags & 16) || !IsFile(filename)) { /* open info for directories */
[2]237
238 char fullname[CCHMAXPATH];
239
[551]240 if (!IsFullName(filename)) {
241 if (!DosQueryPathInfo(filename,
242 FIL_QUERYFULLNAME, fullname, sizeof(fullname)))
[92]243 filename = fullname;
[2]244 }
[551]245 if (IsFullName(filename) &&
246 !(driveflags[toupper(*filename) - 'A'] & DRIVE_INVALID)) {
247 if (!IsRoot(filename)) {
[92]248 dummy[0] = filename;
249 dummy[1] = NULL;
250 WinDlgBox(HWND_DESKTOP,
251 HWND_DESKTOP,
[551]252 FileInfoProc, FM3ModHandle, FLE_FRAME, (PVOID) dummy);
[2]253 }
254 else
[92]255 WinDlgBox(HWND_DESKTOP,
256 HWND_DESKTOP,
[551]257 DrvInfoProc, FM3ModHandle, INFO_FRAME, (PVOID) filename);
[2]258 }
259 return;
260 }
261
[551]262 if (flags & 8) { /* edit file */
[2]263
264 ULONG type = IDM_EDITTEXT;
265
266 dummy[0] = filename;
267 dummy[1] = NULL;
[551]268 if (TestBinary(filename))
[2]269 type = IDM_EDITBINARY;
[551]270 switch (type) {
271 case IDM_EDITBINARY:
272 if (*bined) {
273 ExecOnList((HWND) 0, bined, WINDOWED | SEPARATE, NULL, dummy, NULL);
274 break;
275 }
[2]276 /* else intentional fallthru */
[551]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;
[2]286 }
287 return;
288 }
289
[551]290 if (ExecAssociation(hwnd, filename) == -1) {
[2]291 hwndArc = StartArcCnr((fExternalArcboxes || !swp ||
[551]292 strcmp(realappname, FM3Str)) ?
[92]293 HWND_DESKTOP :
[551]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)
[92]300 p = ".";
[551]301 if (stricmp(p, ".INI") || !StartIniEditor(hwndParent, filename, 4)) {
302 if (stricmp(p, ".HLP") || !ViewHelp(filename)) {
303 ViewIt:
304 if (*viewer) {
[92]305 dummy[0] = filename;
306 dummy[1] = NULL;
307 ExecOnList(hwnd,
308 viewer,
309 WINDOWED | SEPARATE |
[551]310 ((fViewChild) ? CHILD : 0), NULL, dummy, NULL);
[878]311 }
312 else if (fUseNewViewer) {
313 if (fExternalViewer || strcmp(realappname, FM3Str))
314 hwndParent = HWND_DESKTOP;
315 StartViewer(hwndParent, 5, filename, hwndFrame);
316 }
[92]317 else
[551]318 StartMLEEditor(hwndParent, 5, filename, hwndFrame);
[92]319 }
320 }
321 }
[2]322 }
323 }
324 else {
[551]325 if ((swp &&
326 !fExternalArcboxes &&
327 !strcmp(realappname, FM3Str)) &&
328 !ParentIsDesktop(hwnd, hwndParent))
[92]329 WinSetWindowPos(hwndArc,
330 HWND_TOP,
331 swp->x,
332 swp->y,
333 swp->cx,
334 swp->cy,
[551]335 SWP_MOVE | SWP_SIZE | SWP_SHOW |
[92]336 SWP_ZORDER | SWP_ACTIVATE);
[2]337 }
338 }
339}
[793]340
341#pragma alloc_text(DEFVIEW,DefaultView,ShowMultimedia,DefaultViewKeys)
Note: See TracBrowser for help on using the repository browser.