/*****************************************************************************
*
* FILE NAME:    ClientThread1.cpp
*
* DESCRIPTION:  クライアント クラス ClientThread1
*
\*****************************************************************************/

#include <stdio.h>
#include <string.h>
#include "SampleAPP.h"


///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
// CIClientThread1 クラス

///////////////////////////////////////////////////////////////////////
// コンストラクタ

CIClientThread1::    CIClientThread1()
  : CIThread()
{
	HRESULT hr;

	// RSL初期化
	hr = ListenerInitialize(TRUE);	// 強制カタログ有効

	// RSLへコールバック関数設定
	hr = InitCallback();
}


///////////////////////////////////////////////////////////////////////
// デストラクタ

CIClientThread1::    ~CIClientThread1()
{
}


///////////////////////////////////////////////////////////////////////
// オーバーライド InitInstance

BOOL CIClientThread1:: InitInstance(void)
{
	return TRUE;
}


///////////////////////////////////////////////////////////////////////
// オーバーライド DoForever

BOOL CIClientThread1:: DoForever(void)
{
	int a;
	BOOL bExit = FALSE;

	// RSL Listening開始
	ListenerStart();
	PrintLog(LOG_DEBUG, "debug  : Listener status = %d \n", ListenerGetStatus());
	PrintLog(LOG_DEBUG, "\n\n");

	while (1)
	{
		scanf("%d", &a);
		switch (a) {
		case 1:		// Start
			ListenerStart();
			PrintLog(LOG_DEBUG, "debug  : Listener status = %d \n", ListenerGetStatus());
			PrintLog(LOG_DEBUG, "\n\n");
			break;
		case 2:		// Stop
			ListenerStop();
			PrintLog(LOG_DEBUG, "debug  : Listener status = %d \n", ListenerGetStatus());
			PrintLog(LOG_DEBUG, "\n\n");
			break;
		case 3:		// Exit
			bExit = TRUE;
			break;
		default:
			break;
		}

		if (bExit) {
			break;
		}
		RtSleep(1000);
	}

	// RSL Listening停止
	ListenerStop();
	PrintLog(LOG_DEBUG, "debug  : Listener status = %d \n", ListenerGetStatus());
	// 終了処理
//	theApp.ExitInstance();

	return TRUE;
}


HRESULT CIClientThread1::InitCallback(void)
{
	HRESULT hr = S_OK;

	// Service
	hr = ListenerSetCallbackFunc(ID_SERVICE_START, &CIClientThread1::ServiceStart, this);
//	hr = ListenerSetCallbackFunc(ID_SERVICE_START, ServiceStart, this);
	hr = ListenerSetCallbackFunc(ID_SERVICE_STOP, ServiceStop, this);
	// Controller
	hr = ListenerSetCallbackFunc(ID_CONTROLLER_CONNECT, ControllerConnect, this);
	hr = ListenerSetCallbackFunc(ID_CONTROLLER_DISCONNECT, ControllerDisconnect, this);
	hr = ListenerSetCallbackFunc(ID_CONTROLLER_GETMESSAGE, ControllerGetmessage, this);

	return hr;
}

void CIClientThread1::PrintTest(LPCSTR pStr)
{
	PrintLog(LOG_DEBUG, pStr);
}

#if 1	// test
HRESULT CIClientThread1::ServiceStart(CALLBACK_T strCallback)
//HRESULT ServiceStart(CALLBACK_T strCallback)
{
	CIClientThread1 *pThis = (CIClientThread1 *)strCallback.obj;
	pThis->PrintTest("ServiceStart() \n");

	PrintLog(LOG_DEBUG, "nInParaNum=%d \n", strCallback.nInParaNum);
	PrintLog(LOG_DEBUG, "vntInPara->vt=0x%x \n", strCallback.vntInPara->vt);

	// 応答：なし
	return S_OK;
}

HRESULT ServiceStop(CALLBACK_T strCallback)
{
	CIClientThread1 *pThis = (CIClientThread1 *)strCallback.obj;
	pThis->PrintTest("ServiceStop() \n");

	// 応答：なし
	return S_OK;
}

HRESULT ControllerConnect(CALLBACK_T strCallback)
{
	CIClientThread1 *pThis = (CIClientThread1 *)strCallback.obj;
	pThis->PrintTest("ControllerConnect() \n");

	// 応答：VARIANT(VT_I4)
	strCallback.pvntOutPara->vt = VT_I4;
	strCallback.pvntOutPara->lVal = 1;
	return S_OK;
}

HRESULT ControllerDisconnect(CALLBACK_T strCallback)
{
	CIClientThread1 *pThis = (CIClientThread1 *)strCallback.obj;
	pThis->PrintTest("ControllerDisconnect() \n");

	// 応答：なし
	return S_OK;
}

HRESULT ControllerGetmessage(CALLBACK_T strCallback)
{
	CIClientThread1 *pThis = (CIClientThread1 *)strCallback.obj;
	pThis->PrintTest("ControllerGetmessage() \n");

	// 応答：VARIANT
	// TODO:
	return E_FAIL;
}
#endif	// test
