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

📄 sessionsettings.h

📁 Vc.Net入门与提高源码
💻 H
字号:
// SessionSettings.h : Defines the ATL Server request handler class
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Classes Reference and related electronic
// documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft C++ Libraries products.

#pragma once


inline CStringA ToCStringA(LPCWSTR wsz) throw()
{
	USES_CONVERSION;
	return wsz ? W2CA(wsz) : "";
}

inline CStringA ToCStringA(const VARIANT& v) throw()
{
	CComVariant var(v);
	return (SUCCEEDED(var.ChangeType(VT_BSTR))) ? ToCStringA(var.bstrVal) : "";
}

inline CStringA ToCStringA(const VARIANT* pv) throw()
{
	return pv ? ToCStringA(*pv) : "";
}

inline CStringA ToCStringA(LONG l) throw()
{
	CStringA str;
	str.Format("%ld", l);
	return str;
}


typedef DWORD HTTP_STATUS_CODE;		// 200 (OK), etc.
typedef HTTP_CODE ATLS_STATUS_CODE;		// HTTP_SUCCESS, etc.
typedef DWORD ATLS_STATUS_SUBCODE;	// SUBERR_NO_PROCESS, etc.


inline HTTP_STATUS_CODE ValidateHttpStatusCode(HTTP_STATUS_CODE code) throw()
{
	// Note that we allow zero for HTTP_SUCCESS
	ATLASSERT((code == 0) || (code >= 200 && code < 207) ||  (code >= 300 && code < 308) || (code >= 400 && code < 418) || (code >= 500 && code < 506));
	return code;
}


template <typename THandler>
class CSessionRequestHandler : 
public CRequestHandlerT<THandler>
{
public:
	// Create a new session, add the session ID to the response as a cookie
	HRESULT NewSession(ISessionStateService* pSessionService, ISession** ppSession)
	{
		CHAR szID[64 + 1];
		*szID = 0;
		DWORD dwCharacters = (sizeof(szID)/sizeof(szID[0])) - 1;

		HRESULT hr = pSessionService->CreateNewSession( szID, &dwCharacters, ppSession );

		if (SUCCEEDED(hr))
		{
			CSessionCookie theSessionCookie( szID );
			m_HttpResponse.AppendCookie( &theSessionCookie );
		}

		return hr;
	}

	// Get session pointer based on ID in cookie
	HRESULT GetSession(ISessionStateService* pSessionService, ISession** ppSession)
	{
		HRESULT hr = E_FAIL;
		CStringA szID;
		
		if ( m_HttpRequest.Cookies(SESSION_COOKIE_NAME).GetValue( szID ))// && szID.GetLength())
		{
			hr = pSessionService->GetSession( szID, ppSession );
		}

		return hr;
	}

	// Try to get the session, if that fails, create a new one
	HRESULT EnsureGetSession(ISessionStateService* pSessionService, ISession** ppSession)
	{
		HRESULT hr = GetSession(pSessionService, ppSession);
		
		if (FAILED(hr))
			hr = NewSession( pSessionService, ppSession );

		return hr;
	}

	HRESULT TerminateSession(ISessionStateService* pSessionService)
	{
		ATLASSERT(pSessionService);
		HRESULT hr = E_FAIL;
		CStringA szID;
		m_HttpRequest.Cookies(SESSION_COOKIE_NAME).GetValue(szID);
		
		if (szID.GetLength())
		{
			hr = pSessionService->CloseSession( szID );
		}

		return hr;
	}

	ATLS_STATUS_CODE ServerError(HTTP_STATUS_CODE dwStatus = 500, ATLS_STATUS_SUBCODE dwSubCode = SUBERR_NONE)
	{
		// Only call with server error status codes
		// This function might be useful at other times
		// but your code will be harder to understand
		ATLASSERT(dwStatus >= 500 && dwStatus < 600);
		return SetErrorCode(dwStatus, dwSubCode);
	}

	ATLS_STATUS_CODE SetErrorCode(HTTP_STATUS_CODE dwStatus = 500, ATLS_STATUS_SUBCODE dwSubCode = SUBERR_NONE)
	{
		m_HttpResponse.ClearResponse();
		PreventClientResponseCaching();
		return SetStatusCode(dwStatus, dwSubCode);
	}

	ATLS_STATUS_CODE NoProcess(HTTP_STATUS_CODE dwStatus = 200)
	{
		return SetStatusCode(dwStatus, SUBERR_NO_PROCESS);
	}

	ATLS_STATUS_CODE SetStatusCode(HTTP_STATUS_CODE dwStatus = 200, ATLS_STATUS_SUBCODE dwSubCode = SUBERR_NONE)
	{
		ValidateHttpStatusCode(dwStatus);
		m_HttpResponse.SetStatusCode(dwStatus ? dwStatus : 200); // Convert zero to 200
		return HTTP_ERROR(dwStatus, dwSubCode);
	}

	bool PreventClientResponseCaching() throw()
	{
		bool bSuccess = false;
		m_HttpResponse.SetCacheControl("no-cache");
		{
			if (m_HttpResponse.SetExpires(0))
				bSuccess = true;
		}
		return bSuccess;
	}
};


class CSessionSettingsHandler : public CSessionRequestHandler<CSessionSettingsHandler>
{
public:
	HTTP_CODE ValidateAndExchange()
	{
		m_HttpResponse.SetContentType("text/html");

		// Get the ISessionStateService from the ISAPI extension
		HRESULT hr = m_spServiceProvider->QueryService(__uuidof(ISessionStateService), &stateService );

		hr = EnsureGetSession( stateService, &session );
		if (FAILED(hr))
			return ServerError(501);

		const CHttpRequestParams& formFields = m_HttpRequest.GetFormVars();

		CHttpRequest::HTTP_METHOD m = m_HttpRequest.GetMethod();
		if ( m == CHttpRequest::HTTP_METHOD_GET )
		{
			CComVariant var;
			hr = session->GetVariable("res", &var);

			CStringA strVar;
			strVar = ToCStringA(var);

			if (SUCCEEDED(hr) && strVar.GetLength() > 0)
			{
				setHighCheck = lstrcmp(strVar, "high") == 0;
				setMedCheck = lstrcmp(strVar, "med") == 0;
				setLowCheck = lstrcmp(strVar, "low") == 0;
			}
			else
			{
				setHighCheck = false;
				setMedCheck = false;
				setLowCheck = false;
			}

			var.Clear();

			hr = session->GetVariable("scale", &var);
			strVar = ToCStringA(var);

			if (SUCCEEDED(hr) && strVar.GetLength() > 0)
			{
				setScaleYesCheck = lstrcmp(strVar, "yes") == 0;
				setScaleNoCheck = lstrcmp(strVar, "no") == 0;
			}
			else
			{
				setScaleYesCheck = false;
				setScaleNoCheck = false;
			}

			return HTTP_SUCCESS;
		}


		LPCTSTR res = formFields.Lookup("res");
		if (FAILED(session->SetVariable("res", CComVariant(res) )))
			return ServerError();

		LPCTSTR scale = formFields.Lookup("scale");
		if (FAILED(session->SetVariable("scale", CComVariant(scale) )))
			return ServerError();

		m_HttpResponse.Redirect("gallery.srf");

		return HTTP_SUCCESS;
	}
 
	HTTP_CODE OnHighCheck()
	{
		if (setHighCheck)
			m_HttpResponse << "checked";

		return HTTP_SUCCESS;
	}

	HTTP_CODE OnMedCheck()
	{
		if (setMedCheck)
			m_HttpResponse << "checked";

		return HTTP_SUCCESS;
	}
	HTTP_CODE OnLowCheck()
	{
		if (setLowCheck)
			m_HttpResponse << "checked";

		return HTTP_SUCCESS;
	}

	HTTP_CODE OnScaleYes()
	{
		if (setScaleYesCheck)
			m_HttpResponse << "checked";

		return HTTP_SUCCESS;
	}

	HTTP_CODE OnScaleNo()
	{
		if (setScaleNoCheck)
			m_HttpResponse << "checked";

		return HTTP_SUCCESS;
	}
/*
	HTTP_CODE OnImage(void)
	{
		m_HttpResponse << "wrong handler!";

		return HTTP_SUCCESS;
	}
*/
	BEGIN_REPLACEMENT_METHOD_MAP(CSessionSettingsHandler)
		REPLACEMENT_METHOD_ENTRY("highcheck", OnHighCheck)
		REPLACEMENT_METHOD_ENTRY("medcheck", OnMedCheck)
		REPLACEMENT_METHOD_ENTRY("lowcheck", OnLowCheck)
		REPLACEMENT_METHOD_ENTRY("scaleYes", OnScaleYes)
		REPLACEMENT_METHOD_ENTRY("scaleNo", OnScaleNo)
//		REPLACEMENT_METHOD_ENTRY("image", OnImage)
	END_REPLACEMENT_METHOD_MAP()

private:
	// Session service support
	CComPtr<ISessionStateService> stateService;
	CComPtr<ISession> session;
	
	bool setHighCheck, setMedCheck, setLowCheck;
	bool setScaleNoCheck, setScaleYesCheck;
}; // class CSessionSettingsHandler



class CSessionSettingsMainHandler : public CSessionRequestHandler<CSessionSettingsMainHandler>
{
public:
	HTTP_CODE ValidateAndExchange()
	{
		// TODO: Put all initialization and validation code here
		
		m_HttpResponse.SetContentType("text/html");

		// Get the ISessionStateService from the ISAPI extension
		HRESULT hr = m_spServiceProvider->QueryService( __uuidof(ISessionStateService), &stateService );
		if (FAILED(hr))
			return ServerError();

		hr = EnsureGetSession(stateService, &session);
		if (FAILED(hr))
			return ServerError();

		CComVariant var;
		hr = session->GetVariable("res", &var);

		CStringA strVar;
		strVar = ToCStringA(var);

		if (/*SUCCEEDED(hr) &&*/ strVar.GetLength() > 0)
		{
			resHigh = lstrcmp(strVar, "high") == 0;
			resMed = lstrcmp(strVar, "med") == 0;
			resLow = lstrcmp(strVar, "low") == 0;
		}
		else
			resHigh = resMed = resLow = false;

		hr = session->GetVariable("scale", &var);
		strVar = ToCStringA(var);

		if (/*SUCCEEDED(hr) &&*/ strVar.GetLength() > 0)
		{
			scaleYes = lstrcmp(strVar, "yes") == 0;
			scaleNo = lstrcmp(strVar, "no") == 0;
		}
		else
			resHigh = resMed = resLow = false;

		return HTTP_SUCCESS;
	}
 
	HTTP_CODE OnImage(void)
	{
		CStringA scaleStr;

		if (scaleYes)
			scaleStr = "width=\"480\" height=\"360\"";
		else
			scaleStr = "";

		if (resHigh)
		{
			m_HttpResponse << "<img src=\"cat_high.jpg\"" << scaleStr << ">";
			m_HttpResponse << "<br>high resolution";
		}
		else if (resMed)
		{
			m_HttpResponse << "<img src=\"cat_med.jpg\"" << scaleStr << ">";
			m_HttpResponse << "<br>medium resolution";
		}
		else
		{
			m_HttpResponse << "<img src=\"cat_low.jpg\"" << scaleStr << ">";
			if (resLow == false)
				m_HttpResponse << "<br>(no settings specified) using low resolution";
			else
				m_HttpResponse << "<br>low resolution";
		}

		if (scaleYes)
			m_HttpResponse << ", scaled";
		else
			m_HttpResponse << ", actual size";

		return HTTP_SUCCESS;
	}

	BEGIN_REPLACEMENT_METHOD_MAP(CSessionSettingsMainHandler)
		REPLACEMENT_METHOD_ENTRY("image", OnImage)
	END_REPLACEMENT_METHOD_MAP()

private:
	// Session service support
	CComPtr<ISessionStateService> stateService;
	CComPtr<ISession> session;
	
	bool resHigh, resMed, resLow;
	bool scaleYes, scaleNo;

}; // class CSessionSettingsMainHandler


class CSessionSettingsResetHandler : public CSessionRequestHandler<CSessionSettingsResetHandler>
{
public:
	HTTP_CODE ValidateAndExchange()
	{
		m_HttpResponse.SetContentType("text/html");

		// Get the ISessionStateService from the ISAPI extension
		HRESULT hr = m_spServiceProvider->QueryService(__uuidof(ISessionStateService), &stateService );
		if (FAILED(hr))
			return ServerError();

		if (FAILED(TerminateSession( stateService )))
		{
			ServerError(501);
		}

		return HTTP_SUCCESS;
	}
 
/*	HTTP_CODE OnImage(void)
	{
		m_HttpResponse << "wrong handler!";

		return HTTP_SUCCESS;
	}

	BEGIN_REPLACEMENT_METHOD_MAP(CSessionSettingsResetHandler)
		REPLACEMENT_METHOD_ENTRY("image", OnImage)
	END_REPLACEMENT_METHOD_MAP()
*/
private:
	// Session service support
	CComPtr<ISessionStateService> stateService;
	CComPtr<ISession> session;
	
	bool resHigh, resMed, resLow;

}; // class CSessionSettingsResetHandler


BEGIN_HANDLER_MAP()
	HANDLER_ENTRY("Intro", CSessionSettingsHandler)
	HANDLER_ENTRY("Main", CSessionSettingsMainHandler)
	HANDLER_ENTRY("Reset", CSessionSettingsResetHandler)
END_HANDLER_MAP()

⌨️ 快捷键说明

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