Demote the Play-Facade to a in-language (C++) Interface to get rid of InterfaceFacadeLink
I am fully aware this change has some far reaching ramifications. Effectively I am hereby abandoning the goal of a highly modularised Lumiera, where every major component is mapped over the Interface-System. This was always a goal I accepted only reluctantly, and my now years of experience confirm my reservation: it will cost us lots of efforts just for the sake of being "sexy".
This commit is contained in:
parent
9f3c127240
commit
4e0d99e928
8 changed files with 40 additions and 166 deletions
|
|
@ -1,124 +0,0 @@
|
||||||
/*
|
|
||||||
INTERFACE-FACADE-LINK - a switchable link from interface to service implementation
|
|
||||||
|
|
||||||
Copyright (C) Lumiera.org
|
|
||||||
2011, Hermann Vosseler <Ichthyostega@web.de>
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU General Public License as
|
|
||||||
published by the Free Software Foundation; either version 2 of
|
|
||||||
the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @file interface-facade-link.hpp
|
|
||||||
** Opening, accessing and closing the service access through a facade interface.
|
|
||||||
** Client code is assumed to access an application level service through an facade
|
|
||||||
** interface, while the actual implementation object remains an opaque internal detail.
|
|
||||||
** Moreover, services may come up and shut down, so the implementation might change
|
|
||||||
** during the Lifecycle. The facility defined here in this header provides a basic
|
|
||||||
** implementation for this access mechanism, but without any adaptation, binding
|
|
||||||
** or plugin access layer. It works only under the assumption that both the
|
|
||||||
** interface and the actual service implementation coexist in the same
|
|
||||||
** executable and are written in C++, so any invocation of an
|
|
||||||
** interface method boils down to a language-level call.
|
|
||||||
**
|
|
||||||
** Usually, client code doesn't need to include this header. Clients are assumed
|
|
||||||
** to use the facade interface of the service in question. This facade interface
|
|
||||||
** contains a static member of type \c lumiera::facade::Accessor<I> (where I is
|
|
||||||
** the type of the facade interface). The Accessor baseclass is defined in
|
|
||||||
** interfaceproxy.hpp and typically included through the facade header.
|
|
||||||
**
|
|
||||||
** @note there is a way more elaborate implementation of the same mechanism
|
|
||||||
** for use with the Lumiera Interface/Plugin system.
|
|
||||||
**
|
|
||||||
** @see interfaceproxy.hpp description of the more general use case
|
|
||||||
** @see PlayService example for the simple use case
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef LUMIERA_FACADE_INTERFACE_FACADE_LINK_H
|
|
||||||
#define LUMIERA_FACADE_INTERFACE_FACADE_LINK_H
|
|
||||||
|
|
||||||
|
|
||||||
#include "lib/error.hpp"
|
|
||||||
#include "lib/nocopy.hpp"
|
|
||||||
#include "lib/meta/util.hpp"
|
|
||||||
#include "include/interfaceproxy.hpp"
|
|
||||||
#include "lib/symbol.hpp"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace lumiera {
|
|
||||||
namespace facade {
|
|
||||||
|
|
||||||
using lib::Literal;
|
|
||||||
|
|
||||||
|
|
||||||
/********************************************************************//**
|
|
||||||
* simple access-frontend to the implementation of a service (C++ only).
|
|
||||||
* Usually, an instance of Accessor is placed as static member right into
|
|
||||||
* the facade interface used to access the service. This implementation
|
|
||||||
* of the access mechanism handles the simple case that both the facade
|
|
||||||
* and the service implementation are written in C++ and calls happen
|
|
||||||
* within the main executable as direct language calls, without an
|
|
||||||
* binding layer and without involving the Interface/Plugin system.
|
|
||||||
*
|
|
||||||
* Typically, the InterfaceFacadeLink becomes a member of the service
|
|
||||||
* implementation class and is directly tied into the constructor of
|
|
||||||
* the latter. Being a subclass of lumiera::facade::Accessor, it is
|
|
||||||
* allowed to "open" the facade access just by setting the static
|
|
||||||
* protected pointer Accessor::implProxy_
|
|
||||||
*/
|
|
||||||
template<class FA>
|
|
||||||
class InterfaceFacadeLink
|
|
||||||
: protected Accessor<FA>
|
|
||||||
, util::NonCopyable
|
|
||||||
{
|
|
||||||
string displayName_;
|
|
||||||
|
|
||||||
void
|
|
||||||
__checkLifecycle ()
|
|
||||||
{
|
|
||||||
if (Accessor<FA>::implProxy_)
|
|
||||||
throw error::State("Attempt to open an already opened Facade interface."
|
|
||||||
, error::LERR_(LIFECYCLE));
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
InterfaceFacadeLink(FA& serviceImpl, Literal interfaceName_for_Log=0)
|
|
||||||
: displayName_(interfaceName_for_Log? string(interfaceName_for_Log)
|
|
||||||
: util::typeStr<FA>())
|
|
||||||
{
|
|
||||||
__checkLifecycle();
|
|
||||||
Accessor<FA>::implProxy_ = &serviceImpl;
|
|
||||||
INFO (interface, "interface %s opened", displayName_.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
~InterfaceFacadeLink()
|
|
||||||
{
|
|
||||||
INFO (interface, "closing interface %s...", displayName_.c_str());
|
|
||||||
Accessor<FA>::implProxy_ = 0;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** storage for the static access pointer */
|
|
||||||
template<class FA>
|
|
||||||
FA* Accessor<FA>::implProxy_;
|
|
||||||
|
|
||||||
|
|
||||||
}} // namespace lumiera::facade
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -21,8 +21,13 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/** @file play-facade.h
|
/** @file play-facade.hpp
|
||||||
** Public access point to the _playback service_ provided by the »play-out subsystem«
|
** Public access point to the _playback service_ provided by the »play-out subsystem«
|
||||||
|
** @todo in theory this could be an external interface mapped via Lumiera's interface system.
|
||||||
|
** This would be much work however, and not serve any tangible goal in the current stage
|
||||||
|
** of development (2018). I take this as just another confirmation that turning everything
|
||||||
|
** into a plug-in does not quality as good architecture: if you want to do it right, it
|
||||||
|
** creates a lot of additional cost. And to do it just superficially would be like cheating.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -31,15 +36,11 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include "lib/depend.hpp"
|
||||||
#ifdef __cplusplus /* ============== C++ Interface ================= */
|
|
||||||
|
|
||||||
//#include "include/interfaceproxy.hpp"
|
|
||||||
#include "lib/handle.hpp"
|
#include "lib/handle.hpp"
|
||||||
#include "lib/iter-source.hpp" ////////////////////TICKET #493 : only using the IterSource base interface here
|
#include "lib/iter-source.hpp" ////////////////////TICKET #493 : only using the IterSource base interface here
|
||||||
#include "lib/time/control.hpp"
|
#include "lib/time/control.hpp"
|
||||||
#include "lib/time/timevalue.hpp"
|
#include "lib/time/timevalue.hpp"
|
||||||
#include "include/interfaceproxy.hpp"
|
|
||||||
#include "proc/mobject/model-port.hpp"
|
#include "proc/mobject/model-port.hpp"
|
||||||
#include "proc/mobject/output-designation.hpp"
|
#include "proc/mobject/output-designation.hpp"
|
||||||
#include "proc/mobject/session/clip.hpp"
|
#include "proc/mobject/session/clip.hpp"
|
||||||
|
|
@ -83,7 +84,7 @@ namespace lumiera {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/** get an implementation instance of this service */
|
/** get an implementation instance of this service */
|
||||||
static lumiera::facade::Accessor<Play> facade;
|
static lib::Depend<Play> facade;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -153,19 +154,4 @@ namespace lumiera {
|
||||||
|
|
||||||
|
|
||||||
} // namespace lumiera
|
} // namespace lumiera
|
||||||
|
#endif /*PROC_INTERFACE_PLAY_H*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
#endif /* =========================== CL Interface ===================== */
|
|
||||||
|
|
||||||
|
|
||||||
// #include "common/interface.h"
|
|
||||||
////////////////////////////////////TODO define a C binding for the Interface system here
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
@ -72,7 +72,7 @@ namespace play {
|
||||||
Lock sync(this);
|
Lock sync(this);
|
||||||
REQUIRE (not shutdown_initiated_);
|
REQUIRE (not shutdown_initiated_);
|
||||||
|
|
||||||
player_.reset (new PlayService);
|
player_.createInstance();
|
||||||
return this->isOperational();
|
return this->isOperational();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -132,7 +132,7 @@ namespace play {
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
TODO ("actually bring down the output generation");
|
TODO ("actually bring down the output generation");
|
||||||
player_.reset(0);
|
player_.shutdown();
|
||||||
|
|
||||||
completedSignal(0);
|
completedSignal(0);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@
|
||||||
|
|
||||||
#include "lib/error.hpp"
|
#include "lib/error.hpp"
|
||||||
#include "lib/depend.hpp"
|
#include "lib/depend.hpp"
|
||||||
|
#include "lib/depend-inject.hpp"
|
||||||
#include "proc/play/output-manager.hpp"
|
#include "proc/play/output-manager.hpp"
|
||||||
#include "common/subsys.hpp"
|
#include "common/subsys.hpp"
|
||||||
#include "lib/nocopy.hpp"
|
#include "lib/nocopy.hpp"
|
||||||
|
|
@ -54,6 +55,7 @@ namespace play {
|
||||||
using std::unique_ptr;
|
using std::unique_ptr;
|
||||||
|
|
||||||
|
|
||||||
|
class Play;
|
||||||
class PlayService;
|
class PlayService;
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -70,9 +72,10 @@ namespace play {
|
||||||
: util::NonCopyable
|
: util::NonCopyable
|
||||||
, public lib::Sync<>
|
, public lib::Sync<>
|
||||||
{
|
{
|
||||||
typedef lumiera::Subsys::SigTerm SigTerm;
|
using SigTerm = lumiera::Subsys::SigTerm;
|
||||||
|
using PlayServiceHandle = lib::DependInject<Play>::ServiceInstance<PlayService>;
|
||||||
|
|
||||||
unique_ptr<PlayService> player_;
|
PlayServiceHandle player_;
|
||||||
///////TODO more components and connections to manage here...
|
///////TODO more components and connections to manage here...
|
||||||
|
|
||||||
bool shutdown_initiated_ = false; /////TODO probably need a way more elaborate lifecylce management
|
bool shutdown_initiated_ = false; /////TODO probably need a way more elaborate lifecylce management
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@
|
||||||
|
|
||||||
|
|
||||||
#include "lib/error.hpp"
|
#include "lib/error.hpp"
|
||||||
#include "include/play-facade.h"
|
#include "include/play-facade.hpp"
|
||||||
#include "proc/play/play-service.hpp"
|
#include "proc/play/play-service.hpp"
|
||||||
#include "proc/play/play-process.hpp"
|
#include "proc/play/play-process.hpp"
|
||||||
#include "proc/play/render-configurator.hpp"
|
#include "proc/play/render-configurator.hpp"
|
||||||
|
|
@ -167,8 +167,7 @@ namespace play {
|
||||||
* this service through the lumiera::Play facade.
|
* this service through the lumiera::Play facade.
|
||||||
*/
|
*/
|
||||||
PlayService::PlayService()
|
PlayService::PlayService()
|
||||||
: facadeAccess_(*this, "Player")
|
: pTable_(new ProcessTable)
|
||||||
, pTable_(new ProcessTable)
|
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -58,8 +58,7 @@
|
||||||
|
|
||||||
#include "lib/error.hpp"
|
#include "lib/error.hpp"
|
||||||
#include "lib/nocopy.hpp"
|
#include "lib/nocopy.hpp"
|
||||||
#include "include/play-facade.h"
|
#include "include/play-facade.hpp"
|
||||||
#include "common/interface-facade-link.hpp"
|
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
//#include <string>
|
//#include <string>
|
||||||
|
|
@ -102,7 +101,6 @@ namespace play {
|
||||||
: public lumiera::Play
|
: public lumiera::Play
|
||||||
, util::NonCopyable
|
, util::NonCopyable
|
||||||
{
|
{
|
||||||
InterfaceFacadeLink<lumiera::Play> facadeAccess_;
|
|
||||||
std::unique_ptr<ProcessTable> pTable_;
|
std::unique_ptr<ProcessTable> pTable_;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@
|
||||||
#include "proc/play/dummy-play-connection.hpp"
|
#include "proc/play/dummy-play-connection.hpp"
|
||||||
//#include "proc/engine/buffhandle.hpp"
|
//#include "proc/engine/buffhandle.hpp"
|
||||||
//#include "proc/engine/testframe.hpp"
|
//#include "proc/engine/testframe.hpp"
|
||||||
#include "include/play-facade.h"
|
#include "include/play-facade.hpp"
|
||||||
#include "lib/time/control.hpp"
|
#include "lib/time/control.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28345,8 +28345,8 @@
|
||||||
<node CREATED="1522635366958" ID="ID_70940233" MODIFIED="1522639464220" TEXT="wäre jetzt ebenfalls denkbar">
|
<node CREATED="1522635366958" ID="ID_70940233" MODIFIED="1522639464220" TEXT="wäre jetzt ebenfalls denkbar">
|
||||||
<icon BUILTIN="yes"/>
|
<icon BUILTIN="yes"/>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522638768719" ID="ID_1027038623" MODIFIED="1522639457609" TEXT="InterfaceFacadeLink">
|
<node COLOR="#338800" CREATED="1522638768719" ID="ID_1027038623" MODIFIED="1522713321459" TEXT="InterfaceFacadeLink">
|
||||||
<icon BUILTIN="flag-yellow"/>
|
<icon BUILTIN="button_ok"/>
|
||||||
<node CREATED="1522638777486" ID="ID_1287650379" MODIFIED="1522638916886" TEXT="serivce-Handle"/>
|
<node CREATED="1522638777486" ID="ID_1287650379" MODIFIED="1522638916886" TEXT="serivce-Handle"/>
|
||||||
<node CREATED="1522638783717" ID="ID_357133685" MODIFIED="1522638790235" TEXT="umgeht das Interface-system">
|
<node CREATED="1522638783717" ID="ID_357133685" MODIFIED="1522638790235" TEXT="umgeht das Interface-system">
|
||||||
<icon BUILTIN="ksmiletris"/>
|
<icon BUILTIN="ksmiletris"/>
|
||||||
|
|
@ -28354,7 +28354,8 @@
|
||||||
<node CREATED="1522638791268" ID="ID_965518210" MODIFIED="1522638800868" TEXT="tja, lib::Depend macht das jetzt auch">
|
<node CREATED="1522638791268" ID="ID_965518210" MODIFIED="1522638800868" TEXT="tja, lib::Depend macht das jetzt auch">
|
||||||
<icon BUILTIN="ksmiletris"/>
|
<icon BUILTIN="ksmiletris"/>
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1522638812521" ID="ID_893221959" MODIFIED="1522638820556" TEXT="nur ein einziges mal verwendet">
|
<node CREATED="1522638812521" ID="ID_893221959" MODIFIED="1522712867059" TEXT="nur ein einziges mal verwendet">
|
||||||
|
<icon BUILTIN="idea"/>
|
||||||
<node CREATED="1522638830367" ID="ID_792298822" MODIFIED="1522638835178" TEXT="PlayService"/>
|
<node CREATED="1522638830367" ID="ID_792298822" MODIFIED="1522638835178" TEXT="PlayService"/>
|
||||||
<node CREATED="1522638837022" ID="ID_362446492" MODIFIED="1522638876050">
|
<node CREATED="1522638837022" ID="ID_362446492" MODIFIED="1522638876050">
|
||||||
<richcontent TYPE="NODE"><html>
|
<richcontent TYPE="NODE"><html>
|
||||||
|
|
@ -28366,8 +28367,7 @@
|
||||||
den habe ich <b>nicht mehr</b> über das Interface-System gemappt
|
den habe ich <b>nicht mehr</b> über das Interface-System gemappt
|
||||||
</p>
|
</p>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html></richcontent>
|
||||||
</richcontent>
|
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
<head>
|
<head>
|
||||||
|
|
||||||
|
|
@ -28380,13 +28380,25 @@
|
||||||
Also hat das hier Prototyp-Charakter!
|
Also hat das hier Prototyp-Charakter!
|
||||||
</p>
|
</p>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html></richcontent>
|
||||||
</richcontent>
|
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522638877744" ID="ID_1175146695" MODIFIED="1522638901259" TEXT="sollte prototypisch-sauber umgestellt werden">
|
<node CREATED="1522638877744" ID="ID_1175146695" MODIFIED="1522712862995" TEXT="sollte prototypisch-sauber umgestellt werden">
|
||||||
<icon BUILTIN="yes"/>
|
<icon BUILTIN="yes"/>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
|
<node COLOR="#338800" CREATED="1522712059423" ID="ID_885178924" MODIFIED="1522713316288" TEXT="komplett auf lib::Depend umstellen">
|
||||||
|
<icon BUILTIN="yes"/>
|
||||||
|
<node CREATED="1522712083659" ID="ID_1397345256" MODIFIED="1522712851333" TEXT="das heißt: nicht einmal mehr die Fiktion einer Trennung">
|
||||||
|
<icon BUILTIN="messagebox_warning"/>
|
||||||
|
</node>
|
||||||
|
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1522712827196" ID="ID_61159385" MODIFIED="1522712843093" TEXT="ein sauber gebautes C++ - Inteface ist Trennung genug">
|
||||||
|
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
|
||||||
|
<icon BUILTIN="yes"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node COLOR="#338800" CREATED="1522713332342" ID="ID_1078169696" MODIFIED="1522713348764" TEXT="der OutputDirector steuert nun diesen Service">
|
||||||
|
<icon BUILTIN="button_ok"/>
|
||||||
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522638949038" ID="ID_1756362217" MODIFIED="1522639349336" TEXT="interfaceproxy - Accessor">
|
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522638949038" ID="ID_1756362217" MODIFIED="1522639349336" TEXT="interfaceproxy - Accessor">
|
||||||
<icon BUILTIN="flag-yellow"/>
|
<icon BUILTIN="flag-yellow"/>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue