sc/source/ui/unoobj/exceldetect.cxx | 41 +++++++++++++++- sc/source/ui/unoobj/scdetect.cxx | 92 ------------------------------------ 2 files changed, 40 insertions(+), 93 deletions(-)
New commits: commit f81b1c6e9d1cc6b5d14e61805f0837b961323f15 Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Tue Feb 5 11:00:00 2013 -0500 Remove the Excel 4.0/95/97 detection bits from ScFilterDetect. We still need to leave the MS Excel 4.0 filter name there as it's used for Excel 1.0/2.0/3.0 file formats. In the future we might move these to ScExcelBiffDetect as well... Change-Id: I8422e7470fbb0a14c219b7f67e3dfd4a34131eba diff --git a/sc/source/ui/unoobj/scdetect.cxx b/sc/source/ui/unoobj/scdetect.cxx index 6bacac2..a550698 100644 --- a/sc/source/ui/unoobj/scdetect.cxx +++ b/sc/source/ui/unoobj/scdetect.cxx @@ -94,13 +94,6 @@ static const sal_Char pFilterAscii[] = "Text - txt - csv (StarCalc)"; static const sal_Char pFilterLotus[] = "Lotus"; static const sal_Char pFilterQPro6[] = "Quattro Pro 6.0"; static const sal_Char pFilterExcel4[] = "MS Excel 4.0"; -static const sal_Char pFilterEx4Temp[] = "MS Excel 4.0 Vorlage/Template"; -static const sal_Char pFilterExcel5[] = "MS Excel 5.0/95"; -static const sal_Char pFilterEx5Temp[] = "MS Excel 5.0/95 Vorlage/Template"; -static const sal_Char pFilterExcel95[] = "MS Excel 95"; -static const sal_Char pFilterEx95Temp[] = "MS Excel 95 Vorlage/Template"; -static const sal_Char pFilterExcel97[] = "MS Excel 97"; -static const sal_Char pFilterEx97Temp[] = "MS Excel 97 Vorlage/Template"; static const sal_Char pFilterExcelXML[] = "MS Excel 2003 XML"; static const sal_Char pFilterDBase[] = "dBase"; static const sal_Char pFilterDif[] = "DIF"; @@ -455,81 +448,7 @@ static sal_Bool lcl_MayBeDBase( SvStream& rStream ) // 0-length stream as that would create the compound // document header on the stream and effectively write to // disk! - SotStorageRef aStorage; if (nSize > 0) - aStorage = new SotStorage ( pStream, false ); - if ( aStorage.Is() && !aStorage->GetError() ) - { - // Excel-5: detect through contained streams - // there are some "excel" formats from 3rd party vendors that need to be distinguished - String aStreamName(RTL_CONSTASCII_USTRINGPARAM("Workbook")); - sal_Bool bExcel97Stream = ( aStorage->IsStream( aStreamName ) ); - - aStreamName = String(RTL_CONSTASCII_USTRINGPARAM("Book")); - sal_Bool bExcel5Stream = ( aStorage->IsStream( aStreamName ) ); - if ( bExcel97Stream || bExcel5Stream ) - { - if ( bExcel97Stream ) - { - String aOldName; - sal_Bool bIsCalcFilter = sal_True; - if ( pPreselectedFilter ) - { - // cross filter; now this should be a type detection only, not a filter detection - // we can simulate it by preserving the preselected filter if the type matches - // example: Excel filters for Writer - aOldName = pPreselectedFilter->GetFilterName(); - bIsCalcFilter = pPreselectedFilter->GetServiceName() == "com.sun.star.sheet.SpreadsheetDocument"; - } - - if ( aOldName.EqualsAscii(pFilterEx97Temp) || !bIsCalcFilter ) - { - // Excel 97 template selected -> keep selection - } - else if ( bExcel5Stream && - ( aOldName.EqualsAscii(pFilterExcel5) || aOldName.EqualsAscii(pFilterEx5Temp) || - aOldName.EqualsAscii(pFilterExcel95) || aOldName.EqualsAscii(pFilterEx95Temp) ) ) - { - // dual format file and Excel 5 selected -> keep selection - } - else - { - // else use Excel 97 filter - pFilter = aMatcher.GetFilter4FilterName( rtl::OUString(pFilterExcel97) ); - } - } - else if ( bExcel5Stream ) - { - String aOldName; - sal_Bool bIsCalcFilter = sal_True; - if ( pPreselectedFilter ) - { - // cross filter; now this should be a type detection only, not a filter detection - // we can simulate it by preserving the preselected filter if the type matches - // example: Excel filters for Writer - aOldName = pPreselectedFilter->GetFilterName(); - bIsCalcFilter = pPreselectedFilter->GetServiceName() == "com.sun.star.sheet.SpreadsheetDocument"; - } - - if ( aOldName.EqualsAscii(pFilterExcel95) || aOldName.EqualsAscii(pFilterEx95Temp) || - aOldName.EqualsAscii(pFilterEx5Temp) || !bIsCalcFilter ) - { - // Excel 95 oder Vorlage (5 oder 95) eingestellt -> auch gut - } - else if ( aOldName.EqualsAscii(pFilterEx97Temp) ) - { - // auto detection has found template -> return Excel5 template - pFilter = aMatcher.GetFilter4FilterName( rtl::OUString(pFilterEx5Temp) ); - } - else - { - // sonst wird als Excel 5-Datei erkannt - pFilter = aMatcher.GetFilter4FilterName( rtl::OUString(pFilterExcel5) ); - } - } - } - } - else if (nSize > 0) { SvStream &rStr = *pStream; @@ -710,16 +629,7 @@ static sal_Bool lcl_MayBeDBase( SvStream& rStream ) } else if( nMuster & M_ENDE ) { // Format detected - if ( pFilterName[nFilter] == pFilterExcel4 && pPreselectedFilter && - ( (pPreselectedFilter)->GetFilterName().EqualsAscii(pFilterEx4Temp) || pPreselectedFilter->GetTypeName().EqualsAscii("calc_MS_Excel_40") ) ) - { - // Excel 4 erkannt, Excel 4 Vorlage eingestellt -> auch gut - // oder Excel 4 Filter anderer Applikation (simulated type detection!) - } - else - { // gefundenen Filter einstellen - pFilter = aMatcher.GetFilter4FilterName( rtl::OUString::createFromAscii(pFilterName[ nFilter ]) ); - } + pFilter = aMatcher.GetFilter4FilterName(OUString::createFromAscii(pFilterName[nFilter])); bSync = false; // leave inner loop nFilter = nFilterCount; // leave outer loop } commit ca1e8922842254ffdfb186e087bde29a6a8c5062 Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Tue Feb 5 10:54:32 2013 -0500 Implement detection for Excel 4.0 format. Change-Id: Ic0f5c585386f602bd51e006770b30cbb190a531e diff --git a/sc/source/ui/unoobj/exceldetect.cxx b/sc/source/ui/unoobj/exceldetect.cxx index 2e0eae2..4119b1d 100644 --- a/sc/source/ui/unoobj/exceldetect.cxx +++ b/sc/source/ui/unoobj/exceldetect.cxx @@ -74,6 +74,41 @@ bool hasStream(const uno::Reference<io::XInputStream>& xInStream, const OUString return xStorage->IsStream(rName); } +bool isExcel40(const uno::Reference<io::XInputStream>& xInStream) +{ + SfxMedium aMedium; + aMedium.UseInteractionHandler(true); + aMedium.setStreamToLoadFrom(xInStream, true); + SvStream* pStream = aMedium.GetInStream(); + if (!pStream) + return false; + + pStream->Seek(STREAM_SEEK_TO_END); + sal_Size nSize = pStream->Tell(); + pStream->Seek(0); + + if (nSize < 4) + return false; + + sal_uInt16 nBofId, nBofSize; + *pStream >> nBofId >> nBofSize; + + if (nBofId != 0x0409) + // This ID signifies Excel 4.0 format. It must be 0x0409. + return false; + + if (nBofSize < 4 || 16 < nBofSize) + // BOF record must be sized between 4 and 16 for Excel 4.0 stream. + return false; + + sal_Size nPos = pStream->Tell(); + if (nSize - nPos < nBofSize) + // BOF record doesn't have required bytes. + return false; + + return true; +} + bool isTemplate(const OUString& rType) { return rType.indexOf("_VorlageTemplate") != -1; @@ -131,9 +166,11 @@ OUString ScExcelBiffDetect::detect( uno::Sequence<beans::PropertyValue>& lDescri if (aType == "calc_MS_Excel_40" || aType == "calc_MS_Excel_40_VorlageTemplate") { // See if this stream is a Excel 4.0 stream. + if (!isExcel40(xInStream)) + return OUString(); - // TODO: Implement this. - return OUString(); + aMediaDesc[MediaDescriptor::PROP_FILTERNAME()] <<= isTemplate(aType) ? OUString("MS Excel 4.0 Vorlage/Template") : OUString("MS Excel 4.0"); + return aType; } // failed! _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits