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/layout.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( vcl::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 : vcl::Window* MediaWindow::getWindow() const
194 : {
195 0 : return mpImpl.get();
196 : }
197 :
198 :
199 :
200 35 : void MediaWindow::getMediaFilters( FilterNameVector& rFilterNameVector )
201 : {
202 : static const char* pFilters[] = { "Advanced Audio Coding", "aac",
203 : "AIF Audio", "aif;aiff",
204 : "Advanced Systems Format", "asf;wma;wmv",
205 : "AU Audio", "au",
206 : "AC3 Audio", "ac3",
207 : "AVI", "avi",
208 : "CD Audio", "cda",
209 : "Digital Video", "dv",
210 : "FLAC Audio", "flac",
211 : "Flash Video", "flv",
212 : "Matroska Media", "mkv",
213 : "MIDI Audio", "mid;midi",
214 : "MPEG Audio", "mp2;mp3;mpa;m4a",
215 : "MPEG Video", "mpg;mpeg;mpv;mp4;m4v",
216 : "Ogg Audio", "ogg;oga;opus",
217 : "Ogg Video", "ogv;ogx",
218 : "Real Audio", "ra",
219 : "Real Media", "rm",
220 : "RMI MIDI Audio", "rmi",
221 : "SND (SouND) Audio", "snd",
222 : "Quicktime Video", "mov",
223 : "Vivo Video", "viv",
224 : "WAVE Audio", "wav",
225 : "WebM Video", "webm",
226 : "Windows Media Audio", "wma",
227 : "Windows Media Video", "wmv"};
228 :
229 945 : for( size_t i = 0; i < SAL_N_ELEMENTS(pFilters); i += 2 )
230 : {
231 : rFilterNameVector.push_back( ::std::make_pair< OUString, OUString >(
232 : OUString::createFromAscii(pFilters[i]),
233 910 : OUString::createFromAscii(pFilters[i+1]) ) );
234 : }
235 35 : }
236 :
237 :
238 :
239 0 : bool MediaWindow::executeMediaURLDialog(vcl::Window* /* pParent */,
240 : OUString& rURL, bool *const o_pbLink)
241 : {
242 : ::sfx2::FileDialogHelper aDlg( (o_pbLink)
243 : ? ui::dialogs::TemplateDescription::FILEOPEN_LINK_PREVIEW
244 0 : : ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE, 0 );
245 0 : static const OUString aWildcard( "*." );
246 0 : FilterNameVector aFilters;
247 0 : const OUString aSeparator( ";" );
248 0 : OUString aAllTypes;
249 :
250 0 : aDlg.SetTitle( AVMEDIA_RESSTR( (o_pbLink)
251 0 : ? AVMEDIA_STR_INSERTMEDIA_DLG : AVMEDIA_STR_OPENMEDIA_DLG ) );
252 :
253 0 : getMediaFilters( aFilters );
254 :
255 : unsigned int i;
256 0 : for( i = 0; i < aFilters.size(); ++i )
257 : {
258 0 : for( sal_Int32 nIndex = 0; nIndex >= 0; )
259 : {
260 0 : if( !aAllTypes.isEmpty() )
261 0 : aAllTypes += aSeparator;
262 :
263 0 : ( aAllTypes += aWildcard ) += aFilters[ i ].second.getToken( 0, ';', nIndex );
264 : }
265 : }
266 :
267 : // add filter for all media types
268 0 : aDlg.AddFilter( AVMEDIA_RESSTR( AVMEDIA_STR_ALL_MEDIAFILES ), aAllTypes );
269 :
270 0 : for( i = 0; i < aFilters.size(); ++i )
271 : {
272 0 : OUString aTypes;
273 :
274 0 : for( sal_Int32 nIndex = 0; nIndex >= 0; )
275 : {
276 0 : if( !aTypes.isEmpty() )
277 0 : aTypes += aSeparator;
278 :
279 0 : ( aTypes += aWildcard ) += aFilters[ i ].second.getToken( 0, ';', nIndex );
280 : }
281 :
282 : // add single filters
283 0 : aDlg.AddFilter( aFilters[ i ].first, aTypes );
284 0 : }
285 :
286 : // add filter for all types
287 0 : aDlg.AddFilter( AVMEDIA_RESSTR( AVMEDIA_STR_ALL_FILES ), OUString( "*.*" ) );
288 :
289 0 : uno::Reference<ui::dialogs::XFilePicker> const xFP(aDlg.GetFilePicker());
290 : uno::Reference<ui::dialogs::XFilePickerControlAccess> const xCtrlAcc(xFP,
291 0 : uno::UNO_QUERY_THROW);
292 0 : if (o_pbLink)
293 : {
294 : // for video link should be the default
295 0 : xCtrlAcc->setValue(
296 : ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_LINK, 0,
297 0 : uno::makeAny(true) );
298 : // disabled for now: TODO: preview?
299 0 : xCtrlAcc->enableControl(
300 : ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_PREVIEW,
301 0 : false);
302 : }
303 :
304 0 : if( aDlg.Execute() == ERRCODE_NONE )
305 : {
306 0 : const INetURLObject aURL( aDlg.GetPath() );
307 0 : rURL = aURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS );
308 :
309 0 : if (o_pbLink)
310 : {
311 0 : uno::Any const any = xCtrlAcc->getValue(
312 0 : ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_LINK, 0);
313 0 : if (!(any >>= *o_pbLink))
314 : {
315 : SAL_WARN("avmedia", "invalid link property");
316 0 : *o_pbLink = true;
317 0 : }
318 0 : }
319 : }
320 0 : else if( !rURL.isEmpty() )
321 0 : rURL = OUString();
322 :
323 0 : return !rURL.isEmpty();
324 : }
325 :
326 :
327 :
328 0 : void MediaWindow::executeFormatErrorBox( vcl::Window* pParent )
329 : {
330 0 : MessageDialog aErrBox( pParent, AVMEDIA_RESID( AVMEDIA_STR_ERR_URL ) );
331 :
332 0 : aErrBox.Execute();
333 0 : }
334 :
335 :
336 :
337 35 : bool MediaWindow::isMediaURL( const OUString& rURL, const OUString& rReferer, bool bDeep, Size* pPreferredSizePixel )
338 : {
339 35 : const INetURLObject aURL( rURL );
340 35 : bool bRet = false;
341 :
342 35 : if( aURL.GetProtocol() != INET_PROT_NOT_VALID )
343 : {
344 35 : if( bDeep || pPreferredSizePixel )
345 : {
346 : try
347 : {
348 : uno::Reference< media::XPlayer > xPlayer( priv::MediaWindowImpl::createPlayer(
349 : aURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ),
350 0 : rReferer ) );
351 :
352 0 : if( xPlayer.is() )
353 : {
354 0 : bRet = true;
355 :
356 0 : if( pPreferredSizePixel )
357 : {
358 0 : const awt::Size aAwtSize( xPlayer->getPreferredPlayerWindowSize() );
359 :
360 0 : pPreferredSizePixel->Width() = aAwtSize.Width;
361 0 : pPreferredSizePixel->Height() = aAwtSize.Height;
362 : }
363 0 : }
364 : }
365 0 : catch( ... )
366 : {
367 0 : }
368 : }
369 : else
370 : {
371 35 : FilterNameVector aFilters;
372 70 : const OUString aExt( aURL.getExtension() );
373 :
374 35 : getMediaFilters( aFilters );
375 :
376 : unsigned int i;
377 840 : for( i = 0; ( i < aFilters.size() ) && !bRet; ++i )
378 : {
379 2905 : for( sal_Int32 nIndex = 0; nIndex >= 0 && !bRet; )
380 : {
381 1295 : if( aExt.equalsIgnoreAsciiCase( aFilters[ i ].second.getToken( 0, ';', nIndex ) ) )
382 35 : bRet = true;
383 : }
384 35 : }
385 : }
386 : }
387 :
388 35 : return bRet;
389 : }
390 :
391 :
392 :
393 2 : uno::Reference< media::XPlayer > MediaWindow::createPlayer( const OUString& rURL, const OUString& rReferer, const OUString* pMimeType )
394 : {
395 2 : return priv::MediaWindowImpl::createPlayer( rURL, rReferer, pMimeType );
396 : }
397 :
398 :
399 :
400 2 : uno::Reference< graphic::XGraphic > MediaWindow::grabFrame( const OUString& rURL,
401 : const OUString& rReferer,
402 : const OUString& sMimeType,
403 : double fMediaTime )
404 : {
405 2 : uno::Reference< media::XPlayer > xPlayer( createPlayer( rURL, rReferer, &sMimeType ) );
406 2 : uno::Reference< graphic::XGraphic > xRet;
407 4 : boost::scoped_ptr< Graphic > apGraphic;
408 :
409 2 : if( xPlayer.is() )
410 : {
411 0 : uno::Reference< media::XFrameGrabber > xGrabber( xPlayer->createFrameGrabber() );
412 :
413 0 : if( xGrabber.is() )
414 : {
415 0 : if( AVMEDIA_FRAMEGRABBER_DEFAULTFRAME == fMediaTime )
416 0 : fMediaTime = AVMEDIA_FRAMEGRABBER_DEFAULTFRAME_MEDIATIME;
417 :
418 0 : if( fMediaTime >= xPlayer->getDuration() )
419 0 : fMediaTime = ( xPlayer->getDuration() * 0.5 );
420 :
421 0 : xRet = xGrabber->grabFrame( fMediaTime );
422 : }
423 :
424 0 : if( !xRet.is() )
425 : {
426 0 : awt::Size aPrefSize( xPlayer->getPreferredPlayerWindowSize() );
427 :
428 0 : if( !aPrefSize.Width && !aPrefSize.Height )
429 : {
430 0 : const BitmapEx aBmpEx( getAudioLogo() );
431 0 : apGraphic.reset( new Graphic( aBmpEx ) );
432 : }
433 0 : }
434 : }
435 :
436 2 : if( !xRet.is() && !apGraphic.get() )
437 : {
438 2 : const BitmapEx aBmpEx( getEmptyLogo() );
439 2 : apGraphic.reset( new Graphic( aBmpEx ) );
440 : }
441 :
442 2 : if( apGraphic.get() )
443 2 : xRet = apGraphic->GetXGraphic();
444 :
445 4 : return xRet;
446 : }
447 :
448 0 : BitmapEx MediaWindow::getAudioLogo()
449 : {
450 0 : return BitmapEx(AVMEDIA_RESID(AVMEDIA_BMP_AUDIOLOGO));
451 : }
452 :
453 2 : BitmapEx MediaWindow::getEmptyLogo()
454 : {
455 2 : return BitmapEx(AVMEDIA_RESID(AVMEDIA_BMP_EMPTYLOGO));
456 : }
457 :
458 :
459 651 : } // namespace avemdia
460 :
461 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|