Esempio n. 1
0
void CDummyClientManager::CallFunctionVa( int _startIndex, int _endIndex, acstr _funcName, CStringA _format, va_list _vaList )
{
	PyObject *module;
	CtesttoolDlg* dlg = (CtesttoolDlg*)AfxGetApp()->m_pMainWnd;
	CString logStr;
	
	std::vector<int> variableIndexArray;
	int formatLength = _format.GetLength();
	for( int i = 0; i < formatLength; i++ )
	{
		if( _format.GetAt(i) == 'v' )
		{
			variableIndexArray.push_back(i);
			_format.SetAt(i, 'i');
		}
	}

	CStringA format = "(" + _format + ")";
	int variableIndexArraySize = variableIndexArray.size();

	PyObject *parameters;
	CDummyClient *targetClient;

	for( int i = _startIndex; i <= _endIndex; i++ )
	{
		// 모듈 로드
		for( int j = 0; j < variableIndexArraySize; j++ )
		{
			int *pList = (int *)_vaList;
			pList[variableIndexArray[j]] = i;
		}

		parameters = Py_VaBuildValue( format, _vaList );

		if( i == MAINSCRIPT )
		{
			if( mainScriptmodule != NULL )
			{
				module = mainScriptmodule;
			}
			else
			{		
				dlg->addMainLog( L"[에러 - CallFunction] 메인 스크립트가 없습니다." );
				dlg->showMainLog();
				continue;
			}
		}
		else
		{
			targetClient =  GetDummyClientByIndex( i );
			if( targetClient != NULL )
			{
				module = targetClient->module;
			}
			else
			{
				CString logStr;
				logStr.Format( L"[에러 - CallFunction] %d 클라이언트가 없습니다.", i );
				dlg->addMainLog( logStr );
				dlg->showMainLog();
				continue;
			}
		}
			
		// 함수 로드
		PyGILState_STATE gilState;
		gilState = PyGILState_Ensure();

		PyObject *function = PyObject_GetAttrString(module, _funcName);

		if( function != NULL )
		{ 
			PyObject_CallObject(function, parameters );
			Py_DECREF(parameters);
			PyGILState_Release( gilState );
		}
		else
		{
			targetClient->addLog( L"[에러 - CallFunction] 함수 로드 실패." );
			PyErr_Clear();	
			PyGILState_Release( gilState );
			continue;  
		}
	}
	
}