diff options
Diffstat (limited to 'sw/inc/iodetect.cxx')
-rw-r--r-- | sw/inc/iodetect.cxx | 697 |
1 files changed, 0 insertions, 697 deletions
diff --git a/sw/inc/iodetect.cxx b/sw/inc/iodetect.cxx deleted file mode 100644 index a340f342b0d7..000000000000 --- a/sw/inc/iodetect.cxx +++ /dev/null @@ -1,697 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: iodetect.cxx,v $ - * $Revision: 1.31 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef _IODETECT_CXX -#define _IODETECT_CXX - -#include <sfx2/docfilt.hxx> -#include <sfx2/docfile.hxx> -#include <sfx2/fcontnr.hxx> -#include <svtools/parhtml.hxx> -#include <osl/endian.h> -#include <errhdl.hxx> // for ASSERT -#include <tools/string.hxx> -#include <tools/urlobj.hxx> - -#ifdef _DLL_ -#include <shellio.hxx> -#endif - -using namespace com::sun::star; - -class Reader; -USHORT AutoDetec(const String& FileName, USHORT & rVersion); -bool IsDocShellRegistered(); -void GetWW8Writer( const String&, const String&, WriterRef& ); - -typedef void (*FnGetWriter)(const String&, const String& rBaseURL, WriterRef&); - -struct SwIoDetect -{ -// eigentlich privat, aber der Compiler kann sonst die -// Tabelle nicht initialisieren - const sal_Char* pName; - USHORT nLen; - - inline int IsFilter( const String& rNm ) - { - return pName && rNm.EqualsAscii( pName, 0, nLen ); - } - -#ifdef _DLL_ - Reader* pReader; - FnGetWriter fnGetWriter; - BOOL bDelReader; - - inline Reader* GetReader() const { return pReader; } - inline void GetWriter( const String& rNm, const String& rBaseURL, WriterRef& xWrt ) const - { if( fnGetWriter ) (*fnGetWriter)(rNm,rBaseURL,xWrt); else xWrt = WriterRef(0); } -#endif - - const sal_Char* IsReader(const sal_Char* pHeader, ULONG nLen_, - const String &rFileName, const String& rUserData ) const; -}; - - -#ifdef _DLL_ -#define SwIoEntry(sNm, cCharLen, pWrt, bDel) { sNm, cCharLen, 0, pWrt, bDel } -#else -#define SwIoEntry(sNm, cCharLen, pWrt, bDel) { sNm, cCharLen } -#endif - -#ifdef DEBUG_SH - -#define DEB_SH_SwIoEntry(sNm, cCharLen, pWrt, bDel) , SwIoEntry(sNm, cCharLen, pWrt, bDel) -#else -#define DEB_SH_SwIoEntry(sNm, cCharLen, pWrt, bDel) -#endif - -const USHORT MAXFILTER = -#ifdef DEBUG_SH - 1 + -#endif - 11; - -const sal_Char __FAR_DATA FILTER_BAS[] = "BAS"; -const sal_Char __FAR_DATA FILTER_RTF[] = "RTF"; -const sal_Char __FAR_DATA FILTER_SWW4V[] = "CSW4VWEB"; -const sal_Char __FAR_DATA FILTER_SWW5V[] = "CSW5VWEB"; -const sal_Char __FAR_DATA sRtfWH[] = "WH_RTF"; -const sal_Char __FAR_DATA sHTML[] = "HTML"; -const sal_Char __FAR_DATA sWW1[] = "WW1"; -const sal_Char __FAR_DATA sWW5[] = "WW6"; -const sal_Char __FAR_DATA sWW6[] = "CWW6"; -const sal_Char __FAR_DATA FILTER_WW8[] = "CWW8"; -const sal_Char __FAR_DATA FILTER_TEXT_DLG[] = "TEXT_DLG"; -const sal_Char __FAR_DATA FILTER_TEXT[] = "TEXT"; -const sal_Char __FAR_DATA sDebug[] = "DEBUG"; -const sal_Char __FAR_DATA sUndo[] = "UNDO"; -const sal_Char __FAR_DATA FILTER_XML[] = "CXML"; -const sal_Char __FAR_DATA FILTER_XMLV[] = "CXMLV"; -const sal_Char __FAR_DATA FILTER_XMLVW[] = "CXMLVWEB"; - -#ifdef _DLL_ -const sal_Char* GetFILTER_XML() -{ - return FILTER_XML; -} -const sal_Char* GetFILTER_WW8() -{ - return FILTER_WW8; -} -#endif - -SwIoDetect aReaderWriter[ MAXFILTER ] = -{ -///* 0*/ SwIoEntry(FILTER_SW5, 4, &::GetSw3Writer, TRUE), -///* 1*/ SwIoEntry(FILTER_SW4, 4, &::GetSw3Writer, FALSE), -///* 2*/ SwIoEntry(FILTER_SW3, 4, &::GetSw3Writer, FALSE), -///* 3*/ SwIoEntry(FILTER_SWG, STRING_LEN, 0, TRUE), -///* 4*/ SwIoEntry(FILTER_SWGV, 4, 0, FALSE), -/* 5*/ SwIoEntry(FILTER_RTF, STRING_LEN, &::GetRTFWriter, TRUE), -///* 6*/ SwIoEntry(sSwDos, STRING_LEN, 0, TRUE), -/* 7*/ SwIoEntry(FILTER_BAS, STRING_LEN, &::GetASCWriter, FALSE), -/* 8*/ SwIoEntry(sWW6, STRING_LEN, &::GetWW8Writer, TRUE), -/* 9*/ SwIoEntry(FILTER_WW8, STRING_LEN, &::GetWW8Writer, FALSE), -///* 10*/ SwIoEntry(FILTER_W4W, 3, &::GetW4WWriter, TRUE), -/* 11*/ SwIoEntry(sRtfWH, STRING_LEN, &::GetRTFWriter, FALSE), -///* 12*/ SwIoEntry(sCExcel, 5, 0, TRUE), -///* 13*/ SwIoEntry(sExcel, 4, 0, FALSE), -///* 14*/ SwIoEntry(sLotusD, 5, 0, TRUE), -/* 15*/ SwIoEntry(sHTML, 4, &::GetHTMLWriter, TRUE), -/* 16*/ SwIoEntry(sWW1, STRING_LEN, 0, TRUE), -/* 17*/ SwIoEntry(sWW5, STRING_LEN, 0, FALSE), -///* 18*/ SwIoEntry(sSwg1, 4, 0, FALSE), -/* 19*/ SwIoEntry(FILTER_XML, 4, &::GetXMLWriter, TRUE), -/*20*/ SwIoEntry(FILTER_TEXT_DLG, 8, &::GetASCWriter, TRUE), -/*last*/ SwIoEntry(FILTER_TEXT, 4, &::GetASCWriter, TRUE) -}; - -const char* pSw = "swriter"; -const char* pSwWeb = "swriter/web"; - -// Filter erkennung -struct W1_FIB -{ - SVBT16 wIdent; // 0x0 int magic number - SVBT16 nFib; // 0x2 FIB version written - SVBT16 nProduct; // 0x4 product version written by - SVBT16 nlocale; // 0x6 language stamp---localized version; - SVBT16 pnNext; // 0x8 - SVBT16 fFlags; - - USHORT nFibGet() { return SVBT16ToShort(nFib); } - USHORT wIdentGet() { return SVBT16ToShort(wIdent); } - USHORT fFlagsGet() { return SVBT16ToShort(fFlags); } - // SVBT16 fComplex :1;// 0004 when 1, file is in complex, fast-saved format. - BOOL fComplexGet() { return static_cast< BOOL >((fFlagsGet() >> 2) & 1); } -}; - -const sal_Char* SwIoDetect::IsReader(const sal_Char* pHeader, ULONG nLen_, - const String & /*rFileName*/, const String& /*rUserData*/) const -{ - int bRet = FALSE; - if( sHTML == pName ) - bRet = HTMLParser::IsHTMLFormat( pHeader, TRUE, RTL_TEXTENCODING_DONTKNOW ); - else if( FILTER_RTF == pName ) - bRet = 0 == strncmp( "{\\rtf", pHeader, 5 ); - else if( sWW5 == pName ) - { - W1_FIB *pW1Header = (W1_FIB*)pHeader; - if (pW1Header->wIdentGet() == 0xA5DC && pW1Header->nFibGet() == 0x65) - bRet = true; /*WW5*/ - else if (pW1Header->wIdentGet() == 0xA5DB && pW1Header->nFibGet() == 0x2D) - bRet = true; /*WW2*/ - } - else if( sWW1 == pName ) - { - bRet = (( ((W1_FIB*)pHeader)->wIdentGet() == 0xA59C - && ((W1_FIB*)pHeader)->nFibGet() == 0x21) - && ((W1_FIB*)pHeader)->fComplexGet() == 0); - } - else if (FILTER_TEXT == pName) - bRet = SwIoSystem::IsDetectableText(pHeader, nLen_); - else if( FILTER_TEXT_DLG == pName) - bRet = SwIoSystem::IsDetectableText( pHeader, nLen_, 0, 0, 0, true); - return bRet ? pName : 0; -} - -const String SwIoSystem::GetSubStorageName( const SfxFilter& rFltr ) -{ - /* bei den StorageFiltern noch den SubStorageNamen setzen */ - const String& rUserData = rFltr.GetUserData(); - if( rUserData.EqualsAscii(FILTER_XML) || - rUserData.EqualsAscii(FILTER_XMLV) || - rUserData.EqualsAscii(FILTER_XMLVW) ) - return String::CreateFromAscii( - RTL_CONSTASCII_STRINGPARAM( "content.xml" )); - if( rUserData.EqualsAscii(sWW6) || rUserData.EqualsAscii(FILTER_WW8) ) - return String::CreateFromAscii( - RTL_CONSTASCII_STRINGPARAM( "WordDocument" )); - return String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "" )); -} -const SfxFilter* SwIoSystem::GetFilterOfFormat(const String& rFmtNm, - const SfxFilterContainer* pCnt) -{ - SfxFilterContainer aCntSw( String::CreateFromAscii( pSw ) ); - SfxFilterContainer aCntSwWeb( String::CreateFromAscii( pSwWeb ) ); - const SfxFilterContainer* pFltCnt = pCnt ? pCnt : ( IsDocShellRegistered() ? &aCntSw : &aCntSwWeb ); - - do { - if( pFltCnt ) - { - SfxFilterMatcher aMatcher( pFltCnt->GetName() ); - SfxFilterMatcherIter aIter( &aMatcher ); - const SfxFilter* pFilter = aIter.First(); - while ( pFilter ) - { - if( pFilter->GetUserData() == rFmtNm ) - return pFilter; - pFilter = aIter.Next(); - } - } - if( pCnt || pFltCnt == &aCntSwWeb ) - break; - pFltCnt = &aCntSwWeb; - } while( TRUE ); - return 0; -} - -BOOL SwIoSystem::IsValidStgFilter( const uno::Reference < embed::XStorage >& rStg, const SfxFilter& rFilter) -{ - BOOL bRet = FALSE; - try - { - ULONG nStgFmtId = SotStorage::GetFormatID( rStg ); - bRet = rStg->isStreamElement( ::rtl::OUString::createFromAscii("content.xml") ); - if ( bRet ) - bRet = ( nStgFmtId && ( rFilter.GetFormat() == nStgFmtId ) ); - } - catch ( uno::Exception& ) - { - } - - return bRet; -} - -BOOL SwIoSystem::IsValidStgFilter(SotStorage& rStg, const SfxFilter& rFilter) -{ - ULONG nStgFmtId = rStg.GetFormat(); - /*#i8409# We cannot trust the clipboard id anymore :-(*/ - if( rFilter.GetUserData().EqualsAscii(FILTER_WW8) || - rFilter.GetUserData().EqualsAscii(sWW6) ) - { - nStgFmtId = 0; - } - - BOOL bRet = SVSTREAM_OK == rStg.GetError() && - ( !nStgFmtId || rFilter.GetFormat() == nStgFmtId ) && - ( rStg.IsContained( SwIoSystem::GetSubStorageName( rFilter )) ); - if( bRet ) - { - /* Bug 53445 - es gibt Excel Docs ohne ClipBoardId! */ - /* Bug 62703 - und auch WinWord Docs ohne ClipBoardId! */ - if( rFilter.GetUserData().EqualsAscii(FILTER_WW8) || - rFilter.GetUserData().EqualsAscii(sWW6) ) - { - bRet = !((rStg.IsContained( String::CreateFromAscii("0Table" )) || - rStg.IsContained( String::CreateFromAscii("1Table" ))) ^ - rFilter.GetUserData().EqualsAscii(FILTER_WW8)); - if (bRet && !rFilter.IsAllowedAsTemplate()) - { - SotStorageStreamRef xRef = - rStg.OpenSotStream(String::CreateFromAscii("WordDocument"), - STREAM_STD_READ | STREAM_NOCREATE ); - xRef->Seek(10); - BYTE nByte; - *xRef >> nByte; - bRet = !(nByte & 1); - } - } -// else if( !rFilter.GetUserData().EqualsAscii(sCExcel) ) -// bRet = rFilter.GetFormat() == nStgFmtId; - } - return bRet; -} - -void TerminateBuffer(sal_Char *pBuffer, ULONG nBytesRead, ULONG nBufferLen) -{ - ASSERT(nBytesRead <= nBufferLen - 2, - "what you read must be less than the max + null termination"); - ASSERT(!(nBufferLen & 0x00000001), "nMaxReadBuf must be an even number"); - if (nBytesRead <= nBufferLen - 2) - { - pBuffer[nBytesRead] = '\0'; - pBuffer[nBytesRead+1] = '\0'; - if (nBytesRead & 0x00000001) - pBuffer[nBytesRead+2] = '\0'; - } -} - - /* Feststellen ob das File in dem entsprechenden Format vorliegt. */ - /* Z.z werden nur unsere eigene Filter unterstuetzt */ -BOOL SwIoSystem::IsFileFilter( SfxMedium& rMedium, const String& rFmtName, - const SfxFilter** ppFilter ) -{ - BOOL bRet = FALSE; - - SfxFilterContainer aCntSw( String::CreateFromAscii( pSw ) ); - SfxFilterContainer aCntSwWeb( String::CreateFromAscii( pSwWeb ) ); - const SfxFilterContainer& rFltContainer = IsDocShellRegistered() ? aCntSw : aCntSwWeb; - - uno::Reference < embed::XStorage > xStor; - SotStorageRef xStg; - if (rMedium.IsStorage()) - xStor = rMedium.GetStorage(); - else - { - SvStream* pStream = rMedium.GetInStream(); - if ( pStream && SotStorage::IsStorageFile(pStream) ) - xStg = new SotStorage( pStream, FALSE ); - } - - SfxFilterMatcher aMatcher( rFltContainer.GetName() ); - SfxFilterMatcherIter aIter( &aMatcher ); - const SfxFilter* pFltr = aIter.First(); - while ( pFltr ) - { - if( pFltr->GetUserData() == rFmtName ) - { - const String& rUserData = pFltr->GetUserData(); - if( 'C' == *rUserData.GetBuffer() ) - { - if ( xStor.is() ) - bRet = IsValidStgFilter( xStor, *pFltr ); - else if ( xStg.Is() ) - bRet = xStg.Is() && IsValidStgFilter( *xStg, *pFltr ); - bRet = bRet && (pFltr->GetUserData() == rFmtName); - } - else if( !xStg.Is() && !xStor.is() ) - { - SvStream* pStrm = rMedium.GetInStream(); - if( pStrm && !pStrm->GetError() ) - { - sal_Char aBuffer[4098]; - const ULONG nMaxRead = sizeof(aBuffer) - 2; - ULONG nBytesRead = pStrm->Read(aBuffer, nMaxRead); - pStrm->Seek(STREAM_SEEK_TO_BEGIN); - TerminateBuffer(aBuffer, nBytesRead, sizeof(aBuffer)); - for (USHORT i = 0; i < MAXFILTER; ++i) - { - if (aReaderWriter[i].IsFilter(rFmtName)) - { - bRet = 0 != aReaderWriter[i].IsReader( aBuffer, nBytesRead, - rMedium.GetPhysicalName(), rUserData ); - break; - } - } - } - } - - if( bRet && ppFilter ) - *ppFilter = pFltr; - } - - pFltr = aIter.Next(); - } - - return bRet; -} - -/* die Methode stellt fest, von welchem Typ der stream (File) ist. */ -/* Es wird versucht, eine dem Filter entsprechende Byte-Folge zu finden. */ -/* Wird kein entsprechender gefunden, wird zur Zeit der ASCII-Reader */ -/* returnt !! Der Returnwert ist der interne Filtername! */ -/* rPrefFltName ist der interne Name des Filters, den der Benutzer im */ -/* Open-Dialog eingestellt hat. */ -const SfxFilter* SwIoSystem::GetFileFilter(const String& rFileName, - const String& rPrefFltName, SfxMedium* pMedium) -{ - SfxFilterContainer aCntSw( String::CreateFromAscii( pSw ) ); - SfxFilterContainer aCntSwWeb( String::CreateFromAscii( pSwWeb ) ); - const SfxFilterContainer* pFCntnr = IsDocShellRegistered() ? &aCntSw : &aCntSwWeb; - - if( !pFCntnr ) - return 0; - - SfxFilterMatcher aMatcher( pFCntnr->GetName() ); - SfxFilterMatcherIter aIter( &aMatcher ); - const SfxFilter* pFilter = aIter.First(); - if ( !pFilter ) - return 0; - - if( pMedium ? ( pMedium->IsStorage() || SotStorage::IsStorageFile( pMedium->GetInStream() ) ) : SotStorage::IsStorageFile( rFileName ) ) - { - // package storage or OLEStorage based format - SotStorageRef xStg; - BOOL bDeleteMedium = FALSE; - if (!pMedium ) - { - INetURLObject aObj; - aObj.SetSmartProtocol( INET_PROT_FILE ); - aObj.SetSmartURL( rFileName ); - pMedium = new SfxMedium( aObj.GetMainURL( INetURLObject::NO_DECODE ), STREAM_STD_READ, FALSE ); - bDeleteMedium = TRUE; - } - - // templates should not get precedence over "normal" filters (#i35508, #i33168) - const SfxFilter* pTemplateFilter = 0; - const SfxFilter* pOldFilter = pFCntnr->GetFilter4FilterName( rPrefFltName ); - BOOL bLookForTemplate = pOldFilter && pOldFilter->IsOwnTemplateFormat(); - if ( pMedium->IsStorage() ) - { - uno::Reference < embed::XStorage > xStor = pMedium->GetStorage(); - if ( xStor.is() ) - { - while ( pFilter ) - { - if( 'C' == *pFilter->GetUserData().GetBuffer() && IsValidStgFilter( xStor, *pFilter ) ) - { - if ( pFilter->IsOwnTemplateFormat() && !bLookForTemplate ) - // found template filter; maybe there's a "normal" one also - pTemplateFilter = pFilter; - else - return pFilter; - } - - pFilter = aIter.Next(); - } - - // there's only a template filter that could be found - if ( pTemplateFilter ) - pFilter = pTemplateFilter; - } - } - else - { - SvStream* pStream = pMedium->GetInStream(); - if ( pStream && SotStorage::IsStorageFile(pStream) ) - xStg = new SotStorage( pStream, FALSE ); - - if( xStg.Is() && ( xStg->GetError() == SVSTREAM_OK ) ) - { - while ( pFilter ) - { - if( 'C' == *pFilter->GetUserData().GetBuffer() && IsValidStgFilter( *xStg, *pFilter ) ) - { - if ( pFilter->IsOwnTemplateFormat() && !bLookForTemplate ) - // found template filter; maybe there's a "normal" one also - pTemplateFilter = pFilter; - else - return pFilter; - } - - pFilter = aIter.Next(); - } - - // there's only a template filter that could be found - if ( pTemplateFilter ) - pFilter = pTemplateFilter; - - } - } - - return pFilter; - } - - sal_Char aBuffer[4098]; - const ULONG nMaxRead = sizeof(aBuffer) - 2; - ULONG nBytesRead = 0; - if (pMedium) - { - SvStream* pIStrm = pMedium->GetInStream(); - if( !pIStrm || SVSTREAM_OK != pIStrm->GetError() ) - return 0; - ULONG nCurrPos = pIStrm->Tell(); - nBytesRead = pIStrm->Read(aBuffer, nMaxRead); - pIStrm->Seek( nCurrPos ); - } - /* - else - { - SvFileStream aStrm( rFileName, STREAM_READ ); - - // ohne FileName oder ohne Stream gibts nur den ANSI-Filter - if( !rFileName.Len() || SVSTREAM_OK != aStrm.GetError() ) - return 0; - - nBytesRead = aStrm.Read(aBuffer, nMaxRead); - aStrm.Close(); - }*/ - - TerminateBuffer(aBuffer, nBytesRead, sizeof(aBuffer)); - - - /* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ - /* suche nach dem bestimmten Filter, falls kein entsprechender */ - /* gefunden wird, so wird der ASCII-Filter returnt. */ - /* Gibt es Filter ohne einen Identifizierungs-String, so werden diese */ - /* nie erkannt und es wird auch der ASCII-Filter returnt. */ - /* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ - { - const SfxFilter* pFilterTmp = 0; - const sal_Char* pNm; - for( USHORT n = 0; n < MAXFILTER; ++n ) - { - String sEmptyUserData; - pNm = aReaderWriter[n].IsReader(aBuffer, nBytesRead, rFileName, sEmptyUserData); - pFilterTmp = pNm ? SwIoSystem::GetFilterOfFormat(String::CreateFromAscii(pNm), pFCntnr) : 0; - if (pNm && pFilterTmp) - { - return pFilterTmp; - } - } - } - - /* Ok, bis jetzt kein Filter gefunden, also befrage mal die */ - /* "WORD 4 WORD" Filter */ - if( rFileName.Len() ) - { - if( pMedium ) - pMedium->CloseInStream(); - - } - return SwIoSystem::GetTextFilter( aBuffer, nBytesRead); -} - -bool SwIoSystem::IsDetectableText(const sal_Char* pBuf, ULONG &rLen, - CharSet *pCharSet, bool *pSwap, LineEnd *pLineEnd, bool bEncodedFilter) -{ - bool bSwap = false; - CharSet eCharSet = RTL_TEXTENCODING_DONTKNOW; - bool bLE = true; - ULONG nHead=0; - /*See if its a known unicode type*/ - if (rLen >= 2) - { - if (rLen > 2 && BYTE(pBuf[0]) == 0xEF && BYTE(pBuf[1]) == 0xBB && - BYTE(pBuf[2]) == 0xBF) - { - eCharSet = RTL_TEXTENCODING_UTF8; - nHead = 3; - } - else if (BYTE(pBuf[0]) == 0xFE && BYTE(pBuf[1]) == 0xFF) - { - eCharSet = RTL_TEXTENCODING_UCS2; - bLE = false; - nHead = 2; - } - else if (BYTE(pBuf[1]) == 0xFE && BYTE(pBuf[0]) == 0xFF) - { - eCharSet = RTL_TEXTENCODING_UCS2; - nHead = 2; - } - pBuf+=nHead; - rLen-=nHead; - } - - bool bCR = false, bLF = false, bNoNormalChar = false, - bIsBareUnicode = false; - - if (eCharSet != RTL_TEXTENCODING_DONTKNOW) - { - String sWork; - sal_Unicode *pNewBuf = sWork.AllocBuffer( static_cast< xub_StrLen >(rLen)); - sal_Size nNewLen; - if (eCharSet != RTL_TEXTENCODING_UCS2) - { - nNewLen = rLen; - rtl_TextToUnicodeConverter hConverter = - rtl_createTextToUnicodeConverter(eCharSet); - rtl_TextToUnicodeContext hContext = - rtl_createTextToUnicodeContext(hConverter); - - sal_Size nCntBytes; - sal_uInt32 nInfo; - nNewLen = rtl_convertTextToUnicode( hConverter, hContext, pBuf, - rLen, pNewBuf, nNewLen, - (RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_DEFAULT | - RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_DEFAULT | - RTL_TEXTTOUNICODE_FLAGS_INVALID_DEFAULT), &nInfo, &nCntBytes); - - rtl_destroyTextToUnicodeContext(hConverter, hContext); - rtl_destroyTextToUnicodeConverter(hConverter); - } - else - { - nNewLen = rLen/2; - memcpy(pNewBuf, pBuf, rLen); -#ifdef OSL_LITENDIAN - bool bNativeLE = true; -#else - bool bNativeLE = false; -#endif - if (bLE != bNativeLE) - { - bSwap = true; - sal_Char* pF = (sal_Char*)pNewBuf; - sal_Char* pN = pF+1; - for(xub_StrLen n = 0; n < nNewLen; ++n, pF+=2, pN+=2) - { - sal_Char c = *pF; - *pF = *pN; - *pN = c; - } - } - } - - sWork.ReleaseBufferAccess( static_cast< xub_StrLen >(nNewLen) ); - pNewBuf = sWork.GetBufferAccess(); - - for (ULONG nCnt = 0; nCnt < nNewLen; ++nCnt, ++pNewBuf) - { - switch (*pNewBuf) - { - case 0xA: - bLF = true; - break; - case 0xD: - bCR = true; - break; - default: - break; - } - } - } - else - { - for( ULONG nCnt = 0; nCnt < rLen; ++nCnt, ++pBuf ) - { - switch (*pBuf) - { - case 0x0: - if( nCnt + 1 < rLen && !*(pBuf+1) ) - return 0; - bIsBareUnicode = true; - break; - case 0xA: - bLF = true; - break; - case 0xD: - bCR = true; - break; - case 0xC: - case 0x1A: - case 0x9: - break; - default: - if (0x20 > (BYTE)*pBuf) - bNoNormalChar = true; - break; - } - } - } - - LineEnd eSysLE = GetSystemLineEnd(); - LineEnd eLineEnd; - if (!bCR && !bLF) - eLineEnd = eSysLE; - else - eLineEnd = bCR ? ( bLF ? LINEEND_CRLF : LINEEND_CR ) : LINEEND_LF; - - if (pCharSet) - *pCharSet = eCharSet; - if (pSwap) - *pSwap = bSwap; - if (pLineEnd) - *pLineEnd = eLineEnd; - - return bEncodedFilter || (!bIsBareUnicode && eSysLE == eLineEnd); -} - -const SfxFilter* SwIoSystem::GetTextFilter( const sal_Char* pBuf, ULONG nLen) -{ - bool bAuto = IsDetectableText(pBuf, nLen); - const sal_Char* pNm = bAuto ? FILTER_TEXT : FILTER_TEXT_DLG; - return SwIoSystem::GetFilterOfFormat( String::CreateFromAscii(pNm), 0 ); -} - - -#endif |