mirror of
https://github.com/salvadordf/CEF4Delphi.git
synced 2024-11-15 15:55:56 +01:00
Update to CEF 81.2.17
- New MediaRouter demo (still buggy) - Removed TCEFMediaObserverComponent and merged all the ICefMediaObserver methods and events into TChromium. - Fixed some Media Observer parameters - Added TChromium.RequestContext - Added TChromium.MediaRouter - Added TChromium.MediaObserver - Added TChromium.Registration
This commit is contained in:
parent
02ef32b474
commit
62c310a7b9
@ -3,13 +3,13 @@ CEF4Delphi is an open source project created by Salvador D
|
|||||||
|
|
||||||
CEF4Delphi is based on DCEF3, made by Henri Gourvest. The original license of DCEF3 still applies to CEF4Delphi. Read the license terms in the first lines of any *.pas file.
|
CEF4Delphi is based on DCEF3, made by Henri Gourvest. The original license of DCEF3 still applies to CEF4Delphi. Read the license terms in the first lines of any *.pas file.
|
||||||
|
|
||||||
CEF4Delphi uses CEF 81.2.16 which includes Chromium 81.0.4044.92.
|
CEF4Delphi uses CEF 81.2.17 which includes Chromium 81.0.4044.113.
|
||||||
The CEF binaries used by CEF4Delphi are available for download at spotify :
|
The CEF binaries used by CEF4Delphi are available for download at spotify :
|
||||||
* 32 bits not available at this moment.
|
* [32 bits](http://opensource.spotify.com/cefbuilds/cef_binary_81.2.17%2Bgb382c62%2Bchromium-81.0.4044.113_windows32.tar.bz2)
|
||||||
* [64 bits](http://opensource.spotify.com/cefbuilds/cef_binary_81.2.16%2Bgdacda4f%2Bchromium-81.0.4044.92_windows64.tar.bz2)
|
* [64 bits](http://opensource.spotify.com/cefbuilds/cef_binary_81.2.17%2Bgb382c62%2Bchromium-81.0.4044.113_windows64.tar.bz2)
|
||||||
|
|
||||||
|
|
||||||
CEF4Delphi was developed and tested on Delphi 10.3.3 and it has been tested in Delphi 7, Delphi XE, Delphi 10, Delphi 10.2 and Lazarus 2.0.6/FPC 3.0.4. CEF4Delphi includes VCL, FireMonkey (FMX) and Lazarus components.
|
CEF4Delphi was developed and tested on Delphi 10.3.3 and it has been tested in Delphi 7, Delphi XE, Delphi 10, Delphi 10.2 and Lazarus 2.0.8/FPC 3.0.4. CEF4Delphi includes VCL, FireMonkey (FMX) and Lazarus components.
|
||||||
|
|
||||||
## Links
|
## Links
|
||||||
* [Installation instructions and more information about CEF4Delphi](https://www.briskbard.com/index.php?lang=en&pageid=cef)
|
* [Installation instructions and more information about CEF4Delphi](https://www.briskbard.com/index.php?lang=en&pageid=cef)
|
||||||
|
18
demos/Delphi_VCL/MediaRouter/00-DeleteDCUs.bat
Normal file
18
demos/Delphi_VCL/MediaRouter/00-DeleteDCUs.bat
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
del /s /q *.dcu
|
||||||
|
del /s /q *.exe
|
||||||
|
del /s /q *.res
|
||||||
|
del /s /q *.rsm
|
||||||
|
del /s /q *.log
|
||||||
|
del /s /q *.dsk
|
||||||
|
del /s /q *.identcache
|
||||||
|
del /s /q *.stat
|
||||||
|
del /s /q *.local
|
||||||
|
del /s /q *.~*
|
||||||
|
rmdir Win32\Debug
|
||||||
|
rmdir Win32\Release
|
||||||
|
rmdir Win32
|
||||||
|
rmdir Win64\Debug
|
||||||
|
rmdir Win64\Release
|
||||||
|
rmdir Win64
|
||||||
|
rmdir __history
|
||||||
|
rmdir __recovery
|
@ -2,7 +2,7 @@
|
|||||||
// ***************************** CEF4Delphi *******************************
|
// ***************************** CEF4Delphi *******************************
|
||||||
// ************************************************************************
|
// ************************************************************************
|
||||||
//
|
//
|
||||||
// CEF4Delphi is based on DCEF3 which uses CEF to embed a chromium-based
|
// CEF4Delphi is based on DCEF3 which uses CEF3 to embed a chromium-based
|
||||||
// browser in Delphi applications.
|
// browser in Delphi applications.
|
||||||
//
|
//
|
||||||
// The original license of DCEF3 still applies to CEF4Delphi.
|
// The original license of DCEF3 still applies to CEF4Delphi.
|
||||||
@ -10,7 +10,7 @@
|
|||||||
// For more information about CEF4Delphi visit :
|
// For more information about CEF4Delphi visit :
|
||||||
// https://www.briskbard.com/index.php?lang=en&pageid=cef
|
// https://www.briskbard.com/index.php?lang=en&pageid=cef
|
||||||
//
|
//
|
||||||
// Copyright © 2020 Salvador Diaz Fau. All rights reserved.
|
// Copyright © 2018 Salvador Díaz Fau. All rights reserved.
|
||||||
//
|
//
|
||||||
// ************************************************************************
|
// ************************************************************************
|
||||||
// ************ vvvv Original license and comments below vvvv *************
|
// ************ vvvv Original license and comments below vvvv *************
|
||||||
@ -35,33 +35,35 @@
|
|||||||
*
|
*
|
||||||
*)
|
*)
|
||||||
|
|
||||||
unit uCEFMediaObserverEvents;
|
program MediaRouter;
|
||||||
|
|
||||||
{$IFDEF FPC}
|
|
||||||
{$MODE OBJFPC}{$H+}
|
|
||||||
{$ENDIF}
|
|
||||||
|
|
||||||
{$IFNDEF CPUX64}{$ALIGN ON}{$ENDIF}
|
|
||||||
{$MINENUMSIZE 4}
|
|
||||||
|
|
||||||
{$I cef.inc}
|
{$I cef.inc}
|
||||||
|
|
||||||
interface
|
|
||||||
|
|
||||||
uses
|
uses
|
||||||
{$IFDEF DELPHI16_UP}
|
{$IFDEF DELPHI16_UP}
|
||||||
System.Classes,
|
Vcl.Forms,
|
||||||
|
WinApi.Windows,
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
Classes,
|
Forms,
|
||||||
|
Windows,
|
||||||
{$ENDIF }
|
{$ENDIF }
|
||||||
uCEFTypes, uCEFInterfaces;
|
uCEFApplication,
|
||||||
|
uMediaRouterFrm in 'uMediaRouterFrm.pas' {MediaRouterFrm};
|
||||||
|
|
||||||
type
|
{$R *.res}
|
||||||
TOnSinksEvent = procedure(Sender: TObject; const sinks: TCefMediaSinkArray) of object;
|
|
||||||
TOnRoutesEvent = procedure(Sender: TObject; const routes: TCefMediaRouteArray) of object;
|
|
||||||
TOnRouteStateChangedEvent = procedure(Sender: TObject; const route: ICefMediaRoute; state: TCefMediaRouteConnectionState) of object;
|
|
||||||
TOnRouteMessageReceivedEvent = procedure(Sender: TObject; const route: ICefMediaRoute; const message_: Pointer; message_size: NativeUInt) of object;
|
|
||||||
|
|
||||||
implementation
|
{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}
|
||||||
|
|
||||||
|
begin
|
||||||
|
CreateGlobalCEFApp;
|
||||||
|
|
||||||
|
if GlobalCEFApp.StartMainProcess then
|
||||||
|
begin
|
||||||
|
Application.Initialize;
|
||||||
|
Application.MainFormOnTaskbar := True;
|
||||||
|
Application.CreateForm(TMediaRouterFrm, MediaRouterFrm);
|
||||||
|
Application.Run;
|
||||||
|
end;
|
||||||
|
|
||||||
|
DestroyGlobalCEFApp;
|
||||||
end.
|
end.
|
1004
demos/Delphi_VCL/MediaRouter/MediaRouter.dproj
Normal file
1004
demos/Delphi_VCL/MediaRouter/MediaRouter.dproj
Normal file
File diff suppressed because it is too large
Load Diff
409
demos/Delphi_VCL/MediaRouter/cef.inc
Normal file
409
demos/Delphi_VCL/MediaRouter/cef.inc
Normal file
@ -0,0 +1,409 @@
|
|||||||
|
// ************************************************************************
|
||||||
|
// ***************************** CEF4Delphi *******************************
|
||||||
|
// ************************************************************************
|
||||||
|
//
|
||||||
|
// CEF4Delphi is based on DCEF3 which uses CEF3 to embed a chromium-based
|
||||||
|
// browser in Delphi applications.
|
||||||
|
//
|
||||||
|
// The original license of DCEF3 still applies to CEF4Delphi.
|
||||||
|
//
|
||||||
|
// For more information about CEF4Delphi visit :
|
||||||
|
// https://www.briskbard.com/index.php?lang=en&pageid=cef
|
||||||
|
//
|
||||||
|
// Copyright © 2017 Salvador Diaz Fau. All rights reserved.
|
||||||
|
//
|
||||||
|
// ************************************************************************
|
||||||
|
// ************ vvvv Original license and comments below vvvv *************
|
||||||
|
// ************************************************************************
|
||||||
|
(*
|
||||||
|
* Delphi Chromium Embedded 3
|
||||||
|
*
|
||||||
|
* Usage allowed under the restrictions of the Lesser GNU General Public License
|
||||||
|
* or alternatively the restrictions of the Mozilla Public License 1.1
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
|
||||||
|
* the specific language governing rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* Unit owner : Henri Gourvest <hgourvest@gmail.com>
|
||||||
|
* Web site : http://www.progdigy.com
|
||||||
|
* Repository : http://code.google.com/p/delphichromiumembedded/
|
||||||
|
* Group : http://groups.google.com/group/delphichromiumembedded
|
||||||
|
*
|
||||||
|
* Embarcadero Technologies, Inc is not permitted to use or redistribute
|
||||||
|
* this source code without explicit permission.
|
||||||
|
*
|
||||||
|
*)
|
||||||
|
|
||||||
|
// The complete list of compiler versions is here :
|
||||||
|
// http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Compiler_Versions
|
||||||
|
|
||||||
|
{$DEFINE DELPHI_VERSION_UNKNOW}
|
||||||
|
|
||||||
|
// Delphi 5
|
||||||
|
{$IFDEF VER130}
|
||||||
|
{$UNDEF DELPHI_VERSION_UNKNOW}
|
||||||
|
{$DEFINE DELPHI5_UP}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
// Delphi 6
|
||||||
|
{$IFDEF VER140}
|
||||||
|
{$UNDEF DELPHI_VERSION_UNKNOW}
|
||||||
|
{$DEFINE DELPHI5_UP}
|
||||||
|
{$DEFINE DELPHI6_UP}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
// Delphi 7
|
||||||
|
{$IFDEF VER150}
|
||||||
|
{$UNDEF DELPHI_VERSION_UNKNOW}
|
||||||
|
{$DEFINE DELPHI5_UP}
|
||||||
|
{$DEFINE DELPHI6_UP}
|
||||||
|
{$DEFINE DELPHI7_UP}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
// Delphi 8
|
||||||
|
{$IFDEF VER160}
|
||||||
|
{$UNDEF DELPHI_VERSION_UNKNOW}
|
||||||
|
{$DEFINE DELPHI5_UP}
|
||||||
|
{$DEFINE DELPHI6_UP}
|
||||||
|
{$DEFINE DELPHI7_UP}
|
||||||
|
{$DEFINE DELPHI8_UP}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
// Delphi 2005
|
||||||
|
{$IFDEF VER170}
|
||||||
|
{$UNDEF DELPHI_VERSION_UNKNOW}
|
||||||
|
{$DEFINE DELPHI5_UP}
|
||||||
|
{$DEFINE DELPHI6_UP}
|
||||||
|
{$DEFINE DELPHI7_UP}
|
||||||
|
{$DEFINE DELPHI8_UP}
|
||||||
|
{$DEFINE DELPHI9_UP}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
{$IFDEF VER180}
|
||||||
|
{$UNDEF DELPHI_VERSION_UNKNOW}
|
||||||
|
// Delphi 2007
|
||||||
|
{$IFDEF VER185}
|
||||||
|
{$DEFINE DELPHI5_UP}
|
||||||
|
{$DEFINE DELPHI6_UP}
|
||||||
|
{$DEFINE DELPHI7_UP}
|
||||||
|
{$DEFINE DELPHI8_UP}
|
||||||
|
{$DEFINE DELPHI9_UP}
|
||||||
|
{$DEFINE DELPHI10_UP}
|
||||||
|
{$DEFINE DELPHI11_UP}
|
||||||
|
// Delphi 2006
|
||||||
|
{$ELSE}
|
||||||
|
{$DEFINE DELPHI5_UP}
|
||||||
|
{$DEFINE DELPHI6_UP}
|
||||||
|
{$DEFINE DELPHI7_UP}
|
||||||
|
{$DEFINE DELPHI8_UP}
|
||||||
|
{$DEFINE DELPHI9_UP}
|
||||||
|
{$DEFINE DELPHI10_UP}
|
||||||
|
{$ENDIF}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
// Delphi 2009
|
||||||
|
{$IFDEF VER200}
|
||||||
|
{$UNDEF DELPHI_VERSION_UNKNOW}
|
||||||
|
{$DEFINE DELPHI5_UP}
|
||||||
|
{$DEFINE DELPHI6_UP}
|
||||||
|
{$DEFINE DELPHI7_UP}
|
||||||
|
{$DEFINE DELPHI8_UP}
|
||||||
|
{$DEFINE DELPHI9_UP}
|
||||||
|
{$DEFINE DELPHI10_UP}
|
||||||
|
{$DEFINE DELPHI11_UP}
|
||||||
|
{$DEFINE DELPHI12_UP}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
//Delphi 2010
|
||||||
|
{$IFDEF VER210}
|
||||||
|
{$UNDEF DELPHI_VERSION_UNKNOW}
|
||||||
|
{$DEFINE DELPHI5_UP}
|
||||||
|
{$DEFINE DELPHI6_UP}
|
||||||
|
{$DEFINE DELPHI7_UP}
|
||||||
|
{$DEFINE DELPHI8_UP}
|
||||||
|
{$DEFINE DELPHI9_UP}
|
||||||
|
{$DEFINE DELPHI10_UP}
|
||||||
|
{$DEFINE DELPHI11_UP}
|
||||||
|
{$DEFINE DELPHI12_UP}
|
||||||
|
{$DEFINE DELPHI14_UP}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
// Delphi XE
|
||||||
|
{$IFDEF VER220}
|
||||||
|
{$UNDEF DELPHI_VERSION_UNKNOW}
|
||||||
|
{$DEFINE DELPHI5_UP}
|
||||||
|
{$DEFINE DELPHI6_UP}
|
||||||
|
{$DEFINE DELPHI7_UP}
|
||||||
|
{$DEFINE DELPHI8_UP}
|
||||||
|
{$DEFINE DELPHI9_UP}
|
||||||
|
{$DEFINE DELPHI10_UP}
|
||||||
|
{$DEFINE DELPHI11_UP}
|
||||||
|
{$DEFINE DELPHI12_UP}
|
||||||
|
{$DEFINE DELPHI14_UP}
|
||||||
|
{$DEFINE DELPHI15_UP}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
// Delphi XE2 (First FireMonkey and 64bit compiler)
|
||||||
|
{$IFDEF VER230}
|
||||||
|
{$UNDEF DELPHI_VERSION_UNKNOW}
|
||||||
|
{$DEFINE DELPHI5_UP}
|
||||||
|
{$DEFINE DELPHI6_UP}
|
||||||
|
{$DEFINE DELPHI7_UP}
|
||||||
|
{$DEFINE DELPHI8_UP}
|
||||||
|
{$DEFINE DELPHI9_UP}
|
||||||
|
{$DEFINE DELPHI10_UP}
|
||||||
|
{$DEFINE DELPHI11_UP}
|
||||||
|
{$DEFINE DELPHI12_UP}
|
||||||
|
{$DEFINE DELPHI14_UP}
|
||||||
|
{$DEFINE DELPHI15_UP}
|
||||||
|
{$DEFINE DELPHI16_UP}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
// Delphi XE3
|
||||||
|
{$IFDEF VER240}
|
||||||
|
{$UNDEF DELPHI_VERSION_UNKNOW}
|
||||||
|
{$DEFINE DELPHI5_UP}
|
||||||
|
{$DEFINE DELPHI6_UP}
|
||||||
|
{$DEFINE DELPHI7_UP}
|
||||||
|
{$DEFINE DELPHI8_UP}
|
||||||
|
{$DEFINE DELPHI9_UP}
|
||||||
|
{$DEFINE DELPHI10_UP}
|
||||||
|
{$DEFINE DELPHI11_UP}
|
||||||
|
{$DEFINE DELPHI12_UP}
|
||||||
|
{$DEFINE DELPHI14_UP}
|
||||||
|
{$DEFINE DELPHI15_UP}
|
||||||
|
{$DEFINE DELPHI16_UP}
|
||||||
|
{$DEFINE DELPHI17_UP}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
// Delphi XE4
|
||||||
|
{$IFDEF VER250}
|
||||||
|
{$UNDEF DELPHI_VERSION_UNKNOW}
|
||||||
|
{$DEFINE DELPHI5_UP}
|
||||||
|
{$DEFINE DELPHI6_UP}
|
||||||
|
{$DEFINE DELPHI7_UP}
|
||||||
|
{$DEFINE DELPHI8_UP}
|
||||||
|
{$DEFINE DELPHI9_UP}
|
||||||
|
{$DEFINE DELPHI10_UP}
|
||||||
|
{$DEFINE DELPHI11_UP}
|
||||||
|
{$DEFINE DELPHI12_UP}
|
||||||
|
{$DEFINE DELPHI14_UP}
|
||||||
|
{$DEFINE DELPHI15_UP}
|
||||||
|
{$DEFINE DELPHI16_UP}
|
||||||
|
{$DEFINE DELPHI17_UP}
|
||||||
|
{$DEFINE DELPHI18_UP}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
// Delphi XE5
|
||||||
|
{$IFDEF VER260}
|
||||||
|
{$UNDEF DELPHI_VERSION_UNKNOW}
|
||||||
|
{$DEFINE DELPHI5_UP}
|
||||||
|
{$DEFINE DELPHI6_UP}
|
||||||
|
{$DEFINE DELPHI7_UP}
|
||||||
|
{$DEFINE DELPHI8_UP}
|
||||||
|
{$DEFINE DELPHI9_UP}
|
||||||
|
{$DEFINE DELPHI10_UP}
|
||||||
|
{$DEFINE DELPHI11_UP}
|
||||||
|
{$DEFINE DELPHI12_UP}
|
||||||
|
{$DEFINE DELPHI14_UP}
|
||||||
|
{$DEFINE DELPHI15_UP}
|
||||||
|
{$DEFINE DELPHI16_UP}
|
||||||
|
{$DEFINE DELPHI17_UP}
|
||||||
|
{$DEFINE DELPHI18_UP}
|
||||||
|
{$DEFINE DELPHI19_UP}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
// Delphi XE6
|
||||||
|
{$IFDEF VER270}
|
||||||
|
{$UNDEF DELPHI_VERSION_UNKNOW}
|
||||||
|
{$DEFINE DELPHI5_UP}
|
||||||
|
{$DEFINE DELPHI6_UP}
|
||||||
|
{$DEFINE DELPHI7_UP}
|
||||||
|
{$DEFINE DELPHI8_UP}
|
||||||
|
{$DEFINE DELPHI9_UP}
|
||||||
|
{$DEFINE DELPHI10_UP}
|
||||||
|
{$DEFINE DELPHI11_UP}
|
||||||
|
{$DEFINE DELPHI12_UP}
|
||||||
|
{$DEFINE DELPHI14_UP}
|
||||||
|
{$DEFINE DELPHI15_UP}
|
||||||
|
{$DEFINE DELPHI16_UP}
|
||||||
|
{$DEFINE DELPHI17_UP}
|
||||||
|
{$DEFINE DELPHI18_UP}
|
||||||
|
{$DEFINE DELPHI19_UP}
|
||||||
|
{$DEFINE DELPHI20_UP}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
// Delphi XE7
|
||||||
|
{$IFDEF VER280}
|
||||||
|
{$UNDEF DELPHI_VERSION_UNKNOW}
|
||||||
|
{$DEFINE DELPHI5_UP}
|
||||||
|
{$DEFINE DELPHI6_UP}
|
||||||
|
{$DEFINE DELPHI7_UP}
|
||||||
|
{$DEFINE DELPHI8_UP}
|
||||||
|
{$DEFINE DELPHI9_UP}
|
||||||
|
{$DEFINE DELPHI10_UP}
|
||||||
|
{$DEFINE DELPHI11_UP}
|
||||||
|
{$DEFINE DELPHI12_UP}
|
||||||
|
{$DEFINE DELPHI14_UP}
|
||||||
|
{$DEFINE DELPHI15_UP}
|
||||||
|
{$DEFINE DELPHI16_UP}
|
||||||
|
{$DEFINE DELPHI17_UP}
|
||||||
|
{$DEFINE DELPHI18_UP}
|
||||||
|
{$DEFINE DELPHI19_UP}
|
||||||
|
{$DEFINE DELPHI20_UP}
|
||||||
|
{$DEFINE DELPHI21_UP}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
// Delphi XE8
|
||||||
|
{$IFDEF VER290}
|
||||||
|
{$UNDEF DELPHI_VERSION_UNKNOW}
|
||||||
|
{$DEFINE DELPHI5_UP}
|
||||||
|
{$DEFINE DELPHI6_UP}
|
||||||
|
{$DEFINE DELPHI7_UP}
|
||||||
|
{$DEFINE DELPHI8_UP}
|
||||||
|
{$DEFINE DELPHI9_UP}
|
||||||
|
{$DEFINE DELPHI10_UP}
|
||||||
|
{$DEFINE DELPHI11_UP}
|
||||||
|
{$DEFINE DELPHI12_UP}
|
||||||
|
{$DEFINE DELPHI14_UP}
|
||||||
|
{$DEFINE DELPHI15_UP}
|
||||||
|
{$DEFINE DELPHI16_UP}
|
||||||
|
{$DEFINE DELPHI17_UP}
|
||||||
|
{$DEFINE DELPHI18_UP}
|
||||||
|
{$DEFINE DELPHI19_UP}
|
||||||
|
{$DEFINE DELPHI20_UP}
|
||||||
|
{$DEFINE DELPHI21_UP}
|
||||||
|
{$DEFINE DELPHI22_UP}
|
||||||
|
{$ENDIF VER290}
|
||||||
|
|
||||||
|
// Rad Studio 10 - Delphi Seattle
|
||||||
|
{$IFDEF VER300}
|
||||||
|
{$UNDEF DELPHI_VERSION_UNKNOW}
|
||||||
|
{$DEFINE DELPHI5_UP}
|
||||||
|
{$DEFINE DELPHI6_UP}
|
||||||
|
{$DEFINE DELPHI7_UP}
|
||||||
|
{$DEFINE DELPHI8_UP}
|
||||||
|
{$DEFINE DELPHI9_UP}
|
||||||
|
{$DEFINE DELPHI10_UP}
|
||||||
|
{$DEFINE DELPHI11_UP}
|
||||||
|
{$DEFINE DELPHI12_UP}
|
||||||
|
{$DEFINE DELPHI14_UP}
|
||||||
|
{$DEFINE DELPHI15_UP}
|
||||||
|
{$DEFINE DELPHI16_UP}
|
||||||
|
{$DEFINE DELPHI17_UP}
|
||||||
|
{$DEFINE DELPHI18_UP}
|
||||||
|
{$DEFINE DELPHI19_UP}
|
||||||
|
{$DEFINE DELPHI20_UP}
|
||||||
|
{$DEFINE DELPHI21_UP}
|
||||||
|
{$DEFINE DELPHI22_UP}
|
||||||
|
{$DEFINE DELPHI23_UP}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
// Rad Studio 10.1 - Delphi Berlin
|
||||||
|
{$IFDEF VER310}
|
||||||
|
{$UNDEF DELPHI_VERSION_UNKNOW}
|
||||||
|
{$DEFINE DELPHI5_UP}
|
||||||
|
{$DEFINE DELPHI6_UP}
|
||||||
|
{$DEFINE DELPHI7_UP}
|
||||||
|
{$DEFINE DELPHI8_UP}
|
||||||
|
{$DEFINE DELPHI9_UP}
|
||||||
|
{$DEFINE DELPHI10_UP}
|
||||||
|
{$DEFINE DELPHI11_UP}
|
||||||
|
{$DEFINE DELPHI12_UP}
|
||||||
|
{$DEFINE DELPHI14_UP}
|
||||||
|
{$DEFINE DELPHI15_UP}
|
||||||
|
{$DEFINE DELPHI16_UP}
|
||||||
|
{$DEFINE DELPHI17_UP}
|
||||||
|
{$DEFINE DELPHI18_UP}
|
||||||
|
{$DEFINE DELPHI19_UP}
|
||||||
|
{$DEFINE DELPHI20_UP}
|
||||||
|
{$DEFINE DELPHI21_UP}
|
||||||
|
{$DEFINE DELPHI22_UP}
|
||||||
|
{$DEFINE DELPHI23_UP}
|
||||||
|
{$DEFINE DELPHI24_UP}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
// Rad Studio 10.2 - Delphi Tokyo
|
||||||
|
{$IFDEF VER320}
|
||||||
|
{$UNDEF DELPHI_VERSION_UNKNOW}
|
||||||
|
{$DEFINE DELPHI5_UP}
|
||||||
|
{$DEFINE DELPHI6_UP}
|
||||||
|
{$DEFINE DELPHI7_UP}
|
||||||
|
{$DEFINE DELPHI8_UP}
|
||||||
|
{$DEFINE DELPHI9_UP}
|
||||||
|
{$DEFINE DELPHI10_UP}
|
||||||
|
{$DEFINE DELPHI11_UP}
|
||||||
|
{$DEFINE DELPHI12_UP}
|
||||||
|
{$DEFINE DELPHI14_UP}
|
||||||
|
{$DEFINE DELPHI15_UP}
|
||||||
|
{$DEFINE DELPHI16_UP}
|
||||||
|
{$DEFINE DELPHI17_UP}
|
||||||
|
{$DEFINE DELPHI18_UP}
|
||||||
|
{$DEFINE DELPHI19_UP}
|
||||||
|
{$DEFINE DELPHI20_UP}
|
||||||
|
{$DEFINE DELPHI21_UP}
|
||||||
|
{$DEFINE DELPHI22_UP}
|
||||||
|
{$DEFINE DELPHI23_UP}
|
||||||
|
{$DEFINE DELPHI24_UP}
|
||||||
|
{$DEFINE DELPHI25_UP}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
// Rad Studio 10.3 - Delphi Rio
|
||||||
|
{$IFDEF VER330}
|
||||||
|
{$UNDEF DELPHI_VERSION_UNKNOW}
|
||||||
|
{$DEFINE DELPHI5_UP}
|
||||||
|
{$DEFINE DELPHI6_UP}
|
||||||
|
{$DEFINE DELPHI7_UP}
|
||||||
|
{$DEFINE DELPHI8_UP}
|
||||||
|
{$DEFINE DELPHI9_UP}
|
||||||
|
{$DEFINE DELPHI10_UP}
|
||||||
|
{$DEFINE DELPHI11_UP}
|
||||||
|
{$DEFINE DELPHI12_UP}
|
||||||
|
{$DEFINE DELPHI14_UP}
|
||||||
|
{$DEFINE DELPHI15_UP}
|
||||||
|
{$DEFINE DELPHI16_UP}
|
||||||
|
{$DEFINE DELPHI17_UP}
|
||||||
|
{$DEFINE DELPHI18_UP}
|
||||||
|
{$DEFINE DELPHI19_UP}
|
||||||
|
{$DEFINE DELPHI20_UP}
|
||||||
|
{$DEFINE DELPHI21_UP}
|
||||||
|
{$DEFINE DELPHI22_UP}
|
||||||
|
{$DEFINE DELPHI23_UP}
|
||||||
|
{$DEFINE DELPHI24_UP}
|
||||||
|
{$DEFINE DELPHI25_UP}
|
||||||
|
{$DEFINE DELPHI26_UP}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
{$IFDEF FPC}
|
||||||
|
{$DEFINE SUPPORTS_INLINE}
|
||||||
|
{$ELSE}
|
||||||
|
{$IFDEF DELPHI_VERSION_UNKNOW}
|
||||||
|
{$DEFINE DELPHI5_UP}
|
||||||
|
{$DEFINE DELPHI6_UP}
|
||||||
|
{$DEFINE DELPHI7_UP}
|
||||||
|
{$DEFINE DELPHI8_UP}
|
||||||
|
{$DEFINE DELPHI9_UP}
|
||||||
|
{$DEFINE DELPHI10_UP}
|
||||||
|
{$DEFINE DELPHI11_UP}
|
||||||
|
{$DEFINE DELPHI12_UP}
|
||||||
|
{$DEFINE DELPHI14_UP}
|
||||||
|
{$DEFINE DELPHI15_UP}
|
||||||
|
{$DEFINE DELPHI16_UP}
|
||||||
|
{$DEFINE DELPHI17_UP}
|
||||||
|
{$DEFINE DELPHI18_UP}
|
||||||
|
{$DEFINE DELPHI19_UP}
|
||||||
|
{$DEFINE DELPHI20_UP}
|
||||||
|
{$DEFINE DELPHI21_UP}
|
||||||
|
{$DEFINE DELPHI22_UP}
|
||||||
|
{$DEFINE DELPHI23_UP}
|
||||||
|
{$DEFINE DELPHI24_UP}
|
||||||
|
{$DEFINE DELPHI25_UP}
|
||||||
|
{$DEFINE DELPHI26_UP}
|
||||||
|
{$ENDIF}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
{$IFDEF DELPHI9_UP}
|
||||||
|
{$DEFINE SUPPORTS_INLINE}
|
||||||
|
{$ENDIF}
|
||||||
|
|
314
demos/Delphi_VCL/MediaRouter/uMediaRouterFrm.dfm
Normal file
314
demos/Delphi_VCL/MediaRouter/uMediaRouterFrm.dfm
Normal file
@ -0,0 +1,314 @@
|
|||||||
|
object MediaRouterFrm: TMediaRouterFrm
|
||||||
|
Left = 0
|
||||||
|
Top = 0
|
||||||
|
Caption = 'Media Router'
|
||||||
|
ClientHeight = 757
|
||||||
|
ClientWidth = 1029
|
||||||
|
Color = clBtnFace
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -11
|
||||||
|
Font.Name = 'Tahoma'
|
||||||
|
Font.Style = []
|
||||||
|
OldCreateOrder = False
|
||||||
|
Position = poScreenCenter
|
||||||
|
OnCloseQuery = FormCloseQuery
|
||||||
|
OnCreate = FormCreate
|
||||||
|
OnDestroy = FormDestroy
|
||||||
|
OnShow = FormShow
|
||||||
|
PixelsPerInch = 96
|
||||||
|
TextHeight = 13
|
||||||
|
object CEFWindowParent1: TCEFWindowParent
|
||||||
|
Left = 184
|
||||||
|
Top = 56
|
||||||
|
Width = 0
|
||||||
|
Height = 0
|
||||||
|
TabOrder = 0
|
||||||
|
Visible = False
|
||||||
|
Enabled = False
|
||||||
|
end
|
||||||
|
object MainPnl: TPanel
|
||||||
|
Left = 0
|
||||||
|
Top = 0
|
||||||
|
Width = 1029
|
||||||
|
Height = 757
|
||||||
|
Align = alClient
|
||||||
|
BevelOuter = bvNone
|
||||||
|
Padding.Left = 15
|
||||||
|
Padding.Top = 15
|
||||||
|
Padding.Right = 15
|
||||||
|
Padding.Bottom = 15
|
||||||
|
TabOrder = 1
|
||||||
|
object SinksGbx: TGroupBox
|
||||||
|
Left = 15
|
||||||
|
Top = 15
|
||||||
|
Width = 250
|
||||||
|
Height = 727
|
||||||
|
Align = alLeft
|
||||||
|
Caption = ' Sinks available on this network '
|
||||||
|
Padding.Left = 10
|
||||||
|
Padding.Top = 10
|
||||||
|
Padding.Right = 10
|
||||||
|
Padding.Bottom = 10
|
||||||
|
TabOrder = 0
|
||||||
|
object SinksLbx: TListBox
|
||||||
|
Left = 12
|
||||||
|
Top = 25
|
||||||
|
Width = 226
|
||||||
|
Height = 616
|
||||||
|
Align = alClient
|
||||||
|
ItemHeight = 13
|
||||||
|
TabOrder = 0
|
||||||
|
OnClick = SinksLbxClick
|
||||||
|
end
|
||||||
|
object SinksButtonsPnl: TPanel
|
||||||
|
Left = 12
|
||||||
|
Top = 641
|
||||||
|
Width = 226
|
||||||
|
Height = 74
|
||||||
|
Align = alBottom
|
||||||
|
BevelOuter = bvNone
|
||||||
|
Padding.Top = 10
|
||||||
|
TabOrder = 1
|
||||||
|
object CreateRouteBtn: TButton
|
||||||
|
Left = 0
|
||||||
|
Top = 10
|
||||||
|
Width = 226
|
||||||
|
Height = 27
|
||||||
|
Align = alTop
|
||||||
|
Caption = 'Create route'
|
||||||
|
Enabled = False
|
||||||
|
TabOrder = 0
|
||||||
|
OnClick = CreateRouteBtnClick
|
||||||
|
end
|
||||||
|
object NotifySinksBtn: TButton
|
||||||
|
Left = 0
|
||||||
|
Top = 47
|
||||||
|
Width = 226
|
||||||
|
Height = 27
|
||||||
|
Align = alBottom
|
||||||
|
Caption = 'Notify sinks'
|
||||||
|
TabOrder = 1
|
||||||
|
OnClick = NotifySinksBtnClick
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
object CentralPnl: TPanel
|
||||||
|
Left = 265
|
||||||
|
Top = 15
|
||||||
|
Width = 499
|
||||||
|
Height = 727
|
||||||
|
Align = alClient
|
||||||
|
BevelOuter = bvNone
|
||||||
|
Padding.Left = 20
|
||||||
|
Padding.Right = 20
|
||||||
|
TabOrder = 1
|
||||||
|
object SourcePnl: TPanel
|
||||||
|
Left = 20
|
||||||
|
Top = 0
|
||||||
|
Width = 459
|
||||||
|
Height = 41
|
||||||
|
Align = alTop
|
||||||
|
BevelOuter = bvNone
|
||||||
|
Padding.Top = 10
|
||||||
|
Padding.Right = 2
|
||||||
|
Padding.Bottom = 10
|
||||||
|
TabOrder = 0
|
||||||
|
object SourceURNEdt: TEdit
|
||||||
|
Left = 65
|
||||||
|
Top = 10
|
||||||
|
Width = 392
|
||||||
|
Height = 21
|
||||||
|
Align = alClient
|
||||||
|
TabOrder = 0
|
||||||
|
Text = 'cast:<appId>?clientId=<clientId>'
|
||||||
|
OnChange = SourceURNEdtChange
|
||||||
|
end
|
||||||
|
object SourceLblPnl: TPanel
|
||||||
|
Left = 0
|
||||||
|
Top = 10
|
||||||
|
Width = 65
|
||||||
|
Height = 21
|
||||||
|
Align = alLeft
|
||||||
|
BevelOuter = bvNone
|
||||||
|
TabOrder = 1
|
||||||
|
object SourceURNLbl: TLabel
|
||||||
|
Left = 0
|
||||||
|
Top = 0
|
||||||
|
Width = 57
|
||||||
|
Height = 13
|
||||||
|
Align = alClient
|
||||||
|
Caption = 'Source URN'
|
||||||
|
Layout = tlCenter
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
object MessageGbx: TGroupBox
|
||||||
|
Left = 20
|
||||||
|
Top = 352
|
||||||
|
Width = 459
|
||||||
|
Height = 375
|
||||||
|
Align = alClient
|
||||||
|
Caption = ' Message '
|
||||||
|
Padding.Left = 10
|
||||||
|
Padding.Top = 10
|
||||||
|
Padding.Right = 10
|
||||||
|
Padding.Bottom = 10
|
||||||
|
TabOrder = 1
|
||||||
|
object SendMessagePnl: TPanel
|
||||||
|
Left = 12
|
||||||
|
Top = 326
|
||||||
|
Width = 435
|
||||||
|
Height = 37
|
||||||
|
Align = alBottom
|
||||||
|
BevelOuter = bvNone
|
||||||
|
Padding.Top = 10
|
||||||
|
TabOrder = 0
|
||||||
|
object SendMsgBtn: TButton
|
||||||
|
Left = 0
|
||||||
|
Top = 10
|
||||||
|
Width = 435
|
||||||
|
Height = 27
|
||||||
|
Align = alClient
|
||||||
|
Caption = 'Send message'
|
||||||
|
TabOrder = 0
|
||||||
|
OnClick = SendMsgBtnClick
|
||||||
|
end
|
||||||
|
end
|
||||||
|
object MessageMem: TMemo
|
||||||
|
Left = 12
|
||||||
|
Top = 25
|
||||||
|
Width = 435
|
||||||
|
Height = 301
|
||||||
|
Align = alClient
|
||||||
|
ScrollBars = ssBoth
|
||||||
|
TabOrder = 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
object LogGbx: TGroupBox
|
||||||
|
Left = 20
|
||||||
|
Top = 41
|
||||||
|
Width = 459
|
||||||
|
Height = 296
|
||||||
|
Align = alTop
|
||||||
|
Caption = ' Log '
|
||||||
|
Padding.Left = 10
|
||||||
|
Padding.Top = 10
|
||||||
|
Padding.Right = 10
|
||||||
|
Padding.Bottom = 10
|
||||||
|
TabOrder = 2
|
||||||
|
object LogMem: TMemo
|
||||||
|
Left = 12
|
||||||
|
Top = 25
|
||||||
|
Width = 435
|
||||||
|
Height = 222
|
||||||
|
Align = alClient
|
||||||
|
ReadOnly = True
|
||||||
|
ScrollBars = ssBoth
|
||||||
|
TabOrder = 0
|
||||||
|
end
|
||||||
|
object ClearLogPnl: TPanel
|
||||||
|
Left = 12
|
||||||
|
Top = 247
|
||||||
|
Width = 435
|
||||||
|
Height = 37
|
||||||
|
Align = alBottom
|
||||||
|
BevelOuter = bvNone
|
||||||
|
Padding.Top = 10
|
||||||
|
TabOrder = 1
|
||||||
|
object ClearLogBtn: TButton
|
||||||
|
Left = 0
|
||||||
|
Top = 10
|
||||||
|
Width = 435
|
||||||
|
Height = 27
|
||||||
|
Align = alClient
|
||||||
|
Caption = 'Clear log'
|
||||||
|
TabOrder = 0
|
||||||
|
OnClick = ClearLogBtnClick
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
object SpacerPnl: TPanel
|
||||||
|
Left = 20
|
||||||
|
Top = 337
|
||||||
|
Width = 459
|
||||||
|
Height = 15
|
||||||
|
Align = alTop
|
||||||
|
BevelOuter = bvNone
|
||||||
|
TabOrder = 3
|
||||||
|
end
|
||||||
|
end
|
||||||
|
object RoutesGbx: TGroupBox
|
||||||
|
Left = 764
|
||||||
|
Top = 15
|
||||||
|
Width = 250
|
||||||
|
Height = 727
|
||||||
|
Align = alRight
|
||||||
|
Caption = ' Routes available '
|
||||||
|
Padding.Left = 10
|
||||||
|
Padding.Top = 10
|
||||||
|
Padding.Right = 10
|
||||||
|
Padding.Bottom = 10
|
||||||
|
TabOrder = 2
|
||||||
|
object RoutesLbx: TListBox
|
||||||
|
Left = 12
|
||||||
|
Top = 25
|
||||||
|
Width = 226
|
||||||
|
Height = 616
|
||||||
|
Align = alClient
|
||||||
|
ItemHeight = 13
|
||||||
|
TabOrder = 0
|
||||||
|
end
|
||||||
|
object RoutesButtonPnl: TPanel
|
||||||
|
Left = 12
|
||||||
|
Top = 641
|
||||||
|
Width = 226
|
||||||
|
Height = 74
|
||||||
|
Align = alBottom
|
||||||
|
BevelOuter = bvNone
|
||||||
|
Padding.Top = 10
|
||||||
|
TabOrder = 1
|
||||||
|
object TerminateRouteBtn: TButton
|
||||||
|
Left = 0
|
||||||
|
Top = 10
|
||||||
|
Width = 226
|
||||||
|
Height = 27
|
||||||
|
Align = alTop
|
||||||
|
Caption = 'Terminate route'
|
||||||
|
Enabled = False
|
||||||
|
TabOrder = 0
|
||||||
|
OnClick = TerminateRouteBtnClick
|
||||||
|
end
|
||||||
|
object NotifyRoutesBtn: TButton
|
||||||
|
Left = 0
|
||||||
|
Top = 47
|
||||||
|
Width = 226
|
||||||
|
Height = 27
|
||||||
|
Align = alBottom
|
||||||
|
Caption = 'Notify routes'
|
||||||
|
TabOrder = 1
|
||||||
|
OnClick = NotifyRoutesBtnClick
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
object Chromium1: TChromium
|
||||||
|
OnMediaRouteCreateFinished = Chromium1MediaRouteCreateFinished
|
||||||
|
OnAfterCreated = Chromium1AfterCreated
|
||||||
|
OnBeforeClose = Chromium1BeforeClose
|
||||||
|
OnClose = Chromium1Close
|
||||||
|
OnSinks = Chromium1Sinks
|
||||||
|
OnRoutes = Chromium1Routes
|
||||||
|
OnRouteStateChanged = Chromium1RouteStateChanged
|
||||||
|
OnRouteMessageReceived = Chromium1RouteMessageReceived
|
||||||
|
Left = 72
|
||||||
|
Top = 56
|
||||||
|
end
|
||||||
|
object Timer1: TTimer
|
||||||
|
Enabled = False
|
||||||
|
Interval = 300
|
||||||
|
OnTimer = Timer1Timer
|
||||||
|
Left = 72
|
||||||
|
Top = 136
|
||||||
|
end
|
||||||
|
end
|
704
demos/Delphi_VCL/MediaRouter/uMediaRouterFrm.pas
Normal file
704
demos/Delphi_VCL/MediaRouter/uMediaRouterFrm.pas
Normal file
@ -0,0 +1,704 @@
|
|||||||
|
// ************************************************************************
|
||||||
|
// ***************************** CEF4Delphi *******************************
|
||||||
|
// ************************************************************************
|
||||||
|
//
|
||||||
|
// CEF4Delphi is based on DCEF3 which uses CEF to embed a chromium-based
|
||||||
|
// browser in Delphi applications.
|
||||||
|
//
|
||||||
|
// The original license of DCEF3 still applies to CEF4Delphi.
|
||||||
|
//
|
||||||
|
// For more information about CEF4Delphi visit :
|
||||||
|
// https://www.briskbard.com/index.php?lang=en&pageid=cef
|
||||||
|
//
|
||||||
|
// Copyright © 2020 Salvador Diaz Fau. All rights reserved.
|
||||||
|
//
|
||||||
|
// ************************************************************************
|
||||||
|
// ************ vvvv Original license and comments below vvvv *************
|
||||||
|
// ************************************************************************
|
||||||
|
(*
|
||||||
|
* Delphi Chromium Embedded 3
|
||||||
|
*
|
||||||
|
* Usage allowed under the restrictions of the Lesser GNU General Public License
|
||||||
|
* or alternatively the restrictions of the Mozilla Public License 1.1
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
|
||||||
|
* the specific language governing rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* Unit owner : Henri Gourvest <hgourvest@gmail.com>
|
||||||
|
* Web site : http://www.progdigy.com
|
||||||
|
* Repository : http://code.google.com/p/delphichromiumembedded/
|
||||||
|
* Group : http://groups.google.com/group/delphichromiumembedded
|
||||||
|
*
|
||||||
|
* Embarcadero Technologies, Inc is not permitted to use or redistribute
|
||||||
|
* this source code without explicit permission.
|
||||||
|
*
|
||||||
|
*)
|
||||||
|
|
||||||
|
unit uMediaRouterFrm;
|
||||||
|
|
||||||
|
{$I cef.inc}
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
{$IFDEF DELPHI16_UP}
|
||||||
|
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Menus,
|
||||||
|
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, System.Types, Vcl.ComCtrls, Vcl.ClipBrd,
|
||||||
|
System.UITypes, Vcl.AppEvnts, Winapi.ActiveX, Winapi.ShlObj, System.SyncObjs,
|
||||||
|
{$ELSE}
|
||||||
|
Windows, Messages, SysUtils, Variants, Classes, Graphics, Menus,
|
||||||
|
Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Types, ComCtrls, ClipBrd,
|
||||||
|
AppEvnts, ActiveX, ShlObj, SyncObjs,
|
||||||
|
{$ENDIF}
|
||||||
|
uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, uCEFConstants,
|
||||||
|
uCEFWinControl, uCEFSentinel, uCEFChromiumCore;
|
||||||
|
|
||||||
|
const
|
||||||
|
MEDIA_ROUTER_PENDING_LOG_LINES = WM_APP + $B00;
|
||||||
|
MEDIA_ROUTER_REFRESH_SINKS = WM_APP + $B01;
|
||||||
|
MEDIA_ROUTER_REFRESH_ROUTES = WM_APP + $B02;
|
||||||
|
MEDIA_ROUTER_UPDATE_BUTTONS = WM_APP + $B03;
|
||||||
|
|
||||||
|
type
|
||||||
|
TMediaRouterFrm = class(TForm)
|
||||||
|
Chromium1: TChromium;
|
||||||
|
CEFWindowParent1: TCEFWindowParent;
|
||||||
|
Timer1: TTimer;
|
||||||
|
MainPnl: TPanel;
|
||||||
|
SinksGbx: TGroupBox;
|
||||||
|
SinksLbx: TListBox;
|
||||||
|
SinksButtonsPnl: TPanel;
|
||||||
|
CreateRouteBtn: TButton;
|
||||||
|
CentralPnl: TPanel;
|
||||||
|
SourcePnl: TPanel;
|
||||||
|
SourceURNEdt: TEdit;
|
||||||
|
SourceLblPnl: TPanel;
|
||||||
|
SourceURNLbl: TLabel;
|
||||||
|
RoutesGbx: TGroupBox;
|
||||||
|
RoutesLbx: TListBox;
|
||||||
|
RoutesButtonPnl: TPanel;
|
||||||
|
TerminateRouteBtn: TButton;
|
||||||
|
MessageGbx: TGroupBox;
|
||||||
|
SendMessagePnl: TPanel;
|
||||||
|
SendMsgBtn: TButton;
|
||||||
|
MessageMem: TMemo;
|
||||||
|
LogGbx: TGroupBox;
|
||||||
|
LogMem: TMemo;
|
||||||
|
SpacerPnl: TPanel;
|
||||||
|
NotifySinksBtn: TButton;
|
||||||
|
NotifyRoutesBtn: TButton;
|
||||||
|
ClearLogPnl: TPanel;
|
||||||
|
ClearLogBtn: TButton;
|
||||||
|
|
||||||
|
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
|
||||||
|
procedure FormCreate(Sender: TObject);
|
||||||
|
procedure FormDestroy(Sender: TObject);
|
||||||
|
procedure FormShow(Sender: TObject);
|
||||||
|
|
||||||
|
procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser);
|
||||||
|
procedure Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser);
|
||||||
|
procedure Chromium1Close(Sender: TObject; const browser: ICefBrowser; var aAction: TCefCloseBrowserAction);
|
||||||
|
procedure Chromium1Sinks(Sender: TObject; const sinks: TCefMediaSinkArray);
|
||||||
|
procedure Chromium1Routes(Sender: TObject; const routes: TCefMediaRouteArray);
|
||||||
|
procedure Chromium1RouteStateChanged(Sender: TObject; const route: ICefMediaRoute; state: TCefMediaRouteConnectionState);
|
||||||
|
procedure Chromium1RouteMessageReceived(Sender: TObject; const route: ICefMediaRoute; const message_: ustring);
|
||||||
|
procedure Chromium1MediaRouteCreateFinished(Sender: TObject; result: Integer; const error: ustring; const route: ICefMediaRoute);
|
||||||
|
|
||||||
|
procedure Timer1Timer(Sender: TObject);
|
||||||
|
procedure SourceURNEdtChange(Sender: TObject);
|
||||||
|
procedure SinksLbxClick(Sender: TObject);
|
||||||
|
procedure CreateRouteBtnClick(Sender: TObject);
|
||||||
|
procedure TerminateRouteBtnClick(Sender: TObject);
|
||||||
|
procedure SendMsgBtnClick(Sender: TObject);
|
||||||
|
procedure NotifySinksBtnClick(Sender: TObject);
|
||||||
|
procedure NotifyRoutesBtnClick(Sender: TObject);
|
||||||
|
procedure ClearLogBtnClick(Sender: TObject);
|
||||||
|
|
||||||
|
protected
|
||||||
|
// Variables to control when can we destroy the form safely
|
||||||
|
FCanClose : boolean; // Set to True in TChromium.OnBeforeClose
|
||||||
|
FClosing : boolean; // Set to True in the CloseQuery event.
|
||||||
|
|
||||||
|
FMediaCS : TCriticalSection;
|
||||||
|
FLog : TStringList;
|
||||||
|
FSinks : TCefMediaSinkInfoArray;
|
||||||
|
FRoutes : TCefMediaRouteInfoArray;
|
||||||
|
|
||||||
|
procedure BrowserDestroyMsg(var aMessage : TMessage); message CEF_DESTROY;
|
||||||
|
procedure PendingLogLinesMsg(var aMessage : TMessage); message MEDIA_ROUTER_PENDING_LOG_LINES;
|
||||||
|
procedure RefreshSinksMsg(var aMessage : TMessage); message MEDIA_ROUTER_REFRESH_SINKS;
|
||||||
|
procedure RefreshRoutesMsg(var aMessage : TMessage); message MEDIA_ROUTER_REFRESH_ROUTES;
|
||||||
|
procedure UpdateButtonsMsg(var aMessage : TMessage); message MEDIA_ROUTER_UPDATE_BUTTONS;
|
||||||
|
|
||||||
|
procedure DestroySinksArray;
|
||||||
|
procedure DestroyRoutesArray;
|
||||||
|
procedure DestroyAllArrays;
|
||||||
|
procedure CopySinksArray(const aSinks : TCefMediaSinkArray);
|
||||||
|
procedure CopyRoutesArray(const aRoutes : TCefMediaRouteArray);
|
||||||
|
procedure UpdateAvailableSinks;
|
||||||
|
procedure UpdateAvailableRoutes;
|
||||||
|
procedure UpdateButtons;
|
||||||
|
procedure AddLogEntry(const aMessage1, aMessage2 : string; aRec : boolean); overload;
|
||||||
|
procedure AddLogEntry(const aMessage1 : string; const aMessage2 : string = ''); overload;
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
MediaRouterFrm: TMediaRouterFrm;
|
||||||
|
|
||||||
|
procedure CreateGlobalCEFApp;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
{$R *.dfm}
|
||||||
|
|
||||||
|
uses
|
||||||
|
{$IFDEF DELPHI16_UP}
|
||||||
|
System.Math,
|
||||||
|
{$ELSE}
|
||||||
|
Math,
|
||||||
|
{$ENDIF}
|
||||||
|
uCEFMiscFunctions;
|
||||||
|
|
||||||
|
procedure CreateGlobalCEFApp;
|
||||||
|
begin
|
||||||
|
GlobalCEFApp := TCefApplication.Create;
|
||||||
|
GlobalCEFApp.LogFile := 'debug.log';
|
||||||
|
GlobalCEFApp.LogSeverity := LOGSEVERITY_INFO; //LOGSEVERITY_VERBOSE;
|
||||||
|
GlobalCEFApp.FrameworkDirPath := 'c:\cef';
|
||||||
|
GlobalCEFApp.ResourcesDirPath := 'c:\cef';
|
||||||
|
GlobalCEFApp.LocalesDirPath := 'c:\cef\locales';
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.Chromium1AfterCreated(Sender: TObject;
|
||||||
|
const browser: ICefBrowser);
|
||||||
|
begin
|
||||||
|
AddLogEntry('Browser initialized.');
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser);
|
||||||
|
begin
|
||||||
|
FCanClose := True;
|
||||||
|
PostMessage(Handle, WM_CLOSE, 0, 0);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.Chromium1Close(Sender: TObject;
|
||||||
|
const browser: ICefBrowser; var aAction: TCefCloseBrowserAction);
|
||||||
|
begin
|
||||||
|
PostMessage(Handle, CEF_DESTROY, 0, 0);
|
||||||
|
aAction := cbaDelay;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.Chromium1MediaRouteCreateFinished(Sender: TObject;
|
||||||
|
result: Integer; const error: ustring; const route: ICefMediaRoute);
|
||||||
|
var
|
||||||
|
TempMsg, TempID : string;
|
||||||
|
begin
|
||||||
|
TempMsg := '';
|
||||||
|
|
||||||
|
try
|
||||||
|
FMediaCS.Acquire;
|
||||||
|
|
||||||
|
if (result = CEF_MRCR_OK) then
|
||||||
|
begin
|
||||||
|
TempMsg := 'Route created';
|
||||||
|
if (route <> nil) then TempID := route.ID;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
TempMsg := error;
|
||||||
|
finally
|
||||||
|
PostMessage(Handle, MEDIA_ROUTER_UPDATE_BUTTONS, 0, 0);
|
||||||
|
FMediaCS.Release;
|
||||||
|
if (length(TempMsg) > 0) then AddLogEntry(TempID, TempMsg);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.Chromium1RouteMessageReceived(Sender: TObject;
|
||||||
|
const route: ICefMediaRoute; const message_: ustring);
|
||||||
|
var
|
||||||
|
TempID : string;
|
||||||
|
begin
|
||||||
|
if (route <> nil) then
|
||||||
|
TempID := route.ID;
|
||||||
|
|
||||||
|
AddLogEntry(TempID, message_, True);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.Chromium1Routes(Sender: TObject;
|
||||||
|
const routes: TCefMediaRouteArray);
|
||||||
|
begin
|
||||||
|
CopyRoutesArray(routes);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.Chromium1RouteStateChanged(Sender: TObject;
|
||||||
|
const route: ICefMediaRoute; state: TCefMediaRouteConnectionState);
|
||||||
|
var
|
||||||
|
TempMsg, TempID : string;
|
||||||
|
begin
|
||||||
|
if (route <> nil) then TempID := route.ID;
|
||||||
|
|
||||||
|
case state of
|
||||||
|
CEF_MRCS_CONNECTING : TempMsg := 'State : Connecting.';
|
||||||
|
CEF_MRCS_CONNECTED : TempMsg := 'State : Connected.';
|
||||||
|
CEF_MRCS_CLOSED : TempMsg := 'State : Closed.';
|
||||||
|
CEF_MRCS_TERMINATED : TempMsg := 'State : Terminated.';
|
||||||
|
else TempMsg := 'State : Unknown.';
|
||||||
|
end;
|
||||||
|
|
||||||
|
TempMsg := TempMsg + ' ' + dateTimeToStr(now);
|
||||||
|
|
||||||
|
AddLogEntry(TempID, TempMsg);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.Chromium1Sinks(Sender: TObject;
|
||||||
|
const sinks: TCefMediaSinkArray);
|
||||||
|
begin
|
||||||
|
CopySinksArray(sinks);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.ClearLogBtnClick(Sender: TObject);
|
||||||
|
begin
|
||||||
|
LogMem.Lines.Clear;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.FormCloseQuery(Sender: TObject;
|
||||||
|
var CanClose: Boolean);
|
||||||
|
begin
|
||||||
|
CanClose := FCanClose;
|
||||||
|
|
||||||
|
if not(FClosing) then
|
||||||
|
begin
|
||||||
|
FClosing := True;
|
||||||
|
Visible := False;
|
||||||
|
DestroyAllArrays;
|
||||||
|
Chromium1.CloseBrowser(True);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.FormCreate(Sender: TObject);
|
||||||
|
begin
|
||||||
|
FCanClose := False;
|
||||||
|
FClosing := False;
|
||||||
|
FSinks := nil;
|
||||||
|
FRoutes := nil;
|
||||||
|
FMediaCS := TCriticalSection.Create;
|
||||||
|
FLog := TStringList.Create;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.FormDestroy(Sender: TObject);
|
||||||
|
begin
|
||||||
|
FLog.Free;
|
||||||
|
FMediaCS.Free;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.FormShow(Sender: TObject);
|
||||||
|
begin
|
||||||
|
UpdateButtons;
|
||||||
|
|
||||||
|
if not(Chromium1.CreateBrowser(CEFWindowParent1)) then
|
||||||
|
Timer1.Enabled := True;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.NotifyRoutesBtnClick(Sender: TObject);
|
||||||
|
begin
|
||||||
|
Chromium1.NotifyCurrentRoutes;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.NotifySinksBtnClick(Sender: TObject);
|
||||||
|
begin
|
||||||
|
Chromium1.NotifyCurrentSinks;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.SendMsgBtnClick(Sender: TObject);
|
||||||
|
var
|
||||||
|
TempMsg, TempID : string;
|
||||||
|
begin
|
||||||
|
TempMsg := '';
|
||||||
|
|
||||||
|
try
|
||||||
|
FMediaCS.Acquire;
|
||||||
|
|
||||||
|
if (RoutesLbx.Items.Count > 0) and
|
||||||
|
(FRoutes <> nil) and
|
||||||
|
(RoutesLbx.ItemIndex >= 0) and
|
||||||
|
(RoutesLbx.ItemIndex < length(FRoutes)) and
|
||||||
|
(MessageMem.Lines.Count > 0) then
|
||||||
|
begin
|
||||||
|
TempMsg := trim(MessageMem.Lines.Text);
|
||||||
|
|
||||||
|
if (length(TempMsg) > 0) and
|
||||||
|
(FRoutes[RoutesLbx.ItemIndex].RouteIntf <> nil) then
|
||||||
|
try
|
||||||
|
TempID := FRoutes[RoutesLbx.ItemIndex].RouteIntf.ID;
|
||||||
|
FRoutes[RoutesLbx.ItemIndex].RouteIntf.SendRouteMessage(TempMsg);
|
||||||
|
except
|
||||||
|
on e : exception do
|
||||||
|
if CustomExceptionHandler('TMediaRouterFrm.SendMsgBtnClick', e) then raise;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
FMediaCS.Release;
|
||||||
|
if (length(TempMsg) > 0) then AddLogEntry(TempID, TempMsg, False);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.SinksLbxClick(Sender: TObject);
|
||||||
|
begin
|
||||||
|
UpdateButtons;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.SourceURNEdtChange(Sender: TObject);
|
||||||
|
begin
|
||||||
|
UpdateButtons;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.TerminateRouteBtnClick(Sender: TObject);
|
||||||
|
begin
|
||||||
|
try
|
||||||
|
FMediaCS.Acquire;
|
||||||
|
|
||||||
|
if (RoutesLbx.Items.Count > 0) and
|
||||||
|
(FRoutes <> nil) and
|
||||||
|
(RoutesLbx.ItemIndex >= 0) and
|
||||||
|
(RoutesLbx.ItemIndex < length(FRoutes)) and
|
||||||
|
(FRoutes[RoutesLbx.ItemIndex].RouteIntf <> nil) then
|
||||||
|
try
|
||||||
|
FRoutes[RoutesLbx.ItemIndex].RouteIntf.Terminate;
|
||||||
|
except
|
||||||
|
on e : exception do
|
||||||
|
if CustomExceptionHandler('TMediaRouterFrm.TerminateRouteBtnClick', e) then raise;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
FMediaCS.Release;
|
||||||
|
UpdateButtons;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.Timer1Timer(Sender: TObject);
|
||||||
|
begin
|
||||||
|
Timer1.Enabled := False;
|
||||||
|
if not(Chromium1.CreateBrowser(CEFWindowParent1)) and not(Chromium1.Initialized) then
|
||||||
|
Timer1.Enabled := True;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.BrowserDestroyMsg(var aMessage : TMessage);
|
||||||
|
begin
|
||||||
|
CEFWindowParent1.Free;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.PendingLogLinesMsg(var aMessage : TMessage);
|
||||||
|
begin
|
||||||
|
if FClosing then exit;
|
||||||
|
|
||||||
|
try
|
||||||
|
FMediaCS.Acquire;
|
||||||
|
|
||||||
|
if (FLog <> nil) and (FLog.Count > 0) then
|
||||||
|
begin
|
||||||
|
LogMem.Lines.AddStrings(FLog);
|
||||||
|
FLog.Clear;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
FMediaCS.Release;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.RefreshSinksMsg(var aMessage : TMessage);
|
||||||
|
begin
|
||||||
|
if FClosing then exit;
|
||||||
|
|
||||||
|
UpdateAvailableSinks;
|
||||||
|
UpdateButtons;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.RefreshRoutesMsg(var aMessage : TMessage);
|
||||||
|
begin
|
||||||
|
if FClosing then exit;
|
||||||
|
|
||||||
|
UpdateAvailableRoutes;
|
||||||
|
UpdateButtons;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.UpdateButtonsMsg(var aMessage : TMessage);
|
||||||
|
begin
|
||||||
|
if FClosing then exit;
|
||||||
|
|
||||||
|
UpdateButtons;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.DestroyAllArrays;
|
||||||
|
begin
|
||||||
|
try
|
||||||
|
FMediaCS.Acquire;
|
||||||
|
DestroyRoutesArray;
|
||||||
|
DestroySinksArray;
|
||||||
|
finally
|
||||||
|
FMediaCS.Release;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.DestroySinksArray;
|
||||||
|
var
|
||||||
|
i : integer;
|
||||||
|
begin
|
||||||
|
if (FSinks <> nil) then
|
||||||
|
begin
|
||||||
|
i := pred(length(FSinks));
|
||||||
|
while (i >= 0) do
|
||||||
|
begin
|
||||||
|
FSinks[i].SinkIntf := nil;
|
||||||
|
dec(i);
|
||||||
|
end;
|
||||||
|
|
||||||
|
Finalize(FSinks);
|
||||||
|
FSinks := nil;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.DestroyRoutesArray;
|
||||||
|
var
|
||||||
|
i : integer;
|
||||||
|
begin
|
||||||
|
if (FRoutes <> nil) then
|
||||||
|
begin
|
||||||
|
i := pred(length(FRoutes));
|
||||||
|
while (i >= 0) do
|
||||||
|
begin
|
||||||
|
FRoutes[i].RouteIntf := nil;
|
||||||
|
dec(i);
|
||||||
|
end;
|
||||||
|
|
||||||
|
Finalize(FRoutes);
|
||||||
|
FRoutes := nil;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.CopySinksArray(const aSinks : TCefMediaSinkArray);
|
||||||
|
var
|
||||||
|
i, TempLen : integer;
|
||||||
|
begin
|
||||||
|
try
|
||||||
|
FMediaCS.Acquire;
|
||||||
|
|
||||||
|
FLog.Add('Sinks available : ' + inttostr(length(aSinks)));
|
||||||
|
FLog.Add('------------------------------------------');
|
||||||
|
|
||||||
|
DestroySinksArray;
|
||||||
|
|
||||||
|
if (aSinks <> nil) then
|
||||||
|
begin
|
||||||
|
TempLen := length(aSinks);
|
||||||
|
SetLength(FSinks, TempLen);
|
||||||
|
|
||||||
|
i := 0;
|
||||||
|
while (i < TempLen) do
|
||||||
|
begin
|
||||||
|
FSinks[i].ID := aSinks[i].ID;
|
||||||
|
FSinks[i].Name := aSinks[i].Name;
|
||||||
|
FSinks[i].Description := aSinks[i].Description;
|
||||||
|
FSinks[i].Valid := aSinks[i].IsValid;
|
||||||
|
FSinks[i].SinkIntf := aSinks[i];
|
||||||
|
|
||||||
|
if aSinks[i].IsCastSink then
|
||||||
|
FSinks[i].SinkType := mtCast
|
||||||
|
else
|
||||||
|
if aSinks[i].IsDialSink then
|
||||||
|
FSinks[i].SinkType := mtDial
|
||||||
|
else
|
||||||
|
FSinks[i].SinkType := mtUnknown;
|
||||||
|
|
||||||
|
inc(i);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
PostMessage(Handle, MEDIA_ROUTER_REFRESH_SINKS, 0, 0);
|
||||||
|
FMediaCS.Release;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.CopyRoutesArray(const aRoutes : TCefMediaRouteArray);
|
||||||
|
var
|
||||||
|
i, TempLen : integer;
|
||||||
|
begin
|
||||||
|
try
|
||||||
|
FMediaCS.Acquire;
|
||||||
|
|
||||||
|
FLog.Add('Routes available : ' + inttostr(length(aRoutes)));
|
||||||
|
FLog.Add('------------------------------------------');
|
||||||
|
|
||||||
|
DestroyRoutesArray;
|
||||||
|
|
||||||
|
if (aRoutes <> nil) then
|
||||||
|
begin
|
||||||
|
TempLen := length(aRoutes);
|
||||||
|
SetLength(FRoutes, TempLen);
|
||||||
|
|
||||||
|
i := 0;
|
||||||
|
while (i < TempLen) do
|
||||||
|
begin
|
||||||
|
FRoutes[i].ID := aRoutes[i].ID;
|
||||||
|
FRoutes[i].SourceID := aRoutes[i].GetSource.ID;
|
||||||
|
FRoutes[i].SinkID := aRoutes[i].GetSink.ID;
|
||||||
|
FRoutes[i].RouteIntf := aRoutes[i];
|
||||||
|
inc(i);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
PostMessage(Handle, MEDIA_ROUTER_REFRESH_ROUTES, 0, 0);
|
||||||
|
FMediaCS.Release;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.CreateRouteBtnClick(Sender: TObject);
|
||||||
|
var
|
||||||
|
TempURN, TempErrorMsg : string;
|
||||||
|
TempSource : ICefMediaSource;
|
||||||
|
begin
|
||||||
|
TempURN := trim(SourceURNEdt.Text);
|
||||||
|
|
||||||
|
if (length(TempURN) = 0) then
|
||||||
|
begin
|
||||||
|
AddLogEntry('Invalid URN');
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
TempErrorMsg := '';
|
||||||
|
|
||||||
|
try
|
||||||
|
try
|
||||||
|
FMediaCS.Acquire;
|
||||||
|
|
||||||
|
if (FSinks <> nil) and
|
||||||
|
(SinksLbx.Items.Count > 0) and
|
||||||
|
(SinksLbx.ItemIndex >= 0) and
|
||||||
|
(SinksLbx.ItemIndex < length(FSinks)) then
|
||||||
|
begin
|
||||||
|
TempSource := Chromium1.GetSource(TempURN);
|
||||||
|
|
||||||
|
if (TempSource <> nil) and TempSource.IsValid then
|
||||||
|
begin
|
||||||
|
if (FSinks[SinksLbx.ItemIndex].SinkIntf <> nil) and
|
||||||
|
FSinks[SinksLbx.ItemIndex].SinkIntf.IsValid then
|
||||||
|
begin
|
||||||
|
if FSinks[SinksLbx.ItemIndex].SinkIntf.IsCompatibleWith(TempSource) then
|
||||||
|
Chromium1.CreateRoute(TempSource, FSinks[SinksLbx.ItemIndex].SinkIntf)
|
||||||
|
else
|
||||||
|
TempErrorMsg := 'The selected Sink is not compatible with the Media Source.';
|
||||||
|
end
|
||||||
|
else
|
||||||
|
TempErrorMsg := 'The selected Sink is not valid.';
|
||||||
|
end
|
||||||
|
else
|
||||||
|
TempErrorMsg := 'The Media Source is not valid.';
|
||||||
|
end
|
||||||
|
else
|
||||||
|
TempErrorMsg := 'The sinks list is outdated.';
|
||||||
|
except
|
||||||
|
on e : exception do
|
||||||
|
begin
|
||||||
|
TempErrorMsg := e.Message;
|
||||||
|
if CustomExceptionHandler('TMediaRouterFrm.CreateRouteBtnClick', e) then raise;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
FMediaCS.Release;
|
||||||
|
if (length(TempErrorMsg) > 0) then AddLogEntry(TempErrorMsg);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.UpdateAvailableSinks;
|
||||||
|
var
|
||||||
|
i : integer;
|
||||||
|
begin
|
||||||
|
try
|
||||||
|
FMediaCS.Acquire;
|
||||||
|
SinksLbx.Items.Clear;
|
||||||
|
|
||||||
|
if (FSinks <> nil) then
|
||||||
|
begin
|
||||||
|
i := 0;
|
||||||
|
while (i < length(FSinks)) do
|
||||||
|
begin
|
||||||
|
case FSinks[i].SinkType of
|
||||||
|
mtCast : SinksLbx.Items.Add(FSinks[i].Name + ' (CAST)');
|
||||||
|
mtDial : SinksLbx.Items.Add(FSinks[i].Name + ' (DIAL)');
|
||||||
|
else SinksLbx.Items.Add(FSinks[i].Name + ' (UNKNOWN)');
|
||||||
|
end;
|
||||||
|
|
||||||
|
inc(i);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
FMediaCS.Release;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.UpdateAvailableRoutes;
|
||||||
|
var
|
||||||
|
i : integer;
|
||||||
|
begin
|
||||||
|
try
|
||||||
|
FMediaCS.Acquire;
|
||||||
|
RoutesLbx.Items.Clear;
|
||||||
|
|
||||||
|
if (FRoutes <> nil) then
|
||||||
|
begin
|
||||||
|
i := 0;
|
||||||
|
while (i < length(FRoutes)) do
|
||||||
|
begin
|
||||||
|
RoutesLbx.Items.Add('ID : ' + quotedstr(FRoutes[i].ID));
|
||||||
|
inc(i);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
FMediaCS.Release;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.UpdateButtons;
|
||||||
|
begin
|
||||||
|
TerminateRouteBtn.Enabled := (RoutesLbx.ItemIndex >= 0) and
|
||||||
|
(RoutesLbx.Items.Count > 0);
|
||||||
|
|
||||||
|
SendMsgBtn.Enabled := TerminateRouteBtn.Enabled and
|
||||||
|
(length(trim(MessageMem.Lines.Text)) > 0);
|
||||||
|
|
||||||
|
CreateRouteBtn.Enabled := not(TerminateRouteBtn.Enabled) and
|
||||||
|
(length(trim(SourceURNEdt.Text)) > 0) and
|
||||||
|
(SinksLbx.ItemIndex >= 0) and
|
||||||
|
(SinksLbx.Items.Count > 0);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.AddLogEntry(const aMessage1, aMessage2 : string; aRec : boolean);
|
||||||
|
begin
|
||||||
|
try
|
||||||
|
FMediaCS.Acquire;
|
||||||
|
|
||||||
|
if aRec then
|
||||||
|
FLog.Add('Message received ' + dateTimeToStr(now))
|
||||||
|
else
|
||||||
|
FLog.Add('Message sent ' + dateTimeToStr(now));
|
||||||
|
|
||||||
|
FLog.Add(aMessage1);
|
||||||
|
if (length(aMessage2) > 0) then FLog.Add(aMessage2);
|
||||||
|
FLog.Add('------------------------------------------');
|
||||||
|
finally
|
||||||
|
PostMessage(Handle, MEDIA_ROUTER_PENDING_LOG_LINES, 0, 0);
|
||||||
|
FMediaCS.Release;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMediaRouterFrm.AddLogEntry(const aMessage1, aMessage2 : string);
|
||||||
|
begin
|
||||||
|
try
|
||||||
|
FMediaCS.Acquire;
|
||||||
|
FLog.Add(aMessage1);
|
||||||
|
if (length(aMessage2) > 0) then FLog.Add(aMessage2);
|
||||||
|
FLog.Add('------------------------------------------');
|
||||||
|
finally
|
||||||
|
PostMessage(Handle, MEDIA_ROUTER_PENDING_LOG_LINES, 0, 0);
|
||||||
|
FMediaCS.Release;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
@ -8,7 +8,8 @@
|
|||||||
<Unit0>
|
<Unit0>
|
||||||
<Filename Value="SimpleOSRBrowser.lpr"/>
|
<Filename Value="SimpleOSRBrowser.lpr"/>
|
||||||
<IsPartOfProject Value="True"/>
|
<IsPartOfProject Value="True"/>
|
||||||
<EditorIndex Value="2"/>
|
<IsVisibleTab Value="True"/>
|
||||||
|
<EditorIndex Value="1"/>
|
||||||
<TopLine Value="30"/>
|
<TopLine Value="30"/>
|
||||||
<CursorPos X="28" Y="39"/>
|
<CursorPos X="28" Y="39"/>
|
||||||
<UsageCount Value="20"/>
|
<UsageCount Value="20"/>
|
||||||
@ -244,11 +245,10 @@
|
|||||||
</Unit28>
|
</Unit28>
|
||||||
<Unit29>
|
<Unit29>
|
||||||
<Filename Value="..\..\..\source\uCEFApplicationCore.pas"/>
|
<Filename Value="..\..\..\source\uCEFApplicationCore.pas"/>
|
||||||
<IsVisibleTab Value="True"/>
|
<EditorIndex Value="-1"/>
|
||||||
<EditorIndex Value="1"/>
|
|
||||||
<TopLine Value="43"/>
|
<TopLine Value="43"/>
|
||||||
|
<CursorPos X="57" Y="67"/>
|
||||||
<UsageCount Value="10"/>
|
<UsageCount Value="10"/>
|
||||||
<Loaded Value="True"/>
|
|
||||||
</Unit29>
|
</Unit29>
|
||||||
</Units>
|
</Units>
|
||||||
<JumpHistory Count="30" HistoryIndex="29">
|
<JumpHistory Count="30" HistoryIndex="29">
|
||||||
|
@ -182,9 +182,7 @@ contains
|
|||||||
uCEFMediaRouter in '..\source\uCEFMediaRouter.pas',
|
uCEFMediaRouter in '..\source\uCEFMediaRouter.pas',
|
||||||
uCEFMediaSink in '..\source\uCEFMediaSink.pas',
|
uCEFMediaSink in '..\source\uCEFMediaSink.pas',
|
||||||
uCEFMediaSource in '..\source\uCEFMediaSource.pas',
|
uCEFMediaSource in '..\source\uCEFMediaSource.pas',
|
||||||
uCEFRegistration in '..\source\uCEFRegistration.pas',
|
uCEFRegistration in '..\source\uCEFRegistration.pas';
|
||||||
uCEFMediaObserverComponent in '..\source\uCEFMediaObserverComponent.pas',
|
|
||||||
uCEFMediaObserverEvents in '..\source\uCEFMediaObserverEvents.pas';
|
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
@ -277,8 +277,6 @@
|
|||||||
<DCCReference Include="..\source\uCEFMediaSink.pas"/>
|
<DCCReference Include="..\source\uCEFMediaSink.pas"/>
|
||||||
<DCCReference Include="..\source\uCEFMediaSource.pas"/>
|
<DCCReference Include="..\source\uCEFMediaSource.pas"/>
|
||||||
<DCCReference Include="..\source\uCEFRegistration.pas"/>
|
<DCCReference Include="..\source\uCEFRegistration.pas"/>
|
||||||
<DCCReference Include="..\source\uCEFMediaObserverComponent.pas"/>
|
|
||||||
<DCCReference Include="..\source\uCEFMediaObserverEvents.pas"/>
|
|
||||||
<BuildConfiguration Include="Base">
|
<BuildConfiguration Include="Base">
|
||||||
<Key>Base</Key>
|
<Key>Base</Key>
|
||||||
</BuildConfiguration>
|
</BuildConfiguration>
|
||||||
|
@ -179,8 +179,6 @@ contains
|
|||||||
uCEFMediaRoute in '..\source\uCEFMediaRoute.pas',
|
uCEFMediaRoute in '..\source\uCEFMediaRoute.pas',
|
||||||
uCEFMediaObserver in '..\source\uCEFMediaObserver.pas',
|
uCEFMediaObserver in '..\source\uCEFMediaObserver.pas',
|
||||||
uCEFMediaRouter in '..\source\uCEFMediaRouter.pas',
|
uCEFMediaRouter in '..\source\uCEFMediaRouter.pas',
|
||||||
uCEFRegistration in '..\source\uCEFRegistration.pas',
|
uCEFRegistration in '..\source\uCEFRegistration.pas';
|
||||||
uCEFMediaObserverComponent in '..\source\uCEFMediaObserverComponent.pas',
|
|
||||||
uCEFMediaObserverEvents in '..\source\uCEFMediaObserverEvents.pas';
|
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
@ -50,14 +50,13 @@ implementation
|
|||||||
uses
|
uses
|
||||||
Classes,
|
Classes,
|
||||||
uCEFChromium, uCEFWindowParent, uCEFChromiumWindow, uCEFBufferPanel, uCEFWorkScheduler,
|
uCEFChromium, uCEFWindowParent, uCEFChromiumWindow, uCEFBufferPanel, uCEFWorkScheduler,
|
||||||
uCEFServerComponent, uCEFLinkedWindowParent, uCEFUrlRequestClientComponent, uCEFSentinel,
|
uCEFServerComponent, uCEFLinkedWindowParent, uCEFUrlRequestClientComponent, uCEFSentinel;
|
||||||
uCEFMediaObserverComponent;
|
|
||||||
|
|
||||||
procedure Register;
|
procedure Register;
|
||||||
begin
|
begin
|
||||||
RegisterComponents('Chromium', [TChromium, TCEFWindowParent, TChromiumWindow, TBufferPanel,
|
RegisterComponents('Chromium', [TChromium, TCEFWindowParent, TChromiumWindow, TBufferPanel,
|
||||||
TCEFWorkScheduler, TCEFServerComponent, TCEFLinkedWindowParent,
|
TCEFWorkScheduler, TCEFServerComponent, TCEFLinkedWindowParent,
|
||||||
TCEFUrlRequestClientComponent, TCEFSentinel, TCEFMediaObserverComponent]);
|
TCEFUrlRequestClientComponent, TCEFSentinel]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
@ -187,9 +187,7 @@ contains
|
|||||||
uCEFMediaRoute in '..\source\uCEFMediaRoute.pas',
|
uCEFMediaRoute in '..\source\uCEFMediaRoute.pas',
|
||||||
uCEFMediaObserver in '..\source\uCEFMediaObserver.pas',
|
uCEFMediaObserver in '..\source\uCEFMediaObserver.pas',
|
||||||
uCEFMediaRouter in '..\source\uCEFMediaRouter.pas',
|
uCEFMediaRouter in '..\source\uCEFMediaRouter.pas',
|
||||||
uCEFRegistration in '..\source\uCEFRegistration.pas',
|
uCEFRegistration in '..\source\uCEFRegistration.pas';
|
||||||
uCEFMediaObserverComponent in '..\source\uCEFMediaObserverComponent.pas',
|
|
||||||
uCEFMediaObserverEvents in '..\source\uCEFMediaObserverEvents.pas';
|
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
@ -303,8 +303,6 @@
|
|||||||
<DCCReference Include="..\source\uCEFMediaObserver.pas"/>
|
<DCCReference Include="..\source\uCEFMediaObserver.pas"/>
|
||||||
<DCCReference Include="..\source\uCEFMediaRouter.pas"/>
|
<DCCReference Include="..\source\uCEFMediaRouter.pas"/>
|
||||||
<DCCReference Include="..\source\uCEFRegistration.pas"/>
|
<DCCReference Include="..\source\uCEFRegistration.pas"/>
|
||||||
<DCCReference Include="..\source\uCEFMediaObserverComponent.pas"/>
|
|
||||||
<DCCReference Include="..\source\uCEFMediaObserverEvents.pas"/>
|
|
||||||
<BuildConfiguration Include="Base">
|
<BuildConfiguration Include="Base">
|
||||||
<Key>Base</Key>
|
<Key>Base</Key>
|
||||||
</BuildConfiguration>
|
</BuildConfiguration>
|
||||||
|
@ -52,7 +52,7 @@ uses
|
|||||||
uCEFChromium, uCEFWindowParent, uCEFChromiumWindow, uCEFBufferPanel,
|
uCEFChromium, uCEFWindowParent, uCEFChromiumWindow, uCEFBufferPanel,
|
||||||
uCEFWorkScheduler, uCEFFMXBufferPanel, uCEFFMXChromium, uCEFFMXWorkScheduler,
|
uCEFWorkScheduler, uCEFFMXBufferPanel, uCEFFMXChromium, uCEFFMXWorkScheduler,
|
||||||
uCEFServerComponent, uCEFLinkedWindowParent, uCEFUrlRequestClientComponent,
|
uCEFServerComponent, uCEFLinkedWindowParent, uCEFUrlRequestClientComponent,
|
||||||
uCEFSentinel, uCEFMediaObserverComponent;
|
uCEFSentinel;
|
||||||
|
|
||||||
procedure Register;
|
procedure Register;
|
||||||
begin
|
begin
|
||||||
@ -61,7 +61,7 @@ begin
|
|||||||
TFMXWorkScheduler, TCEFWorkScheduler,
|
TFMXWorkScheduler, TCEFWorkScheduler,
|
||||||
TCEFServerComponent, TCEFLinkedWindowParent,
|
TCEFServerComponent, TCEFLinkedWindowParent,
|
||||||
TCEFUrlRequestClientComponent,
|
TCEFUrlRequestClientComponent,
|
||||||
TCEFSentinel, TCEFMediaObserverComponent]);
|
TCEFSentinel]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
@ -55,15 +55,14 @@ uses
|
|||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
uCEFChromium, uCEFWindowParent, uCEFChromiumWindow, uCEFBufferPanel,
|
uCEFChromium, uCEFWindowParent, uCEFChromiumWindow, uCEFBufferPanel,
|
||||||
uCEFWorkScheduler, uCEFServerComponent, uCEFLinkedWindowParent,
|
uCEFWorkScheduler, uCEFServerComponent, uCEFLinkedWindowParent,
|
||||||
uCEFUrlRequestClientComponent, uCEFSentinel, uCEFMediaObserverComponent;
|
uCEFUrlRequestClientComponent, uCEFSentinel;
|
||||||
|
|
||||||
procedure Register;
|
procedure Register;
|
||||||
begin
|
begin
|
||||||
RegisterComponents('Chromium', [TChromium, TCEFWindowParent, TChromiumWindow,
|
RegisterComponents('Chromium', [TChromium, TCEFWindowParent, TChromiumWindow,
|
||||||
TBufferPanel, TCEFWorkScheduler,
|
TBufferPanel, TCEFWorkScheduler,
|
||||||
TCEFServerComponent, TCEFLinkedWindowParent,
|
TCEFServerComponent, TCEFLinkedWindowParent,
|
||||||
TCEFUrlRequestClientComponent, TCEFSentinel,
|
TCEFUrlRequestClientComponent, TCEFSentinel]);
|
||||||
TCEFMediaObserverComponent]);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
@ -21,8 +21,8 @@
|
|||||||
</CompilerOptions>
|
</CompilerOptions>
|
||||||
<Description Value="CEF4Delphi is an open source project created by Salvador Díaz Fau to embed Chromium-based browsers in applications made with Delphi or Lazarus/FPC."/>
|
<Description Value="CEF4Delphi is an open source project created by Salvador Díaz Fau to embed Chromium-based browsers in applications made with Delphi or Lazarus/FPC."/>
|
||||||
<License Value="MPL 1.1"/>
|
<License Value="MPL 1.1"/>
|
||||||
<Version Major="81" Minor="2" Release="16"/>
|
<Version Major="81" Minor="2" Release="17"/>
|
||||||
<Files Count="156">
|
<Files Count="154">
|
||||||
<Item1>
|
<Item1>
|
||||||
<Filename Value="..\source\uCEFAccessibilityHandler.pas"/>
|
<Filename Value="..\source\uCEFAccessibilityHandler.pas"/>
|
||||||
<UnitName Value="uCEFAccessibilityHandler"/>
|
<UnitName Value="uCEFAccessibilityHandler"/>
|
||||||
@ -625,38 +625,29 @@
|
|||||||
<UnitName Value="uCEFMediaObserver"/>
|
<UnitName Value="uCEFMediaObserver"/>
|
||||||
</Item148>
|
</Item148>
|
||||||
<Item149>
|
<Item149>
|
||||||
<Filename Value="..\source\uCEFMediaObserverComponent.pas"/>
|
|
||||||
<HasRegisterProc Value="True"/>
|
|
||||||
<UnitName Value="uCEFMediaObserverComponent"/>
|
|
||||||
</Item149>
|
|
||||||
<Item150>
|
|
||||||
<Filename Value="..\source\uCEFMediaObserverEvents.pas"/>
|
|
||||||
<UnitName Value="uCEFMediaObserverEvents"/>
|
|
||||||
</Item150>
|
|
||||||
<Item151>
|
|
||||||
<Filename Value="..\source\uCEFMediaRoute.pas"/>
|
<Filename Value="..\source\uCEFMediaRoute.pas"/>
|
||||||
<UnitName Value="uCEFMediaRoute"/>
|
<UnitName Value="uCEFMediaRoute"/>
|
||||||
</Item151>
|
</Item149>
|
||||||
<Item152>
|
<Item150>
|
||||||
<Filename Value="..\source\uCEFMediaRouteCreateCallback.pas"/>
|
<Filename Value="..\source\uCEFMediaRouteCreateCallback.pas"/>
|
||||||
<UnitName Value="uCEFMediaRouteCreateCallback"/>
|
<UnitName Value="uCEFMediaRouteCreateCallback"/>
|
||||||
</Item152>
|
</Item150>
|
||||||
<Item153>
|
<Item151>
|
||||||
<Filename Value="..\source\uCEFMediaRouter.pas"/>
|
<Filename Value="..\source\uCEFMediaRouter.pas"/>
|
||||||
<UnitName Value="uCEFMediaRouter"/>
|
<UnitName Value="uCEFMediaRouter"/>
|
||||||
</Item153>
|
</Item151>
|
||||||
<Item154>
|
<Item152>
|
||||||
<Filename Value="..\source\uCEFMediaSink.pas"/>
|
<Filename Value="..\source\uCEFMediaSink.pas"/>
|
||||||
<UnitName Value="uCEFMediaSink"/>
|
<UnitName Value="uCEFMediaSink"/>
|
||||||
</Item154>
|
</Item152>
|
||||||
<Item155>
|
<Item153>
|
||||||
<Filename Value="..\source\uCEFMediaSource.pas"/>
|
<Filename Value="..\source\uCEFMediaSource.pas"/>
|
||||||
<UnitName Value="uCEFMediaSource"/>
|
<UnitName Value="uCEFMediaSource"/>
|
||||||
</Item155>
|
</Item153>
|
||||||
<Item156>
|
<Item154>
|
||||||
<Filename Value="..\source\uCEFRegistration.pas"/>
|
<Filename Value="..\source\uCEFRegistration.pas"/>
|
||||||
<UnitName Value="uCEFRegistration"/>
|
<UnitName Value="uCEFRegistration"/>
|
||||||
</Item156>
|
</Item154>
|
||||||
</Files>
|
</Files>
|
||||||
<RequiredPkgs Count="4">
|
<RequiredPkgs Count="4">
|
||||||
<Item1>
|
<Item1>
|
||||||
|
@ -50,10 +50,9 @@ uses
|
|||||||
uCEFUrlRequestClientComponent, uCEFOSRIMEHandler, uCEFCookieAccessFilter,
|
uCEFUrlRequestClientComponent, uCEFOSRIMEHandler, uCEFCookieAccessFilter,
|
||||||
uCEFResourceReadCallback, uCEFResourceRequestHandler,
|
uCEFResourceReadCallback, uCEFResourceRequestHandler,
|
||||||
uCEFResourceSkipCallback, uCEFSentinel, uCEFApplicationCore,
|
uCEFResourceSkipCallback, uCEFSentinel, uCEFApplicationCore,
|
||||||
uCEFOAuth2Helper, uCEFMediaObserver, uCEFMediaObserverComponent,
|
uCEFOAuth2Helper, uCEFMediaObserver, uCEFMediaRoute,
|
||||||
uCEFMediaObserverEvents, uCEFMediaRoute, uCEFMediaRouteCreateCallback,
|
uCEFMediaRouteCreateCallback, uCEFMediaRouter, uCEFMediaSink,
|
||||||
uCEFMediaRouter, uCEFMediaSink, uCEFMediaSource, uCEFRegistration,
|
uCEFMediaSource, uCEFRegistration, LazarusPackageIntf;
|
||||||
LazarusPackageIntf;
|
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
@ -69,8 +68,6 @@ begin
|
|||||||
RegisterUnit('uCEFUrlRequestClientComponent',
|
RegisterUnit('uCEFUrlRequestClientComponent',
|
||||||
@uCEFUrlRequestClientComponent.Register);
|
@uCEFUrlRequestClientComponent.Register);
|
||||||
RegisterUnit('uCEFSentinel', @uCEFSentinel.Register);
|
RegisterUnit('uCEFSentinel', @uCEFSentinel.Register);
|
||||||
RegisterUnit('uCEFMediaObserverComponent',
|
|
||||||
@uCEFMediaObserverComponent.Register);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
initialization
|
initialization
|
||||||
|
@ -62,13 +62,13 @@ uses
|
|||||||
const
|
const
|
||||||
CEF_SUPPORTED_VERSION_MAJOR = 81;
|
CEF_SUPPORTED_VERSION_MAJOR = 81;
|
||||||
CEF_SUPPORTED_VERSION_MINOR = 2;
|
CEF_SUPPORTED_VERSION_MINOR = 2;
|
||||||
CEF_SUPPORTED_VERSION_RELEASE = 16;
|
CEF_SUPPORTED_VERSION_RELEASE = 17;
|
||||||
CEF_SUPPORTED_VERSION_BUILD = 0;
|
CEF_SUPPORTED_VERSION_BUILD = 0;
|
||||||
|
|
||||||
CEF_CHROMEELF_VERSION_MAJOR = 81;
|
CEF_CHROMEELF_VERSION_MAJOR = 81;
|
||||||
CEF_CHROMEELF_VERSION_MINOR = 0;
|
CEF_CHROMEELF_VERSION_MINOR = 0;
|
||||||
CEF_CHROMEELF_VERSION_RELEASE = 4044;
|
CEF_CHROMEELF_VERSION_RELEASE = 4044;
|
||||||
CEF_CHROMEELF_VERSION_BUILD = 92;
|
CEF_CHROMEELF_VERSION_BUILD = 113;
|
||||||
|
|
||||||
{$IFDEF MSWINDOWS}
|
{$IFDEF MSWINDOWS}
|
||||||
LIBCEF_DLL = 'libcef.dll';
|
LIBCEF_DLL = 'libcef.dll';
|
||||||
|
@ -78,6 +78,8 @@ type
|
|||||||
FBrowserId : Integer;
|
FBrowserId : Integer;
|
||||||
FReqContextHandler : ICefRequestContextHandler;
|
FReqContextHandler : ICefRequestContextHandler;
|
||||||
FResourceRequestHandler : ICefResourceRequestHandler;
|
FResourceRequestHandler : ICefResourceRequestHandler;
|
||||||
|
FMediaObserver : ICefMediaObserver;
|
||||||
|
FRegistration : ICefRegistration;
|
||||||
FDefaultUrl : ustring;
|
FDefaultUrl : ustring;
|
||||||
FOptions : TChromiumOptions;
|
FOptions : TChromiumOptions;
|
||||||
FFontOptions : TChromiumFontOptions;
|
FFontOptions : TChromiumFontOptions;
|
||||||
@ -251,6 +253,12 @@ type
|
|||||||
FOnBeforePluginLoad : TOnBeforePluginLoad;
|
FOnBeforePluginLoad : TOnBeforePluginLoad;
|
||||||
FOnGetResourceRequestHandler_ReqCtxHdlr : TOnGetResourceRequestHandler;
|
FOnGetResourceRequestHandler_ReqCtxHdlr : TOnGetResourceRequestHandler;
|
||||||
|
|
||||||
|
// ICefMediaObserver
|
||||||
|
FOnSinks : TOnSinksEvent;
|
||||||
|
FOnRoutes : TOnRoutesEvent;
|
||||||
|
FOnRouteStateChanged : TOnRouteStateChangedEvent;
|
||||||
|
FOnRouteMessageReceived : TOnRouteMessageReceivedEvent;
|
||||||
|
|
||||||
// Custom
|
// Custom
|
||||||
FOnTextResultAvailable : TOnTextResultAvailableEvent;
|
FOnTextResultAvailable : TOnTextResultAvailableEvent;
|
||||||
FOnPdfPrintFinished : TOnPdfPrintFinishedEvent;
|
FOnPdfPrintFinished : TOnPdfPrintFinishedEvent;
|
||||||
@ -268,6 +276,7 @@ type
|
|||||||
FOnCookieVisitorDestroyed : TOnCookieVisitorDestroyed;
|
FOnCookieVisitorDestroyed : TOnCookieVisitorDestroyed;
|
||||||
FOnCookieSet : TOnCookieSet;
|
FOnCookieSet : TOnCookieSet;
|
||||||
FOnZoomPctAvailable : TOnZoomPctAvailable;
|
FOnZoomPctAvailable : TOnZoomPctAvailable;
|
||||||
|
FOnMediaRouteCreateFinished : TOnMediaRouteCreateFinishedEvent;
|
||||||
{$IFDEF MSWINDOWS}
|
{$IFDEF MSWINDOWS}
|
||||||
FOnBrowserCompMsg : TOnCompMsgEvent;
|
FOnBrowserCompMsg : TOnCompMsgEvent;
|
||||||
FOnWidgetCompMsg : TOnCompMsgEvent;
|
FOnWidgetCompMsg : TOnCompMsgEvent;
|
||||||
@ -299,6 +308,8 @@ type
|
|||||||
function GetRequestContextIsGlobal : boolean;
|
function GetRequestContextIsGlobal : boolean;
|
||||||
function GetAudioMuted : boolean;
|
function GetAudioMuted : boolean;
|
||||||
function GetParentFormHandle : TCefWindowHandle; virtual;
|
function GetParentFormHandle : TCefWindowHandle; virtual;
|
||||||
|
function GetRequestContext : ICefRequestContext;
|
||||||
|
function GetMediaRouter : ICefMediaRouter;
|
||||||
|
|
||||||
procedure SetDoNotTrack(aValue : boolean);
|
procedure SetDoNotTrack(aValue : boolean);
|
||||||
procedure SetSendReferrer(aValue : boolean);
|
procedure SetSendReferrer(aValue : boolean);
|
||||||
@ -342,9 +353,11 @@ type
|
|||||||
procedure DestroyClientHandler;
|
procedure DestroyClientHandler;
|
||||||
procedure DestroyReqContextHandler;
|
procedure DestroyReqContextHandler;
|
||||||
procedure DestroyResourceRequestHandler;
|
procedure DestroyResourceRequestHandler;
|
||||||
|
procedure DestroyMediaObserver;
|
||||||
procedure ClearBrowserReference;
|
procedure ClearBrowserReference;
|
||||||
procedure CreateReqContextHandler;
|
procedure CreateReqContextHandler;
|
||||||
procedure CreateResourceRequestHandler;
|
procedure CreateResourceRequestHandler;
|
||||||
|
procedure CreateMediaObserver;
|
||||||
|
|
||||||
procedure InitializeEvents;
|
procedure InitializeEvents;
|
||||||
procedure InitializeSettings(var aSettings : TCefBrowserSettings);
|
procedure InitializeSettings(var aSettings : TCefBrowserSettings);
|
||||||
@ -516,6 +529,12 @@ type
|
|||||||
function doOnBeforePluginLoad(const mimeType, pluginUrl:ustring; isMainFrame : boolean; const topOriginUrl: ustring; const pluginInfo: ICefWebPluginInfo; var pluginPolicy: TCefPluginPolicy): Boolean; virtual;
|
function doOnBeforePluginLoad(const mimeType, pluginUrl:ustring; isMainFrame : boolean; const topOriginUrl: ustring; const pluginInfo: ICefWebPluginInfo; var pluginPolicy: TCefPluginPolicy): Boolean; virtual;
|
||||||
procedure doGetResourceRequestHandler_ReqCtxHdlr(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; is_navigation, is_download: boolean; const request_initiator: ustring; var disable_default_handling: boolean; var aResourceRequestHandler : ICefResourceRequestHandler); virtual;
|
procedure doGetResourceRequestHandler_ReqCtxHdlr(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; is_navigation, is_download: boolean; const request_initiator: ustring; var disable_default_handling: boolean; var aResourceRequestHandler : ICefResourceRequestHandler); virtual;
|
||||||
|
|
||||||
|
// ICefMediaObserver
|
||||||
|
procedure doOnSinks(const sinks: TCefMediaSinkArray);
|
||||||
|
procedure doOnRoutes(const routes: TCefMediaRouteArray);
|
||||||
|
procedure doOnRouteStateChanged(const route: ICefMediaRoute; state: TCefMediaRouteConnectionState);
|
||||||
|
procedure doOnRouteMessageReceived(const route: ICefMediaRoute; const message_: ustring);
|
||||||
|
|
||||||
// Custom
|
// Custom
|
||||||
procedure doCookiesDeleted(numDeleted : integer); virtual;
|
procedure doCookiesDeleted(numDeleted : integer); virtual;
|
||||||
procedure doPdfPrintFinished(aResultOK : boolean); virtual;
|
procedure doPdfPrintFinished(aResultOK : boolean); virtual;
|
||||||
@ -540,6 +559,7 @@ type
|
|||||||
procedure doSetZoomLevel(const aValue : double); virtual;
|
procedure doSetZoomLevel(const aValue : double); virtual;
|
||||||
procedure doSetZoomPct(const aValue : double); virtual;
|
procedure doSetZoomPct(const aValue : double); virtual;
|
||||||
procedure doSetZoomStep(aValue : byte); virtual;
|
procedure doSetZoomStep(aValue : byte); virtual;
|
||||||
|
procedure doMediaRouteCreateFinished(result: TCefMediaRouterCreateResult; const error: ustring; const route: ICefMediaRoute); virtual;
|
||||||
function MustCreateLoadHandler : boolean; virtual;
|
function MustCreateLoadHandler : boolean; virtual;
|
||||||
function MustCreateFocusHandler : boolean; virtual;
|
function MustCreateFocusHandler : boolean; virtual;
|
||||||
function MustCreateContextMenuHandler : boolean; virtual;
|
function MustCreateContextMenuHandler : boolean; virtual;
|
||||||
@ -556,6 +576,7 @@ type
|
|||||||
function MustCreateResourceRequestHandler : boolean; virtual;
|
function MustCreateResourceRequestHandler : boolean; virtual;
|
||||||
function MustCreateCookieAccessFilter : boolean; virtual;
|
function MustCreateCookieAccessFilter : boolean; virtual;
|
||||||
function MustCreateRequestContextHandler : boolean; virtual;
|
function MustCreateRequestContextHandler : boolean; virtual;
|
||||||
|
function MustCreateMediaObserver : boolean; virtual;
|
||||||
|
|
||||||
property ParentFormHandle : TCefWindowHandle read GetParentFormHandle;
|
property ParentFormHandle : TCefWindowHandle read GetParentFormHandle;
|
||||||
|
|
||||||
@ -687,6 +708,12 @@ type
|
|||||||
procedure IMEFinishComposingText(keep_selection : boolean);
|
procedure IMEFinishComposingText(keep_selection : boolean);
|
||||||
procedure IMECancelComposition;
|
procedure IMECancelComposition;
|
||||||
|
|
||||||
|
// ICefMediaRouter methods
|
||||||
|
function AddObserver(const observer: ICefMediaObserver): ICefRegistration;
|
||||||
|
function GetSource(const urn: ustring): ICefMediaSource;
|
||||||
|
procedure NotifyCurrentSinks;
|
||||||
|
procedure NotifyCurrentRoutes;
|
||||||
|
procedure CreateRoute(const source: ICefMediaSource; const sink: ICefMediaSink);
|
||||||
|
|
||||||
property DefaultUrl : ustring read FDefaultUrl write FDefaultUrl;
|
property DefaultUrl : ustring read FDefaultUrl write FDefaultUrl;
|
||||||
property Options : TChromiumOptions read FOptions write FOptions;
|
property Options : TChromiumOptions read FOptions write FOptions;
|
||||||
@ -700,6 +727,10 @@ type
|
|||||||
property ResourceRequestHandler : ICefResourceRequestHandler read FResourceRequestHandler;
|
property ResourceRequestHandler : ICefResourceRequestHandler read FResourceRequestHandler;
|
||||||
property CefWindowInfo : TCefWindowInfo read FWindowInfo;
|
property CefWindowInfo : TCefWindowInfo read FWindowInfo;
|
||||||
property VisibleNavigationEntry : ICefNavigationEntry read GetVisibleNavigationEntry;
|
property VisibleNavigationEntry : ICefNavigationEntry read GetVisibleNavigationEntry;
|
||||||
|
property RequestContext : ICefRequestContext read GetRequestContext;
|
||||||
|
property MediaRouter : ICefMediaRouter read GetMediaRouter;
|
||||||
|
property MediaObserver : ICefMediaObserver read FMediaObserver;
|
||||||
|
property Registration : ICefRegistration read FRegistration;
|
||||||
property MultithreadApp : boolean read GetMultithreadApp;
|
property MultithreadApp : boolean read GetMultithreadApp;
|
||||||
property IsLoading : boolean read GetIsLoading;
|
property IsLoading : boolean read GetIsLoading;
|
||||||
property HasDocument : boolean read GetHasDocument;
|
property HasDocument : boolean read GetHasDocument;
|
||||||
@ -777,6 +808,7 @@ type
|
|||||||
property OnCookieVisitorDestroyed : TOnCookieVisitorDestroyed read FOnCookieVisitorDestroyed write FOnCookieVisitorDestroyed;
|
property OnCookieVisitorDestroyed : TOnCookieVisitorDestroyed read FOnCookieVisitorDestroyed write FOnCookieVisitorDestroyed;
|
||||||
property OnCookieSet : TOnCookieSet read FOnCookieSet write FOnCookieSet;
|
property OnCookieSet : TOnCookieSet read FOnCookieSet write FOnCookieSet;
|
||||||
property OnZoomPctAvailable : TOnZoomPctAvailable read FOnZoomPctAvailable write FOnZoomPctAvailable;
|
property OnZoomPctAvailable : TOnZoomPctAvailable read FOnZoomPctAvailable write FOnZoomPctAvailable;
|
||||||
|
property OnMediaRouteCreateFinished : TOnMediaRouteCreateFinishedEvent read FOnMediaRouteCreateFinished write FOnMediaRouteCreateFinished;
|
||||||
{$IFDEF MSWINDOWS}
|
{$IFDEF MSWINDOWS}
|
||||||
property OnBrowserCompMsg : TOnCompMsgEvent read FOnBrowserCompMsg write FOnBrowserCompMsg;
|
property OnBrowserCompMsg : TOnCompMsgEvent read FOnBrowserCompMsg write FOnBrowserCompMsg;
|
||||||
property OnWidgetCompMsg : TOnCompMsgEvent read FOnWidgetCompMsg write FOnWidgetCompMsg;
|
property OnWidgetCompMsg : TOnCompMsgEvent read FOnWidgetCompMsg write FOnWidgetCompMsg;
|
||||||
@ -891,6 +923,12 @@ type
|
|||||||
property OnRequestContextInitialized : TOnRequestContextInitialized read FOnRequestContextInitialized write SetOnRequestContextInitialized;
|
property OnRequestContextInitialized : TOnRequestContextInitialized read FOnRequestContextInitialized write SetOnRequestContextInitialized;
|
||||||
property OnBeforePluginLoad : TOnBeforePluginLoad read FOnBeforePluginLoad write SetOnBeforePluginLoad;
|
property OnBeforePluginLoad : TOnBeforePluginLoad read FOnBeforePluginLoad write SetOnBeforePluginLoad;
|
||||||
property OnGetResourceRequestHandler_ReqCtxHdlr : TOnGetResourceRequestHandler read FOnGetResourceRequestHandler_ReqCtxHdlr write FOnGetResourceRequestHandler_ReqCtxHdlr;
|
property OnGetResourceRequestHandler_ReqCtxHdlr : TOnGetResourceRequestHandler read FOnGetResourceRequestHandler_ReqCtxHdlr write FOnGetResourceRequestHandler_ReqCtxHdlr;
|
||||||
|
|
||||||
|
// ICefMediaObserver
|
||||||
|
property OnSinks : TOnSinksEvent read FOnSinks write FOnSinks;
|
||||||
|
property OnRoutes : TOnRoutesEvent read FOnRoutes write FOnRoutes;
|
||||||
|
property OnRouteStateChanged : TOnRouteStateChangedEvent read FOnRouteStateChanged write FOnRouteStateChanged;
|
||||||
|
property OnRouteMessageReceived : TOnRouteMessageReceivedEvent read FOnRouteMessageReceived write FOnRouteMessageReceived;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
// *********************************************************
|
// *********************************************************
|
||||||
@ -931,9 +969,11 @@ uses
|
|||||||
uCEFBrowser, uCEFValue, uCEFDictionaryValue, uCEFStringMultimap, uCEFFrame,
|
uCEFBrowser, uCEFValue, uCEFDictionaryValue, uCEFStringMultimap, uCEFFrame,
|
||||||
uCEFApplicationCore, uCEFProcessMessage, uCEFRequestContext,
|
uCEFApplicationCore, uCEFProcessMessage, uCEFRequestContext,
|
||||||
{$IFDEF MSWINDOWS}uCEFOLEDragAndDrop,{$ENDIF}
|
{$IFDEF MSWINDOWS}uCEFOLEDragAndDrop,{$ENDIF}
|
||||||
uCEFPDFPrintCallback, uCEFResolveCallback, uCEFDeleteCookiesCallback, uCEFStringVisitor,
|
uCEFPDFPrintCallback, uCEFResolveCallback, uCEFDeleteCookiesCallback,
|
||||||
uCEFListValue, uCEFNavigationEntryVisitor, uCEFDownloadImageCallBack, uCEFCookieManager,
|
uCEFStringVisitor, uCEFListValue, uCEFNavigationEntryVisitor,
|
||||||
uCEFRequestContextHandler, uCEFCookieVisitor, uCEFSetCookieCallback, uCEFResourceRequestHandler;
|
uCEFDownloadImageCallBack, uCEFCookieManager, uCEFRequestContextHandler,
|
||||||
|
uCEFCookieVisitor, uCEFSetCookieCallback, uCEFResourceRequestHandler,
|
||||||
|
uCEFMediaObserver, uCEFMediaRouteCreateCallback;
|
||||||
|
|
||||||
constructor TChromiumCore.Create(AOwner: TComponent);
|
constructor TChromiumCore.Create(AOwner: TComponent);
|
||||||
begin
|
begin
|
||||||
@ -949,6 +989,8 @@ begin
|
|||||||
FHandler := nil;
|
FHandler := nil;
|
||||||
FReqContextHandler := nil;
|
FReqContextHandler := nil;
|
||||||
FResourceRequestHandler := nil;
|
FResourceRequestHandler := nil;
|
||||||
|
FMediaObserver := nil;
|
||||||
|
FRegistration := nil;
|
||||||
FOptions := nil;
|
FOptions := nil;
|
||||||
FFontOptions := nil;
|
FFontOptions := nil;
|
||||||
FDefaultEncoding := '';
|
FDefaultEncoding := '';
|
||||||
@ -1064,6 +1106,7 @@ begin
|
|||||||
DestroyClientHandler;
|
DestroyClientHandler;
|
||||||
DestroyReqContextHandler;
|
DestroyReqContextHandler;
|
||||||
DestroyResourceRequestHandler;
|
DestroyResourceRequestHandler;
|
||||||
|
DestroyMediaObserver;
|
||||||
|
|
||||||
inherited BeforeDestruction;
|
inherited BeforeDestruction;
|
||||||
end;
|
end;
|
||||||
@ -1231,6 +1274,19 @@ begin
|
|||||||
FReqContextHandler := TCustomRequestContextHandler.Create(self);
|
FReqContextHandler := TCustomRequestContextHandler.Create(self);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TChromiumCore.DestroyMediaObserver;
|
||||||
|
begin
|
||||||
|
FRegistration := nil;
|
||||||
|
FMediaObserver := nil;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TChromiumCore.CreateMediaObserver;
|
||||||
|
begin
|
||||||
|
if MustCreateMediaObserver and
|
||||||
|
(FMediaObserver = nil) then
|
||||||
|
FMediaObserver := TCustomMediaObserver.Create(self);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TChromiumCore.DestroyResourceRequestHandler;
|
procedure TChromiumCore.DestroyResourceRequestHandler;
|
||||||
begin
|
begin
|
||||||
try
|
try
|
||||||
@ -1295,6 +1351,7 @@ begin
|
|||||||
if CreateClientHandler(aIsOSR) then
|
if CreateClientHandler(aIsOSR) then
|
||||||
begin
|
begin
|
||||||
CreateResourceRequestHandler;
|
CreateResourceRequestHandler;
|
||||||
|
CreateMediaObserver;
|
||||||
|
|
||||||
aClient := FHandler;
|
aClient := FHandler;
|
||||||
Result := True;
|
Result := True;
|
||||||
@ -1414,6 +1471,12 @@ begin
|
|||||||
FOnBeforePluginLoad := nil;
|
FOnBeforePluginLoad := nil;
|
||||||
FOnGetResourceRequestHandler_ReqCtxHdlr := nil;
|
FOnGetResourceRequestHandler_ReqCtxHdlr := nil;
|
||||||
|
|
||||||
|
// ICefMediaObserver
|
||||||
|
FOnSinks := nil;
|
||||||
|
FOnRoutes := nil;
|
||||||
|
FOnRouteStateChanged := nil;
|
||||||
|
FOnRouteMessageReceived := nil;
|
||||||
|
|
||||||
// Custom
|
// Custom
|
||||||
FOnTextResultAvailable := nil;
|
FOnTextResultAvailable := nil;
|
||||||
FOnPdfPrintFinished := nil;
|
FOnPdfPrintFinished := nil;
|
||||||
@ -1431,6 +1494,7 @@ begin
|
|||||||
FOnCookieVisitorDestroyed := nil;
|
FOnCookieVisitorDestroyed := nil;
|
||||||
FOnCookieSet := nil;
|
FOnCookieSet := nil;
|
||||||
FOnZoomPctAvailable := nil;
|
FOnZoomPctAvailable := nil;
|
||||||
|
FOnMediaRouteCreateFinished := nil;
|
||||||
|
|
||||||
{$IFDEF MSWINDOWS}
|
{$IFDEF MSWINDOWS}
|
||||||
FOnBrowserCompMsg := nil;
|
FOnBrowserCompMsg := nil;
|
||||||
@ -1470,6 +1534,7 @@ begin
|
|||||||
GetSettings(FBrowserSettings);
|
GetSettings(FBrowserSettings);
|
||||||
InitializeWindowInfo(aParentHandle, aParentRect, aWindowName);
|
InitializeWindowInfo(aParentHandle, aParentRect, aWindowName);
|
||||||
CreateResourceRequestHandler;
|
CreateResourceRequestHandler;
|
||||||
|
CreateMediaObserver;
|
||||||
|
|
||||||
if (aContext = nil) then
|
if (aContext = nil) then
|
||||||
begin
|
begin
|
||||||
@ -3178,6 +3243,26 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TChromiumCore.GetRequestContext : ICefRequestContext;
|
||||||
|
begin
|
||||||
|
if Initialized then
|
||||||
|
Result := FBrowser.Host.RequestContext
|
||||||
|
else
|
||||||
|
Result := nil;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TChromiumCore.GetMediaRouter : ICefMediaRouter;
|
||||||
|
var
|
||||||
|
TempRequestContext : ICefRequestContext;
|
||||||
|
begin
|
||||||
|
TempRequestContext := RequestContext;
|
||||||
|
|
||||||
|
if (TempRequestContext <> nil) then
|
||||||
|
Result := TempRequestContext.MediaRouter
|
||||||
|
else
|
||||||
|
Result := nil;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TChromiumCore.SimulateMouseWheel(aDeltaX, aDeltaY : integer);
|
procedure TChromiumCore.SimulateMouseWheel(aDeltaX, aDeltaY : integer);
|
||||||
var
|
var
|
||||||
TempEvent : TCefMouseEvent;
|
TempEvent : TCefMouseEvent;
|
||||||
@ -4022,6 +4107,14 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TChromiumCore.doMediaRouteCreateFinished( result : TCefMediaRouterCreateResult;
|
||||||
|
const error : ustring;
|
||||||
|
const route : ICefMediaRoute);
|
||||||
|
begin
|
||||||
|
if assigned(FOnMediaRouteCreateFinished) then
|
||||||
|
FOnMediaRouteCreateFinished(self, result, error, route);
|
||||||
|
end;
|
||||||
|
|
||||||
function TChromiumCore.MustCreateLoadHandler : boolean;
|
function TChromiumCore.MustCreateLoadHandler : boolean;
|
||||||
begin
|
begin
|
||||||
Result := assigned(FOnLoadStart) or
|
Result := assigned(FOnLoadStart) or
|
||||||
@ -4135,6 +4228,14 @@ begin
|
|||||||
MustCreateResourceRequestHandler;
|
MustCreateResourceRequestHandler;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TChromiumCore.MustCreateMediaObserver : boolean;
|
||||||
|
begin
|
||||||
|
Result := assigned(FOnSinks) or
|
||||||
|
assigned(FOnRoutes) or
|
||||||
|
assigned(FOnRouteStateChanged) or
|
||||||
|
assigned(FOnRouteMessageReceived);
|
||||||
|
end;
|
||||||
|
|
||||||
{$IFDEF MSWINDOWS}
|
{$IFDEF MSWINDOWS}
|
||||||
procedure TChromiumCore.PrefsAvailableMsg(aResultOK : boolean);
|
procedure TChromiumCore.PrefsAvailableMsg(aResultOK : boolean);
|
||||||
begin
|
begin
|
||||||
@ -4385,6 +4486,7 @@ begin
|
|||||||
if (browser <> nil) and (FBrowserId = browser.Identifier) then
|
if (browser <> nil) and (FBrowserId = browser.Identifier) then
|
||||||
begin
|
begin
|
||||||
FInitialized := False;
|
FInitialized := False;
|
||||||
|
DestroyMediaObserver;
|
||||||
DestroyResourceRequestHandler;
|
DestroyResourceRequestHandler;
|
||||||
DestroyReqContextHandler;
|
DestroyReqContextHandler;
|
||||||
ClearBrowserReference;
|
ClearBrowserReference;
|
||||||
@ -4410,6 +4512,9 @@ begin
|
|||||||
|
|
||||||
doUpdatePreferences(browser);
|
doUpdatePreferences(browser);
|
||||||
|
|
||||||
|
if (FMediaObserver <> nil) and (FRegistration = nil) then
|
||||||
|
FRegistration := AddObserver(FMediaObserver);
|
||||||
|
|
||||||
if Assigned(FOnAfterCreated) then FOnAfterCreated(Self, browser);
|
if Assigned(FOnAfterCreated) then FOnAfterCreated(Self, browser);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -4665,9 +4770,37 @@ begin
|
|||||||
aResourceRequestHandler);
|
aResourceRequestHandler);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TChromiumCore.doOnFullScreenModeChange(const browser: ICefBrowser; fullscreen: Boolean);
|
procedure TChromiumCore.doOnSinks(const sinks: TCefMediaSinkArray);
|
||||||
begin
|
begin
|
||||||
if Assigned(FOnFullScreenModeChange) then FOnFullScreenModeChange(Self, browser, fullscreen);
|
if assigned(FOnSinks) then
|
||||||
|
FOnSinks(self, sinks);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TChromiumCore.doOnRoutes(const routes: TCefMediaRouteArray);
|
||||||
|
begin
|
||||||
|
if assigned(FOnRoutes) then
|
||||||
|
FOnRoutes(self, routes);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TChromiumCore.doOnRouteStateChanged(const route : ICefMediaRoute;
|
||||||
|
state : TCefMediaRouteConnectionState);
|
||||||
|
begin
|
||||||
|
if assigned(FOnRouteStateChanged) then
|
||||||
|
FOnRouteStateChanged(self, route, state);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TChromiumCore.doOnRouteMessageReceived(const route : ICefMediaRoute;
|
||||||
|
const message_ : ustring);
|
||||||
|
begin
|
||||||
|
if assigned(FOnRouteMessageReceived) then
|
||||||
|
FOnRouteMessageReceived(self, route, message_);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TChromiumCore.doOnFullScreenModeChange(const browser : ICefBrowser;
|
||||||
|
fullscreen : Boolean);
|
||||||
|
begin
|
||||||
|
if Assigned(FOnFullScreenModeChange) then
|
||||||
|
FOnFullScreenModeChange(Self, browser, fullscreen);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TChromiumCore.doOnGetAuthCredentials(const browser : ICefBrowser;
|
function TChromiumCore.doOnGetAuthCredentials(const browser : ICefBrowser;
|
||||||
@ -5430,6 +5563,67 @@ begin
|
|||||||
if Initialized then FBrowser.Host.IMECancelComposition;
|
if Initialized then FBrowser.Host.IMECancelComposition;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
// ICefMediaRouter methods
|
||||||
|
function TChromiumCore.AddObserver(const observer: ICefMediaObserver): ICefRegistration;
|
||||||
|
var
|
||||||
|
TempMediaRouter : ICefMediaRouter;
|
||||||
|
begin
|
||||||
|
Result := nil;
|
||||||
|
TempMediaRouter := MediaRouter;
|
||||||
|
|
||||||
|
if (TempMediaRouter <> nil) then
|
||||||
|
Result := TempMediaRouter.AddObserver(observer);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TChromiumCore.GetSource(const urn: ustring): ICefMediaSource;
|
||||||
|
var
|
||||||
|
TempMediaRouter : ICefMediaRouter;
|
||||||
|
begin
|
||||||
|
Result := nil;
|
||||||
|
TempMediaRouter := MediaRouter;
|
||||||
|
|
||||||
|
if (TempMediaRouter <> nil) then
|
||||||
|
Result := TempMediaRouter.GetSource(urn);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TChromiumCore.NotifyCurrentSinks;
|
||||||
|
var
|
||||||
|
TempMediaRouter : ICefMediaRouter;
|
||||||
|
begin
|
||||||
|
TempMediaRouter := MediaRouter;
|
||||||
|
|
||||||
|
if (TempMediaRouter <> nil) then
|
||||||
|
TempMediaRouter.NotifyCurrentSinks;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TChromiumCore.NotifyCurrentRoutes;
|
||||||
|
var
|
||||||
|
TempMediaRouter : ICefMediaRouter;
|
||||||
|
begin
|
||||||
|
TempMediaRouter := MediaRouter;
|
||||||
|
|
||||||
|
if (TempMediaRouter <> nil) then
|
||||||
|
TempMediaRouter.NotifyCurrentRoutes;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// This procedure is asynchronous and the result, ICefMediaRoute and the error
|
||||||
|
// message will be available in the TChromium.OnMediaRouteCreateFinished event.
|
||||||
|
procedure TChromiumCore.CreateRoute(const source: ICefMediaSource; const sink: ICefMediaSink);
|
||||||
|
var
|
||||||
|
TempMediaRouter : ICefMediaRouter;
|
||||||
|
TempCallback : ICefMediaRouteCreateCallback;
|
||||||
|
begin
|
||||||
|
TempMediaRouter := MediaRouter;
|
||||||
|
|
||||||
|
if (TempMediaRouter <> nil) then
|
||||||
|
try
|
||||||
|
TempCallback := TCefCustomMediaRouteCreateCallback.Create(self);
|
||||||
|
TempMediaRouter.CreateRoute(source, sink, TempCallback);
|
||||||
|
finally
|
||||||
|
TempCallback := nil;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
{$IFDEF MSWINDOWS}
|
{$IFDEF MSWINDOWS}
|
||||||
function TChromiumCore.CopyDCToBitmapStream(aSrcDC : HDC; const aSrcRect : TRect; var aStream : TStream) : boolean;
|
function TChromiumCore.CopyDCToBitmapStream(aSrcDC : HDC; const aSrcRect : TRect; var aStream : TStream) : boolean;
|
||||||
var
|
var
|
||||||
|
@ -166,6 +166,12 @@ type
|
|||||||
TOnBeforePluginLoad = procedure(Sender: TObject; const mimeType, pluginUrl:ustring; isMainFrame : boolean; const topOriginUrl: ustring; const pluginInfo: ICefWebPluginInfo; var pluginPolicy: TCefPluginPolicy; var aResult : boolean) of Object;
|
TOnBeforePluginLoad = procedure(Sender: TObject; const mimeType, pluginUrl:ustring; isMainFrame : boolean; const topOriginUrl: ustring; const pluginInfo: ICefWebPluginInfo; var pluginPolicy: TCefPluginPolicy; var aResult : boolean) of Object;
|
||||||
// ICefRequestContextHandler uses the same TOnGetResourceRequestHandler event type defined for ICefRequestHandler
|
// ICefRequestContextHandler uses the same TOnGetResourceRequestHandler event type defined for ICefRequestHandler
|
||||||
|
|
||||||
|
// ICefMediaObserver
|
||||||
|
TOnSinksEvent = procedure(Sender: TObject; const sinks: TCefMediaSinkArray) of object;
|
||||||
|
TOnRoutesEvent = procedure(Sender: TObject; const routes: TCefMediaRouteArray) of object;
|
||||||
|
TOnRouteStateChangedEvent = procedure(Sender: TObject; const route: ICefMediaRoute; state: TCefMediaRouteConnectionState) of object;
|
||||||
|
TOnRouteMessageReceivedEvent = procedure(Sender: TObject; const route: ICefMediaRoute; const message_: ustring) of object;
|
||||||
|
|
||||||
// Custom
|
// Custom
|
||||||
TOnTextResultAvailableEvent = procedure(Sender: TObject; const aText : ustring) of object;
|
TOnTextResultAvailableEvent = procedure(Sender: TObject; const aText : ustring) of object;
|
||||||
TOnPdfPrintFinishedEvent = procedure(Sender: TObject; aResultOK : boolean) of object;
|
TOnPdfPrintFinishedEvent = procedure(Sender: TObject; aResultOK : boolean) of object;
|
||||||
@ -179,6 +185,7 @@ type
|
|||||||
TOnCookieVisitorDestroyed = procedure(Sender: TObject; aID : integer) of object;
|
TOnCookieVisitorDestroyed = procedure(Sender: TObject; aID : integer) of object;
|
||||||
TOnCookieSet = procedure(Sender: TObject; aSuccess : boolean; aID : integer) of object;
|
TOnCookieSet = procedure(Sender: TObject; aSuccess : boolean; aID : integer) of object;
|
||||||
TOnZoomPctAvailable = procedure(Sender: TObject; const aZoomPct : double) of object;
|
TOnZoomPctAvailable = procedure(Sender: TObject; const aZoomPct : double) of object;
|
||||||
|
TOnMediaRouteCreateFinishedEvent = procedure(Sender: TObject; result: TCefMediaRouterCreateResult; const error: ustring; const route: ICefMediaRoute) of object;
|
||||||
{$IFDEF MSWINDOWS}
|
{$IFDEF MSWINDOWS}
|
||||||
TOnCompMsgEvent = procedure(var aMessage: TMessage; var aHandled: Boolean) of object;
|
TOnCompMsgEvent = procedure(var aMessage: TMessage; var aHandled: Boolean) of object;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
@ -159,7 +159,31 @@ type
|
|||||||
TCefMediaRouteArray = array of ICefMediaRoute;
|
TCefMediaRouteArray = array of ICefMediaRoute;
|
||||||
TCefMediaSinkArray = array of ICefMediaSink;
|
TCefMediaSinkArray = array of ICefMediaSink;
|
||||||
|
|
||||||
|
TCefMediaSinkInfo = record
|
||||||
|
ID : ustring;
|
||||||
|
Valid : boolean;
|
||||||
|
Name : ustring;
|
||||||
|
Description : ustring;
|
||||||
|
SinkType : TCefMediaType;
|
||||||
|
SinkIntf : ICefMediaSink;
|
||||||
|
end;
|
||||||
|
TCefMediaSinkInfoArray = array of TCefMediaSinkInfo;
|
||||||
|
|
||||||
|
TCefMediaRouteInfo = record
|
||||||
|
ID : ustring;
|
||||||
|
SourceID : ustring;
|
||||||
|
SinkID : ustring;
|
||||||
|
RouteIntf : ICefMediaRoute;
|
||||||
|
end;
|
||||||
|
TCefMediaRouteInfoArray = array of TCefMediaRouteInfo;
|
||||||
|
|
||||||
|
TCefMediaSourceInfo = record
|
||||||
|
ID : ustring;
|
||||||
|
Valid : boolean;
|
||||||
|
SourceType : TCefMediaType;
|
||||||
|
SourceIntf : ICefMediaSource;
|
||||||
|
end;
|
||||||
|
TCefMediaSourceInfoArray = array of TCefMediaSourceInfo;
|
||||||
|
|
||||||
// *******************************************
|
// *******************************************
|
||||||
// ***************** Events ******************
|
// ***************** Events ******************
|
||||||
@ -217,7 +241,7 @@ type
|
|||||||
TCefNavigationEntryVisitorProc = {$IFDEF DELPHI12_UP}reference to{$ENDIF} function(const entry: ICefNavigationEntry; current: Boolean; index, total: Integer): Boolean;
|
TCefNavigationEntryVisitorProc = {$IFDEF DELPHI12_UP}reference to{$ENDIF} function(const entry: ICefNavigationEntry; current: Boolean; index, total: Integer): Boolean;
|
||||||
TOnDownloadImageFinishedProc = {$IFDEF DELPHI12_UP}reference to{$ENDIF} procedure(const imageUrl: ustring; httpStatusCode: Integer; const image: ICefImage);
|
TOnDownloadImageFinishedProc = {$IFDEF DELPHI12_UP}reference to{$ENDIF} procedure(const imageUrl: ustring; httpStatusCode: Integer; const image: ICefImage);
|
||||||
TCefCookieVisitorProc = {$IFDEF DELPHI12_UP}reference to{$ENDIF} function(const name, value, domain, path: ustring; secure, httponly, hasExpires: Boolean; const creation, lastAccess, expires: TDateTime; count, total: Integer; out deleteCookie: Boolean): Boolean;
|
TCefCookieVisitorProc = {$IFDEF DELPHI12_UP}reference to{$ENDIF} function(const name, value, domain, path: ustring; secure, httponly, hasExpires: Boolean; const creation, lastAccess, expires: TDateTime; count, total: Integer; out deleteCookie: Boolean): Boolean;
|
||||||
|
TCefMediaRouteCreateCallbackProc = {$IFDEF DELPHI12_UP}reference to{$ENDIF} procedure(result: TCefMediaRouterCreateResult; const error: ustring; const route: ICefMediaRoute);
|
||||||
|
|
||||||
|
|
||||||
// *******************************************
|
// *******************************************
|
||||||
@ -388,6 +412,12 @@ type
|
|||||||
function doOnBeforePluginLoad(const mimeType, pluginUrl:ustring; isMainFrame : boolean; const topOriginUrl: ustring; const pluginInfo: ICefWebPluginInfo; var pluginPolicy: TCefPluginPolicy): Boolean;
|
function doOnBeforePluginLoad(const mimeType, pluginUrl:ustring; isMainFrame : boolean; const topOriginUrl: ustring; const pluginInfo: ICefWebPluginInfo; var pluginPolicy: TCefPluginPolicy): Boolean;
|
||||||
procedure doGetResourceRequestHandler_ReqCtxHdlr(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; is_navigation, is_download: boolean; const request_initiator: ustring; var disable_default_handling: boolean; var aResourceRequestHandler : ICefResourceRequestHandler);
|
procedure doGetResourceRequestHandler_ReqCtxHdlr(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; is_navigation, is_download: boolean; const request_initiator: ustring; var disable_default_handling: boolean; var aResourceRequestHandler : ICefResourceRequestHandler);
|
||||||
|
|
||||||
|
// ICefMediaObserver
|
||||||
|
procedure doOnSinks(const sinks: TCefMediaSinkArray);
|
||||||
|
procedure doOnRoutes(const routes: TCefMediaRouteArray);
|
||||||
|
procedure doOnRouteStateChanged(const route: ICefMediaRoute; state: TCefMediaRouteConnectionState);
|
||||||
|
procedure doOnRouteMessageReceived(const route: ICefMediaRoute; const message_: ustring);
|
||||||
|
|
||||||
// Custom
|
// Custom
|
||||||
procedure doCookiesDeleted(numDeleted : integer);
|
procedure doCookiesDeleted(numDeleted : integer);
|
||||||
procedure doPdfPrintFinished(aResultOK : boolean);
|
procedure doPdfPrintFinished(aResultOK : boolean);
|
||||||
@ -412,6 +442,7 @@ type
|
|||||||
procedure doSetZoomPct(const aValue : double);
|
procedure doSetZoomPct(const aValue : double);
|
||||||
procedure doSetZoomStep(aValue : byte);
|
procedure doSetZoomStep(aValue : byte);
|
||||||
procedure doReadZoom;
|
procedure doReadZoom;
|
||||||
|
procedure doMediaRouteCreateFinished(result: TCefMediaRouterCreateResult; const error: ustring; const route: ICefMediaRoute);
|
||||||
function MustCreateLoadHandler : boolean;
|
function MustCreateLoadHandler : boolean;
|
||||||
function MustCreateFocusHandler : boolean;
|
function MustCreateFocusHandler : boolean;
|
||||||
function MustCreateContextMenuHandler : boolean;
|
function MustCreateContextMenuHandler : boolean;
|
||||||
@ -427,6 +458,8 @@ type
|
|||||||
function MustCreateFindHandler : boolean;
|
function MustCreateFindHandler : boolean;
|
||||||
function MustCreateResourceRequestHandler : boolean;
|
function MustCreateResourceRequestHandler : boolean;
|
||||||
function MustCreateCookieAccessFilter : boolean;
|
function MustCreateCookieAccessFilter : boolean;
|
||||||
|
function MustCreateRequestContextHandler : boolean;
|
||||||
|
function MustCreateMediaObserver : boolean;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
IServerEvents = interface
|
IServerEvents = interface
|
||||||
@ -1263,7 +1296,7 @@ type
|
|||||||
procedure OnSinks(const sinks: TCefMediaSinkArray);
|
procedure OnSinks(const sinks: TCefMediaSinkArray);
|
||||||
procedure OnRoutes(const routes: TCefMediaRouteArray);
|
procedure OnRoutes(const routes: TCefMediaRouteArray);
|
||||||
procedure OnRouteStateChanged(const route: ICefMediaRoute; state: TCefMediaRouteConnectionState);
|
procedure OnRouteStateChanged(const route: ICefMediaRoute; state: TCefMediaRouteConnectionState);
|
||||||
procedure OnRouteMessageReceived(const route: ICefMediaRoute; const message_: Pointer; message_size: NativeUInt);
|
procedure OnRouteMessageReceived(const route: ICefMediaRoute; const message_: ustring);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
ICefMediaObserverEvents = interface
|
ICefMediaObserverEvents = interface
|
||||||
@ -1271,7 +1304,7 @@ type
|
|||||||
procedure doOnSinks(const sinks: TCefMediaSinkArray);
|
procedure doOnSinks(const sinks: TCefMediaSinkArray);
|
||||||
procedure doOnRoutes(const routes: TCefMediaRouteArray);
|
procedure doOnRoutes(const routes: TCefMediaRouteArray);
|
||||||
procedure doOnRouteStateChanged(const route: ICefMediaRoute; state: TCefMediaRouteConnectionState);
|
procedure doOnRouteStateChanged(const route: ICefMediaRoute; state: TCefMediaRouteConnectionState);
|
||||||
procedure doOnRouteMessageReceived(const route: ICefMediaRoute; const message_: Pointer; message_size: NativeUInt);
|
procedure doOnRouteMessageReceived(const route: ICefMediaRoute; const message_: ustring);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
// TCefMediaRoute
|
// TCefMediaRoute
|
||||||
@ -1281,10 +1314,12 @@ type
|
|||||||
function GetId: ustring;
|
function GetId: ustring;
|
||||||
function GetSource: ICefMediaSource;
|
function GetSource: ICefMediaSource;
|
||||||
function GetSink: ICefMediaSink;
|
function GetSink: ICefMediaSink;
|
||||||
procedure SendRouteMessage(const message_: Pointer; message_size: NativeUInt);
|
procedure SendRouteMessage(const message_: ustring);
|
||||||
procedure Terminate;
|
procedure Terminate;
|
||||||
|
|
||||||
property ID : ustring read GetId;
|
property ID : ustring read GetId;
|
||||||
|
property Source : ICefMediaSource read GetSource;
|
||||||
|
property Sink : ICefMediaSink read GetSink;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
// TCefMediaRouteCreateCallback
|
// TCefMediaRouteCreateCallback
|
||||||
@ -2125,6 +2160,7 @@ type
|
|||||||
|
|
||||||
property CachePath : ustring read GetCachePath;
|
property CachePath : ustring read GetCachePath;
|
||||||
property IsGlobalContext : boolean read IsGlobal;
|
property IsGlobalContext : boolean read IsGlobal;
|
||||||
|
property MediaRouter : ICefMediaRouter read GetMediaRouter;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
// TCefPrintSettings
|
// TCefPrintSettings
|
||||||
|
@ -57,7 +57,7 @@ type
|
|||||||
procedure OnSinks(const sinks: TCefMediaSinkArray); virtual;
|
procedure OnSinks(const sinks: TCefMediaSinkArray); virtual;
|
||||||
procedure OnRoutes(const routes: TCefMediaRouteArray); virtual;
|
procedure OnRoutes(const routes: TCefMediaRouteArray); virtual;
|
||||||
procedure OnRouteStateChanged(const route: ICefMediaRoute; state: TCefMediaRouteConnectionState); virtual;
|
procedure OnRouteStateChanged(const route: ICefMediaRoute; state: TCefMediaRouteConnectionState); virtual;
|
||||||
procedure OnRouteMessageReceived(const route: ICefMediaRoute; const message_: Pointer; message_size: NativeUInt); virtual;
|
procedure OnRouteMessageReceived(const route: ICefMediaRoute; const message_: ustring); virtual;
|
||||||
|
|
||||||
public
|
public
|
||||||
constructor Create; virtual;
|
constructor Create; virtual;
|
||||||
@ -70,10 +70,10 @@ type
|
|||||||
procedure OnSinks(const sinks: TCefMediaSinkArray); override;
|
procedure OnSinks(const sinks: TCefMediaSinkArray); override;
|
||||||
procedure OnRoutes(const routes: TCefMediaRouteArray); override;
|
procedure OnRoutes(const routes: TCefMediaRouteArray); override;
|
||||||
procedure OnRouteStateChanged(const route: ICefMediaRoute; state: TCefMediaRouteConnectionState); override;
|
procedure OnRouteStateChanged(const route: ICefMediaRoute; state: TCefMediaRouteConnectionState); override;
|
||||||
procedure OnRouteMessageReceived(const route: ICefMediaRoute; const message_: Pointer; message_size: NativeUInt); override;
|
procedure OnRouteMessageReceived(const route: ICefMediaRoute; const message_: ustring); override;
|
||||||
|
|
||||||
public
|
public
|
||||||
constructor Create(const events: ICefMediaObserverEvents); reintroduce;
|
constructor Create(const events: IChromiumEvents); reintroduce;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -95,27 +95,29 @@ uses
|
|||||||
procedure cef_media_observer_on_sinks( self : PCefMediaObserver;
|
procedure cef_media_observer_on_sinks( self : PCefMediaObserver;
|
||||||
sinksCount : NativeUInt;
|
sinksCount : NativeUInt;
|
||||||
const sinks : PPCefMediaSink); stdcall;
|
const sinks : PPCefMediaSink); stdcall;
|
||||||
|
type
|
||||||
|
TSinkArray = array of PCefMediaSink;
|
||||||
var
|
var
|
||||||
TempObject : TObject;
|
TempObject : TObject;
|
||||||
TempArray : TCefMediaSinkArray;
|
TempArray : TCefMediaSinkArray;
|
||||||
i : NativeUInt;
|
i : NativeUInt;
|
||||||
TempItem : PCefMediaSink;
|
|
||||||
begin
|
begin
|
||||||
TempArray := nil;
|
TempArray := nil;
|
||||||
TempObject := CefGetObject(self);
|
TempObject := CefGetObject(self);
|
||||||
|
|
||||||
if (TempObject <> nil) and (TempObject is TCefMediaObserverOwn) then
|
if (TempObject <> nil) and (TempObject is TCefMediaObserverOwn) then
|
||||||
try
|
try
|
||||||
|
if (sinksCount > 0) and (sinks <> nil) then
|
||||||
|
begin
|
||||||
SetLength(TempArray, sinksCount);
|
SetLength(TempArray, sinksCount);
|
||||||
TempItem := PCefMediaSink(sinks^);
|
|
||||||
|
|
||||||
i := 0;
|
i := 0;
|
||||||
while (i < sinksCount) do
|
while (i < sinksCount) do
|
||||||
begin
|
begin
|
||||||
TempArray[i] := TCefMediaSinkRef.UnWrap(TempItem);
|
TempArray[i] := TCefMediaSinkRef.UnWrap(TSinkArray(sinks)[i]);
|
||||||
inc(TempItem);
|
|
||||||
inc(i);
|
inc(i);
|
||||||
end;
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
TCefMediaObserverOwn(TempObject).OnSinks(TempArray);
|
TCefMediaObserverOwn(TempObject).OnSinks(TempArray);
|
||||||
finally
|
finally
|
||||||
@ -137,27 +139,29 @@ end;
|
|||||||
procedure cef_media_observer_on_routes( self : PCefMediaObserver;
|
procedure cef_media_observer_on_routes( self : PCefMediaObserver;
|
||||||
routesCount : NativeUInt;
|
routesCount : NativeUInt;
|
||||||
const routes : PPCefMediaRoute); stdcall;
|
const routes : PPCefMediaRoute); stdcall;
|
||||||
|
type
|
||||||
|
TRouteArray = array of PCefMediaRoute;
|
||||||
var
|
var
|
||||||
TempObject : TObject;
|
TempObject : TObject;
|
||||||
TempArray : TCefMediaRouteArray;
|
TempArray : TCefMediaRouteArray;
|
||||||
i : NativeUInt;
|
i : NativeUInt;
|
||||||
TempItem : PCefMediaRoute;
|
|
||||||
begin
|
begin
|
||||||
TempArray := nil;
|
TempArray := nil;
|
||||||
TempObject := CefGetObject(self);
|
TempObject := CefGetObject(self);
|
||||||
|
|
||||||
if (TempObject <> nil) and (TempObject is TCefMediaObserverOwn) then
|
if (TempObject <> nil) and (TempObject is TCefMediaObserverOwn) then
|
||||||
try
|
try
|
||||||
|
if (routesCount > 0) and (routes <> nil) then
|
||||||
|
begin
|
||||||
SetLength(TempArray, routesCount);
|
SetLength(TempArray, routesCount);
|
||||||
TempItem := PCefMediaRoute(routes^);
|
|
||||||
|
|
||||||
i := 0;
|
i := 0;
|
||||||
while (i < routesCount) do
|
while (i < routesCount) do
|
||||||
begin
|
begin
|
||||||
TempArray[i] := TCefMediaRouteRef.UnWrap(TempItem);
|
TempArray[i] := TCefMediaRouteRef.UnWrap(TRouteArray(routes)[i]);
|
||||||
inc(TempItem);
|
|
||||||
inc(i);
|
inc(i);
|
||||||
end;
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
TCefMediaObserverOwn(TempObject).OnRoutes(TempArray);
|
TCefMediaObserverOwn(TempObject).OnRoutes(TempArray);
|
||||||
finally
|
finally
|
||||||
@ -194,13 +198,18 @@ procedure cef_media_observer_on_route_message_received( self : PCef
|
|||||||
message_size : NativeUInt); stdcall;
|
message_size : NativeUInt); stdcall;
|
||||||
var
|
var
|
||||||
TempObject : TObject;
|
TempObject : TObject;
|
||||||
|
TempMessage : Ansistring;
|
||||||
begin
|
begin
|
||||||
TempObject := CefGetObject(self);
|
TempObject := CefGetObject(self);
|
||||||
|
|
||||||
if (TempObject <> nil) and (TempObject is TCefMediaObserverOwn) then
|
if (TempObject <> nil) and (TempObject is TCefMediaObserverOwn) then
|
||||||
|
begin
|
||||||
|
if (message_size > 0) and (message_ <> nil) then
|
||||||
|
SetString(TempMessage, PAnsiChar(message_), message_size);
|
||||||
|
|
||||||
TCefMediaObserverOwn(TempObject).OnRouteMessageReceived(TCefMediaRouteRef.UnWrap(route),
|
TCefMediaObserverOwn(TempObject).OnRouteMessageReceived(TCefMediaRouteRef.UnWrap(route),
|
||||||
message_,
|
ustring(TempMessage));
|
||||||
message_size);
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
constructor TCefMediaObserverOwn.Create;
|
constructor TCefMediaObserverOwn.Create;
|
||||||
@ -231,7 +240,7 @@ begin
|
|||||||
//
|
//
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCefMediaObserverOwn.OnRouteMessageReceived(const route: ICefMediaRoute; const message_: Pointer; message_size: NativeUInt);
|
procedure TCefMediaObserverOwn.OnRouteMessageReceived(const route: ICefMediaRoute; const message_: ustring);
|
||||||
begin
|
begin
|
||||||
//
|
//
|
||||||
end;
|
end;
|
||||||
@ -240,7 +249,7 @@ end;
|
|||||||
// ************** TCustomMediaObserver **************
|
// ************** TCustomMediaObserver **************
|
||||||
// **************************************************
|
// **************************************************
|
||||||
|
|
||||||
constructor TCustomMediaObserver.Create(const events: ICefMediaObserverEvents);
|
constructor TCustomMediaObserver.Create(const events: IChromiumEvents);
|
||||||
begin
|
begin
|
||||||
inherited Create;
|
inherited Create;
|
||||||
|
|
||||||
@ -258,7 +267,7 @@ procedure TCustomMediaObserver.OnSinks(const sinks: TCefMediaSinkArray);
|
|||||||
begin
|
begin
|
||||||
try
|
try
|
||||||
if (FEvents <> nil) then
|
if (FEvents <> nil) then
|
||||||
ICefMediaObserverEvents(FEvents).doOnSinks(sinks);
|
IChromiumEvents(FEvents).doOnSinks(sinks);
|
||||||
except
|
except
|
||||||
on e : exception do
|
on e : exception do
|
||||||
if CustomExceptionHandler('TCustomMediaObserver.OnSinks', e) then raise;
|
if CustomExceptionHandler('TCustomMediaObserver.OnSinks', e) then raise;
|
||||||
@ -269,7 +278,7 @@ procedure TCustomMediaObserver.OnRoutes(const routes: TCefMediaRouteArray);
|
|||||||
begin
|
begin
|
||||||
try
|
try
|
||||||
if (FEvents <> nil) then
|
if (FEvents <> nil) then
|
||||||
ICefMediaObserverEvents(FEvents).doOnRoutes(routes);
|
IChromiumEvents(FEvents).doOnRoutes(routes);
|
||||||
except
|
except
|
||||||
on e : exception do
|
on e : exception do
|
||||||
if CustomExceptionHandler('TCustomMediaObserver.OnRoutes', e) then raise;
|
if CustomExceptionHandler('TCustomMediaObserver.OnRoutes', e) then raise;
|
||||||
@ -280,18 +289,18 @@ procedure TCustomMediaObserver.OnRouteStateChanged(const route: ICefMediaRoute;
|
|||||||
begin
|
begin
|
||||||
try
|
try
|
||||||
if (FEvents <> nil) then
|
if (FEvents <> nil) then
|
||||||
ICefMediaObserverEvents(FEvents).doOnRouteStateChanged(route, state);
|
IChromiumEvents(FEvents).doOnRouteStateChanged(route, state);
|
||||||
except
|
except
|
||||||
on e : exception do
|
on e : exception do
|
||||||
if CustomExceptionHandler('TCustomMediaObserver.OnRouteStateChanged', e) then raise;
|
if CustomExceptionHandler('TCustomMediaObserver.OnRouteStateChanged', e) then raise;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCustomMediaObserver.OnRouteMessageReceived(const route: ICefMediaRoute; const message_: Pointer; message_size: NativeUInt);
|
procedure TCustomMediaObserver.OnRouteMessageReceived(const route: ICefMediaRoute; const message_: ustring);
|
||||||
begin
|
begin
|
||||||
try
|
try
|
||||||
if (FEvents <> nil) then
|
if (FEvents <> nil) then
|
||||||
ICefMediaObserverEvents(FEvents).doOnRouteMessageReceived(route, message_, message_size);
|
IChromiumEvents(FEvents).doOnRouteMessageReceived(route, message_);
|
||||||
except
|
except
|
||||||
on e : exception do
|
on e : exception do
|
||||||
if CustomExceptionHandler('TCustomMediaObserver.OnRouteMessageReceived', e) then raise;
|
if CustomExceptionHandler('TCustomMediaObserver.OnRouteMessageReceived', e) then raise;
|
||||||
|
@ -1,188 +0,0 @@
|
|||||||
// ************************************************************************
|
|
||||||
// ***************************** CEF4Delphi *******************************
|
|
||||||
// ************************************************************************
|
|
||||||
//
|
|
||||||
// CEF4Delphi is based on DCEF3 which uses CEF to embed a chromium-based
|
|
||||||
// browser in Delphi applications.
|
|
||||||
//
|
|
||||||
// The original license of DCEF3 still applies to CEF4Delphi.
|
|
||||||
//
|
|
||||||
// For more information about CEF4Delphi visit :
|
|
||||||
// https://www.briskbard.com/index.php?lang=en&pageid=cef
|
|
||||||
//
|
|
||||||
// Copyright © 2020 Salvador Diaz Fau. All rights reserved.
|
|
||||||
//
|
|
||||||
// ************************************************************************
|
|
||||||
// ************ vvvv Original license and comments below vvvv *************
|
|
||||||
// ************************************************************************
|
|
||||||
(*
|
|
||||||
* Delphi Chromium Embedded 3
|
|
||||||
*
|
|
||||||
* Usage allowed under the restrictions of the Lesser GNU General Public License
|
|
||||||
* or alternatively the restrictions of the Mozilla Public License 1.1
|
|
||||||
*
|
|
||||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
|
|
||||||
* the specific language governing rights and limitations under the License.
|
|
||||||
*
|
|
||||||
* Unit owner : Henri Gourvest <hgourvest@gmail.com>
|
|
||||||
* Web site : http://www.progdigy.com
|
|
||||||
* Repository : http://code.google.com/p/delphichromiumembedded/
|
|
||||||
* Group : http://groups.google.com/group/delphichromiumembedded
|
|
||||||
*
|
|
||||||
* Embarcadero Technologies, Inc is not permitted to use or redistribute
|
|
||||||
* this source code without explicit permission.
|
|
||||||
*
|
|
||||||
*)
|
|
||||||
|
|
||||||
unit uCEFMediaObserverComponent;
|
|
||||||
|
|
||||||
{$IFDEF FPC}
|
|
||||||
{$MODE OBJFPC}{$H+}
|
|
||||||
{$ENDIF}
|
|
||||||
|
|
||||||
{$IFNDEF CPUX64}{$ALIGN ON}{$ENDIF}
|
|
||||||
{$MINENUMSIZE 4}
|
|
||||||
|
|
||||||
{$I cef.inc}
|
|
||||||
|
|
||||||
interface
|
|
||||||
|
|
||||||
uses
|
|
||||||
{$IFDEF DELPHI16_UP}
|
|
||||||
{$IFDEF MSWINDOWS}WinApi.Windows, WinApi.Messages, WinApi.ActiveX,{$ENDIF}
|
|
||||||
System.Classes, System.Math,
|
|
||||||
{$ELSE}
|
|
||||||
{$IFDEF MSWINDOWS}Windows, ActiveX,{$ENDIF} Classes, Math,
|
|
||||||
{$IFDEF FPC}
|
|
||||||
LCLProc, LCLType, LCLIntf, LResources, LMessages, InterfaceBase,
|
|
||||||
{$ELSE}
|
|
||||||
Messages,
|
|
||||||
{$ENDIF}
|
|
||||||
{$ENDIF}
|
|
||||||
uCEFTypes, uCEFInterfaces, uCEFMediaObserver, uCEFMediaObserverEvents;
|
|
||||||
|
|
||||||
type
|
|
||||||
{$IFNDEF FPC}{$IFDEF DELPHI16_UP}[ComponentPlatformsAttribute(pidWin32 or pidWin64)]{$ENDIF}{$ENDIF}
|
|
||||||
TCEFMediaObserverComponent = class(TComponent, ICefMediaObserverEvents)
|
|
||||||
protected
|
|
||||||
FMediaObserver : ICefMediaObserver;
|
|
||||||
FOnSinks : TOnSinksEvent;
|
|
||||||
FOnRoutes : TOnRoutesEvent;
|
|
||||||
FOnRouteStateChanged : TOnRouteStateChangedEvent;
|
|
||||||
FOnRouteMessageReceived : TOnRouteMessageReceivedEvent;
|
|
||||||
|
|
||||||
// ICefMediaObserverEvents
|
|
||||||
procedure doOnSinks(const sinks: TCefMediaSinkArray); virtual;
|
|
||||||
procedure doOnRoutes(const routes: TCefMediaRouteArray); virtual;
|
|
||||||
procedure doOnRouteStateChanged(const route: ICefMediaRoute; state: TCefMediaRouteConnectionState); virtual;
|
|
||||||
procedure doOnRouteMessageReceived(const route: ICefMediaRoute; const message_: Pointer; message_size: NativeUInt); virtual;
|
|
||||||
|
|
||||||
public
|
|
||||||
constructor Create(AOwner: TComponent); override;
|
|
||||||
destructor Destroy; override;
|
|
||||||
procedure AfterConstruction; override;
|
|
||||||
|
|
||||||
property MediaObserver : ICefMediaObserver read FMediaObserver;
|
|
||||||
|
|
||||||
published
|
|
||||||
property OnSinks : TOnSinksEvent read FOnSinks write FOnSinks;
|
|
||||||
property OnRoutes : TOnRoutesEvent read FOnRoutes write FOnRoutes;
|
|
||||||
property OnRouteStateChanged : TOnRouteStateChangedEvent read FOnRouteStateChanged write FOnRouteStateChanged;
|
|
||||||
property OnRouteMessageReceived : TOnRouteMessageReceivedEvent read FOnRouteMessageReceived write FOnRouteMessageReceived;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{$IFDEF FPC}
|
|
||||||
procedure Register;
|
|
||||||
{$ENDIF}
|
|
||||||
|
|
||||||
implementation
|
|
||||||
|
|
||||||
// *********************************************************
|
|
||||||
// ********************** ATTENTION ! **********************
|
|
||||||
// *********************************************************
|
|
||||||
// ** **
|
|
||||||
// ** MANY OF THE EVENTS IN CEF4DELPHI COMPONENTS LIKE **
|
|
||||||
// ** TCHROMIUM, TFMXCHROMIUM OR TCEFAPPLICATION ARE **
|
|
||||||
// ** EXECUTED IN A CEF THREAD BY DEFAULT. **
|
|
||||||
// ** **
|
|
||||||
// ** WINDOWS CONTROLS MUST BE CREATED AND DESTROYED IN **
|
|
||||||
// ** THE SAME THREAD TO AVOID ERRORS. **
|
|
||||||
// ** SOME OF THEM RECREATE THE HANDLERS IF THEY ARE **
|
|
||||||
// ** MODIFIED AND CAN CAUSE THE SAME ERRORS. **
|
|
||||||
// ** **
|
|
||||||
// ** DON'T CREATE, MODIFY OR DESTROY WINDOWS CONTROLS **
|
|
||||||
// ** INSIDE THE CEF4DELPHI EVENTS AND USE **
|
|
||||||
// ** SYNCHRONIZATION OBJECTS TO PROTECT VARIABLES AND **
|
|
||||||
// ** FIELDS IF THEY ARE ALSO USED IN THE MAIN THREAD. **
|
|
||||||
// ** **
|
|
||||||
// ** READ THIS FOR MORE INFORMATION : **
|
|
||||||
// ** https://www.briskbard.com/index.php?pageid=cef **
|
|
||||||
// ** **
|
|
||||||
// ** USE OUR FORUMS FOR MORE QUESTIONS : **
|
|
||||||
// ** https://www.briskbard.com/forum/ **
|
|
||||||
// ** **
|
|
||||||
// *********************************************************
|
|
||||||
// *********************************************************
|
|
||||||
|
|
||||||
constructor TCEFMediaObserverComponent.Create(AOwner: TComponent);
|
|
||||||
begin
|
|
||||||
inherited Create(aOwner);
|
|
||||||
|
|
||||||
FMediaObserver := nil;
|
|
||||||
FOnSinks := nil;
|
|
||||||
FOnRoutes := nil;
|
|
||||||
FOnRouteStateChanged := nil;
|
|
||||||
FOnRouteMessageReceived := nil;
|
|
||||||
end;
|
|
||||||
|
|
||||||
destructor TCEFMediaObserverComponent.Destroy;
|
|
||||||
begin
|
|
||||||
FMediaObserver := nil;
|
|
||||||
|
|
||||||
inherited Destroy;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TCEFMediaObserverComponent.AfterConstruction;
|
|
||||||
begin
|
|
||||||
inherited AfterConstruction;
|
|
||||||
|
|
||||||
FMediaObserver := TCustomMediaObserver.Create(self);
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TCEFMediaObserverComponent.doOnSinks(const sinks: TCefMediaSinkArray);
|
|
||||||
begin
|
|
||||||
if assigned(FOnSinks) then
|
|
||||||
FOnSinks(self, sinks);
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TCEFMediaObserverComponent.doOnRoutes(const routes: TCefMediaRouteArray);
|
|
||||||
begin
|
|
||||||
if assigned(FOnRoutes) then
|
|
||||||
FOnRoutes(self, routes);
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TCEFMediaObserverComponent.doOnRouteStateChanged(const route : ICefMediaRoute;
|
|
||||||
state : TCefMediaRouteConnectionState);
|
|
||||||
begin
|
|
||||||
if assigned(FOnRouteStateChanged) then
|
|
||||||
FOnRouteStateChanged(self, route, state);
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TCEFMediaObserverComponent.doOnRouteMessageReceived(const route : ICefMediaRoute;
|
|
||||||
const message_ : Pointer;
|
|
||||||
message_size : NativeUInt);
|
|
||||||
begin
|
|
||||||
if assigned(FOnRouteMessageReceived) then
|
|
||||||
FOnRouteMessageReceived(self, route, message_, message_size);
|
|
||||||
end;
|
|
||||||
|
|
||||||
{$IFDEF FPC}
|
|
||||||
procedure Register;
|
|
||||||
begin
|
|
||||||
{$I res/tcefmediaobservercomponent.lrs}
|
|
||||||
RegisterComponents('Chromium', [TCEFMediaObserverComponent]);
|
|
||||||
end;
|
|
||||||
{$ENDIF}
|
|
||||||
|
|
||||||
end.
|
|
@ -57,7 +57,7 @@ type
|
|||||||
function GetId: ustring;
|
function GetId: ustring;
|
||||||
function GetSource: ICefMediaSource;
|
function GetSource: ICefMediaSource;
|
||||||
function GetSink: ICefMediaSink;
|
function GetSink: ICefMediaSink;
|
||||||
procedure SendRouteMessage(const message_: Pointer; message_size: NativeUInt);
|
procedure SendRouteMessage(const message_: ustring);
|
||||||
procedure Terminate;
|
procedure Terminate;
|
||||||
public
|
public
|
||||||
class function UnWrap(data: Pointer): ICefMediaRoute;
|
class function UnWrap(data: Pointer): ICefMediaRoute;
|
||||||
@ -83,9 +83,19 @@ begin
|
|||||||
Result := TCefMediaSinkRef.UnWrap(PCefMediaRoute(FData)^.get_sink(PCefMediaRoute(FData)));
|
Result := TCefMediaSinkRef.UnWrap(PCefMediaRoute(FData)^.get_sink(PCefMediaRoute(FData)));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCefMediaRouteRef.SendRouteMessage(const message_: Pointer; message_size: NativeUInt);
|
procedure TCefMediaRouteRef.SendRouteMessage(const message_: ustring);
|
||||||
|
var
|
||||||
|
TempMsg : pointer;
|
||||||
|
TempSize : NativeUInt;
|
||||||
begin
|
begin
|
||||||
PCefMediaRoute(FData)^.send_route_message(PCefMediaRoute(FData), message_, message_size);
|
TempSize := length(message_);
|
||||||
|
|
||||||
|
if (TempSize > 0) then
|
||||||
|
TempMsg := @message_[1]
|
||||||
|
else
|
||||||
|
TempMsg := nil;
|
||||||
|
|
||||||
|
PCefMediaRoute(FData)^.send_route_message(PCefMediaRoute(FData), TempMsg, TempSize);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCefMediaRouteRef.Terminate;
|
procedure TCefMediaRouteRef.Terminate;
|
||||||
|
@ -52,37 +52,135 @@ uses
|
|||||||
uCEFBaseRefCounted, uCEFInterfaces, uCEFTypes;
|
uCEFBaseRefCounted, uCEFInterfaces, uCEFTypes;
|
||||||
|
|
||||||
type
|
type
|
||||||
TCefMediaRouteCreateCallbackRef = class(TCefBaseRefCountedRef, ICefMediaRouteCreateCallback)
|
TCefMediaRouteCreateCallbackOwn = class(TCefBaseRefCountedOwn, ICefMediaRouteCreateCallback)
|
||||||
protected
|
protected
|
||||||
procedure OnMediaRouteCreateFinished(result: TCefMediaRouterCreateResult; const error: ustring; const route: ICefMediaRoute);
|
procedure OnMediaRouteCreateFinished(result: TCefMediaRouterCreateResult; const error: ustring; const route: ICefMediaRoute); virtual; abstract;
|
||||||
public
|
public
|
||||||
class function UnWrap(data: Pointer): ICefMediaRouteCreateCallback;
|
constructor Create; virtual;
|
||||||
|
end;
|
||||||
|
|
||||||
|
TCefFastMediaRouteCreateCallback = class(TCefMediaRouteCreateCallbackOwn)
|
||||||
|
protected
|
||||||
|
FCallback: TCefMediaRouteCreateCallbackProc;
|
||||||
|
|
||||||
|
procedure OnMediaRouteCreateFinished(result: TCefMediaRouterCreateResult; const error: ustring; const route: ICefMediaRoute); override;
|
||||||
|
public
|
||||||
|
constructor Create(const callback: TCefMediaRouteCreateCallbackProc); reintroduce;
|
||||||
|
destructor Destroy; override;
|
||||||
|
end;
|
||||||
|
|
||||||
|
TCefCustomMediaRouteCreateCallback = class(TCefMediaRouteCreateCallbackOwn)
|
||||||
|
protected
|
||||||
|
FEvents : Pointer;
|
||||||
|
|
||||||
|
procedure OnMediaRouteCreateFinished(result: TCefMediaRouterCreateResult; const error: ustring; const route: ICefMediaRoute); override;
|
||||||
|
public
|
||||||
|
constructor Create(const aEvents : IChromiumEvents); reintroduce;
|
||||||
|
destructor Destroy; override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
uses
|
uses
|
||||||
uCEFMiscFunctions, uCEFLibFunctions;
|
{$IFDEF DELPHI16_UP}
|
||||||
|
System.SysUtils,
|
||||||
|
{$ELSE}
|
||||||
|
SysUtils,
|
||||||
|
{$ENDIF}
|
||||||
|
uCEFMiscFunctions, uCEFLibFunctions, uCEFMediaRoute;
|
||||||
|
|
||||||
procedure TCefMediaRouteCreateCallbackRef.OnMediaRouteCreateFinished( result : TCefMediaRouterCreateResult;
|
procedure cef_media_route_create_callback_on_media_route_create_finished( self : PCefMediaRouteCreateCallback;
|
||||||
|
result : TCefMediaRouterCreateResult;
|
||||||
|
const error : PCefString;
|
||||||
|
route : PCefMediaRoute); stdcall;
|
||||||
|
var
|
||||||
|
TempObject : TObject;
|
||||||
|
begin
|
||||||
|
TempObject := CefGetObject(self);
|
||||||
|
|
||||||
|
if (TempObject <> nil) and (TempObject is TCefMediaRouteCreateCallbackOwn) then
|
||||||
|
TCefMediaRouteCreateCallbackOwn(TempObject).OnMediaRouteCreateFinished(result,
|
||||||
|
CefString(error),
|
||||||
|
TCefMediaRouteRef.UnWrap(route));
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
// *************************************************************
|
||||||
|
// ************** TCefMediaRouteCreateCallbackOwn **************
|
||||||
|
// *************************************************************
|
||||||
|
|
||||||
|
constructor TCefMediaRouteCreateCallbackOwn.Create;
|
||||||
|
begin
|
||||||
|
inherited CreateData(SizeOf(TCefMediaRouteCreateCallback));
|
||||||
|
|
||||||
|
PCefMediaRouteCreateCallback(FData)^.on_media_route_create_finished :=
|
||||||
|
{$IFDEF FPC}@{$ENDIF}cef_media_route_create_callback_on_media_route_create_finished;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
// **************************************************************
|
||||||
|
// ************** TCefFastMediaRouteCreateCallback **************
|
||||||
|
// **************************************************************
|
||||||
|
|
||||||
|
constructor TCefFastMediaRouteCreateCallback.Create(const callback: TCefMediaRouteCreateCallbackProc);
|
||||||
|
begin
|
||||||
|
inherited Create;
|
||||||
|
|
||||||
|
FCallback := callback;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCefFastMediaRouteCreateCallback.OnMediaRouteCreateFinished( result : TCefMediaRouterCreateResult;
|
||||||
const error : ustring;
|
const error : ustring;
|
||||||
const route : ICefMediaRoute);
|
const route : ICefMediaRoute);
|
||||||
var
|
|
||||||
TempError : TCefString;
|
|
||||||
begin
|
begin
|
||||||
TempError := CefString(error);
|
if assigned(FCallback) then
|
||||||
PCefMediaRouteCreateCallback(FData)^.on_media_route_create_finished(PCefMediaRouteCreateCallback(FData),
|
FCallback(result, error, route);
|
||||||
result,
|
|
||||||
@TempError,
|
|
||||||
CefGetData(route));
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
class function TCefMediaRouteCreateCallbackRef.UnWrap(data: Pointer): ICefMediaRouteCreateCallback;
|
destructor TCefFastMediaRouteCreateCallback.Destroy;
|
||||||
begin
|
begin
|
||||||
if (data <> nil) then
|
FCallback := nil;
|
||||||
Result := Create(data) as ICefMediaRouteCreateCallback
|
|
||||||
else
|
inherited Destroy;
|
||||||
Result := nil;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************
|
||||||
|
// ************** TCefCustomMediaRouteCreateCallback **************
|
||||||
|
// ****************************************************************
|
||||||
|
|
||||||
|
constructor TCefCustomMediaRouteCreateCallback.Create(const aEvents : IChromiumEvents);
|
||||||
|
begin
|
||||||
|
inherited Create;
|
||||||
|
|
||||||
|
FEvents := Pointer(aEvents);
|
||||||
|
end;
|
||||||
|
|
||||||
|
destructor TCefCustomMediaRouteCreateCallback.Destroy;
|
||||||
|
begin
|
||||||
|
FEvents := nil;
|
||||||
|
|
||||||
|
inherited Destroy;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCefCustomMediaRouteCreateCallback.OnMediaRouteCreateFinished( result : TCefMediaRouterCreateResult;
|
||||||
|
const error : ustring;
|
||||||
|
const route : ICefMediaRoute);
|
||||||
|
begin
|
||||||
|
try
|
||||||
|
try
|
||||||
|
if (FEvents <> nil) then
|
||||||
|
IChromiumEvents(FEvents).doMediaRouteCreateFinished(result, error, route);
|
||||||
|
except
|
||||||
|
on e : exception do
|
||||||
|
if CustomExceptionHandler('TCefCustomMediaRouteCreateCallback.OnMediaRouteCreateFinished', e) then raise;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
FEvents := nil;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
@ -423,6 +423,9 @@ type
|
|||||||
hpDisableNonProxiedUDP
|
hpDisableNonProxiedUDP
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Used by TCefMediaSinkInfo and TCefMediaSourceInfo
|
||||||
|
TCefMediaType = (mtCast, mtDial, mtUnknown);
|
||||||
|
|
||||||
// /include/internal/cef_types_win.h (cef_main_args_t)
|
// /include/internal/cef_types_win.h (cef_main_args_t)
|
||||||
TCefMainArgs = record
|
TCefMainArgs = record
|
||||||
{$IFDEF MSWINDOWS}
|
{$IFDEF MSWINDOWS}
|
||||||
|
@ -2,9 +2,9 @@
|
|||||||
"UpdateLazPackages" : [
|
"UpdateLazPackages" : [
|
||||||
{
|
{
|
||||||
"ForceNotify" : true,
|
"ForceNotify" : true,
|
||||||
"InternalVersion" : 118,
|
"InternalVersion" : 119,
|
||||||
"Name" : "cef4delphi_lazarus.lpk",
|
"Name" : "cef4delphi_lazarus.lpk",
|
||||||
"Version" : "81.2.16.0"
|
"Version" : "81.2.17.0"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"UpdatePackageData" : {
|
"UpdatePackageData" : {
|
||||||
|
Loading…
Reference in New Issue
Block a user