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_ucbhelper.hxx"
30 
31 /**************************************************************************
32 								TODO
33  **************************************************************************
34 
35  *************************************************************************/
36 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
37 #include <ucbhelper/contentidentifier.hxx>
38 #include <cppuhelper/typeprovider.hxx>
39 #include <osl/mutex.hxx>
40 
41 using namespace rtl;
42 using namespace com::sun::star::uno;
43 using namespace com::sun::star::lang;
44 using namespace com::sun::star::ucb;
45 
46 namespace ucbhelper
47 {
48 
49 //=========================================================================
50 //=========================================================================
51 //
52 // struct ContentIdentifier_Impl.
53 //
54 //=========================================================================
55 //=========================================================================
56 
57 struct ContentIdentifier_Impl
58 {
59 	Reference< XMultiServiceFactory > m_xSMgr;
60 	OUString 						  m_aContentId;
61 	OUString 						  m_aProviderScheme;
62 	osl::Mutex						  m_aMutex;
63 
64 	ContentIdentifier_Impl( const Reference< XMultiServiceFactory >& rSMgr,
65 				  			const OUString& rURL );
66 };
67 
68 //=========================================================================
69 //
70 // ContentIdentifier_Impl Implementation.
71 //
72 //=========================================================================
73 
74 ContentIdentifier_Impl::ContentIdentifier_Impl(
75 				  const Reference< XMultiServiceFactory >& rSMgr,
76 				  const OUString& rURL )
77 : m_xSMgr( rSMgr )
78 {
79 	// Normalize URL scheme ( it's case insensitive ).
80 
81 	// The content provider scheme is the part before the first ':'
82 	// within the content id.
83 	sal_Int32 nPos = rURL.indexOf( ':', 0 );
84 	if ( nPos != -1 )
85 	{
86 		OUString aScheme( rURL.copy( 0, nPos ) );
87 		m_aProviderScheme = aScheme.toAsciiLowerCase();
88 		m_aContentId = rURL.replaceAt( 0, nPos, aScheme );
89 	}
90 }
91 
92 //=========================================================================
93 //
94 // ContentIdentifier Implementation.
95 //
96 //=========================================================================
97 
98 ContentIdentifier::ContentIdentifier(
99 						const Reference< XMultiServiceFactory >& rxSMgr,
100 						const OUString& rURL )
101 {
102 	m_pImpl = new ContentIdentifier_Impl( rxSMgr, rURL );
103 }
104 
105 //=========================================================================
106 ContentIdentifier::ContentIdentifier( const OUString& rURL )
107 {
108 	m_pImpl = new ContentIdentifier_Impl(
109 					Reference< XMultiServiceFactory >(), rURL );
110 }
111 
112 //=========================================================================
113 // virtual
114 ContentIdentifier::~ContentIdentifier()
115 {
116 	delete m_pImpl;
117 }
118 
119 //=========================================================================
120 //
121 // XInterface methods.
122 //
123 //=========================================================================
124 
125 //=========================================================================
126 // virtual
127 void SAL_CALL ContentIdentifier::acquire() throw()
128 {
129 	OWeakObject::acquire();
130 }
131 
132 //=========================================================================
133 // virtual
134 void SAL_CALL ContentIdentifier::release() throw()
135 {
136 	OWeakObject::release();
137 }
138 
139 //=========================================================================
140 // virtual
141 Any SAL_CALL
142 ContentIdentifier::queryInterface( const Type & rType )
143 	throw ( RuntimeException )
144 {
145 	Any aRet = cppu::queryInterface( rType,
146 				static_cast< XTypeProvider * >( this ),
147 				static_cast< XContentIdentifier * >( this ) );
148 
149 	return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType );
150 }
151 
152 //=========================================================================
153 //
154 // XTypeProvider methods.
155 //
156 //=========================================================================
157 
158 // virtual
159 Sequence< sal_Int8 > SAL_CALL
160 ContentIdentifier::getImplementationId()
161 	throw( RuntimeException )
162 {
163 	static cppu::OImplementationId* pId = NULL;
164   	if ( !pId )
165   	{
166 		osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
167 	  	if ( !pId )
168 	  	{
169 		  	static cppu::OImplementationId id( sal_False );
170 		  	pId = &id;
171 	  	}
172   	}
173   	return (*pId).getImplementationId();
174 }
175 
176 //=========================================================================
177 // virtual
178 Sequence< com::sun::star::uno::Type > SAL_CALL
179 ContentIdentifier::getTypes()
180 	throw( RuntimeException )
181 {
182 	static cppu::OTypeCollection* pCollection = NULL;
183   	if ( !pCollection )
184   	{
185 		osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
186 		if ( !pCollection )
187 		{
188 			static cppu::OTypeCollection collection(
189 					getCppuType( static_cast<
190 						Reference < XTypeProvider > * >( 0 ) ),
191 					getCppuType( static_cast<
192 						Reference< XContentIdentifier > * >( 0 ) ) );
193 			pCollection = &collection;
194 		}
195 	}
196 	return (*pCollection).getTypes();
197 }
198 
199 //=========================================================================
200 //
201 // XContentIdentifier methods.
202 //
203 //=========================================================================
204 
205 // virtual
206 OUString SAL_CALL ContentIdentifier::getContentIdentifier()
207 	throw( RuntimeException )
208 {
209 	return m_pImpl->m_aContentId;
210 }
211 
212 //=========================================================================
213 // virtual
214 OUString SAL_CALL ContentIdentifier::getContentProviderScheme()
215 	throw( RuntimeException )
216 {
217 	return m_pImpl->m_aProviderScheme;
218 }
219 
220 } /* namespace ucbhelper */
221 
222