⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qsprofile.cpp

📁 接收证券行情数据接口的VC源代码,配合上mystock,可很好了解股票软件的内部源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*
	All rights reserved.
*/

#include "stdafx.h"
#include "QSProfile.h"
#include "ProxySocket.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif


//////////////////////////////////////////////////////////////////////
// CQSProfile

CQSProfile & AfxGetQSProfile()
{
	static CQSProfile s_qsprofile;
	return s_qsprofile;
}

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CQSProfile::CQSProfile()
{
	m_nAccessType		=	0;		// INTERNET_OPEN_TYPE_PRECONFIG
	m_nProxyType		=	CProxySocket::TypeHTTP;
	m_nProxyPort		=	80;		// INTERNET_DEFAULT_HTTP_PORT
	
	m_nCurrentServer	=	-1;
	m_bCycleConnect		=	TRUE;
}

CQSProfile::~CQSProfile()
{
}

char szQuoteServerProfileName[] = "QuoteServer.ini";

char szProfile_Proxy[] = "Proxy";
char szProfile_AccessType[] = "AccessType";
char szProfile_ProxyType[] = "ProxyType";
char szProfile_ProxyAddress[] = "ProxyAddress";
char szProfile_ProxyPort[] = "ProxyPort";
char szProfile_ProxyUser[] = "ProxyUser";
char szProfile_ProxyPasswd[] = "ProxyPasswd";

char szProfile_Server[] = "Server";
char szProfile_ServerNumber[] = "ServerNumber";
char szProfile_CurrentServer[] = "CurrentServer";
char szProfile_CycleConnect[] = "CycleConnect";

char szProfile_ServerFmt[] = "-Server%d";
char szProfile_Name[] = "Name";
char szProfile_Address[] = "Address";
char szProfile_Port[] = "Port";
char szProfile_User[] = "User";
char szProfile_Passwd[] = "Passwd";
char szProfile_SavePasswd[] = "SavePasswd";

void CQSProfile::LoadProfile()
{
	CString sFileName = GetWorkDirectory() + szQuoteServerProfileName;
	m_nCurrentServer = ::GetPrivateProfileInt( szProfile_Server, szProfile_CurrentServer, 0, sFileName );
	m_bCycleConnect = ::GetPrivateProfileInt( szProfile_Server, szProfile_CycleConnect, TRUE, sFileName );
	int nServerNumber = ::GetPrivateProfileInt( szProfile_Server, szProfile_ServerNumber, 0, sFileName );
	
	m_aQuoteServers.SetSize( 0, nServerNumber + 3 );
	char buffer[1024];
	for( int k=0; k<nServerNumber; k++ )
	{
		CString	sSession;
		sSession.Format( szProfile_ServerFmt, k );
		
		CQuoteServer	qs;

		memset( buffer, 0, sizeof(buffer) );
		::GetPrivateProfileString( sSession, szProfile_Name, "", buffer, sizeof(buffer)-2, sFileName );
		qs.m_strName = buffer;

		memset( buffer, 0, sizeof(buffer) );
		::GetPrivateProfileString( sSession, szProfile_Address, "", buffer, sizeof(buffer)-2, sFileName );
		qs.m_strAddress = buffer;
		
		qs.m_nPort = ::GetPrivateProfileInt( sSession, szProfile_Port, 8001, sFileName );

		memset( buffer, 0, sizeof(buffer) );
		::GetPrivateProfileString( sSession, szProfile_User, "", buffer, sizeof(buffer)-2, sFileName );
		qs.m_strUser = buffer;

		memset( buffer, 0, sizeof(buffer) );
		::GetPrivateProfileString( sSession, szProfile_Passwd, "", buffer, sizeof(buffer)-2, sFileName );
		qs.m_strPasswd = buffer;
		
		qs.m_bSavePasswd = ::GetPrivateProfileInt( sSession, szProfile_SavePasswd, TRUE, sFileName );
		
		if( qs.m_strName.IsEmpty() )
			qs.m_strName = qs.m_strAddress;
		if( !qs.m_strName.IsEmpty() )
			m_aQuoteServers.Add( qs );
	}

	LoadAliases();
}

void CQSProfile::StoreProfile()
{
	CString sFileName = GetWorkDirectory() + szQuoteServerProfileName;
	CString sTemp;
	sTemp.Format( "%d", m_aQuoteServers.GetSize() );
	::WritePrivateProfileString( szProfile_Server, szProfile_ServerNumber, sTemp, sFileName );
	sTemp.Format( "%d", m_nCurrentServer );
	::WritePrivateProfileString( szProfile_Server, szProfile_CurrentServer, sTemp, sFileName );
	sTemp.Format( "%d", m_bCycleConnect );
	::WritePrivateProfileString( szProfile_Server, szProfile_CycleConnect, sTemp, sFileName );
	::GetPrivateProfileInt( szProfile_Server, szProfile_ServerNumber, m_aQuoteServers.GetSize(), sFileName );

	for( int k=0; k<m_aQuoteServers.GetSize(); k++ )
	{
		CQuoteServer & qs = m_aQuoteServers.ElementAt(k);

		CString	sSession;
		sSession.Format( szProfile_ServerFmt, k );

		::WritePrivateProfileString( sSession, szProfile_Name, qs.m_strName, sFileName );
		::WritePrivateProfileString( sSession, szProfile_Address, qs.m_strAddress, sFileName );
		sTemp.Format( "%d", qs.m_nPort );
		::WritePrivateProfileString( sSession, szProfile_Port, sTemp, sFileName );
		::WritePrivateProfileString( sSession, szProfile_User, qs.m_strUser, sFileName );
		::WritePrivateProfileString( sSession, szProfile_Passwd, qs.m_strPasswd, sFileName );
		sTemp.Format( "%d", qs.m_bSavePasswd );
		::WritePrivateProfileString( sSession, szProfile_SavePasswd, sTemp, sFileName );
	}
}

static HKEY QSP_GetSectionKey( HKEY hKey, LPCTSTR szRegKeyGroup, LPCTSTR szRegKeyCompany, LPCTSTR szRegKeyApp, LPCTSTR lpszVersion, LPCTSTR lpszSection )
{
	HKEY hGroupKey = NULL;
	HKEY hCompanyKey = NULL;
	HKEY hAppKey = NULL;
	HKEY hVersionKey = NULL;
	HKEY hSectionKey = NULL;
	if (RegOpenKeyEx( hKey, szRegKeyGroup, 0, KEY_WRITE|KEY_READ,
		&hGroupKey) == ERROR_SUCCESS)
	{
		DWORD dw;
		if (RegCreateKeyEx(hGroupKey, szRegKeyCompany, 0, REG_NONE,
			REG_OPTION_NON_VOLATILE, KEY_WRITE|KEY_READ, NULL,
			&hCompanyKey, &dw) == ERROR_SUCCESS )
		{
			RegCreateKeyEx(hCompanyKey, szRegKeyApp, 0, REG_NONE,
				REG_OPTION_NON_VOLATILE, KEY_WRITE|KEY_READ, NULL,
				&hAppKey, &dw);
		}
	}
	if (hGroupKey != NULL)
		RegCloseKey(hGroupKey);
	if (hCompanyKey != NULL)
		RegCloseKey(hCompanyKey);

	DWORD dw;
	if( NULL == hAppKey )
		return FALSE;
	RegCreateKeyEx(hAppKey, lpszVersion, 0, REG_NONE,
		REG_OPTION_NON_VOLATILE, KEY_WRITE|KEY_READ, NULL,
		&hVersionKey, &dw);
	RegCloseKey(hAppKey);

	if( NULL == hVersionKey )
		return FALSE;
	RegCreateKeyEx(hVersionKey, lpszSection, 0, REG_NONE,
		REG_OPTION_NON_VOLATILE, KEY_WRITE|KEY_READ, NULL,
		&hSectionKey, &dw);
	RegCloseKey(hVersionKey);
	
	return hSectionKey;
}

static DWORD	QSP_RegQueryDWORD(HKEY hKey, LPCTSTR szRegKeyGroup, LPCTSTR szRegKeyCompany, LPCTSTR szRegKeyApp, LPCTSTR lpszVersion, LPCTSTR lpszSection, LPCTSTR lpszEntry, DWORD dwDefault )
// hKey = HKEY_LOCAL_MACHINE, HKEY_CLASSES_ROOT, or so
{
	HKEY hSecKey = QSP_GetSectionKey(hKey, szRegKeyGroup, szRegKeyCompany, szRegKeyApp, lpszVersion, lpszSection);
	if (hSecKey == NULL)
		return dwDefault;
	DWORD dwValue;
	DWORD dwType, dwCount = 4;
	LONG lResult = RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
		(LPBYTE)&dwValue, &dwCount);
	RegCloseKey(hSecKey);
	if (lResult == ERROR_SUCCESS)
	{
		ASSERT(dwType == REG_DWORD);
		return dwValue;
	}
	return dwDefault;
}

static CString	QSP_RegQueryString(HKEY hKey, LPCTSTR szRegKeyGroup, LPCTSTR szRegKeyCompany, LPCTSTR szRegKeyApp, LPCTSTR lpszVersion, LPCTSTR lpszSection, LPCTSTR lpszEntry, LPCTSTR lpszDefault )
// hKey = HKEY_LOCAL_MACHINE, HKEY_CLASSES_ROOT, or so
{
	HKEY hSecKey = QSP_GetSectionKey(hKey, szRegKeyGroup, szRegKeyCompany, szRegKeyApp, lpszVersion, lpszSection);
	if (hSecKey == NULL)
		return lpszDefault;
	CString strValue;
	DWORD dwType, dwCount;
	LONG lResult = RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
		NULL, &dwCount);
	if (lResult == ERROR_SUCCESS)
	{
		ASSERT(dwType == REG_SZ);
		lResult = RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
			(LPBYTE)strValue.GetBuffer(dwCount/sizeof(TCHAR)), &dwCount);
		strValue.ReleaseBuffer();
	}
	RegCloseKey(hSecKey);
	if (lResult == ERROR_SUCCESS)
	{
		ASSERT(dwType == REG_SZ);
		return strValue;
	}
	return lpszDefault;
}

static BOOL QSP_ParseProxyString( LPCTSTR lpszProxy, int & nProxyType, CString & rProxyAddress, UINT & nProxyPort )
{
	CString strProxy = lpszProxy;
	int nIndex1, nIndex2, nIndex3;

	char szSocks[] = "socks=";
	nIndex1 = strProxy.Find( szSocks );
	if( -1 != nIndex1 )
	{
		nIndex1 = nIndex1 + strlen(szSocks);
		nIndex2 = strProxy.Find( ":", nIndex1 );
		if( -1 != nIndex2 )
		{
			nIndex3 = strProxy.Find( ";", nIndex2 );
			if( -1 == nIndex3 ) nIndex3 = strProxy.GetLength();
			nProxyType = CProxySocket::TypeSocks5;
			rProxyAddress = strProxy.Mid( nIndex1, nIndex2-nIndex1 );
			nProxyPort = atol(strProxy.Mid( nIndex2+1, nIndex3-nIndex2-1) );
			return TRUE;
		}
	}

	char szHttp[] = "http=";
	nIndex1 = strProxy.Find( szHttp );
	if( -1 != nIndex1 )
	{
		nIndex1 = nIndex1 + strlen(szHttp);
		nIndex2 = strProxy.Find( ":", nIndex1 );
		if( -1 != nIndex2 )
		{
			nIndex3 = strProxy.Find( ";", nIndex2 );
			if( -1 == nIndex3 ) nIndex3 = strProxy.GetLength();
			nProxyType = CProxySocket::TypeHTTP;
			rProxyAddress = strProxy.Mid( nIndex1, nIndex2-nIndex1 );
			nProxyPort = atol(strProxy.Mid( nIndex2+1, nIndex3-nIndex2-1) );
			return TRUE;
		}
	}

	// All is the same	
	nIndex1 = 0;
	nIndex2 = strProxy.Find( ":", nIndex1 );
	if( -1 != nIndex2 )
	{
		nIndex3 = strProxy.Find( ";", nIndex2 );
		if( -1 == nIndex3 ) nIndex3 = strProxy.GetLength();
		nProxyType = CProxySocket::TypeSocks5;
		rProxyAddress = strProxy.Mid( nIndex1, nIndex2-nIndex1 );
		nProxyPort = atol(strProxy.Mid( nIndex2+1, nIndex3-nIndex2-1) );
		return TRUE;
	}

	return FALSE;
}

BOOL CQSProfile::GetCompoundConfig( int & nProxyType, CString & strProxyAddress, UINT & nProxyPort )
{
	int nAccessType = GetAccessType();
	nProxyType = GetProxyType();
	strProxyAddress = GetProxyAddress();
	nProxyPort = GetProxyPort();
	if( INTERNET_OPEN_TYPE_PRECONFIG == nAccessType )
	{
		DWORD dwProxyEnable = QSP_RegQueryDWORD( HKEY_CURRENT_USER, _T("Software"), _T("Microsoft"), _T("Windows"),
							_T("CurrentVersion"), _T("Internet Settings"), _T("ProxyEnable"), 0 );
		if( dwProxyEnable )
		{
			CString strProxy = QSP_RegQueryString( HKEY_CURRENT_USER, _T("Software"), _T("Microsoft"), _T("Windows"),
								_T("CurrentVersion"), _T("Internet Settings"), _T("ProxyServer"), "" );
			QSP_ParseProxyString( strProxy, nProxyType, strProxyAddress, nProxyPort );
		}
		else
			nProxyType = CProxySocket::TypeNone;
	}
	else if( INTERNET_OPEN_TYPE_DIRECT == nAccessType )
		nProxyType = CProxySocket::TypeNone;
	return TRUE;
}

int CQSProfile::GetAccessType( )
{
/*	if( INTERNET_OPEN_TYPE_DIRECT != m_nAccessType
		&& INTERNET_OPEN_TYPE_PRECONFIG != m_nAccessType
		&& INTERNET_OPEN_TYPE_PROXY != m_nAccessType )
		return INTERNET_OPEN_TYPE_DIRECT;
*/
	CString sFileName = GetWorkDirectory() + szQuoteServerProfileName;
	m_nAccessType = ::GetPrivateProfileInt( szProfile_Proxy, szProfile_AccessType, 0, sFileName );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -