// RichEditGS.cpp : implementation file
//
#include "stdafx.h"
#include "RichEditCtrlGS.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CRichEditCtrlGS
CRichEditCtrlGS::CRichEditCtrlGS()
{
}
CRichEditCtrlGS::~CRichEditCtrlGS()
{
}
BEGIN_MESSAGE_MAP(CRichEditCtrlGS, CRichEditCtrl)
//{{AFX_MSG_MAP(CRichEditCtrlGS)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
// Character and Font Attributes
int CRichEditCtrlGS::IsBold(void)
{ CHARFORMAT cf;
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask = CFM_BOLD;
DWORD dwSelMask = GetSelectionCharFormat(cf);
bool bConsistent = false; // BOLD inconsistent over the whole Selection
if( dwSelMask & CFM_BOLD )// BOLD consistent over the whole Selection?
{ bConsistent = true;
}
if( !bConsistent )
{ return (-1); // Set Button to indeterminate
}
if( cf.dwEffects & CFE_BOLD )
{ return(1); // Set Button to checked
}
return 0; // Set Button to unchecked
}
int CRichEditCtrlGS::IsItalic(void)
{ CHARFORMAT cf;
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask = CFM_ITALIC;
DWORD dwSelMask = GetSelectionCharFormat(cf);
bool bConsistent = false; // ITALIC inconsistent over the whole Selection
if( dwSelMask & CFM_ITALIC )// ITALIC consistent over the whole Selection?
{ bConsistent = true;
}
if( !bConsistent )
{ return (-1); // Set Button to indeterminate
}
if( cf.dwEffects & CFE_ITALIC )
{ return(1); // Set Button to checked
}
return 0; // Set Button to unchecked
}
int CRichEditCtrlGS::IsUnderlined(void)
{ CHARFORMAT cf;
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask = CFM_UNDERLINE;
DWORD dwSelMask = GetSelectionCharFormat(cf);
bool bConsistent = false; // UNDERLINE inconsistent over the whole Selection
if( dwSelMask & CFM_UNDERLINE )// UNDERLINE consistent over the whole Selection?
{ bConsistent = true;
}
if( !bConsistent )
{ return (-1); // Set Button to indeterminate
}
if( cf.dwEffects & CFE_UNDERLINE )
{ return(1); // Set Button to checked
}
return 0; // Set Button to unchecked
}
int CRichEditCtrlGS::IsStrikeout(void)
{ CHARFORMAT cf;
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask = CFM_STRIKEOUT;
DWORD dwSelMask = GetSelectionCharFormat(cf);
bool bConsistent = false; // STRIKEOUT inconsistent over the whole Selection
if( dwSelMask & CFM_STRIKEOUT )// STRIKEOUT consistent over the whole Selection?
{ bConsistent = true;
}
if( !bConsistent )
{ return (-1); // Set Button to indeterminate
}
if( cf.dwEffects & CFE_STRIKEOUT )
{ return(1); // Set Button to checked
}
return 0; // Set Button to unchecked
}
int CRichEditCtrlGS::IsProtected(void)
{ CHARFORMAT cf;
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask = CFM_PROTECTED;
DWORD dwSelMask = GetSelectionCharFormat(cf);
bool bConsistent = false; // PROTECTED inconsistent over the whole Selection
if( dwSelMask & CFM_PROTECTED )// PROTECTED consistent over the whole Selection?
{ bConsistent = true;
}
if( !bConsistent )
{ return (-1); // Set Button to indeterminate
}
if( cf.dwEffects & CFE_PROTECTED )
{ return(1); // Set Button to checked
}
return 0; // Set Button to unchecked
}
int CRichEditCtrlGS::IsLinked(void)
{ CHARFORMAT cf;
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask = CFM_LINK;
DWORD dwSelMask = GetSelectionCharFormat(cf);
bool bConsistent = false; // PROTECTED inconsistent over the whole Selection
if( dwSelMask & CFM_LINK )// PROTECTED consistent over the whole Selection?
{ bConsistent = true;
}
if( !bConsistent )
{ return (-1); // Set Button to indeterminate
}
if( cf.dwEffects & CFE_LINK )
{ return(1); // Set Button to checked
}
return 0; // Set Button to unchecked
}
void CRichEditCtrlGS::SetBold(void)
{ CHARFORMAT cf;
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask = CFM_BOLD;
DWORD dwSelMask = GetSelectionCharFormat(cf);
// If selection is all the same toggle BOLD style
// turn it on otherwise over the whole selection
if( (cf.dwMask & CFM_BOLD) & (dwSelMask & CFM_BOLD) )
{ cf.dwEffects ^= CFE_BOLD;
}
else
{ cf.dwEffects |= CFE_BOLD;
}
cf.dwMask = CFM_BOLD;
SetSelectionCharFormat(cf);
}
void CRichEditCtrlGS::SetItalic(void)
{ CHARFORMAT cf;
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask = CFM_ITALIC;
DWORD dwSelMask = GetSelectionCharFormat(cf);
// If selection is all the same toggle ITALIC style
// turn it on otherwise over the whole selection
if( (cf.dwMask & CFM_ITALIC) & (dwSelMask & CFM_ITALIC) )
{ cf.dwEffects ^= CFE_ITALIC;
}
else
{ cf.dwEffects |= CFE_ITALIC;
}
cf.dwMask = CFM_ITALIC;
SetSelectionCharFormat(cf);
}
void CRichEditCtrlGS::SetUnderlined(void)
{ CHARFORMAT cf;
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask = CFM_UNDERLINE;
DWORD dwSelMask = GetSelectionCharFormat(cf);
// If selection is all the same toggle UNDERLINE style
// turn it on otherwise over the whole selection
if( (cf.dwMask & CFM_UNDERLINE) & (dwSelMask & CFM_UNDERLINE) )
{ cf.dwEffects ^= CFE_UNDERLINE;
}
else
{ cf.dwEffects |= CFE_UNDERLINE;
}
cf.dwMask = CFM_UNDERLINE;
SetSelectionCharFormat(cf);
}
void CRichEditCtrlGS::SetStrikeout(void)
{ CHARFORMAT cf;
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask = CFM_STRIKEOUT;
DWORD dwSelMask = GetSelectionCharFormat(cf);
// If selection is all the same toggle STRIKEOUT style
// turn it on otherwise over the whole selection
if( (cf.dwMask & CFM_STRIKEOUT) & (dwSelMask & CFM_STRIKEOUT) )
{ cf.dwEffects ^= CFE_STRIKEOUT;
}
else
{ cf.dwEffects |= CFE_STRIKEOUT;
}
cf.dwMask = CFM_STRIKEOUT;
SetSelectionCharFormat(cf);
}
void CRichEditCtrlGS::SetProtected(void)
{ CHARFORMAT cf;
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask = CFM_PROTECTED;
DWORD dwSelMask = GetSelectionCharFormat(cf);
// If selection is all the same toggle PROTECTED style
// turn it on otherwise over the whole selection
if( (cf.dwMask & CFM_PROTECTED) & (dwSelMask & CFM_PROTECTED) )
{ cf.dwEffects ^= CFE_PROTECTED;
}
else
{ cf.dwEffects |= CFE_PROTECTED;
}
cf.dwMask = CFM_PROTECTED;
SetSelectionCharFormat(cf);
}
void CRichEditCtrlGS::SetLink(void)
{ CHARFORMAT cf;
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask = CFM_LINK;
DWORD dwSelMask = GetSelectionCharFormat(cf);
// If selection is all the same toggle PROTECTED style
// turn it on otherwise over the whole selection
if( (cf.dwMask & CFM_LINK) & (dwSelMask & CFM_LINK) )
{ cf.dwEffects ^= CFE_LINK;
}
else
{ cf.dwEffects |= CFE_LINK;
}
cf.dwMask = CFM_LINK;
SetSelectionCharFormat(cf);
}
int CRichEditCtrlGS::GetFontSize(void)
{ CHARFORMAT cf;
int nPointSize = 0;
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask = CFM_SIZE;
DWORD dwSelMask = GetSelectionCharFormat(cf);
// return only the font size it is the same over the whole selection
if( (cf.dwMask & CFM_SIZE) & (dwSelMask & CFM_SIZE) )
{ nPointSize = cf.yHeight/20;// convert from twips to points
}
return nPointSize;
}
void CRichEditCtrlGS::SetFontSize(int nPointSize)
{ CHARFORMAT cf;
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask = CFM_SIZE;
GetSelectionCharFormat(cf);
nPointSize *= 20; // convert from points to twips
cf.yHeight = nPointSize;
cf.dwMask = CFM_SIZE;
SetSelectionCharFormat(cf);
}
CString CRichEditCtrlGS::GetFontName(void)
{ CHARFORMAT cf;
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask = CFM_FACE;
DWORD dwSelMask = GetSelectionCharFormat(cf);
CString strName =_T("");
// return only the font name it is the same over the whole selection
if( (cf.dwMask & CFM_FACE) & (dwSelMask & CFM_FACE) )
{ strName = cf.szFaceName;
}
return strName;
}
void CRichEditCtrlGS::SetFontName(const CString strFontName)
{ CHARFORMAT cf;
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask = CFM_FACE;
GetSelectionCharFormat(cf);
CString strName = strFontName.Left(31);
for (int i = 0; i <= strName.GetLength()-1; i++)
cf.szFaceName[i] = strName[i];
cf.szFaceName[i]='\0';
cf.dwMask = CFM_FACE;
SetSelectionCharFormat(cf);
}
void CRichEditCtrlGS::SetColour(COLORREF color)
{ CHARFORMAT cf;
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask = CFM_COLOR;
GetSelectionCharFormat(cf);
cf.crTextColor = color;
if( cf.dwEffects & CFE_AUTOCOLOR )
{ cf.dwEffects ^= CFE_AUTOCOLOR;
}
SetSelectionCharFormat(cf);
}
// Paragraph Attributes
int CRichEditCtrlGS::IsRight()
{ PARAFORMAT pf;
pf.cbSize = sizeof(PARAFORMAT);
pf.dwMask = PFM_ALIGNMENT | PFA_RIGHT;
DWORD dwSelMask = GetParaFormat(pf);
bool bConsistent = false; // RIGHT alignment inconsistent over the whole Selection
if( dwSelMask & PFA_RIGHT )// RIGHT alignment consistent over the whole Selection?
{ bConsistent = true;
}
if( !bConsistent )
{ return (-1); // Set Button to indeterminate
}
if( (pf.wAlignment & 0xFF) == PFA_RIGHT )
{ return(1); // Set Button to checked
}
return 0; // Set Button to unchecked
}
int CRichEditCtrlGS::IsLeft(void)
{ PARAFORMAT pf;
pf.cbSize = sizeof(PARAFORMAT);
pf.dwMask = PFM_ALIGNMENT;
DWORD dwSelMask = GetParaFormat(pf);
bool bConsistent = false; // LEFT alignment inconsistent over the whole Selection
if( dwSelMask & PFA_LEFT )// LEFT alignment consistent over the whole Selection?
{ bConsistent = true;
}
if( !bConsistent )
{ return (-1); // Set Button to indeterminate
}
if( (pf.wAlignment & 0xFF) == PFA_LEFT )
{ return(1); // Set Button to checked
}
return 0; // Set Button to unchecked
}
int CRichEditCtrlGS::IsCentered(void)
{ PARAFORMAT pf;
pf.cbSize = sizeof(PARAFORMAT);
pf.dwMask = PFM_ALIGNMENT;
DWORD dwSelMask = GetParaFormat(pf);
bool bConsistent = false; // CENTER alignment inconsistent over the whole Selection
if( (dwSelMask & PFA_CENTER) == PFA_CENTER)// CENTER alignment consistent over the whole Selection?
{ bConsistent = true;
}
if( !bConsistent )
{ return (-1); // Set Button to indeterminate
}
if( (pf.wAlignment & 0xFF) == PFA_CENTER )
{ return(1); // Set Button to checked
}
return 0; // Set Button to unchecked
}
int CRichEditCtrlGS::IsJustified(void)
{ PARAFORMAT pf;
pf.cbSize = sizeof(PARAFORMAT);
pf.dwMask = PFM_ALIGNMENT;
DWORD dwSelMask = GetParaFormat(pf);
bool bConsistent = false; // JUSTIFIED alignment inconsistent over the whole Selection
if( dwSelMask & PFA_JUSTIFY )// JUSTIFIED alignment consistent over the whole Selection?
{ bConsistent = true;
}
if( !bConsistent )
{ return (-1); // Set Button to indeterminate
}
if( (pf.wAlignment & 0xFF) == PFA_JUSTIFY )
{ return(1); // Set Button to checked
}
return 0; // Set Button to unchecked
}
int CRichEditCtrlGS::IsBulleted(void)
{ PARAFORMAT pf;
pf.cbSize = sizeof(PARAFORMAT);
pf.dwMask = PFM_ALIGNMENT | PFM_NUMBERING;
DWORD dwSelMask = GetParaFormat(pf);
bool bConsistent = false; // Paragraph NUMBERING inconsistent over the whole Selection
if( dwSelMask & PFM_NUMBERING )// Paragraph NUMBERING consistent over the whole Selection?
{ bConsistent = true;
}
if( !bConsistent )
{ return (-1); // Set Button to indeterminate
}
if( pf.wNumbering & PFN_BULLET )
{ return(1); // Set Button to checked
}
return 0; // Set Button to unchecked
}
void CRichEditCtrlGS::SetRight(void)
{ PARAFORMAT pf;
pf.cbSize = sizeof(PARAFORMAT);
pf.dwMask = PFM_ALIGNMENT;
pf.wAlignment = PFA_RIGHT;
SetParaFormat(pf); // Set the paragraph.
}
void CRichEditCtrlGS::SetLeft(void)
{ PARAFORMAT pf;
pf.cbSize = sizeof(PARAFORMAT);
pf.dwMask = PFM_ALIGNMENT;
pf.wAlignment = PFA_LEFT;
SetParaFormat(pf); // Set the paragraph.
}
void CRichEditCtrlGS::SetCenter(void)
{ PARAFORMAT pf;
pf.cbSize = sizeof(PARAFORMAT);
pf.dwMask = PFM_ALIGNMENT;
pf.wAlignment = PFA_CENTER;
SetParaFormat(pf); // Set the paragraph.
}
void CRichEditCtrlGS::SetJustify(void)
{ PARAFORMAT pf;
pf.cbSize = sizeof(PARAFORMAT);
pf.dwMask = PFM_ALIGNMENT;
pf.wAlignment = PFA_JUSTIFY;
SetParaFormat(pf); // Set the paragraph.
}
void CRichEditCtrlGS::SetBullet(void)
{ int iFormatted = IsBulleted();
PARAFORMAT pf;
pf.cbSize = sizeof(PARAFORMAT);
pf.dwMask = PFM_NUMBERING | PFM_STARTINDENT | PFM_OFFSET;
GetParaFormat(pf);
if( 1 == iFormatted )
{ pf.wNumbering = 0;
pf.dxOffset = 0;
pf.dwMask = PFM_NUMBERING | PFM_STARTINDENT | PFM_OFFSET;
}
else
{ pf.wNumbering = PFN_BULLET;
pf.dwMask = PFM_NUMBERING;
if( pf.dxOffset == 0 )
{ pf.dxOffset = 160;
pf.dwMask = PFM_NUMBERING | PFM_STARTINDENT | PFM_OFFSET;
}
}
SetParaFormat(pf);
}
// Visual Appearance
void CRichEditCtrlGS::SetWordWrap(const bool bOn/*= true*/,const int iLineWidth/* = 0*/)
{ if( bOn )
{ SetTargetDevice(NULL, iLineWidth);
}
else
{ if( 0 == iLineWidth )
{ SetTargetDevice(NULL, 1);
}
else
{ SetTargetDevice(NULL, iLineWidth);
}
}
}
// Reading and Writing
void CRichEditCtrlGS::SetRTF(const CString strText)
{ SCookieString CookieRTF;
CookieRTF.lSize = strText.GetLength();
CookieRTF.lStart = 0;
CookieRTF.pInText = &strText;
CookieRTF.pOutText = NULL;
CString strRTF = _T("");
if( strText.GetLength() > 5 )
{ strRTF = strText.Left(5);
}
// Read the text in
EDITSTREAM es;
es.dwError = 0;
es.pfnCallback = StreamInCString; // Set the callback
es.dwCookie = (DWORD)&CookieRTF; // and the informations
if( strRTF.CompareNoCase(_T("{\\rtf")) == 0 )
{ StreamIn(SF_RTF,es);
}
else
{ StreamIn(SF_TEXT,es);
}
}
void CRichEditCtrlGS::SetRTF(const CByteArray& arrRTF)
{ SCookieByteArray CookieRTF;
CookieRTF.lSize = arrRTF.GetSize();
CookieRTF.lStart = 0;
CookieRTF.pInText = &arrRTF;
CookieRTF.pOutText = NULL;
CString strRTF = _T("");
if( arrRTF.GetSize() > 5 )
{ strRTF = TCHAR(arrRTF[0]);
strRTF += TCHAR(arrRTF[1]);
strRTF += TCHAR(arrRTF[2]);
strRTF += TCHAR(arrRTF[3]);
strRTF += TCHAR(arrRTF[4]);
}
// Read the text in
EDITSTREAM es;
es.dwError = 0;
es.pfnCallback = StreamInCByteArray; // Set the callback
es.dwCookie = (DWORD)&CookieRTF; // and the informations
if( strRTF.CompareNoCase(_T("{\\rtf")) == 0 )
{ StreamIn(SF_RTF,es);
}
else
{ StreamIn(SF_TEXT,es);
}
}
void CRichEditCtrlGS::SetRTF(const UINT resID)
{ // Obtain a handle and the memory to the resource
HINSTANCE hApp = ::GetModuleHandle(0);
ASSERT(hApp);
HRSRC hResInfo = ::FindResource(hApp, MAKEINTRESOURCE(resID), TEXT("RTF"));
if( NULL == hResInfo ) return;
HGLOBAL hRes = ::LoadResource(hApp, hResInfo);
if( NULL == hRes ) return;
LPVOID pRTFText = ::LockResource(hRes);
if( NULL == pRTFText ) return;
DWORD dwRTFSize = ::SizeofResource(hApp, hResInfo);
if( 0 == dwRTFSize )
{ ::FreeResource(hRes);
return;
}
CByteArray arrbRTF;
arrbRTF.SetSize(dwRTFSize);
LPBYTE pArrRTF = arrbRTF.GetData();
::CopyMemory(pArrRTF,pRTFText,dwRTFSize);
::FreeResource(hRes);
SetRTF(arrbRTF);
}
void CRichEditCtrlGS::LoadRTF(const CString strFilename)
{ SCookieFile CookieRTF;
CFileStatus fileStatus;
CString strRTF = _T("");
CookieRTF.lStart = 0;
CookieRTF.pFilename = &strFilename;
// Close all filehandles
if( CFile::hFileNull != CookieRTF.fileInText.m_hFile )
{ CookieRTF.fileInText.Close();
}
if( CFile::hFileNull != CookieRTF.fileOutText.m_hFile )
{ CookieRTF.fileOutText.Close();
}
// Is the filename the name of a file?
if( CFile::GetStatus(strFilename, fileStatus) )
{ if( (fileStatus.m_attribute & ( CFile::volume | CFile::directory )) )
{ AfxMessageBox(AFX_IDP_INVALID_FILENAME);
return; // Filename is not the name of a file
}
}
else
{ AfxMessageBox(AFX_IDP_INVALID_FILENAME);
return;// The name is not existing
}
CookieRTF.lSize = fileStatus.m_size;
if( !CookieRTF.fileInText.Open( *CookieRTF.pFilename,CFile::modeRead | CFile::shareDenyNone | CFile::typeBinary ) )
{ AfxMessageBox(AFX_IDP_FAILED_TO_OPEN_DOC);
return; // File could not be opened
}
CookieRTF.fileInText.SeekToBegin();
LPTSTR pBuff = strRTF.GetBuffer(15);
CookieRTF.fileInText.Read(pBuff,5);
pBuff[5] = 0;
strRTF.ReleaseBuffer();
EDITSTREAM es;
es.dwError = 0;
es.pfnCallback = StreamInCFile; // Set the callback
es.dwCookie = (DWORD)&CookieRTF; // and the informations
if( strRTF.CompareNoCase(_T("{\\rtf")) == 0 )
{ StreamIn(SF_RTF,es);
}
else
{ StreamIn(SF_TEXT,es);
}
CookieRTF.fileInText.Close();
}
void CRichEditCtrlGS::GetRTF(CString& strText,const bool bAsRTF/*=true*/)
{ SCookieString CookieRTF;
strText.Empty();
CookieRTF.lSize = 0;
CookieRTF.lStart = 0;
CookieRTF.pInText = NULL;
CookieRTF.pOutText = &strText;
// Pull the text out
EDITSTREAM es;
es.dwError = 0;
es.pfnCallback = StreamOutCString; // Set the callback
es.dwCookie = (DWORD)&CookieRTF; // and the informations
if( bAsRTF )
{ StreamOut(SF_RTF,es);
}
else
{ StreamOut(SF_TEXT,es);
}
return;
}
void CRichEditCtrlGS::GetRTF(CByteArray& arrText, const bool bAsRTF/*=true*/)
{ SCookieByteArray CookieRTF;
arrText.RemoveAll();
CookieRTF.lSize = 0;
CookieRTF.lStart = 0;
CookieRTF.pInText = NULL;
CookieRTF.pOutText = &arrText;
// Pull the text out
EDITSTREAM es;
es.dwError = 0;
es.pfnCallback = StreamOutCByteArray; // Set the callback
es.dwCookie = (DWORD)&CookieRTF; // and the informations
if( bAsRTF )
{ StreamOut(SF_RTF,es);
}
else
{ StreamOut(SF_TEXT,es);
}
}
void CRichEditCtrlGS::WriteRTF(const CString strFilename, const bool bAsRTF/*=true*/ )
{ SCookieFile CookieRTF;
CFileStatus fileStatus;
CString strRTF = _T("");
CookieRTF.lStart = 0;
CookieRTF.pFilename = &strFilename;
// Close all filehandles
if( CFile::hFileNull != CookieRTF.fileInText.m_hFile )
{ CookieRTF.fileInText.Close();
}
if( CFile::hFileNull != CookieRTF.fileOutText.m_hFile )
{ CookieRTF.fileOutText.Close();
}
if( !CookieRTF.fileOutText.Open( *CookieRTF.pFilename,CFile::modeCreate | CFile::modeReadWrite | CFile::typeBinary ) )
{ AfxMessageBox(AFX_IDP_FAILED_TO_SAVE_DOC);
return; // File could not be opened for saving
}
CookieRTF.fileOutText.SeekToBegin();
EDITSTREAM es;
es.dwError = 0;
es.pfnCallback = StreamOutCFile; // Set the callback
es.dwCookie = (DWORD)&CookieRTF; // and the informations
if( bAsRTF )
{ StreamOut(SF_RTF,es);
}
else
{ StreamOut(SF_TEXT,es);
}
CookieRTF.fileOutText.Close();
}
// StreamIn StreamOut methods
DWORD CALLBACK CRichEditCtrlGS::StreamInCString(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{ SCookieString *pCookie = (SCookieString *)dwCookie;
long lMaxSize = cb; // We may only read such much
long lReadSize = cb; // We can only read such much
*pcb = 0; // Till now we have nothing read so far
if( pCookie->lStart < 0 )
{ return(0); // Nothing to do
}
if( NULL == pCookie->pInText )
{ return(0); // Nothing to do
}
if( pCookie->pInText->GetLength() < cb )
{ lMaxSize = pCookie->pInText->GetLength();
}
lReadSize = lMaxSize;
if( (pCookie->lSize - pCookie->lStart) < lReadSize )
{ lReadSize = pCookie->lSize - pCookie->lStart;
}
if( lReadSize <= 0 )
{ return (0); // Nothing to do
}
LPCTSTR pText = (LPCTSTR)(*(pCookie->pInText));
pText += pCookie->lStart;
pCookie->lStart += lReadSize;
*pcb = lReadSize;
memcpy(pbBuff,pText,lReadSize);
return 0;
}
DWORD CALLBACK CRichEditCtrlGS::StreamInCByteArray(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{ SCookieByteArray *pCookie = (SCookieByteArray *)dwCookie;
long lMaxSize = cb; // We may only read such much
long lReadSize = cb; // We can only read such much
*pcb = 0; // Till now we have nothing read so far
if( pCookie->lStart < 0 )
{ return(0); // Nothing to do
}
if( NULL == pCookie->pInText )
{ return(0); // Nothing to do
}
if( pCookie->pInText->GetSize() < cb )
{ lMaxSize = pCookie->pInText->GetSize();
}
lReadSize = lMaxSize;
if( (pCookie->lSize - pCookie->lStart) < lReadSize )
{ lReadSize = pCookie->lSize - pCookie->lStart;
}
if( lReadSize <= 0 )
{ return (0); // Nothing to do
}
LPCTSTR pText = (LPCTSTR)(pCookie->pInText->GetData());
pText += pCookie->lStart;
pCookie->lStart += lReadSize;
*pcb = lReadSize;
memcpy(pbBuff,pText,lReadSize);
return 0;
}
DWORD CALLBACK CRichEditCtrlGS::StreamInCFile(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{ SCookieFile *pCookie = (SCookieFile *)dwCookie;
UINT uiReadSize = 0;
*pcb = 0; // Till now we have nothing read so far
if( pCookie->lStart < 0 )
{ return (0); // Nothing to do
}
if( 0 == cb )
{ return(0); // Nothing to do
}
if( CFile::hFileNull == pCookie->fileInText.m_hFile )
{ return(0); // Nothing to do
}
pCookie->fileInText.Seek(pCookie->lStart,CFile::begin);
uiReadSize = pCookie->fileInText.Read(pbBuff,cb);
*pcb = uiReadSize;
pCookie->lStart += uiReadSize;
return 0;
}
DWORD CALLBACK CRichEditCtrlGS::StreamOutCString(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG* pcb)
{ SCookieString *pCookie = (SCookieString *)dwCookie;
long lWriteSize = cb; // We can only Write such much
*pcb = 0; // Till now we have nothing written so far
if( pCookie->lStart < 0 )
{ return (0); // Nothing to do
}
if( 0 == cb )
{ return(0); // Nothing to do
}
if( NULL == pCookie->pOutText )
{ return(0); // Nothing to do
}
CString strBuffer = _T("");
strBuffer = (CString)pbBuff;
(*(pCookie->pOutText)) += strBuffer.Left(lWriteSize);
*pcb = lWriteSize;
pCookie->lStart += lWriteSize;
return 0;
}
DWORD CALLBACK CRichEditCtrlGS::StreamOutCByteArray(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG* pcb)
{ SCookieByteArray *pCookie = (SCookieByteArray *)dwCookie;
long lWriteSize = cb; // We can only Write such much
*pcb = 0; // Till now we have nothing written so far
if( pCookie->lStart < 0 )
{ return (0); // Nothing to do
}
if( 0 == cb )
{ return(0); // Nothing to do
}
if( NULL == pCookie->pOutText )
{ return(0); // Nothing to do
}
CByteArray arrBuffer;
arrBuffer.SetSize(lWriteSize);
BYTE *pByte = arrBuffer.GetData();
memcpy(pByte,pbBuff,lWriteSize);
pCookie->pOutText->Append(arrBuffer);
*pcb = lWriteSize;
pCookie->lStart += lWriteSize;
return 0;
}
DWORD CALLBACK CRichEditCtrlGS::StreamOutCFile(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{ SCookieFile *pCookie = (SCookieFile *)dwCookie;
*pcb = 0; // Till now we have nothing written so far
if( pCookie->lStart < 0 )
{ return (0); // Nothing to do
}
if( 0 == cb )
{ return(0); // Nothing to do
}
if( CFile::hFileNull == pCookie->fileOutText.m_hFile )
{ return(0); // Nothing to do
}
try
{ pCookie->fileOutText.SeekToEnd();
pCookie->fileOutText.Write(pbBuff,cb);
}
catch (CFileException *e)
{ AfxMessageBox(AFX_IDP_FAILED_TO_SAVE_DOC);
e->Delete();
return (1); // File could not be opened for saving so stop saving
}
*pcb = cb;
return 0;
}