// mfcucase.cpp : implements the filter class // // This is a part of the Microsoft Foundation Classes C++ library. // Copyright (C) 1997-1998 Microsoft Corporation // All rights reserved. // // This source code is only intended as a supplement to the // Microsoft Foundation Classes Reference and related // electronic documentation provided with the library. // See these sources for detailed information regarding the // Microsoft Foundation Classes product. // Note that your filters probably won't have an #ifdef like this one. // The project file for this sample allows you to build the sample as // a statically linked regular MFC DLL (that is, with _AFXDLL defined) // or as a DLL that doesn't use MFC classes aside from the ISAPI // support classes (that is, without _AFXDLL defined). #ifdef _AFXDLL #include #include #endif #include #include "mfcucase.h" #include "resource.h" /////////////////////////////////////////////////////////////////////// // The one and only CUpCaseFilter object CUpCaseFilter theFilter; /////////////////////////////////////////////////////////////////////// // CUpCaseFilter implementation CUpCaseFilter::CUpCaseFilter() { } CUpCaseFilter::~CUpCaseFilter() { } /////////////////////////////////////////////////////////////////////// // CUpCaseFilter object BOOL CUpCaseFilter::GetFilterVersion(PHTTP_FILTER_VERSION pVer) { // call default implmentation to initialize CHttpFilter::GetFilterVersion(pVer); // set flags that interest us pVer->dwFlags |= (SF_NOTIFY_NONSECURE_PORT | SF_NOTIFY_URL_MAP | SF_NOTIFY_SEND_RAW_DATA); // load description string TCHAR sz[SF_MAX_FILTER_DESC_LEN+1]; ISAPIVERIFY(::LoadString(AfxGetResourceHandle(), IDS_MFCUCASE_FILTER, sz, SF_MAX_FILTER_DESC_LEN)); _tcscpy(pVer->lpszFilterDesc, sz); return TRUE; } DWORD CUpCaseFilter::OnSendRawData(CHttpFilterContext* pCtxt, PHTTP_FILTER_RAW_DATA pRawData) { LPTSTR pstrIn; DWORD cbBuffer; DWORD cbTemp; // if we previously identified the data requested as being // interesting, let's try to parse it if (pCtxt->m_pFC->pFilterContext != NULL) { // gain a pointer to the actual data pstrIn = (LPTSTR) pRawData->pvInData; cbBuffer = 0; cbTemp = 0; // are we waiting for the header? if (pCtxt->m_pFC->pFilterContext == (VOID *) 1) { // rip through the header to the end while (cbBuffer < pRawData->cbInData) { if (pstrIn[cbBuffer] == '\n' && pstrIn[cbBuffer+2] == '\n') { cbBuffer += 3; break; } cbBuffer++; } // does the header identify HTML content? while (cbTemp < cbBuffer) { if (pstrIn[cbTemp] == '/' && pstrIn[cbTemp+1] == 'h' && pstrIn[cbTemp+2] == 't' && pstrIn[cbTemp+3] == 'm') { // yes, it's HTML, set our flag pCtxt->m_pFC->pFilterContext = (VOID*) 2; break; } cbTemp++; } // if it wasn't HTML--clear the flag if (cbTemp == cbBuffer) pCtxt->m_pFC->pFilterContext = NULL; } // if there's anything else left in the buffer, // convert it all to upper case! if (pCtxt->m_pFC->pFilterContext != NULL) { while (cbBuffer < pRawData->cbInData) { if (isleadbyte(pstrIn[cbBuffer])) cbBuffer += 2; else { pstrIn[cbBuffer] = _totupper(pstrIn[cbBuffer]); cbBuffer++; } } } } return SF_STATUS_REQ_NEXT_NOTIFICATION; } DWORD CUpCaseFilter::OnUrlMap(CHttpFilterContext* pCtxt, PHTTP_FILTER_URL_MAP pUrlMap) { LPTSTR pstrPhysPath = pUrlMap->pszPhysicalPath; pCtxt->m_pFC->pFilterContext = NULL; // if we get a URL, try to see if it has the string "\UC\" while (*pstrPhysPath != '\0') { if (pstrPhysPath[0] == '\\' && (pstrPhysPath[1] == 'u' || pstrPhysPath[1] == 'U') && (pstrPhysPath[2] == 'c' || pstrPhysPath[2] == 'C') && pstrPhysPath[3] == '\\') { // we found a "\UC\", so the user wants // upper case. remove the "\UC\" substring // so the server can find the real path while (pstrPhysPath[3] != '\0') { pstrPhysPath[0] = pstrPhysPath[3]; pstrPhysPath = _tcsinc(pstrPhysPath); } pstrPhysPath[0] = '\0'; // set a flag to remind us to try and uppercase pCtxt->m_pFC->pFilterContext = (VOID*) 1; break; } pstrPhysPath = _tcsinc(pstrPhysPath); } return SF_STATUS_REQ_NEXT_NOTIFICATION; } // If you're building a filter that doesn't use any MFC classes, you'll // need to implement your own version of AfxGetResourceHandle() so that // the MFC ISAPI support classes can find resources they may need. // If you're using MFC classes besides the ISAPI support classes, you'll // automatically get the normal MFC implementation of // AfxGetResourceHandle() and won't need this code. #ifndef _AFXDLL static HINSTANCE g_hInstance; HINSTANCE AFXISAPI AfxGetResourceHandle() { return g_hInstance; } BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ulReason, LPVOID lpReserved) { if (ulReason == DLL_PROCESS_ATTACH) g_hInstance = hInst; return TRUE; } #endif