컴포넌트는 C++ 기반으로 구현되지만, 유연한 UX/UI 기능을 제공하기 위해서는 WPF로 프런트엔드 기능을 구현한 후 cpp_cs_intf를 이용하여 WPF 기반의 프런트엔드와 C++ 기반의 컴포넌트를 연결한다.

Figure: C++ component to WPF Frontend Interface

interface manager는 컴포넌트의 Component interface를 통해 event를 전달하고 property를 엑세스하고 command를 실행한다. 컴포넌트는 역시 cpp_cs_intf를 통해 WPF에 event를 event를 전달하고 property를 엑세스하고 command를 실행한다. 이를 위해 cpp_cs_intf는 다음과 같이 Component interface의 일부 인터페이스를 제공한다:

public ref class cpp_cs_intf_t
{

public:
event Reinitialize_Delegator^ reinitialize_delegator;
event Ready_to_run_Delegator^ ready_to_run_delegator;
event Finish_Delegator^ finish_delegator;
event Event_Delegator^ event_delegator;
event Execute_Command_Delegator^ execute_command_delegator;
event Activated_Delegator^ activated_delegator;
event Deactivated_Delegator^ deactivated_delegator;
event Set_Focus_Delegator^ set_focus_delegator;
event Kill_Focus_Delegator^ kill_focus_delegator;
event Sleep_Delegator^ sleep_delegator;
event Wakeup_Delegator^ wakeup_delegator;                                    

void reinitialize_cs() { reinitialize_delegator(); }
void ready_to_run_cs() { ready_to_run_delegator(); }
void finish_cs() { finish_delegator(); }
void event_cs(swa::LocalId lid, System::Object^ wp, System::Object^ lp)
{ event_delegator(lid, wp, lp); }
Object^ execute_command_cs(swa::LocalId lid, System::Object^ wp, System::Object^ lp)
{ return execute_command_delegator(lid, wp, lp); }
void activated_cs() { activated_delegator(); }
void deactivated_cs() { deactivated_delegator(); }
void set_focus_cs() { set_focus_delegator(); }
void kill_focus_cs() { kill_focus(); }
void sleep_cs() { sleep_delegator(); }
void wakeup_cs() { wakeup_delegator(); }
};

위의 내용을 시퀀스 다이어그램으로 살펴보면 다음과 같다:

Figure: Interface flow from the interface manager to an WPF frontend

interface manager가 컴포넌트를 생성하는 과정에서 WPF_Frontend 오브젝트는 cpp_cs_intf 오브젝의 event delegator에 자신의 event handler를 연결한다.

interface manager가, 예를 들어, 컴포넌트의 Component interface인 reinitialize()를 호출하면, 컴포넌트는 cpp_cs_intf의 reinitialize_cs()를 호출하며, reinitialize_cs()는 내부적으로 reinitialize_delegator()을 호출하며, reinitialize_delegator()에 의해 WPF_Frontend의 on_initialize()가 실행된다.

WPF_Frontend는 interface manager를 통해 다른 컴포넌트와 통신을 할 수 있어야 하며, C++ 컴포넌트와도 통신을 할 수 있어야 한다. 이를 위해 cpp_cs_intf는 다음과 같은 인터페이스를 제공한다:

public ref class cpp_cs_intf_t
{

public:
cpp_cs_intf (Component_Bus* bus, GlobalId cid, const swa::Component_Data* data, cpp_cs_cb_t* cb);   System::Object^ execute_command_cpp(System::String^ command, System::Object^ wp, System::Object^ lp);
};

cpp_cs_cb 인터페이스는 다음과 같다:

class cpp_cs_cb_t
{
public:
cpp_cs_cb_t(){}
virtual ~ cpp_cs_cb_t(){}  
virtual std::unique_ptr<swa::Value> execute_command_cpp( const wchar_t* command, const Value& wp, const Value& lp ) = 0;
};

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다