272 lines
9.7 KiB
C++
272 lines
9.7 KiB
C++
// ==========================================================================
|
|
// Class Specification : COXConvertedFile
|
|
// ==========================================================================
|
|
|
|
// Header file : convfile.h
|
|
|
|
// Version: 9.3
|
|
|
|
// This software along with its related components, documentation and files ("The Libraries")
|
|
// is © 1994-2007 The Code Project (1612916 Ontario Limited) and use of The Libraries is
|
|
// governed by a software license agreement ("Agreement"). Copies of the Agreement are
|
|
// available at The Code Project (www.codeproject.com), as part of the package you downloaded
|
|
// to obtain this file, or directly from our office. For a copy of the license governing
|
|
// this software, you may contact us at legalaffairs@codeproject.com, or by calling 416-849-8900.
|
|
|
|
// //////////////////////////////////////////////////////////////////////////
|
|
|
|
// Properties:
|
|
// YES Abstract class (does not have any objects)
|
|
// Pure functions : ConvertRead
|
|
// ConvertWrite
|
|
// YES Derived from CFile
|
|
|
|
// NO Is a Cwnd.
|
|
// NO Two stage creation (constructor & Create())
|
|
// NO Has a message map
|
|
// NO Needs a resource (template)
|
|
|
|
// NO Persistent objects (saveable on disk)
|
|
// Yes Uses exceptions (same as CFile)
|
|
|
|
// //////////////////////////////////////////////////////////////////////////
|
|
|
|
// Desciption :
|
|
// This class enhances the CFile bass class by enabling conversions
|
|
// Every block that is read from file or written to file is first
|
|
// converted by calling the pure virtual functions ConvertRead and ConvertWrite
|
|
// These conversion functions work with buffers of fixed size that must specified
|
|
// when a COXConvertedFile is constructed
|
|
|
|
// Remark:
|
|
// To enable the conversion blockwise are file functions are buffered until
|
|
// an entire block can be processed
|
|
// The actual file positioning occurs always with that specified size
|
|
// Blocks are padded with 0-characters
|
|
|
|
// Prerequisites (necessary conditions):
|
|
// ***
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
#ifndef __CONVFILE_H__
|
|
#define __CONVFILE_H__
|
|
|
|
#if _MSC_VER >= 1000
|
|
#pragma once
|
|
#endif // _MSC_VER >= 1000
|
|
|
|
#include "OXDllExt.h"
|
|
|
|
#include "watchbuf.h"
|
|
|
|
#ifndef LPCBYTE
|
|
#define LPCBYTE const unsigned char*
|
|
#endif
|
|
|
|
|
|
class OX_CLASS_DECL COXConvertedFile : public CFile
|
|
{
|
|
DECLARE_DYNAMIC(COXConvertedFile)
|
|
|
|
// Data members -------------------------------------------------------------
|
|
public:
|
|
|
|
protected:
|
|
BOOL m_bEnabled;
|
|
|
|
const UINT m_nBufferLength;
|
|
LPBYTE m_pOriginalBuffer;
|
|
COXWatchBuffer m_convertedBuffer;
|
|
|
|
int m_nBufferPos;
|
|
DWORD m_nFilePos;
|
|
BOOL m_bRead;
|
|
|
|
BOOL m_bOpenedForRead;
|
|
BOOL m_bOpenedForWrite;
|
|
|
|
CFile* m_pDelegateToFile;
|
|
|
|
private:
|
|
|
|
// Member functions ---------------------------------------------------------
|
|
public:
|
|
COXConvertedFile(UINT wBufferLength, BOOL bConvertEnabled = TRUE);
|
|
// --- In :wBufferLength : The length used for conversions
|
|
// bConvertEnabled : Whether conversion should be actually done
|
|
// --- Out :
|
|
// --- Returns :
|
|
// --- Effect : Contructor of object
|
|
// It will initialize the internal state
|
|
|
|
UINT GetBufferLength() const;
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns : The length of the internal buffer
|
|
// --- Effect :
|
|
|
|
BOOL IsConvertEnabled() const;
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns : Whether conversions are enabled or not
|
|
// --- Effect :
|
|
|
|
BOOL EnableConvert(BOOL bEnable = TRUE);
|
|
// --- In : bEnable : The new enable state
|
|
// --- Out :
|
|
// --- Returns : Whether it succeeds or not
|
|
// --- Effect : Enables or disables the file conversion
|
|
// This can only be done on buffer boundaries
|
|
// (So must be : GetPosition() % GetBufferLength() == 0)
|
|
|
|
WORD ForceEnableConvert(BOOL bEnable = TRUE);
|
|
// --- In : bEnable : The new enable state
|
|
// --- Out :
|
|
// --- Returns : The number of bytes skipped to reach th next buffer boundary
|
|
// --- Effect : Enables or disables the file conversion
|
|
// When this function is invoked and the buffer is not
|
|
// on a boundary (GetPosition() % GetBufferLength() != 0)
|
|
// bytes will be skipped until a boundary is reached
|
|
// When the file has been opened for writing, zero-characters
|
|
// will be written
|
|
|
|
virtual BOOL IsOpen() const;
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns : Whether the file has been opened and not yet closed
|
|
// --- Effect :
|
|
|
|
virtual BOOL ConvertRead(LPCBYTE pOriginal, LPBYTE pConverted) = 0;
|
|
// --- In : pOriginal : Buffer with original contents
|
|
// pConverted : Empty (but allocated) buffer
|
|
// --- Out : pConverted : Converted buffer
|
|
// --- Returns : Whether it succeeded or not
|
|
// Should always be TRUE for now
|
|
// --- Effect : Converts a block when it is read from file
|
|
// pOriginal contains the original file contents
|
|
// Both blocks have the length that was specified at construction time
|
|
|
|
virtual BOOL ConvertWrite(LPCBYTE pOriginal, LPBYTE pConverted) = 0;
|
|
// --- In : pOriginal : Buffer with original contents
|
|
// pConverted : Empty (but allocated) buffer
|
|
// --- Out : pConverted : Converted buffer
|
|
// --- Returns : Whether it succeeded or not
|
|
// Should always be TRUE for now
|
|
// --- Effect : Converts a block when it is written from file
|
|
// pConverted should contain the new file contents
|
|
// Both blocks have the length that was specified at construction time
|
|
|
|
// ANSI functions
|
|
virtual LPSTR ReadString(LPSTR psz, UINT nMax);
|
|
// --- In : psz : Specifies a pointer to a user-supplied buffer that will receive
|
|
// a null-terminated text string.
|
|
// nMax : Specifies the maximum number of characters to read.
|
|
// Should be one less than the size of the lpsz buffer.
|
|
// --- Out :
|
|
// --- Returns : A pointer to the buffer containing the text data;
|
|
// NULL if end-of-file was reached.
|
|
// --- Effect : This function completely mimics the CStdioFile::ReadString behaviour
|
|
// including the CR/LF - LF conversion and EOF-character detection
|
|
|
|
virtual void WriteString(LPCSTR psz);
|
|
// --- In : psz : Specifies a pointer to a buffer containing a null-terminated
|
|
// text string.
|
|
// --- Out :
|
|
// --- Returns :
|
|
// --- Effect : This function completely mimics the CStdioFile::WriteString behaviour
|
|
// including the CR/LF - LF conversion and EOF-character detection
|
|
|
|
#ifdef WIN32
|
|
// UNICODE functions
|
|
virtual LPSTR ReadString(LPWSTR psz, UINT nMax);
|
|
// --- In : psz : Specifies a pointer to a user-supplied buffer that will receive
|
|
// a null-terminated text string.
|
|
// nMax : Specifies the maximum number of characters to read.
|
|
// Should be one less than the size of the lpsz buffer.
|
|
// --- Out :
|
|
// --- Returns : A pointer to the buffer containing the text data;
|
|
// NULL if end-of-file was reached.
|
|
// --- Effect : This function completely mimics the CStdioFile::ReadString behaviour
|
|
// including the CR/LF - LF conversion and EOF-character detection
|
|
|
|
virtual void WriteString(LPCWSTR psz);
|
|
// --- In : psz : Specifies a pointer to a buffer containing a null-terminated
|
|
// text string.
|
|
// --- Out :
|
|
// --- Returns :
|
|
// --- Effect : This function completely mimics the CStdioFile::WriteString behaviour
|
|
// including the CR/LF - LF conversion and EOF-character detection
|
|
#endif
|
|
|
|
BOOL DelegateOpen(CFile* pDelegateToFile, UINT nOpenFlags);
|
|
// --- In : pDelegateToFile : The new file pointer to delegated to.
|
|
// nOpenFlags : The flags that will determine how this encrypted file should
|
|
// be treated.
|
|
// --- Out :
|
|
// --- Returns : succesfull or not
|
|
// --- Effect : This function enables this conversion to be inserted into a chain of transformations.
|
|
// This chaining requires a setup sequence of transformations. Via this function
|
|
// you tell this conversion on what file pointer he has to do his conversion.
|
|
// This file pointer can allready be converted himself, so that's the way to
|
|
// form a sequence of transformations. More specifically this file pointer replaces
|
|
// the CFile baseclass of this encrypted file. All calls to the baseclass will now
|
|
// be routed(delegated) to this file pointer, which is the next in the transformation chain.
|
|
|
|
BOOL UnDelegateOpen();
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns : succesfull or not
|
|
// --- Effect : Calling this function ensures that this transformation is not anymore
|
|
// chained to other transfromations. It's again a stand-alone transformation.
|
|
// The state where this object will be in after calling this function, is the
|
|
// same when the object was just constructed.
|
|
|
|
// The following functions are the overloaded versions of the original CFile functions
|
|
// They take care of the buffering and conversions
|
|
virtual BOOL Open(LPCTSTR pszFileName, UINT nOpenFlags, CFileException* pError = NULL);
|
|
|
|
virtual CFile* Duplicate() const;
|
|
#if _MFC_VER >= 0x0700
|
|
virtual ULONGLONG GetPosition() const;
|
|
virtual ULONGLONG GetLength() const;
|
|
#else
|
|
virtual DWORD GetPosition() const;
|
|
virtual DWORD GetLength() const;
|
|
#endif
|
|
virtual LONG Seek(LONG lOff, UINT nFrom);
|
|
virtual void SetLength(DWORD dwNewLen);
|
|
|
|
virtual UINT Read(void FAR* lpBuf, UINT nCount);
|
|
virtual void Write(const void FAR* lpBuf, UINT nCount);
|
|
|
|
virtual void LockRange(DWORD dwPos, DWORD dwCount);
|
|
virtual void UnlockRange(DWORD dwPos, DWORD dwCount);
|
|
|
|
virtual void Abort();
|
|
virtual void Flush();
|
|
virtual void Close();
|
|
|
|
#ifdef _DEBUG
|
|
virtual void Dump(CDumpContext&) const;
|
|
virtual void AssertValid() const;
|
|
#endif //_DEBUG
|
|
|
|
virtual ~COXConvertedFile();
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns :
|
|
// --- Effect : Destructor of object
|
|
|
|
protected:
|
|
DWORD GetLengthPrivate() const;
|
|
BOOL ReadBuffer();
|
|
void FlushBuffer();
|
|
void CheckBufferPosition();
|
|
|
|
private:
|
|
|
|
};
|
|
|
|
#endif
|
|
// ==========================================================================
|