16,370
社区成员




// CEditStringDoc serialization
void CEditStringDoc::Serialize(CArchive& ar)
{
BOOL FirstLine=TRUE;
WCHAR wBuf[2048];
char szBuf[2048];
int i=0;
BOOL LineEnd=FALSE;
char type[10];
char dummy[10];
char *pLine=0;
char UtfHead[3]={(char)0xEF,(char)0xBB,(char)0xBF};
char UniHead[2]={(char)0xFF,(char)0xFE};
//
memset(type,0,10);
memset(dummy,0,10);
//
if (ar.IsStoring())
{
// TODO: add storing code here
int all=m_TextArray.GetSize();
for (int kk=0;kk<all;kk++)
{
strcpy(szBuf,m_TextArray[kk].GetBuffer(2048));
strcat(szBuf,"\r\n");
if(FirstLine)
{
if (m_UTF8) ar.Write(UtfHead,3);
else if (m_UNICODE) ar.Write(UniHead,2);
}// end 1st line
if(m_UTF8)
{
MultiByteToWideChar(CP_ACP,0,szBuf,-1,wBuf,2048);
WideCharToMultiByte(CP_UTF8,0,wBuf,-1,szBuf,2048,0,0);
ar.Write(szBuf,strlen(szBuf));
}
else if(m_UNICODE)
{
MultiByteToWideChar(CP_ACP,0,szBuf,-1,wBuf,2048);
ar.Write(wBuf,2*wcslen(wBuf));
}
else
{
ar.Write(szBuf,strlen(szBuf));
}
FirstLine=FALSE;
}// end for
}// end save
else
{// if UTF8 file the 1st 3 chars are: EFh,BBh,BFh
// if UNICODE file the 1st 2 chars are :FFh,FEh
// TODO: add loading code here
m_TextArray.RemoveAll();
memset(szBuf,0,sizeof(szBuf));
while(ar.Read(&szBuf[i],1))
{//
if(FirstLine)
{
if( (szBuf[0]!=(char)0xEF) &&
(szBuf[0]!=(char)0xBB) &&
(szBuf[0]!=(char)0xBF) &&
(szBuf[0]!=(char)0xFF) &&
(szBuf[0]!=(char)0xFE) )
{// normal file
m_UTF8=FALSE;
m_UNICODE=FALSE;
FirstLine=FALSE;
i++;
continue;
}
if( szBuf[0]==(char)0xEF)
{
type[0]=szBuf[0];
continue;
}
if( szBuf[0]==(char)0xBB)
{
type[1]=szBuf[0];
continue;
}
if( szBuf[0]==(char)0xBF)
{
type[2]=szBuf[0];
}
// Is UTF8 file ?
if( (type[0]==(char)0xEF) &&
(type[1]==(char)0xBB) &&
(type[2]==(char)0xBF) )
{// UTF8 file
m_UTF8=TRUE;
m_UNICODE=FALSE;
FirstLine=FALSE;
continue;//i=0
}
// Is UNICODE file ?
if( szBuf[0]==(char)0xFF)
{
type[0]=szBuf[0];
continue;
}
if( szBuf[0]==(char)0xFE)
{
type[1]=szBuf[0];
}
if( (type[0]==(char)0xFF) &&
(type[1]==(char)0xFE) )
{
m_UNICODE=TRUE;
m_UTF8=FALSE;
FirstLine=FALSE;
continue;//i=0
}
}// end firstline
// check line end
if(szBuf[i]==0x0D)
{//
LineEnd=TRUE;
szBuf[i]=0;
ar.Read(dummy,1);//00 or 0a
if(m_UNICODE)
{
ar.Read(dummy,2);//0a 00
}
}
//
if(LineEnd)
{
if(m_UTF8)
{// utf8 file
MultiByteToWideChar(CP_UTF8,0,szBuf,-1,wBuf,2048);
WideCharToMultiByte(CP_ACP,0,wBuf,-1,szBuf,2048,0,0);
pLine=szBuf;
}
else if(m_UNICODE)
{// Unicode file
WideCharToMultiByte(CP_ACP,0,(WCHAR *)szBuf,-1,(char *)wBuf,2048,0,0);
pLine=(char *)wBuf;
}
else
{// normal file
pLine=szBuf;
}
LineEnd=FALSE;// new line
//add
m_TextArray.Add(pLine);
memset(szBuf,0,sizeof(szBuf));
i=-1;// +1=0 szBuf[0]
}// end LineEnd
i++;//from 0
}// end while
// if file end but no LF
if(szBuf[0]!=0) m_TextArray.Add(szBuf);// last line
if(m_TextArray.GetSize()!=0)
{
UpdateAllViews(0);
}
}
}