summaryrefslogtreecommitdiff
path: root/hwpfilter
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2011-06-13 21:08:00 +0100
committerCaolán McNamara <caolanm@redhat.com>2011-06-13 21:08:00 +0100
commit1663abc706497fb0f56ee0b548f345ff76257520 (patch)
treee46a763220789e44018c756e8bae1c4628463849 /hwpfilter
parent46d4d4b877b7aace6dde24b534f711f674b8a494 (diff)
#i49123# implement typedetection for supported .hwp format versions
Diffstat (limited to 'hwpfilter')
-rw-r--r--hwpfilter/qa/cppunit/data/fail/BK.hwp (renamed from hwpfilter/qa/cppunit/data/pass/BK.hwp)bin21504 -> 21504 bytes
-rw-r--r--hwpfilter/source/hwpfile.cpp11
-rw-r--r--hwpfilter/source/hwpfile.h7
-rw-r--r--hwpfilter/source/hwpreader.hxx80
-rw-r--r--hwpfilter/source/makefile.mk1
5 files changed, 70 insertions, 29 deletions
diff --git a/hwpfilter/qa/cppunit/data/pass/BK.hwp b/hwpfilter/qa/cppunit/data/fail/BK.hwp
index d4da79fc127d..d4da79fc127d 100644
--- a/hwpfilter/qa/cppunit/data/pass/BK.hwp
+++ b/hwpfilter/qa/cppunit/data/fail/BK.hwp
Binary files differ
diff --git a/hwpfilter/source/hwpfile.cpp b/hwpfilter/source/hwpfile.cpp
index 5d8b5f09e910..2b1bde79f7d1 100644
--- a/hwpfilter/source/hwpfile.cpp
+++ b/hwpfilter/source/hwpfile.cpp
@@ -43,14 +43,9 @@
#include "hcode.h"
#include "hstream.h"
-#define HWPIDLen 30
#define HWPHeadLen 128
#define HWPSummaryLen 1008
-#define V20SIGNATURE "HWP Document File V2.00 \032\1\2\3\4\5"
-#define V21SIGNATURE "HWP Document File V2.10 \032\1\2\3\4\5"
-#define V30SIGNATURE "HWP Document File V3.00 \032\1\2\3\4\5"
-
#define FILESTG_SIGNATURE 0xF8995567
#define FILESTG_SIGNATURE_NORMAL 0xF8995568
@@ -127,8 +122,7 @@ int HWPFile::ReadHwpFile(HStream & stream)
return State();
}
-
-static int hwp_version(char *str)
+int detect_hwp_version(const char *str)
{
if (memcmp(V20SIGNATURE, str, HWPIDLen) == 0)
return HWP_V20;
@@ -139,7 +133,6 @@ static int hwp_version(char *str)
return 0;
}
-
// HIODev wrapper
int HWPFile::Open(HStream & stream)
@@ -162,7 +155,7 @@ int HWPFile::Open(HStream & stream)
char idstr[HWPIDLen];
if (ReadBlock(idstr, HWPIDLen) <= 0
- || HWP_V30 != (version = hwp_version(idstr)))
+ || HWP_V30 != (version = detect_hwp_version(idstr)))
{
return SetState(HWP_UNSUPPORTED_VERSION);
}
diff --git a/hwpfilter/source/hwpfile.h b/hwpfilter/source/hwpfile.h
index 52f30829da9c..78cdbab0b99f 100644
--- a/hwpfilter/source/hwpfile.h
+++ b/hwpfilter/source/hwpfile.h
@@ -44,10 +44,17 @@
#include "hpara.h"
#include "list.hxx"
+#define HWPIDLen 30
+#define V20SIGNATURE "HWP Document File V2.00 \032\1\2\3\4\5"
+#define V21SIGNATURE "HWP Document File V2.10 \032\1\2\3\4\5"
+#define V30SIGNATURE "HWP Document File V3.00 \032\1\2\3\4\5"
+
#define HWP_V20 20
#define HWP_V21 21
#define HWP_V30 30
+int detect_hwp_version(const char *str);
+
struct FBox;
struct EmPicture;
struct HyperText;
diff --git a/hwpfilter/source/hwpreader.hxx b/hwpfilter/source/hwpreader.hxx
index 37e57d42f7f3..d547befeada6 100644
--- a/hwpfilter/source/hwpreader.hxx
+++ b/hwpfilter/source/hwpreader.hxx
@@ -52,11 +52,12 @@
#include <com/sun/star/io/XActiveDataSink.hpp>
#include <com/sun/star/io/XActiveDataControl.hpp>
#include <com/sun/star/io/XStreamListener.hpp>
+#include <com/sun/star/document/XExtendedFilterDetection.hpp>
#include <cppuhelper/factory.hxx>
#include <cppuhelper/weak.hxx>
#include <cppuhelper/implbase1.hxx>
-#include <cppuhelper/implbase3.hxx>
+#include <cppuhelper/implbase4.hxx>
#include <cppuhelper/servicefactory.hxx>
using namespace ::rtl;
@@ -69,9 +70,12 @@ using namespace ::com::sun::star::registry;
using namespace ::com::sun::star::document;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::xml::sax;
+using namespace ::com::sun::star::document;
#include <assert.h>
+#include <comphelper/mediadescriptor.hxx>
+
#include "hwpfile.h"
#include "hcode.h"
#include "hbox.h"
@@ -82,8 +86,9 @@ using namespace ::com::sun::star::xml::sax;
#define IMPLEMENTATION_NAME "com.sun.comp.hwpimport.HwpImportFilter"
-#define SERVICE_NAME "com.sun.star.document.ImportFilter"
-#define WRITER_IMPORTER_NAME "com.sun.star.comp.Writer.XMLImporter"
+#define SERVICE_NAME1 "com.sun.star.document.ImportFilter"
+#define SERVICE_NAME2 "com.sun.star.document.ExtendedTypeDetection"
+#define WRITER_IMPORTER_NAME "com.sun.star.comp.Writer.XMLImporter"
class MyDataSink : public ::cppu::WeakImplHelper2< XActiveDataControl, XActiveDataSink >
{
@@ -193,7 +198,7 @@ private:
/* --------- Styles Parsing ------------ */
void makePageStyle();
- void makeColumns(ColumnDef *);
+ void makeColumns(ColumnDef *);
void makeTStyle(CharShape *);
void makePStyle(ParaShape *);
void makeFStyle(FBoxStyle *);
@@ -206,7 +211,7 @@ private:
char* getPStyleName(int, char *);
};
-class HwpImportFilter : public WeakImplHelper3< XFilter, XImporter, XServiceInfo >
+class HwpImportFilter : public WeakImplHelper4< XFilter, XImporter, XServiceInfo, XExtendedFilterDetection >
{
public:
HwpImportFilter( const Reference< XMultiServiceFactory > xFact );
@@ -217,18 +222,23 @@ public:
static OUString getImplementationName_Static() throw();
public:
- // XFilter
+ // XFilter
virtual sal_Bool SAL_CALL filter( const Sequence< PropertyValue >& aDescriptor )
throw( RuntimeException );
virtual void SAL_CALL cancel() throw(RuntimeException);
- // XImporter
+
+ // XImporter
virtual void SAL_CALL setTargetDocument( const Reference< XComponent >& xDoc)
throw( IllegalArgumentException, RuntimeException );
- // XServiceInfo
+
+ // XServiceInfo
OUString SAL_CALL getImplementationName() throw (RuntimeException);
Sequence< OUString > SAL_CALL getSupportedServiceNames(void) throw (::com::sun::star::uno::RuntimeException);
sal_Bool SAL_CALL supportsService(const OUString& ServiceName) throw (::com::sun::star::uno::RuntimeException);
+ //XExtendedFilterDetection
+ virtual OUString SAL_CALL detect( ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& rDescriptor ) throw (::com::sun::star::uno::RuntimeException);
+
public:
Reference< XFilter > rFilter;
Reference< XImporter > rImporter;
@@ -248,6 +258,7 @@ Sequence< OUString > HwpImportFilter::getSupportedServiceNames_Static( void ) th
aRet.getArray()[0] = HwpImportFilter::getImplementationName_Static();
return aRet;
}
+
HwpImportFilter::HwpImportFilter( const Reference< XMultiServiceFactory > xFact )
{
OUString sService(RTL_CONSTASCII_USTRINGPARAM( WRITER_IMPORTER_NAME ));
@@ -258,15 +269,14 @@ HwpImportFilter::HwpImportFilter( const Reference< XMultiServiceFactory > xFact
HwpReader *p = new HwpReader;
p->setDocumentHandler( xHandler );
- Sequence< Any > aArgs( 2 );
- aArgs[0] <<= OUString(RTL_CONSTASCII_USTRINGPARAM("Local"));
- aArgs[1] <<= OUString(RTL_CONSTASCII_USTRINGPARAM("Office"));
- Reference< XInterface > xUCB
- ( xFact->createInstanceWithArguments
- (OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.ucb.UniversalContentBroker")),
- aArgs));
- p->setUCB( xUCB );
-
+ Sequence< Any > aArgs( 2 );
+ aArgs[0] <<= OUString(RTL_CONSTASCII_USTRINGPARAM("Local"));
+ aArgs[1] <<= OUString(RTL_CONSTASCII_USTRINGPARAM("Office"));
+ Reference< XInterface > xUCB
+ ( xFact->createInstanceWithArguments
+ (OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.ucb.UniversalContentBroker")),
+ aArgs));
+ p->setUCB( xUCB );
Reference< XImporter > xImporter = Reference< XImporter >( xHandler, UNO_QUERY );
rImporter = xImporter;
@@ -314,6 +324,7 @@ OUString HwpImportFilter::getImplementationName() throw(::com::sun::star::uno::R
{
return OUString(RTL_CONSTASCII_USTRINGPARAM( IMPLEMENTATION_NAME ));
}
+
sal_Bool HwpImportFilter::supportsService( const OUString& ServiceName ) throw(::com::sun::star::uno::RuntimeException)
{
Sequence< OUString > aSNL = getSupportedServiceNames();
@@ -326,11 +337,40 @@ sal_Bool HwpImportFilter::supportsService( const OUString& ServiceName ) throw(:
return sal_False;
}
+//XExtendedFilterDetection
+OUString HwpImportFilter::detect( ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& rDescriptor ) throw (::com::sun::star::uno::RuntimeException)
+{
+ rtl::OUString sTypeName;
+
+ comphelper::MediaDescriptor aDescriptor(rDescriptor);
+ aDescriptor.addInputStream();
+
+ Reference< XInputStream > xInputStream(
+ aDescriptor[comphelper::MediaDescriptor::PROP_INPUTSTREAM()], UNO_QUERY);
+
+ if (xInputStream.is())
+ {
+ Sequence< sal_Int8 > aData;
+ sal_Int32 nLen = HWPIDLen;
+ if (
+ nLen == xInputStream->readBytes(aData, nLen) &&
+ detect_hwp_version(reinterpret_cast<const char*>(aData.getConstArray()))
+ )
+ {
+ sTypeName = OUString(RTL_CONSTASCII_USTRINGPARAM("writer_MIZI_Hwp_97"));
+ }
+ }
+
+ return sTypeName;
+}
+
Sequence< OUString> HwpImportFilter::getSupportedServiceNames( void ) throw(::com::sun::star::uno::RuntimeException)
{
- Sequence< OUString > seq(1);
- seq.getArray()[0] = OUString(RTL_CONSTASCII_USTRINGPARAM( SERVICE_NAME ));
- return seq;
+ Sequence < OUString > aRet(2);
+ OUString* pArray = aRet.getArray();
+ pArray[0] = OUString(RTL_CONSTASCII_USTRINGPARAM(SERVICE_NAME1));
+ pArray[1] = OUString(RTL_CONSTASCII_USTRINGPARAM(SERVICE_NAME2));
+ return aRet;
}
/////////////////////////////////////////////////////////////////////////////////////
diff --git a/hwpfilter/source/makefile.mk b/hwpfilter/source/makefile.mk
index accfe79dfb29..a8e137b6851b 100644
--- a/hwpfilter/source/makefile.mk
+++ b/hwpfilter/source/makefile.mk
@@ -72,6 +72,7 @@ SLOFILES = \
SHL1TARGET= $(TARGET)
SHL1STDLIBS= \
+ $(COMPHELPERLIB) \
$(CPPULIB) \
$(CPPUHELPERLIB)\
$(SALLIB) \