source: trunk/dll/defview.c@ 1164

Last change on this file since 1164 was 1164, checked in by John Small, 17 years ago

Ticket 187: Draft 1: Functions only

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