1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_package.hxx"
30 #include <ManifestReader.hxx>
31 #include <ManifestImport.hxx>
32 #include <cppuhelper/factory.hxx>
33 #ifndef _COM_SUN_STAR_XML_SAX_XDOCUMENTHANDLER_HPP
34 #include <com/sun/star/xml/sax/XDocumentHandler.hpp>
35 #endif
36 #ifndef _COM_SUN_STAR_XML_SAX_SAXPARSEEXCEPTION_HPP
37 #include <com/sun/star/xml/sax/SAXParseException.hpp>
38 #endif
39 #ifndef _COM_SUN_STAR_XML_SAX_XPARSER_HPP
40 #include <com/sun/star/xml/sax/XParser.hpp>
41 #endif
42 #ifndef _COM_SUN_STAR_LANG_XMULTISERVICEFACTORY_HPP
43 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
44 #endif
45 #ifndef _COM_SUN_STAR_LANG_XSINGLESERVICEFACTORY_HPP
46 #include <com/sun/star/lang/XSingleServiceFactory.hpp>
47 #endif
48 #include <vector>
49 
50 using namespace ::rtl;
51 using namespace ::std;
52 using namespace ::com::sun::star::uno;
53 using namespace ::com::sun::star::beans;
54 using namespace ::com::sun::star::io;
55 using namespace ::com::sun::star::lang;
56 using namespace ::com::sun::star::registry;
57 using namespace ::com::sun::star::packages;
58 using namespace ::com::sun::star::xml::sax;
59 using namespace ::com::sun::star::packages::manifest;
60 
61 ManifestReader::ManifestReader( const Reference < XMultiServiceFactory > & xNewFactory )
62 : xFactory ( xNewFactory )
63 {
64 }
65 ManifestReader::~ManifestReader()
66 {
67 }
68 Sequence< Sequence< PropertyValue > > SAL_CALL ManifestReader::readManifestSequence( const Reference< XInputStream >& rStream )
69 	throw (::com::sun::star::uno::RuntimeException)
70 {
71 	Sequence < Sequence < PropertyValue > > aManifestSequence;
72 	Reference < XParser > xParser (xFactory->createInstance ( OUString ( RTL_CONSTASCII_USTRINGPARAM ( "com.sun.star.xml.sax.Parser" ) ) ), UNO_QUERY );
73 	if (xParser.is())
74 	{
75 		try
76 		{
77 			vector < Sequence < PropertyValue > > aManVector;
78 			Reference < XDocumentHandler > xFilter = new ManifestImport( aManVector );
79 			InputSource aParserInput;
80 			aParserInput.aInputStream = rStream;
81 			aParserInput.sSystemId = OUString ( RTL_CONSTASCII_USTRINGPARAM ( "META-INF/manifest.xml" ) );
82 			xParser->setDocumentHandler ( xFilter );
83 			xParser->parseStream( aParserInput );
84 			aManifestSequence.realloc ( aManVector.size() );
85 			Sequence < PropertyValue > * pSequence = aManifestSequence.getArray();
86 			::std::vector < Sequence < PropertyValue > >::const_iterator aIter = aManVector.begin();
87 			::std::vector < Sequence < PropertyValue > >::const_iterator aEnd = aManVector.end();
88 			while( aIter != aEnd )
89 				*pSequence++ = (*aIter++);
90 		}
91 		catch (SAXParseException& )
92 		{
93 		}
94 		catch (SAXException& )
95 		{
96 		}
97 		catch (IOException& )
98 		{
99 		}
100 	}
101 	xParser->setDocumentHandler ( Reference < XDocumentHandler > () );
102 	return aManifestSequence;
103 }
104 // Component functions
105 
106 Reference < XInterface > SAL_CALL ManifestReader_createInstance( Reference< XMultiServiceFactory > const & rServiceFactory )
107 {
108 	return *new ManifestReader( rServiceFactory );
109 }
110 OUString ManifestReader::static_getImplementationName()
111 {
112 	return OUString ( RTL_CONSTASCII_USTRINGPARAM ( "com.sun.star.packages.manifest.comp.ManifestReader" ) );
113 }
114 
115 sal_Bool SAL_CALL ManifestReader::static_supportsService(OUString const & rServiceName)
116 {
117 	return rServiceName == getSupportedServiceNames()[0];
118 }
119 
120 Sequence < OUString > ManifestReader::static_getSupportedServiceNames()
121 {
122 	Sequence < OUString > aNames(1);
123 	aNames[0] = OUString(RTL_CONSTASCII_USTRINGPARAM ( "com.sun.star.packages.manifest.ManifestReader" ) );
124 	return aNames;
125 }
126 
127 OUString ManifestReader::getImplementationName()
128 	throw (RuntimeException)
129 {
130 	return static_getImplementationName();
131 }
132 
133 sal_Bool SAL_CALL ManifestReader::supportsService(OUString const & rServiceName)
134 	throw (RuntimeException)
135 {
136 	return static_supportsService ( rServiceName );
137 }
138 
139 Sequence < OUString > ManifestReader::getSupportedServiceNames()
140 	throw (RuntimeException)
141 {
142 	return static_getSupportedServiceNames();
143 }
144 Reference < XSingleServiceFactory > ManifestReader::createServiceFactory( Reference < XMultiServiceFactory > const & rServiceFactory )
145 {
146 	return cppu::createSingleFactory (rServiceFactory,
147 										   static_getImplementationName(),
148 										   ManifestReader_createInstance,
149 										   static_getSupportedServiceNames());
150 }
151