oldfart
Member
Hi guys,
Thanks for your help and if you are interested I'm willing to share some C++ (VC++ 6.0) source code.
It's no so much a snippet as a full CWinThread class. Below is "screen capture" of the test harness dialog I used to test this class.
I have included the header file - the full class is about 3000 lines of code - which I'll make available if anyone is interested.
cheers
AnOldBloke
P.S. Big thanks to [FS]Erix920 for pointing me in the right direction.
Thanks for your help and if you are interested I'm willing to share some C++ (VC++ 6.0) source code.
It's no so much a snippet as a full CWinThread class. Below is "screen capture" of the test harness dialog I used to test this class.
I have included the header file - the full class is about 3000 lines of code - which I'll make available if anyone is interested.
cheers
AnOldBloke
P.S. Big thanks to [FS]Erix920 for pointing me in the right direction.
Code:
#if !defined(AFX_STEAMDLLAPI_H__34117073_8FE0_4F68_AD17_3882C4F7D043__INCLUDED_)
#define AFX_STEAMDLLAPI_H__34117073_8FE0_4F68_AD17_3882C4F7D043__INCLUDED_
// -------------------------------------------------------------
//
//
// SteamDllApi.h: interface for the CSteamDllApi class.
//
// Some parts plagiarized from Mitsukarina @ cs.rin.ru
// Many thanks to [FS]Erix920 @ www.freesteam.org
//
// -------------------------------------------------------------
//
// CVS - Tracking
//
// MODULE : $RCSfile: SteamDllApi.h,v $
//
// CREATED : $Author: CVSUser $
//
// REVISION : $Revision: 1.3 $, $Date: 2009/12/17 01:27:36 $
// EDITEDBY : $Author: CVSUser $
//
//
// -------------------------------------------------------------
//
// Version: $Log: SteamDllApi.h,v $
// Version: Revision 1.3 2009/12/17 01:27:36 CVSUser
// Version: Almost Final.
// Version: Finish Launch Game + State Machine
// Version: Finish Kill Game + State Machine
// Version:
// Version: Revision 1.2 2009/12/15 07:50:32 CVSUser
// Version: no message
// Version:
// Version: Revision 1.1 2009/12/14 09:27:02 CVSUser
// Version: Including SteamDllApi
// Version:
//
//
// ------------------------------------------------------------------------
//
//
// (C) Copyright OldFart. 2000 - 2009
//
// All rights reserved
//
//
// OldFart makes no warranty of any kind with regard to this
// software, including, but not limited to, the implied warranties of
// merchantability and fitness for a particular purpose.
// OldFart shall not be liable for errors contained herein or
// direct, indirect, special, incidental or consequential damages in
// connection with the furnishing, performance or use of this material.
//
// ------------------------------------------------------------------------
// -------------------------------------------------------------
//
// Includes
//
// -------------------------------------------------------------
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "Lock.h"
// -------------------------------------------------------------
//
// Defines & Typedefs
//
// -------------------------------------------------------------
#define GLOBAL
#define LOCAL static
// What this Application listens for ?
#define ON_STEAMDLLAPI_REQUEST(memberFxn) \
ON_REGISTERED_THREAD_MESSAGE( CSteamDllApi::mg_nRequestMsg, memberFxn )
// What the Parent is listening for
#define ON_STEAMDLLAPI_RESPONSE(memberFxn) \
ON_REGISTERED_MESSAGE( CSteamDllApi::mg_nResponseMsg, memberFxn )
//
// Definitions to describe Some Steam App info
//
typedef enum SDA_Type_Tag {
Invalid = -1,
Game = 0,
Application = 1,
Video = 2,
Audio = 3,
Steam = 4
} SDAType;
typedef enum SDA_SteamType_Tag {
Unknown = 0,
HalfLife = 1,
HalfLifeMod = 2,
Source = 3,
SourceMod = 4,
ThirdParty = 5,
ThirdPartyMod = 6,
SteamThirdParty = 7,
Tool = 8,
SteamMedia = 9,
Demo = 10,
} SDASteamType;
typedef struct GAME_ARRAY_TAG {
DWORD dwGameId;
CString csGameName; // Name used by vNetCafe
CString csExeName; // Exe Name used by vNetCafe
SDAType eType; // Will be Steam
SDASteamType eSteamType; // Game, Tools, Media etc
BOOL fSteamSubscribed; // The games is subscribed to the current user
BOOL fSteamValidated; // This Game Id Exists and is a Game
CString csSteamGameName; // Name used by Steam
CString csSteamExeName; // Exe Name used by Steam
CString csSteamExeSubPath; // Exe sub path - extracted from Arguments
CString csSteamExePath; // Exe path
CString csSteamArguments; // Launch options
CString csSteamStatus; // the "state" of the game
CString csSteamIcon; // Not sure
} GAME_ARRAY;
typedef CArray< GAME_ARRAY, GAME_ARRAY &> SDA_GAME_ARRAY;
typedef enum RequestType_tag {
ReqSteamLogin,
ReqSteamLogout,
ReqSteamValidateGameArray,
ReqSteamGetGameArray,
ReqSteamGetSubscriptionArray,
ReqSteamLaunchGame,
ReqSteamKillGame,
ReqExitNow,
} RequestType;
typedef enum ResponseType_tag {
RspSteamLoginSucceeds,
RspSteamLoginFails,
RspSteamLogoutSucceeds,
RspSteamLogoutFails,
RspSteamValidateGameArraySucceeds,
RspSteamValidateGameArrayFails,
RspSteamGetGameArraySucceeds,
RspSteamGetGameArrayFails,
RspSteamGetSubscriptionArraySucceeds,
RspSteamGetSubscriptionArrayFails,
RspSteamLaunchGameSucceeds,
RspSteamLaunchGameFails,
RspSteamKillGameSucceeds,
RspSteamKillGameFails,
RspSteamGameVanished,
RspThreadExits,
RspUnknownRequestFails,
//RspExitNowFails,
} ResponseType;
// -------------------------------------------------------------
//
// GLOBAL Type Data
//
// -------------------------------------------------------------
typedef enum SDA_ERROR_Tag {
SDA_NO_ERROR = 0,
SDA_LOAD_DLL_FAILS,
SDA_DLL_NOT_READY,
SDA_NOT_LOGGED_IN,
SDA_LOGGING_IN,
SDA_STEAM_FAILS,
SDA_STEAM_USER_SET,
SDA_STEAM_LOGIN_FAILS,
SDA_LOGGED_IN_ACTIVE,
SDA_APP_NOT_SUBSCRIBED,
SDA_VALIDATE_GAME_ACTIVE,
SDA_VALIDATE_GAME_ARRAY_ACTIVE,
SDA_LOGGING_OUT_ACTIVE,
SDA_NOT_VALID_GAME,
SDA_NO_TERMINATE_RIGHTS,
SDA_GAME_CLOSED,
SDA_GAME_TERMINATED,
SDA_GAME_TERMINATE_FAILS,
SDA_GAME_NOT_RUNNING,
} SDA_ERROR;
// ----------------------------------------------------------------
//
// CLASS DEFINITIONS & GLOBAL Function Prototypes
//
// ----------------------------------------------------------------
class CSteamDllApi : public CWinThread
{
DECLARE_DYNCREATE(CSteamDllApi)
protected:
CSteamDllApi(); // protected constructor used by dynamic creation
// Attributes
public:
// Default Parent notification message
static const UINT mg_nRequestMsg;
static const UINT mg_nResponseMsg;
// Operations
public:
BOOL SetSteamAccount(HWND hWndParent,
LPCTSTR pszSteamDir,
LPCTSTR pszSteamUsername,
LPCTSTR pszSteamPassword );
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CSteamDllApi)
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
//}}AFX_VIRTUAL
// Attributes
protected:
CCriticalSection m_CSLockSDA;
HWND m_hWndParent;
LPCTSTR m_pszSteamUsername;
LPCTSTR m_pszSteamPassword;
CString m_csSteamDir;
DWORD m_dwGameId;
GAME_ARRAY m_tLaunchedGame;
typedef enum {
SDA_Unknown,
SDA_Idle,
SDA_Ready,
SDA_LoggingIn,
SDA_LoggedIn,
SDA_LoggingOut,
SDA_ValidatingGameArray,
SDA_GettingGameArray,
SDA_GettingSubscriptionArray,
SDA_LaunchingGame,
SDA_InGame,
SDA_KillingGame,
} SDA_STATE;
SDA_STATE m_eState;
BOOL m_fSteamDllLoaded;
HINSTANCE m_hInstSteam;
DWORD m_dwError;
// Implementation
protected:
BOOL KillPid( DWORD dwPid, ULONG ulTimo );
void SetNewState( SDA_STATE eNewState );
void PostRequestFailMessage( RequestType eType, DWORD dwData );
// State Processing
void ProcessIdleState( RequestType eRequest, DWORD dwData );
void ProcessReadyState( RequestType eRequest, DWORD dwData );
void ProcessLoggingInState( RequestType eRequest, DWORD dwData );
void ProcessLoggedInState( RequestType eRequest, DWORD dwData );
void ProcessLoggingOutState( RequestType eRequest, DWORD dwData );
void ProcessValidatingGameArrayState(RequestType eRequest, DWORD dwData);
void ProcessGettingGameArrayState( RequestType eRequest, DWORD dwData );
void ProcessGettingSubscriptionArrayState(RequestType eRequest, DWORD dwData);
void ProcessInGameState( RequestType eRequest, DWORD dwData );
void ProcessLaunchingGameState( RequestType eRequest, DWORD dwData );
void ProcessKillingGameState( RequestType eRequest, DWORD dwData );
// Utility Functions
BOOL LoadSteamDll( LPCTSTR pszSteamDir );
BOOL UnloadSteamDll();
bool PostMessageToParent( ResponseType eType, LPARAM lMessageCode );
virtual ~CSteamDllApi();
//
// Worker thread stuff here
//
CEvent m_EvThreadTerminated;
CEvent m_EvTerminate;
CEvent m_EvRequest;
CWinThread *m_ptWorkerThread;
static unsigned WorkerThreadFunc( LPVOID thisClient )
{
CSteamDllApi* pThis = reinterpret_cast<CSteamDllApi*>(thisClient);
return pThis->WorkerRun();
}
unsigned WorkerRun();
BOOL GotoSleep();
BOOL FindProcessId( CString &rcProcessName, DWORD &rdwFoundPID );
BOOL DoSteamLogin();
BOOL DoSteamLogout();
BOOL DoSteamValidateGameArray( SDA_GAME_ARRAY *ptGameArray );
BOOL DoSteamGetGameArray( SDA_GAME_ARRAY *ptGameArray );
BOOL DoSteamGetSubscriptionArray( SDA_GAME_ARRAY *ptGameArray );
BOOL DoSteamLaunchGame( DWORD dwGameId, BOOL &rfMonitorGame );
BOOL DoSteamKillGame();
BOOL GetAppInfo( DWORD dwGameId, GAME_ARRAY &rtGA );
BOOL GetAppType( GAME_ARRAY &rtGA );
//
// Enum Windows Callback Handler
//
static BOOL CALLBACK MyEnumWindowsProc( HWND hwnd, LPARAM lParam )
{
DWORD dwRC;
DWORD dwProcessId;
dwRC = GetWindowThreadProcessId( hwnd, &dwProcessId );
if (( DWORD)lParam == dwProcessId )
{
::PostMessage( hwnd, WM_CLOSE, 0, 0 );
}
return TRUE;
};
// ----------------------------------------------------------------
//
// DEBUGGING Functions
//
// ----------------------------------------------------------------
public:
//# ifdef _DEBUG
# define FIND_RESPONSE_TYPE_STRING(a) if (eType == a ) return ""#a"";
CString GetResponseTypeAsString( ResponseType eType)
{
FIND_RESPONSE_TYPE_STRING( RspSteamLoginSucceeds );
FIND_RESPONSE_TYPE_STRING( RspSteamLoginFails );
FIND_RESPONSE_TYPE_STRING( RspSteamLogoutSucceeds );
FIND_RESPONSE_TYPE_STRING( RspSteamLogoutFails );
FIND_RESPONSE_TYPE_STRING( RspSteamValidateGameArraySucceeds );
FIND_RESPONSE_TYPE_STRING( RspSteamValidateGameArrayFails );
FIND_RESPONSE_TYPE_STRING( RspSteamGetGameArraySucceeds );
FIND_RESPONSE_TYPE_STRING( RspSteamGetGameArrayFails );
FIND_RESPONSE_TYPE_STRING( RspSteamGetSubscriptionArraySucceeds );
FIND_RESPONSE_TYPE_STRING( RspSteamGetSubscriptionArrayFails );
FIND_RESPONSE_TYPE_STRING( RspSteamLaunchGameSucceeds );
FIND_RESPONSE_TYPE_STRING( RspSteamLaunchGameFails );
FIND_RESPONSE_TYPE_STRING( RspSteamKillGameSucceeds );
FIND_RESPONSE_TYPE_STRING( RspSteamKillGameFails );
FIND_RESPONSE_TYPE_STRING( RspSteamGameVanished );
FIND_RESPONSE_TYPE_STRING( RspThreadExits );
FIND_RESPONSE_TYPE_STRING( RspUnknownRequestFails );
return "Unknown ResponseType";
}
# define FIND_REQUEST_TYPE_STRING(a) if (eType == a ) return ""#a"";
CString GetRequestTypeAsString( RequestType eType)
{
FIND_REQUEST_TYPE_STRING( ReqSteamLogin );
FIND_REQUEST_TYPE_STRING( ReqSteamLogout );
FIND_REQUEST_TYPE_STRING( ReqSteamValidateGameArray );
FIND_REQUEST_TYPE_STRING( ReqSteamGetGameArray );
FIND_REQUEST_TYPE_STRING( ReqSteamGetSubscriptionArray );
FIND_REQUEST_TYPE_STRING( ReqSteamLaunchGame );
FIND_REQUEST_TYPE_STRING( ReqSteamKillGame );
FIND_REQUEST_TYPE_STRING( ReqExitNow );
return "Unknown RequestType";
}
# define FIND_STATE_STRING(a) if (eState == a ) return ""#a"";
CString GetStateAsString( SDA_STATE eState )
{
FIND_STATE_STRING( SDA_Unknown );
FIND_STATE_STRING( SDA_Idle );
FIND_STATE_STRING( SDA_Ready );
FIND_STATE_STRING( SDA_LoggingIn );
FIND_STATE_STRING( SDA_LoggedIn );
FIND_STATE_STRING( SDA_LoggingOut );
FIND_STATE_STRING( SDA_ValidatingGameArray );
FIND_STATE_STRING( SDA_GettingGameArray );
FIND_STATE_STRING( SDA_GettingSubscriptionArray );
FIND_STATE_STRING( SDA_LaunchingGame );
FIND_STATE_STRING( SDA_InGame );
FIND_STATE_STRING( SDA_KillingGame );
return "Unknown SDA_STATE";
}
# define FIND_ERROR_STRING(a) if (eError == a ) return ""#a"";
CString GetErrorAsString( SDA_ERROR eError )
{
FIND_ERROR_STRING( SDA_NO_ERROR );
FIND_ERROR_STRING( SDA_LOAD_DLL_FAILS );
FIND_ERROR_STRING( SDA_DLL_NOT_READY );
FIND_ERROR_STRING( SDA_NOT_LOGGED_IN );
FIND_ERROR_STRING( SDA_LOGGING_IN );
FIND_ERROR_STRING( SDA_STEAM_FAILS );
FIND_ERROR_STRING( SDA_STEAM_USER_SET );
FIND_ERROR_STRING( SDA_STEAM_LOGIN_FAILS );
FIND_ERROR_STRING( SDA_LOGGED_IN_ACTIVE );
FIND_ERROR_STRING( SDA_APP_NOT_SUBSCRIBED );
FIND_ERROR_STRING( SDA_VALIDATE_GAME_ARRAY_ACTIVE );
FIND_ERROR_STRING( SDA_VALIDATE_GAME_ACTIVE );
FIND_ERROR_STRING( SDA_LOGGING_OUT_ACTIVE );
FIND_ERROR_STRING( SDA_NOT_VALID_GAME );
FIND_ERROR_STRING( SDA_NO_TERMINATE_RIGHTS );
FIND_ERROR_STRING( SDA_GAME_CLOSED );
FIND_ERROR_STRING( SDA_GAME_TERMINATED );
FIND_ERROR_STRING( SDA_GAME_TERMINATE_FAILS );
FIND_ERROR_STRING( SDA_GAME_NOT_RUNNING );
return "Unknown Error";
}
# define FIND_STEAM_TYPE_STRING(a) if (eSteamType == a ) return ""#a"";
CString GetSteamTypeAsString( SDASteamType eSteamType )
{
FIND_STEAM_TYPE_STRING( Unknown );
FIND_STEAM_TYPE_STRING( HalfLife );
FIND_STEAM_TYPE_STRING( HalfLifeMod );
FIND_STEAM_TYPE_STRING( Source );
FIND_STEAM_TYPE_STRING( SourceMod );
FIND_STEAM_TYPE_STRING( ThirdParty );
FIND_STEAM_TYPE_STRING( ThirdPartyMod );
FIND_STEAM_TYPE_STRING( SteamThirdParty );
FIND_STEAM_TYPE_STRING( Tool );
FIND_STEAM_TYPE_STRING( SteamMedia );
FIND_STEAM_TYPE_STRING( Demo );
return "Unknown SDASteamType";
}
//# endif //ifdef _DEBUG
// Generated message map functions
//{{AFX_MSG(CSteamDllApi)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG
afx_msg LRESULT ProcessUserMessage(WPARAM, LPARAM);
afx_msg LRESULT ProcessParentRequest(WPARAM, LPARAM);
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
// ----------------------------------------------------------------
#endif // !defined(AFX_STEAMDLLAPI_H__34117073_8FE0_4F68_AD17_3882C4F7D043__INCLUDED_)
// ----------------------------------------------------------------
//
// EOF
//
// ----------------------------------------------------------------