Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

317 lines
7.9 KiB

/*************************************************************************
PC-WIIS File Input/Output routines
This module contains all the entry points for WRITE.
15-apr-90 steve sherman extracted from fiowrite.c
*************************************************************************/
#include "abridge.h"
#include <windows.h>
#include <fcntl.h>
#include "wic.h"
#include "oifile.h"
#include "oierror.h"
#include "oicmp.h"
#include "filing.h"
#include "engdisp.h"
// 9504.14 jar added conditional
#ifndef MSWINDOWS
#define MSWINDOWS
#endif
#include "wgfs.h"
//#include "oiuidll.h"
#ifdef TIMESTAMP
#include "timestmp.h"
#endif
#ifdef DEBUGIT
#include "monit.h"
#endif
//#define OI_PERFORM_LOG
#ifdef OI_PERFORM_LOG
#define Enterclose "Entering IMGFileClose"
#define Exitclose "Exiting IMGFileClose"
#include "logtool.h"
#endif
int FAR PASCAL IMGFileDeleteFileNC (HWND, LPSTR);
/*************************************************************************/
//*********************************************************************
//
// IMGFileClose
//
//*********************************************************************
// 9504.05 jar return as int
//WORD FAR PASCAL IMGFileClose(hFileID, window_handle)
// HANDLE hFileID;
// HWND window_handle;
int FAR PASCAL IMGFileClose( HANDLE hFileID, HWND window_handle)
{
lp_INFO lpGFSInfoOut;
// 9504.05 jar return int
//WORD status;
int status;
FIO_HANDLE output_fio;
LPSTR lp_real_file;
LPSTR lp_file_name;
LP_FIO_DATA lp_fio_data;
HANDLE hSaveName=0;
HWND hParent;
LPSTR lp_save_name;
char ServerFile[MAXFILESPECLENGTH];
WORD wFlag;
struct _shuffle PageToShuff;
DWORD dwOptstuff[2];
int errcode;
#ifdef OI_PERFORM_LOG
RecordIt("FILE", 5, LOG_ENTER, Enterclose, NULL);
#endif
status = SUCCESS;
if ( !(IsWindow ( window_handle )))
{
#ifdef OI_PERFORM_LOG
RecordIt("FILE", 5, LOG_EXIT, Exitclose, NULL);
#endif
return ( FIO_INVALID_WINDOW_HANDLE );
}
if ( (output_fio = FioGetProp ( window_handle, OUTPUT_DATA ))
&& (output_fio == hFileID))
{
if (!(lp_fio_data = (LP_FIO_DATA)GlobalLock(output_fio)))
{
IMGFileStopOutputHandler ( window_handle );
//UnlockData (0);
#ifdef OI_PERFORM_LOG
RecordIt("FILE", 5, LOG_EXIT, Exitclose, NULL);
#endif
return (status);
}
lpGFSInfoOut = (lp_INFO) GlobalLock ( lp_fio_data->hGFS_info );
if (!lpGFSInfoOut)
{
GlobalUnlock(output_fio);
IMGFileStopOutputHandler ( window_handle );
//UnlockData (0);
#ifdef OI_PERFORM_LOG
RecordIt("FILE", 5, LOG_EXIT, Exitclose, NULL);
#endif
return (FIO_GLOBAL_LOCK_FAILED);
}
// If following is true, we are inserting.
if ((lp_fio_data->page_opts == FIO_INSERT_PAGE) ||
(lp_fio_data->page_opts == FIO_OVERWRITE_PAGE))
{
PageToShuff.old_position = lp_fio_data->pgcnt + 1;
PageToShuff.new_position = lp_fio_data->pgnum;
if (PageToShuff.old_position != PageToShuff.new_position)
{
dwOptstuff[0] = (DWORD)(LPSTR)&PageToShuff;
status = wgfsopts(window_handle, lp_fio_data->filedes, SET, PAGE_INSERT,
(LPSTR)&PageToShuff, &errcode);
if (status)
{
GlobalLock (lp_fio_data->hGFS_info);
GlobalUnlock(output_fio);
#ifdef OI_PERFORM_LOG
RecordIt("FILE", 5, LOG_EXIT, Exitclose, NULL);
#endif
return (status);
}
}
}
status = close_output_file(window_handle, output_fio);
if (lp_fio_data->bTempFile)
{
if (!(lp_real_file = GlobalLock(lp_fio_data->hreal_file)))
{
/* big boo boo - EXIT */
status = FIO_GLOBAL_LOCK_FAILED;
goto DONTCOPY;
}
if (!(lp_file_name = GlobalLock(lp_fio_data->hfile_name)))
{
/* big boo boo - EXIT */
status = FIO_GLOBAL_LOCK_FAILED;
goto DONTCOPY;
}
if (lp_fio_data->over_write_file)
wFlag = OVERWRITEFLAG;
else
wFlag = 0;
/* save the filenames so we can do something after close */
lstrcpy(ServerFile,lp_real_file);
lp_save_name = lp_real_file;
lstrcpy(lp_save_name,lp_file_name);
/* we had an error during a write operation. We do not want
to copy the temp file over the existing original file */
if (lp_fio_data->Copy_Temp_File == FALSE)
hSaveName = 0;
else
hSaveName = lp_fio_data->hreal_file;
}
DONTCOPY:
if ( (lp_fio_data->hreal_file) && (!hSaveName) )
{
/* delete the temp file, it's garbage */
IMGFileDeleteFile(window_handle, lp_save_name);
hSaveName = 0;
GlobalUnlock(lp_fio_data->hreal_file);
GlobalFree(lp_fio_data->hreal_file);
lp_fio_data->hreal_file= 0;
}
if (output_fio)
{
GlobalUnlock(lp_fio_data->hGFS_info);
GlobalUnlock(output_fio);
}
IMGFileStopOutputHandler ( window_handle );
if (hSaveName)
{
/* delete the original,file, then rename the temp file to 'real' file name */
switch (lp_fio_data->page_opts)
{
case FIO_APPEND_PAGE:
FioCacheUpdate(window_handle,ServerFile,0,CACHE_UPDATE_APPEND);
break;
case FIO_INSERT_PAGE:
FioCacheUpdate(window_handle,ServerFile,lp_fio_data->pgnum,CACHE_UPDATE_INSERT_BEFORE);
break;
case FIO_OVERWRITE_PAGE:
FioCacheUpdate(window_handle,ServerFile,lp_fio_data->pgnum,CACHE_UPDATE_OVERWRITE_PAGE);
break;
}
IMGFileDeleteFileNC(window_handle, ServerFile);
status = IMGFileRenameFile(window_handle, lp_save_name, ServerFile);
GlobalUnlock(hSaveName);
GlobalFree(hSaveName);
}
#ifdef DEBUGIT
monit1("imgfileclose status =%x\n",(int)status);
#endif
#ifdef OI_PERFORM_LOG
RecordIt("FILE", 5, LOG_EXIT, Exitclose, NULL);
#endif
return (status);
} /* end IMGGetProp */
else
/* We must have an input file (or there's an error) */
{
status = SearchForPropList(window_handle, hFileID, (LPHANDLE)&hParent);
if (status == FIO_FILE_PROP_FOUND)
status = 0;
if (!status)
if (!(lp_fio_data = (LP_FIO_DATA) GlobalLock(hFileID)))
status=FIO_PROPERTY_LIST_ERROR;
if (status)
{
#ifdef OI_PERFORM_LOG
RecordIt("FILE", 5, LOG_EXIT, Exitclose, NULL);
#endif
return (status);
}
/* If we have a temporary file, save its name for later Delete */
/* Note that we can use the hreal_file string for this */
if (lp_fio_data->bTempFile)
{
hSaveName = lp_fio_data->hreal_file;
if (lp_save_name = GlobalLock(hSaveName))
{
if (lp_file_name = GlobalLock(lp_fio_data->hfile_name))
{
lstrcpy(lp_save_name,lp_file_name);
GlobalUnlock(lp_fio_data->hfile_name);
}
else
{
GlobalUnlock(hSaveName);
GlobalFree(hSaveName);
hSaveName = 0;
}
}
else
hSaveName = 0;
/* Don't keep this locked across calls */
if (hSaveName);
GlobalUnlock(hSaveName);
}
/* Note: This call will release all allocated memory and close file. */
GlobalUnlock(hFileID);
status = IMGFileStopInputHandlerm (window_handle, hFileID);
if (status)
{
if (hSaveName)
GlobalFree(hSaveName);
#ifdef OI_PERFORM_LOG
RecordIt("FILE", 5, LOG_EXIT, Exitclose, NULL);
#endif
return (status);
}
/* Now see if we need to get rid of the temporary file */
/* We already locked this once before, so it should be OK */
if (hSaveName)
{
if (GlobalLock(hSaveName))
{
IMGFileDeleteFile(window_handle, lp_save_name);
GlobalUnlock(hSaveName);
GlobalFree(hSaveName);
}
}
#ifdef OI_PERFORM_LOG
RecordIt("FILE", 5, LOG_EXIT, Exitclose, NULL);
#endif
return status;
}
}