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