282 lines
6.8 KiB
C
282 lines
6.8 KiB
C
|
/* (C) Microsoft Corp., 1991. All rights reserved. */
|
||
|
|
||
|
/* mapcopy.c - duplicates the MIDIMAP.CFG file because of poor design
|
||
|
* !!!!!!!!!!!! THIS IS NEEDLESS GRATUITIOUS CODE !!!!!!!!!!!!!!!!!!!
|
||
|
* The MIDIMAP and applet were badly implemented and because of design
|
||
|
* flaws needed this gratuitous file copy to back up the configuration
|
||
|
* file.
|
||
|
*/
|
||
|
|
||
|
#include<windows.h>
|
||
|
#include <mmsystem.h>
|
||
|
#if defined(WIN32)
|
||
|
#include <port1632.h>
|
||
|
#endif
|
||
|
#include "hack.h"
|
||
|
#include"midimap.h"
|
||
|
#include "extern.h"
|
||
|
#include "midi.h"
|
||
|
|
||
|
#define MAXBUF (10 * 1024) // size of default copy buffer
|
||
|
#define FOPEN(sz) (_lopen(sz,OF_READ|OF_SHARE_DENY_NONE))
|
||
|
#define FCREATE(sz) (_lcreat(sz,0))
|
||
|
#define FCLOSE(fh) (_lclose(fh))
|
||
|
#define FREAD(fh,buf,len) (_lread(fh,buf,len))
|
||
|
#define FWRITE(fh,buf,len) (_lwrite(fh,buf,len))
|
||
|
#define FALLOC(n) (LPVOID)GlobalLock(GlobalAlloc(GMEM_MOVEABLE, (DWORD)(n)))
|
||
|
#define FFREE(n) (GlobalUnlock((HGLOBAL)HIWORD((DWORD)(n))),GlobalFree((HGLOBAL)HIWORD((DWORD)(n))))
|
||
|
#define SLASH(c) ((c) == '/' || (c) == '\\')
|
||
|
|
||
|
|
||
|
static int FileCopy(LPSTR szSrc, LPSTR szDst);
|
||
|
|
||
|
#if defined(WIN16)
|
||
|
|
||
|
static BOOL FileCopy(LPSTR,LPSTR);
|
||
|
static UINT GetFileAttributes(LPSTR);
|
||
|
static DWORD DosDiskFree ( BYTE bDrive );
|
||
|
|
||
|
static int DosCWDrive (VOID);
|
||
|
|
||
|
/*
|
||
|
* Get DOS file attributes
|
||
|
*/
|
||
|
static UINT GetFileAttributes(LPSTR lpszPath)
|
||
|
{
|
||
|
_asm {
|
||
|
push ds ; Preserve DS
|
||
|
lds dx,lpszPath ; DS:DI = lpszPath
|
||
|
mov ax,4300h ; Get File Attributes
|
||
|
int 21h
|
||
|
jc GFAErr
|
||
|
mov ax,cx ; AX = attribute
|
||
|
jmp GFAExit ; Return attribute
|
||
|
GFAErr: mov ah,80h ; Return negative error code
|
||
|
GFAExit:
|
||
|
pop ds ; Restore DS
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int FAR PASCAL DosDelete(LPSTR szFile)
|
||
|
{
|
||
|
_asm {
|
||
|
push ds ; Preserve DS
|
||
|
lds dx,szFile
|
||
|
mov ah,41h
|
||
|
int 21h
|
||
|
jc dexit
|
||
|
xor ax,ax
|
||
|
dexit:
|
||
|
pop ds ; Restore DS
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static DWORD DosDiskFree ( BYTE bDrive )
|
||
|
{
|
||
|
WORD wSectors,wBytes,wClusters;
|
||
|
|
||
|
_asm {
|
||
|
mov dl,bDrive
|
||
|
mov ah,36h
|
||
|
int 21h
|
||
|
mov wSectors,ax
|
||
|
mov wClusters,bx
|
||
|
mov wBytes,cx
|
||
|
}
|
||
|
|
||
|
if (wSectors == 0xffff)
|
||
|
return -1;
|
||
|
else
|
||
|
return ((DWORD)wClusters*(DWORD)wSectors*(DWORD)wBytes);
|
||
|
}
|
||
|
|
||
|
static int DosCWDrive ()
|
||
|
{
|
||
|
_asm {
|
||
|
mov ah,19h ; Get Current Drive
|
||
|
int 21h
|
||
|
sub ah,ah ; Zero out AH
|
||
|
}
|
||
|
}
|
||
|
#endif //WIN16
|
||
|
|
||
|
/*
|
||
|
* Create a duplicate map file for editing
|
||
|
*/
|
||
|
|
||
|
BOOL FAR PASCAL DupMapCfg(LPSTR lpstrCfgPath, LPSTR lpstrBakPath)
|
||
|
{
|
||
|
extern BOOL fReadOnly;
|
||
|
UINT uAttr;
|
||
|
OFSTRUCT of;
|
||
|
int err;
|
||
|
char szFunc[50],szMessage[256];
|
||
|
|
||
|
if (OpenFile(lpstrCfgPath,&of,OF_EXIST|OF_SHARE_DENY_NONE) == HFILE_ERROR)
|
||
|
{
|
||
|
// We need to let the mapper create a new one.
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
uAttr = GetFileAttributes(lpstrCfgPath);
|
||
|
if (uAttr != (UINT)(-1))
|
||
|
{
|
||
|
if (uAttr & FILE_ATTRIBUTE_READONLY)
|
||
|
{
|
||
|
|
||
|
LoadString(hLibInst, IDS_FCERR_WARN, szFunc, sizeof(szFunc));
|
||
|
LoadString(hLibInst, IDS_FCERR_READONLY, szMessage, sizeof(szMessage));
|
||
|
MessageBox(NULL, szMessage, szFunc,
|
||
|
MB_ICONEXCLAMATION | MB_OK);
|
||
|
|
||
|
fReadOnly = TRUE; // Stay Read Only for the remainder
|
||
|
return FALSE;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
return FALSE;
|
||
|
|
||
|
err = FileCopy(lpstrCfgPath,lpstrBakPath);
|
||
|
if (err != IDS_FCERR_SUCCESS)
|
||
|
{
|
||
|
LoadString(hLibInst, IDS_FCERR_ERROR, szFunc, sizeof(szFunc));
|
||
|
LoadString(hLibInst, err, szMessage, sizeof(szMessage));
|
||
|
MessageBox(NULL, szMessage, szFunc, MB_ICONHAND | MB_TASKMODAL
|
||
|
| MB_OK);
|
||
|
|
||
|
fReadOnly = TRUE; // Read Only if there is some kind of disk problem
|
||
|
return FALSE;
|
||
|
}
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Copy the duplicate map file over the original map file
|
||
|
*/
|
||
|
BOOL FAR PASCAL UpdateMapCfg(LPSTR lpstrCfgPath, LPSTR lpstrBakPath)
|
||
|
{
|
||
|
int err;
|
||
|
char szFunc[50],szMessage[256];
|
||
|
|
||
|
if ((err = FileCopy(lpstrBakPath,lpstrCfgPath)) != IDS_FCERR_SUCCESS)
|
||
|
{
|
||
|
LoadString(hLibInst, IDS_FCERR_ERROR, szFunc, sizeof(szFunc));
|
||
|
LoadString(hLibInst, err, szMessage, sizeof(szMessage));
|
||
|
MessageBox(NULL, szMessage, szFunc, MB_ICONHAND | MB_TASKMODAL
|
||
|
| MB_OK);
|
||
|
}
|
||
|
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
|
||
|
#if defined(WIN16)
|
||
|
|
||
|
/* So who was too lazy to write a comment? */
|
||
|
static int FileCopy(LPSTR szSrc,LPSTR szDst)
|
||
|
{
|
||
|
HFILE fhSrc,fhDst;
|
||
|
WORD size;
|
||
|
BOOL fComplete = TRUE;
|
||
|
OFSTRUCT of;
|
||
|
LPSTR lpbBuf;
|
||
|
DWORD dwSrcSize,dwDestFree;
|
||
|
BYTE bDrive;
|
||
|
int err;
|
||
|
|
||
|
if (OpenFile(szSrc,&of,OF_EXIST|OF_SHARE_DENY_NONE) == HFILE_ERROR)
|
||
|
{
|
||
|
err = IDS_FCERR_NOSRC;
|
||
|
goto exit; //ERROR:File Not Found
|
||
|
}
|
||
|
|
||
|
fhSrc = FOPEN(szSrc);
|
||
|
|
||
|
if (fhSrc == HFILE_ERROR)
|
||
|
{
|
||
|
err = IDS_FCERR_NOSRC;
|
||
|
return FALSE; //ERROR:File inaccessible
|
||
|
}
|
||
|
|
||
|
dwSrcSize = _llseek(fhSrc,0,2); //file size
|
||
|
_llseek(fhSrc,0,0);
|
||
|
|
||
|
if (*(szDst+1) == ':')
|
||
|
{
|
||
|
bDrive = (BYTE)(*(szDst) - 'A' + 1);
|
||
|
}
|
||
|
else
|
||
|
bDrive = (BYTE)(DosCWDrive() + 1);
|
||
|
|
||
|
|
||
|
if ((LONG)(dwDestFree = DosDiskFree(bDrive)) != -1)
|
||
|
{
|
||
|
if (dwSrcSize > dwDestFree)
|
||
|
{
|
||
|
err = IDS_FCERR_DISKFULL;
|
||
|
goto errclose1;
|
||
|
}
|
||
|
}
|
||
|
/* This failed on a wierd 386 machine for no good reason, so removed.
|
||
|
MM Bug 6277.
|
||
|
else
|
||
|
{
|
||
|
err = IDS_FCERR_DISK;
|
||
|
goto errclose1;
|
||
|
}
|
||
|
*/
|
||
|
|
||
|
lpbBuf = FALLOC(MAXBUF);
|
||
|
|
||
|
if (lpbBuf == NULL)
|
||
|
{
|
||
|
err = IDS_FCERR_LOMEM;
|
||
|
goto errclose1; //ERROR:Low Memory
|
||
|
}
|
||
|
|
||
|
fhDst = FCREATE(szDst);
|
||
|
|
||
|
if (fhDst == HFILE_ERROR)
|
||
|
{
|
||
|
err = IDS_FCERR_NODEST;
|
||
|
goto errfree; //ERROR:Couldn't create Destination
|
||
|
}
|
||
|
|
||
|
while (size = FREAD(fhSrc,lpbBuf,MAXBUF))
|
||
|
{
|
||
|
if (FWRITE(fhDst,lpbBuf,size) != size)
|
||
|
{
|
||
|
err = IDS_FCERR_WRITE;
|
||
|
goto errclose; //ERROR:Write Error
|
||
|
}
|
||
|
}
|
||
|
err = IDS_FCERR_SUCCESS;
|
||
|
|
||
|
errclose: // Close the Destination File
|
||
|
FCLOSE(fhDst);
|
||
|
errfree: // Free the buffer
|
||
|
FFREE(lpbBuf);
|
||
|
errclose1: // Close the Source File
|
||
|
FCLOSE(fhSrc);
|
||
|
exit:
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
#else
|
||
|
|
||
|
/* Copy the file szSrc to the file szDst, overwriting it if it already exists */
|
||
|
static int FileCopy(LPSTR szSrc, LPSTR szDst)
|
||
|
{
|
||
|
if (CopyFile(szSrc, szDst, FALSE)) {
|
||
|
return IDS_FCERR_SUCCESS;
|
||
|
} else {
|
||
|
switch (GetLastError()) {
|
||
|
// ??? This is throwing away valuable error information!
|
||
|
default:
|
||
|
return IDS_FCERR_NOSRC;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
} /* FileCopy */
|
||
|
#endif //WIN16
|