source: trunk/dll/defview.c@ 1120

Last change on this file since 1120 was 1120, checked in by Gregg Young, 17 years ago

Check TMP directory space warn if lee than 5 MiB prevent archiver from opening if less than 10 KiB (It hangs and can't be closed) (Ticket 214) Also some cleanup of the error messages for CheckDriveSpaceAvail.

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