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

📄 warifmimetypes.cpp

📁 ftpserver very good sample
💻 CPP
字号:
#include "StdAfx.h"#include "WarIfMimeTypes.h"   // class implemented#include "WarAutoLock.h"#ifndef WAR_LOG_H#   include "WarLog.h"#endifusing namespace std;#define AUTO_LOCK WarAutoLock my_lock((WarCriticalSection&)mLock);/////////////////////////////// PUBLIC /////////////////////////////////////////============================= LIFECYCLE ====================================WarIfMimeTypes::WarIfMimeTypes(WarIfSite& SiteRef): mIsInitialized(false){	// Open the registry key    mRegKey.Open(SiteRef.GetRegKey().GetRef(WAR_WINNT_REG_MIME_TYPES));	// Open the regkey for defined types	mRegDefined.Open(mRegKey.GetRef(WAR_WINNT_REG_DEFINED));}// WarIfMimeTypesWarIfMimeTypes::~WarIfMimeTypes(){}// ~WarIfMimeTypes//============================= OPERATORS ====================================//============================= OPERATIONS ===================================void WarIfMimeTypes::SetFilePath(const war_ccsysstr_t filePath) throw(WarException){	mRegKey.SetValue(WAR_WINNT_REG_FILENAME, filePath);}void WarIfMimeTypes::SetOsOption(bool doUseLocalOs) throw(WarException){	mRegKey.SetValue(WAR_WINNT_USE_LOCAL_OS, doUseLocalOs);}void WarIfMimeTypes::SetMimeTypes(const mime_map_t& mimeMap) throw(WarException){	// Delete the old types	mRegDefined.DeleteAllValues();	// Set new types	for(mime_map_t::const_iterator P = mimeMap.begin()		; P != mimeMap.end()		; ++P)	{		war_registrypath_t key = P->first;		WarCollector<war_fsysch_t> value = P->second;		mRegDefined.SetValue(key.GetPath(), value.GetValue());	}}bool WarIfMimeTypes::ResolvMimeType(const filename_t& extName,									mime_type_t& dstMimeType) const{	AUTO_LOCK;		if (!mIsInitialized)	{		((WarIfMimeTypes *)this)->LoadMimeDefinitions();		((WarIfMimeTypes *)this)->mIsInitialized = true;	}		mime_map_t::const_iterator P = mMimeMap.find(extName);		if (P != mMimeMap.end())	{		dstMimeType = P->second;		return true;	}#ifdef WIN32	{		if (mRegHkeyRoot.IsOpen())		{			// Lookup the mime-type in the registry. If it is found, we			// add it to the internal map to save another lookup in the 			// registry the nest time someone asks for it.			WarWin32Registry key;			try			{				war_registrypath_t key_name;				key_name << "." << extName;				key.Open(mRegHkeyRoot.GetRef(key_name.GetPath()));				war_regstr_t mime_type = key.GetStrValue(_T("Content Type"));								WarCollector<char> my_mime_type = mime_type;								((WarIfMimeTypes *)this)->mMimeMap.insert(mime_map_t::value_type(					extName, my_mime_type.GetValue()));				dstMimeType = my_mime_type.GetValue();				return true;			}			catch(WarException)			{			}		}	}#endif		return false;}//============================= CALLBACK   ===================================//============================= ACCESS     ===================================//============================= INQUIRY    ===================================WarIfMimeTypes::filename_t WarIfMimeTypes::GetFilePath() throw(WarException){	return mRegKey.GetStrValue(WAR_WINNT_REG_FILENAME);}bool WarIfMimeTypes::GetOsOption() throw(WarException){	return mRegKey.GetIntValue(WAR_WINNT_USE_LOCAL_OS);}void WarIfMimeTypes::GetMimeTypes(mime_map_t& mimeMap) throw(WarException){	WarWin32Registry::keyname_list_t values;	mRegDefined.EnumValue(values);	for(WarWin32Registry::keyname_list_t::const_iterator 		P = values.begin()		; P != values.end()		; ++P)	{		WarCollector<char> mime_type = 			mRegDefined.GetStrValue(P->c_str());				mimeMap.insert(mime_map_t::value_type(			*P, mime_type.GetValue()));	}}/////////////////////////////// PROTECTED  ///////////////////////////////////void WarIfMimeTypes::LoadMimeDefinitions(){		// We assume that the object is locked!	// Load from site definition	GetMimeTypes(mMimeMap);		// Load from file	try	{		struct file_t		{		public:			file_t()			{				mFp = NULL;			}			~file_t()			{				if (NULL != mFp)				{					fclose(mFp);					mFp = NULL;				}			}						FILE *mFp;		} my_fp;				filename_t mime_file_name = GetFilePath();		if (!mime_file_name.empty())		{						if ((my_fp.mFp = _tfopen(mime_file_name.c_str(), _T("r"))) == NULL)			{				WarLog warn_log(WARLOG_WARNINGS, "WarIfMimeTypes::LoadMimeDefinitions()");								warn_log << "Failed to open file \"" 					<< mime_file_name					<< "\". Mime-definitions from that file will not be available."					<< WarSystemError()					<< war_endl;			}			else			{				char buf[1024* 8];				char *p;				while(( p = fgets(buf, sizeof(buf), my_fp.mFp)) != NULL)				{					while(isspace(*p))						++p;					if ('#' == *p)						continue; // Comment					if (!*p)						continue; // Empty line					// Application-tag					const char *mime_type = p, *ext = NULL;					while(*p && !isspace(*p))						++p;					if (isspace(*p))						*p++ = 0;					while(isspace(*p))						++p;										// Extension (can be more than one!)					while(*p)					{						while(isspace(*p))							++p;						ext = p;												while(!isspace(*p))							++p;						if (isspace(*p))							*p++ = 0;												if (*mime_type && ext && *ext)						{							WarCollector<war_sysch_t> my_mime_ext = ext;							WarCollector<char> my_mime_type = mime_type;														mMimeMap.insert(mime_map_t::value_type(								my_mime_ext.GetValue(), 								my_mime_type.GetValue()));													}					}									}			}		}	}	catch(WarException)	{	}	if (GetOsOption())	{#ifdef WIN32				try		{			mRegHkeyRoot.Open(HKEY_CLASSES_ROOT, 				war_registrypath_t(_T("\\")), 				KEY_READ);		}		catch(WarException& ex)		{			WarLog warn_log(WARLOG_WARNINGS, "WarIfMimeTypes::LoadMimeDefinitions()");							warn_log << "Failed to open HKEY_CLASSES_ROOT in the registry. " 					<< "Mime-definitions from Windows will not be available."					<< ex					<< war_endl;		}#endif // WIN32	}}/////////////////////////////// PRIVATE    ///////////////////////////////////

⌨️ 快捷键说明

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