205 lines
5.6 KiB
C++
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_
|