Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <stdio.h>
21 :
22 : #include <avmedia/mediawindow.hxx>
23 : #include <boost/scoped_ptr.hpp>
24 : #include "mediawindow_impl.hxx"
25 : #include "mediamisc.hxx"
26 : #include "mediawindow.hrc"
27 : #include <tools/urlobj.hxx>
28 : #include <vcl/msgbox.hxx>
29 : #include <unotools/pathoptions.hxx>
30 : #include <sfx2/filedlghelper.hxx>
31 : #include <comphelper/processfactory.hxx>
32 : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
33 : #include <com/sun/star/media/XManager.hpp>
34 : #include "com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp"
35 : #include "com/sun/star/ui/dialogs/TemplateDescription.hpp"
36 : #include "com/sun/star/ui/dialogs/XFilePickerControlAccess.hpp"
37 :
38 : #define AVMEDIA_FRAMEGRABBER_DEFAULTFRAME_MEDIATIME 3.0
39 :
40 : using namespace ::com::sun::star;
41 :
42 : namespace avmedia {
43 :
44 :
45 : // - MediaWindow -
46 :
47 :
48 0 : MediaWindow::MediaWindow( Window* parent, bool bInternalMediaControl ) :
49 0 : mpImpl( new priv::MediaWindowImpl( parent, this, bInternalMediaControl ) )
50 : {
51 0 : mpImpl->Show();
52 0 : }
53 :
54 :
55 :
56 0 : MediaWindow::~MediaWindow() {}
57 :
58 :
59 :
60 0 : void MediaWindow::setURL( const OUString& rURL, const OUString& rReferer )
61 : {
62 0 : mpImpl->setURL( rURL, OUString(), rReferer );
63 0 : }
64 :
65 :
66 :
67 0 : const OUString& MediaWindow::getURL() const
68 : {
69 0 : return mpImpl->getURL();
70 : }
71 :
72 :
73 :
74 0 : bool MediaWindow::isValid() const
75 : {
76 0 : return mpImpl->isValid();
77 : }
78 :
79 :
80 :
81 0 : void MediaWindow::MouseMove( const MouseEvent& /* rMEvt */ )
82 : {
83 0 : }
84 :
85 :
86 :
87 0 : void MediaWindow::MouseButtonDown( const MouseEvent& /* rMEvt */ )
88 : {
89 0 : }
90 :
91 :
92 :
93 0 : void MediaWindow::MouseButtonUp( const MouseEvent& /* rMEvt */ )
94 : {
95 0 : }
96 :
97 :
98 :
99 0 : void MediaWindow::KeyInput( const KeyEvent& /* rKEvt */ )
100 : {
101 0 : }
102 :
103 :
104 :
105 0 : void MediaWindow::KeyUp( const KeyEvent& /* rKEvt */ )
106 : {
107 0 : }
108 :
109 :
110 :
111 0 : void MediaWindow::Command( const CommandEvent& /* rCEvt */ )
112 : {
113 0 : }
114 :
115 :
116 :
117 0 : sal_Int8 MediaWindow::AcceptDrop( const AcceptDropEvent& /* rEvt */ )
118 : {
119 0 : return 0;
120 : }
121 :
122 :
123 :
124 0 : sal_Int8 MediaWindow::ExecuteDrop( const ExecuteDropEvent& /* rEvt */ )
125 : {
126 0 : return 0;
127 : }
128 :
129 :
130 :
131 0 : void MediaWindow::StartDrag( sal_Int8 /* nAction */, const Point& /* rPosPixel */ )
132 : {
133 0 : }
134 :
135 :
136 :
137 0 : Size MediaWindow::getPreferredSize() const
138 : {
139 0 : return mpImpl->getPreferredSize();
140 : }
141 :
142 :
143 :
144 0 : void MediaWindow::setPosSize( const Rectangle& rNewRect )
145 : {
146 0 : mpImpl->setPosSize( rNewRect );
147 0 : }
148 :
149 :
150 :
151 0 : void MediaWindow::setPointer( const Pointer& rPointer )
152 : {
153 0 : mpImpl->setPointer( rPointer );
154 0 : }
155 :
156 :
157 :
158 0 : bool MediaWindow::start()
159 : {
160 0 : return mpImpl->start();
161 : }
162 :
163 :
164 :
165 0 : void MediaWindow::updateMediaItem( MediaItem& rItem ) const
166 : {
167 0 : mpImpl->updateMediaItem( rItem );
168 0 : }
169 :
170 :
171 :
172 0 : void MediaWindow::executeMediaItem( const MediaItem& rItem )
173 : {
174 0 : mpImpl->executeMediaItem( rItem );
175 0 : }
176 :
177 :
178 :
179 0 : void MediaWindow::show()
180 : {
181 0 : mpImpl->Show();
182 0 : }
183 :
184 :
185 :
186 0 : void MediaWindow::hide()
187 : {
188 0 : mpImpl->Hide();
189 0 : }
190 :
191 :
192 :
193 0 : Window* MediaWindow::getWindow() const
194 : {
195 0 : return mpImpl.get();
196 : }
197 :
198 :
199 :
200 0 : void MediaWindow::getMediaFilters( FilterNameVector& rFilterNameVector )
201 : {
202 : static const char* pFilters[] = { "Advanced Audio Coding", "aac",
203 : "AIF Audio", "aif;aiff",
204 : "AU Audio", "au",
205 : "AVI", "avi",
206 : "CD Audio", "cda",
207 : "FLAC Audio", "flac",
208 : "Flash Video", "flv",
209 : "Matroska Media", "mkv",
210 : "MIDI Audio", "mid;midi",
211 : "MPEG Audio", "mp2;mp3;mpa",
212 : "MPEG Video", "mpg;mpeg;mpv;mp4;m4v",
213 : "Ogg Audio", "ogg;oga",
214 : "Ogg Video", "ogv;ogx",
215 : "RMI MIDI Audio", "rmi",
216 : "SND (SouND) Audio", "snd",
217 : "Quicktime Video", "mov",
218 : "Vivo Video", "viv",
219 : "WAVE Audio", "wav",
220 : "WebM Video", "webm",
221 : "Windows Media Audio", "wma",
222 : "Windows Media Video", "wmv"};
223 :
224 0 : for( size_t i = 0; i < SAL_N_ELEMENTS(pFilters); i += 2 )
225 : {
226 : rFilterNameVector.push_back( ::std::make_pair< OUString, OUString >(
227 : OUString::createFromAscii(pFilters[i]),
228 0 : OUString::createFromAscii(pFilters[i+1]) ) );
229 : }
230 0 : }
231 :
232 :
233 :
234 0 : bool MediaWindow::executeMediaURLDialog(Window* /* pParent */,
235 : OUString& rURL, bool *const o_pbLink)
236 : {
237 : ::sfx2::FileDialogHelper aDlg( (o_pbLink)
238 : ? ui::dialogs::TemplateDescription::FILEOPEN_LINK_PREVIEW
239 0 : : ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE, 0 );
240 0 : static const OUString aWildcard( "*." );
241 0 : FilterNameVector aFilters;
242 0 : const OUString aSeparator( ";" );
243 0 : OUString aAllTypes;
244 :
245 0 : aDlg.SetTitle( AVMEDIA_RESSTR( (o_pbLink)
246 0 : ? AVMEDIA_STR_INSERTMEDIA_DLG : AVMEDIA_STR_OPENMEDIA_DLG ) );
247 :
248 0 : getMediaFilters( aFilters );
249 :
250 : unsigned int i;
251 0 : for( i = 0; i < aFilters.size(); ++i )
252 : {
253 0 : for( sal_Int32 nIndex = 0; nIndex >= 0; )
254 : {
255 0 : if( !aAllTypes.isEmpty() )
256 0 : aAllTypes += aSeparator;
257 :
258 0 : ( aAllTypes += aWildcard ) += aFilters[ i ].second.getToken( 0, ';', nIndex );
259 : }
260 : }
261 :
262 : // add filter for all media types
263 0 : aDlg.AddFilter( AVMEDIA_RESSTR( AVMEDIA_STR_ALL_MEDIAFILES ), aAllTypes );
264 :
265 0 : for( i = 0; i < aFilters.size(); ++i )
266 : {
267 0 : OUString aTypes;
268 :
269 0 : for( sal_Int32 nIndex = 0; nIndex >= 0; )
270 : {
271 0 : if( !aTypes.isEmpty() )
272 0 : aTypes += aSeparator;
273 :
274 0 : ( aTypes += aWildcard ) += aFilters[ i ].second.getToken( 0, ';', nIndex );
275 : }
276 :
277 : // add single filters
278 0 : aDlg.AddFilter( aFilters[ i ].first, aTypes );
279 0 : }
280 :
281 : // add filter for all types
282 0 : aDlg.AddFilter( AVMEDIA_RESSTR( AVMEDIA_STR_ALL_FILES ), OUString( "*.*" ) );
283 :
284 0 : uno::Reference<ui::dialogs::XFilePicker> const xFP(aDlg.GetFilePicker());
285 : uno::Reference<ui::dialogs::XFilePickerControlAccess> const xCtrlAcc(xFP,
286 0 : uno::UNO_QUERY_THROW);
287 0 : if (o_pbLink)
288 : {
289 : // for video link should be the default
290 0 : xCtrlAcc->setValue(
291 : ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_LINK, 0,
292 0 : uno::makeAny(sal_True) );
293 : // disabled for now: TODO: preview?
294 0 : xCtrlAcc->enableControl(
295 : ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_PREVIEW,
296 0 : sal_False);
297 : }
298 :
299 0 : if( aDlg.Execute() == ERRCODE_NONE )
300 : {
301 0 : const INetURLObject aURL( aDlg.GetPath() );
302 0 : rURL = aURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS );
303 :
304 0 : if (o_pbLink)
305 : {
306 0 : uno::Any const any = xCtrlAcc->getValue(
307 0 : ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_LINK, 0);
308 0 : if (!(any >>= *o_pbLink))
309 : {
310 : SAL_WARN("avmedia", "invalid link property");
311 0 : *o_pbLink = true;
312 0 : }
313 0 : }
314 : }
315 0 : else if( !rURL.isEmpty() )
316 0 : rURL = OUString();
317 :
318 0 : return !rURL.isEmpty();
319 : }
320 :
321 :
322 :
323 0 : void MediaWindow::executeFormatErrorBox( Window* pParent )
324 : {
325 0 : ErrorBox aErrBox( pParent, AVMEDIA_RESID( AVMEDIA_ERR_URL ) );
326 :
327 0 : aErrBox.Execute();
328 0 : }
329 :
330 :
331 :
332 0 : bool MediaWindow::isMediaURL( const OUString& rURL, const OUString& rReferer, bool bDeep, Size* pPreferredSizePixel )
333 : {
334 0 : const INetURLObject aURL( rURL );
335 0 : bool bRet = false;
336 :
337 0 : if( aURL.GetProtocol() != INET_PROT_NOT_VALID )
338 : {
339 0 : if( bDeep || pPreferredSizePixel )
340 : {
341 : try
342 : {
343 : uno::Reference< media::XPlayer > xPlayer( priv::MediaWindowImpl::createPlayer(
344 : aURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ),
345 0 : rReferer ) );
346 :
347 0 : if( xPlayer.is() )
348 : {
349 0 : bRet = true;
350 :
351 0 : if( pPreferredSizePixel )
352 : {
353 0 : const awt::Size aAwtSize( xPlayer->getPreferredPlayerWindowSize() );
354 :
355 0 : pPreferredSizePixel->Width() = aAwtSize.Width;
356 0 : pPreferredSizePixel->Height() = aAwtSize.Height;
357 : }
358 0 : }
359 : }
360 0 : catch( ... )
361 : {
362 0 : }
363 : }
364 : else
365 : {
366 0 : FilterNameVector aFilters;
367 0 : const OUString aExt( aURL.getExtension() );
368 :
369 0 : getMediaFilters( aFilters );
370 :
371 : unsigned int i;
372 0 : for( i = 0; ( i < aFilters.size() ) && !bRet; ++i )
373 : {
374 0 : for( sal_Int32 nIndex = 0; nIndex >= 0 && !bRet; )
375 : {
376 0 : if( aExt.equalsIgnoreAsciiCase( aFilters[ i ].second.getToken( 0, ';', nIndex ) ) )
377 0 : bRet = true;
378 : }
379 0 : }
380 : }
381 : }
382 :
383 0 : return bRet;
384 : }
385 :
386 :
387 :
388 0 : uno::Reference< media::XPlayer > MediaWindow::createPlayer( const OUString& rURL, const OUString& rReferer )
389 : {
390 0 : return priv::MediaWindowImpl::createPlayer( rURL, rReferer );
391 : }
392 :
393 :
394 :
395 0 : uno::Reference< graphic::XGraphic > MediaWindow::grabFrame( const OUString& rURL,
396 : const OUString& rReferer,
397 : bool bAllowToCreateReplacementGraphic,
398 : double fMediaTime )
399 : {
400 0 : uno::Reference< media::XPlayer > xPlayer( createPlayer( rURL, rReferer ) );
401 0 : uno::Reference< graphic::XGraphic > xRet;
402 0 : boost::scoped_ptr< Graphic > apGraphic;
403 :
404 0 : if( xPlayer.is() )
405 : {
406 0 : uno::Reference< media::XFrameGrabber > xGrabber( xPlayer->createFrameGrabber() );
407 :
408 0 : if( xGrabber.is() )
409 : {
410 0 : if( AVMEDIA_FRAMEGRABBER_DEFAULTFRAME == fMediaTime )
411 0 : fMediaTime = AVMEDIA_FRAMEGRABBER_DEFAULTFRAME_MEDIATIME;
412 :
413 0 : if( fMediaTime >= xPlayer->getDuration() )
414 0 : fMediaTime = ( xPlayer->getDuration() * 0.5 );
415 :
416 0 : xRet = xGrabber->grabFrame( fMediaTime );
417 : }
418 :
419 0 : if( !xRet.is() && bAllowToCreateReplacementGraphic )
420 : {
421 0 : awt::Size aPrefSize( xPlayer->getPreferredPlayerWindowSize() );
422 :
423 0 : if( !aPrefSize.Width && !aPrefSize.Height )
424 : {
425 0 : const BitmapEx aBmpEx( getAudioLogo() );
426 0 : apGraphic.reset( new Graphic( aBmpEx ) );
427 : }
428 0 : }
429 : }
430 :
431 0 : if( !xRet.is() && !apGraphic.get() && bAllowToCreateReplacementGraphic )
432 : {
433 0 : const BitmapEx aBmpEx( getEmptyLogo() );
434 0 : apGraphic.reset( new Graphic( aBmpEx ) );
435 : }
436 :
437 0 : if( apGraphic.get() )
438 0 : xRet = apGraphic->GetXGraphic();
439 :
440 0 : return xRet;
441 : }
442 :
443 0 : BitmapEx MediaWindow::getAudioLogo()
444 : {
445 0 : return BitmapEx(AVMEDIA_RESID(AVMEDIA_BMP_AUDIOLOGO));
446 : }
447 :
448 0 : BitmapEx MediaWindow::getEmptyLogo()
449 : {
450 0 : return BitmapEx(AVMEDIA_RESID(AVMEDIA_BMP_EMPTYLOGO));
451 : }
452 :
453 :
454 : } // namespace avemdia
455 :
456 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|