📄 otherfunctions.cpp
字号:
return _WINVER_XP_;
return _WINVER_XP_; // never return Win95 if we get the info about a NT system
case VER_PLATFORM_WIN32_WINDOWS:
if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
return _WINVER_95_;
if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)
return _WINVER_98_;
if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)
return _WINVER_ME_;
break;
default:
break;
}
return _WINVER_95_; // there should'nt be anything lower than this
}
uint64 GetFreeDiskSpaceX(LPCTSTR pDirectory)
{
static BOOL _bInitialized = FALSE;
static BOOL (WINAPI *_pGetDiskFreeSpaceEx)(LPCTSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER) = NULL;
if (!_bInitialized){
_bInitialized = TRUE;
(FARPROC&)_pGetDiskFreeSpaceEx = GetProcAddress(GetModuleHandle(_T("kernel32.dll")), _TWINAPI("GetDiskFreeSpaceEx"));
}
if(_pGetDiskFreeSpaceEx)
{
ULARGE_INTEGER nFreeDiskSpace;
ULARGE_INTEGER dummy;
_pGetDiskFreeSpaceEx(pDirectory, &nFreeDiskSpace, &dummy, &dummy);
return nFreeDiskSpace.QuadPart;
}
else
{
TCHAR cDrive[16];
TCHAR *p = _tcschr(pDirectory, _T('\\'));
if(p)
{
memcpy(cDrive, pDirectory, (p-pDirectory)*sizeof(TCHAR));
cDrive[p-pDirectory] = _T('\0');
}
else
_tcscpy(cDrive, pDirectory);
DWORD dwSectPerClust, dwBytesPerSect, dwFreeClusters, dwDummy;
GetDiskFreeSpace(cDrive, &dwSectPerClust, &dwBytesPerSect, &dwFreeClusters, &dwDummy);
return (dwFreeClusters * dwSectPerClust * dwBytesPerSect);
}
}
CString GetRateString(uint16 rate)
{
switch (rate){
case 0:
return GetResString(IDS_CMT_NOTRATED);
break;
case 1:
return GetResString(IDS_CMT_FAKE);
break;
case 2:
return GetResString(IDS_CMT_POOR);
break;
case 3:
return GetResString(IDS_CMT_GOOD);
break;
case 4:
return GetResString(IDS_CMT_FAIR);
break;
case 5:
return GetResString(IDS_CMT_EXCELLENT);
break;
}
return GetResString(IDS_CMT_NOTRATED);
}
// Returns a BASE32 encoded byte array
//
// [In]
// buffer: Pointer to byte array
// bufLen: Lenght of buffer array
//
// [Return]
// CString object with BASE32 encoded byte array
CString EncodeBase32(const unsigned char* buffer, unsigned int bufLen)
{
CString Base32Buff;
unsigned int i, index;
unsigned char word;
for(i = 0, index = 0; i < bufLen;) {
// Is the current word going to span a byte boundary?
if (index > 3) {
word = (buffer[i] & (0xFF >> index));
index = (index + 5) % 8;
word <<= index;
if (i < bufLen - 1)
word |= buffer[i + 1] >> (8 - index);
i++;
} else {
word = (buffer[i] >> (8 - (index + 5))) & 0x1F;
index = (index + 5) % 8;
if (index == 0)
i++;
}
Base32Buff += (char) base32Chars[word];
}
return Base32Buff;
}
// Returns a BASE16 encoded byte array
//
// [In]
// buffer: Pointer to byte array
// bufLen: Lenght of buffer array
//
// [Return]
// CString object with BASE16 encoded byte array
CString EncodeBase16(const unsigned char* buffer, unsigned int bufLen)
{
CString Base16Buff;
for(unsigned int i = 0; i < bufLen; i++) {
Base16Buff += base16Chars[buffer[i] >> 4];
Base16Buff += base16Chars[buffer[i] & 0xf];
}
return Base16Buff;
}
// Decodes a BASE16 string into a byte array
//
// [In]
// base16Buffer: String containing BASE16
// base16BufLen: Lenght BASE16 coded string's length
//
// [Out]
// buffer: byte array containing decoded string
bool DecodeBase16(const TCHAR *base16Buffer, unsigned int base16BufLen, byte *buffer, unsigned int bufflen)
{
unsigned int uDecodeLengthBase16 = DecodeLengthBase16(base16BufLen);
if (uDecodeLengthBase16 > bufflen)
return false;
memset(buffer, 0, uDecodeLengthBase16);
for(unsigned int i = 0; i < base16BufLen; i++) {
int lookup = toupper(base16Buffer[i]) - '0';
// Check to make sure that the given word falls inside a valid range
byte word = 0;
if ( lookup < 0 || lookup >= BASE16_LOOKUP_MAX)
word = 0xFF;
else
word = base16Lookup[lookup][1];
if(i % 2 == 0) {
buffer[i/2] = word << 4;
} else {
buffer[(i-1)/2] |= word;
}
}
return true;
}
// Calculates length to decode from BASE16
//
// [In]
// base16Length: Actual length of BASE16 string
//
// [Return]
// New length of byte array decoded
unsigned int DecodeLengthBase16(unsigned int base16Length)
{
return base16Length / 2U;
}
CWebServices::CWebServices()
{
m_tDefServicesFileLastModified = 0;
}
CString CWebServices::GetDefaultServicesFile() const
{
return thePrefs.GetConfigDir() + _T("webservices.dat");
}
void CWebServices::RemoveAllServices()
{
m_aServices.RemoveAll();
m_tDefServicesFileLastModified = 0;
}
int CWebServices::ReadAllServices()
{
RemoveAllServices();
CString strFilePath = GetDefaultServicesFile();
FILE* readFile = _tfsopen(strFilePath, _T("r"), _SH_DENYWR);
if (readFile != NULL)
{
CString name, url, sbuffer;
while (!feof(readFile))
{
TCHAR buffer[1024];
if (_fgetts(buffer, ARRSIZE(buffer), readFile) == NULL)
break;
sbuffer = buffer;
// ignore comments & too short lines
if (sbuffer.GetAt(0) == _T('#') || sbuffer.GetAt(0) == _T('/') || sbuffer.GetLength() < 5)
continue;
int iPos = sbuffer.Find(_T(','));
if (iPos > 0)
{
CString strUrlTemplate = sbuffer.Right(sbuffer.GetLength() - iPos - 1).Trim();
if (!strUrlTemplate.IsEmpty())
{
bool bFileMacros = false;
static const LPCTSTR _apszMacros[] = { _T("#hashid"), _T("#filesize"), _T("#filename") };
for (int i = 0; i < ARRSIZE(_apszMacros); i++)
{
if (strUrlTemplate.Find(_apszMacros[i]) != -1)
{
bFileMacros = true;
break;
}
}
SEd2kLinkService svc;
svc.uMenuID = MP_WEBURL + m_aServices.GetCount();
svc.strMenuLabel = sbuffer.Left(iPos).Trim();
svc.strUrl = strUrlTemplate;
svc.bFileMacros = bFileMacros;
m_aServices.Add(svc);
}
}
}
fclose(readFile);
struct _stat st;
if (_tstat(strFilePath, &st) == 0)
m_tDefServicesFileLastModified = st.st_mtime;
}
return m_aServices.GetCount();
}
int CWebServices::GetAllMenuEntries(CMenu& rMenu, DWORD dwFlags)
{
if (m_aServices.GetCount() == 0)
{
ReadAllServices();
}
else
{
struct _stat st;
if (_tstat(GetDefaultServicesFile(), &st) == 0 && st.st_mtime > m_tDefServicesFileLastModified)
ReadAllServices();
}
int iMenuEntries = 0;
for (int i = 0; i < m_aServices.GetCount(); i++)
{
const SEd2kLinkService& rSvc = m_aServices.GetAt(i);
if ((dwFlags & WEBSVC_GEN_URLS) && rSvc.bFileMacros)
continue;
if ((dwFlags & WEBSVC_FILE_URLS) && !rSvc.bFileMacros)
continue;
if (rMenu.AppendMenu(MF_STRING, MP_WEBURL + i, rSvc.strMenuLabel))
iMenuEntries++;
}
return iMenuEntries;
}
bool CWebServices::RunURL(const CAbstractFile* file, UINT uMenuID)
{
for (int i = 0; i < m_aServices.GetCount(); i++)
{
const SEd2kLinkService& rSvc = m_aServices.GetAt(i);
if (rSvc.uMenuID == uMenuID)
{
CString strUrlTemplate = rSvc.strUrl;
if (file != NULL)
{
// Convert hash to hexadecimal text and add it to the URL
strUrlTemplate.Replace(_T("#hashid"), md4str(file->GetFileHash()));
// Add file size to the URL
CString temp;
temp.Format(_T("%u"), file->GetFileSize());
strUrlTemplate.Replace(_T("#filesize"), temp);
// add filename to the url
strUrlTemplate.Replace(_T("#filename"), URLEncode(file->GetFileName()));
}
// Open URL
TRACE("Starting URL: %s\n", strUrlTemplate);
return (int)ShellExecute(NULL, NULL, strUrlTemplate, NULL, thePrefs.GetAppDir(), SW_SHOWDEFAULT) > 32;
}
}
return false;
}
void CWebServices::Edit()
{
ShellExecute(NULL, _T("open"), thePrefs.GetTxtEditor(), _T("\"") + thePrefs.GetConfigDir() + _T("webservices.dat\""), NULL, SW_SHOW);
}
typedef struct
{
LPCTSTR pszInitialDir;
LPCTSTR pszDlgTitle;
} BROWSEINIT, *LPBROWSEINIT;
extern "C" int CALLBACK BrowseCallbackProc(HWND hWnd, UINT uMsg, LPARAM /*lParam*/, LPARAM lpData)
{
if (uMsg == BFFM_INITIALIZED)
{
// Set initial directory
if ( ((LPBROWSEINIT)lpData)->pszInitialDir != NULL )
SendMessage(hWnd, BFFM_SETSELECTION, TRUE, (LPARAM)((LPBROWSEINIT)lpData)->pszInitialDir);
// Set dialog's window title
if ( ((LPBROWSEINIT)lpData)->pszDlgTitle != NULL )
SendMessage(hWnd, WM_SETTEXT, 0, (LPARAM)((LPBROWSEINIT)lpData)->pszDlgTitle);
}
return 0;
}
bool SelectDir(HWND hWnd, LPTSTR pszPath, LPCTSTR pszTitle, LPCTSTR pszDlgTitle)
{
BOOL bResult = FALSE;
CoInitialize(0);
LPMALLOC pShlMalloc;
if (SHGetMalloc(&pShlMalloc) == NOERROR)
{
BROWSEINFO BrsInfo = {0};
BrsInfo.hwndOwner = hWnd;
BrsInfo.lpszTitle = (pszTitle != NULL) ? pszTitle : pszDlgTitle;
BrsInfo.ulFlags = BIF_VALIDATE | BIF_NEWDIALOGSTYLE | BIF_RETURNONLYFSDIRS | BIF_SHAREABLE | BIF_DONTGOBELOWDOMAIN;
BROWSEINIT BrsInit = {0};
if (pszPath != NULL || pszTitle != NULL || pszDlgTitle != NULL){
// Need the 'BrowseCallbackProc' to set those strings
BrsInfo.lpfn = BrowseCallbackProc;
BrsInfo.lParam = (LPARAM)&BrsInit;
BrsInit.pszDlgTitle = (pszDlgTitle != NULL) ? pszDlgTitle : NULL/*pszTitle*/;
BrsInit.pszInitialDir = pszPath;
}
LPITEMIDLIST pidlBrowse;
if ((pidlBrowse = SHBrowseForFolder(&BrsInfo)) != NULL){
if (SHGetPathFromIDList(pidlBrowse, pszPath))
bResult = TRUE;
pShlMalloc->Free(pidlBrowse);
}
pShlMalloc->Release();
}
CoUninitialize();
return bResult;
}
void MakeFoldername(TCHAR* path){
// CString string(path);
// if (string.GetLength()>0) if (string.Right(1)=='\\') string=string.Left(string.GetLength()-1);
// sprintf(path,"%s",string);
CString strPath(path);
PathCanonicalize(path, strPath);
PathRemoveBackslash(path);
}
CString StringLimit(CString in,uint16 length){
if (in.GetLength()<=length || length<10) return in;
return (in.Left(length-8) + _T("...") + in.Right(8));
}
BOOL DialogBrowseFile(CString& rstrPath, LPCTSTR pszFilters, LPCTSTR pszDefaultFileName, DWORD dwFlags,bool openfilestyle) {
CFileDialog myFileDialog(openfilestyle,NULL,pszDefaultFileName,
dwFlags | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, pszFilters, NULL,
0/*automatically use explorer style open dialog on systems which support it*/);
if (myFileDialog.DoModal() != IDOK)
return FALSE;
rstrPath = myFileDialog.GetPathName();
return TRUE;
}
void md4str(const uchar* hash, TCHAR* pszHash)
{
static const TCHAR _acHexDigits[] = _T("0123456789ABCDEF");
for (int i = 0; i < 16; i++){
*pszHash++ = _acHexDigits[hash[i] >> 4];
*pszHash++ = _acHexDigits[hash[i] & 0xf];
}
*pszHash = _T('\0');
}
CString md4str(const uchar* hash)
{
TCHAR szHash[MAX_HASHSTR_SIZE];
md4str(hash, szHash);
return CString(szHash);
}
void md4strA(const uchar* hash, CHAR* pszHash)
{
static const CHAR _acHexDigits[] = "0123456789ABCDEF";
for (int i = 0; i < 16; i++){
*pszHash++ = _acHexDigits[hash[i] >> 4];
*pszHash++ = _acHexDigits[hash[i] & 0xf];
}
*pszHash = '\0';
}
CStringA md4strA(const uchar* hash)
{
CHAR szHash[MAX_HASHSTR_SIZE];
md4strA(hash, szHash);
return CStringA(szHash);
}
bool strmd4(const char* pszHash, uchar* hash)
{
memset(hash, 0, 16);
for (int i = 0; i < 16; i++)
{
char byte[3];
byte[0] = pszHash[i*2+0];
byte[1] = pszHash[i*2+1];
byte[2] = '\0';
UINT b;
if (sscanf(byte, "%x", &b) != 1)
return false;
hash[i] = b;
}
return true;
}
bool strmd4(const CString& rstr, uchar* hash)
{
memset(hash, 0, 16);
if (rstr.GetLength() != 16*2)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -