windows-nt/Source/XPSP1/NT/base/win32/fusion/xmlparser/encodingstream.hxx
2020-09-26 16:20:57 +08:00

205 lines
5.6 KiB
C++

/////////////////////////////////////////////////////////////////////////////////
//
// fusion\xmlparser\EncodingStream.hxx
//
/////////////////////////////////////////////////////////////////////////////////
#ifndef _FUSION_XMLPARSER__ENCODINGSTREAM_H_INCLUDE_
#define _FUSION_XMLPARSER__ENCODINGSTREAM_H_INCLUDE_
#pragma once
#include "codepage.h"
#include "charencoder.hxx"
#include "core.hxx" //UNUSED() is used
#include <ole2.h>
#include <xmlparser.h>
#include <objbase.h>
typedef _reference<IStream> RStream;
#include <crtdbg.h>
#define Assert(x) _ASSERT(x)
class EncodingStream : public _unknown<IStream, &IID_IStream>
{
protected:
EncodingStream(IStream * stream);
~EncodingStream();
public:
// create an EncodingStream for input
static IStream * newEncodingStream(IStream * stream);
#ifdef FUSION_USE_OLD_XML_PARSER_SOURCE
// create an EncodingStream for OUTPUT
static IStream * EncodingStream::newEncodingStream(IStream * stream, Encoding * encoding);
#endif
HRESULT STDMETHODCALLTYPE Read(void * pv, ULONG cb, ULONG * pcbRead);
#ifdef FUSION_USE_OLD_XML_PARSER_SOURCE
HRESULT STDMETHODCALLTYPE Write(void const* pv, ULONG cb, ULONG * pcbWritten);
#else
HRESULT STDMETHODCALLTYPE Write(void const* pv, ULONG cb, ULONG * pcbWritten)
{
UNUSED(pv);
UNUSED(cb);
UNUSED(pcbWritten);
return E_NOTIMPL;
}
#endif
virtual HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER * plibNewPosition)
{
UNUSED(dlibMove);
UNUSED(dwOrigin);
UNUSED(plibNewPosition);
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE SetSize(ULARGE_INTEGER libNewSize)
{
UNUSED(libNewSize);
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE CopyTo(IStream * pstm, ULARGE_INTEGER cb, ULARGE_INTEGER * pcbRead, ULARGE_INTEGER * pcbWritten)
{
UNUSED(pstm);
UNUSED(cb);
UNUSED(pcbRead);
UNUSED(pcbWritten);
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE Commit(DWORD grfCommitFlags)
{
return stream->Commit(grfCommitFlags);
}
virtual HRESULT STDMETHODCALLTYPE Revert(void)
{
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE LockRegion( ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
{
UNUSED(libOffset);
UNUSED(cb);
UNUSED(dwLockType);
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE UnlockRegion(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
{
UNUSED(libOffset);
UNUSED(cb);
UNUSED(dwLockType);
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG * pstatstg, DWORD grfStatFlag)
{
UNUSED(pstatstg);
UNUSED(grfStatFlag);
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE Clone(IStream ** ppstm)
{
UNUSED(ppstm);
return E_NOTIMPL;
}
///////////////////////////////////////////////////////////
// public methods
//
/**
* Defines the character encoding of the input stream.
* The new character encoding must agree with the encoding determined by the constructer.
* setEncoding is used to clarify between encodings that are not fully determinable
* through the first four bytes in a stream and not to change the encoding.
* This method must be called within BUFFERSIZE reads() after construction.
*/
HRESULT switchEncodingAt(Encoding * newEncoding, int newPosition);
#ifdef FUSION_USE_OLD_XML_PARSER_SOURCE
/**
* Gets encoding
*/
Encoding * getEncoding();
#endif
// For Read EncodingStreams, this method can be used to push raw data
// which is an alternate approach to providing another IStream.
HRESULT AppendData(const BYTE* buffer, ULONG length, BOOL lastBuffer);
HRESULT BufferData();
void setReadStream(bool flag) { _fReadStream = flag; }
#ifdef FUSION_USE_OLD_XML_PARSER_SOURCE
void SetMimeType(const WCHAR * pwszMimeType, int length);
void SetCharset(const WCHAR * pwszCharset, int length);
#endif
private:
/**
* Buffer Size
*/
static const int BUFFERSIZE;
HRESULT autoDetect();
HRESULT prepareForInput(ULONG minlen);
/**
* Character encoding variables : xiaoyu: only encoding is used for reading, other three used for writeXML
*/
CODEPAGE codepage; // code page number
Encoding * encoding; // encoding
//bool _fTextXML; // MIME type, true: "text/xml", false: "application/xml"
//bool _fSetCharset; // Whether the charset has been set from outside. e.g, when mime type text/xml or application/xml
// has charset parameter
/**
* Multibyte buffer
*/
BYTE *buf; // storage for multibyte bytes
ULONG bufsize;
UINT bnext; // point to next available byte in the rawbuffer
ULONG btotal; // total number of bytes in the rawbuffer
int startAt; // where the buffer starts at in the input stream
/**
* Function pointer to convert from multibyte to unicode
*/
WideCharFromMultiByteFunc * pfnWideCharFromMultiByte;
#ifdef FUSION_USE_OLD_XML_PARSER_SOURCE
/**
* Function pointer to convert from unicode to multibytes
*/
WideCharToMultiByteFunc * pfnWideCharToMultiByte;
#endif
UINT maxCharSize; // maximum number of bytes of a wide char
// xiaoyu : used for writeXML,
RStream stream;
bool isInput;
bool lastBuffer;
bool _fEOF;
bool _fUTF8BOM;
bool _fReadStream; // lets Read() method call Read() on wrapped stream object.
DWORD _dwMode; // MLANG context.
};
typedef _reference<EncodingStream> REncodingStream;
#endif _FUSION_XMLPARSER__ENCODINGSTREAM_H_INCLUDE_