📄 otherfunctions.cpp
字号:
//this file is part of eMule
//Copyright (C)2002 Merkur ( devs@emule-project.net / http://www.emule-project.net )
//
//This program is free software; you can redistribute it and/or
//modify it under the terms of the GNU General Public License
//as published by the Free Software Foundation; either
//version 2 of the License, or (at your option) any later version.
//
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//GNU General Public License for more details.
//
//You should have received a copy of the GNU General Public License
//along with this program; if not, write to the Free Software
//Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#include "stdafx.h"
#include <sys/stat.h>
#include <share.h>
#include <io.h>
#include "emule.h"
#include "OtherFunctions.h"
#include "DownloadQueue.h"
#include "Preferences.h"
#include "PartFile.h"
#include "SharedFileList.h"
#include "UpDownClient.h"
#include "Opcodes.h"
#include "WebServices.h"
#include <shlobj.h>
#include "emuledlg.h"
#include "MenuCmds.h"
#include "ZipFile.h"
#include <atlbase.h>
#include "StringConversion.h"
#include "shahashset.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
CWebServices theWebServices;
// Base chars for encode an decode functions
static byte base16Chars[17] = "0123456789ABCDEF";
static byte base32Chars[33] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
#define BASE16_LOOKUP_MAX 23
static byte base16Lookup[BASE16_LOOKUP_MAX][2] = {
{ '0', 0x0 },
{ '1', 0x1 },
{ '2', 0x2 },
{ '3', 0x3 },
{ '4', 0x4 },
{ '5', 0x5 },
{ '6', 0x6 },
{ '7', 0x7 },
{ '8', 0x8 },
{ '9', 0x9 },
{ ':', 0x9 },
{ ';', 0x9 },
{ '<', 0x9 },
{ '=', 0x9 },
{ '>', 0x9 },
{ '?', 0x9 },
{ '@', 0x9 },
{ 'A', 0xA },
{ 'B', 0xB },
{ 'C', 0xC },
{ 'D', 0xD },
{ 'E', 0xE },
{ 'F', 0xF }
};
CString CastItoXBytes(uint16 count, bool isK, bool isPerSec, uint32 decimal){
return CastItoXBytes((double)count, isK, isPerSec, decimal);
}
CString CastItoXBytes(uint32 count, bool isK, bool isPerSec, uint32 decimal){
return CastItoXBytes((double)count, isK, isPerSec, decimal);
}
CString CastItoXBytes(uint64 count, bool isK, bool isPerSec, uint32 decimal){
return CastItoXBytes((double)count, isK, isPerSec, decimal);
}
CString CastItoXBytes(float count, bool isK, bool isPerSec, uint32 decimal){
return CastItoXBytes((double)count, isK, isPerSec, decimal);
}
CString CastItoXBytes(double count, bool isK, bool isPerSec, uint32 decimal){
if( count <= 0.0 )
{
if(isPerSec)
return _T("0 ") + GetResString(IDS_BYTESPERSEC);
else
return _T("0 ") + GetResString(IDS_BYTES);
}
else if( isK )
{
if( count > 1.7E+300 )
count = 1.7E+300;
else
count *= 1024.0;
}
CString buffer;
if( isPerSec )
{
if (count < 1024.0)
buffer.Format(_T("%.0f %s"), count, GetResString(IDS_BYTESPERSEC));
else if (count < 1024000.0)
buffer.Format(_T("%.*f %s"), decimal, count/1024.0, GetResString(IDS_KBYTESPERSEC));
else if (count < 1048576000.0)
buffer.Format(_T("%.*f %s"), decimal, count/1048576.0, GetResString(IDS_MBYTESPERSEC));
else if (count < 1073741824000.0)
buffer.Format(_T("%.*f %s"), decimal, count/1073741824.0, GetResString(IDS_GBYTESPERSEC));
else
buffer.Format(_T("%.*f %s"), decimal, count/1099511627776.0, GetResString(IDS_TBYTESPERSEC));
}
else
{
if (count < 1024.0)
buffer.Format(_T("%.0f %s"), count, GetResString(IDS_BYTES));
else if (count < 1024000.0)
buffer.Format(_T("%.*f %s"), decimal, count/1024.0, GetResString(IDS_KBYTES));
else if (count < 1048576000.0)
buffer.Format(_T("%.*f %s"), decimal, count/1048576.0, GetResString(IDS_MBYTES));
else if (count < 1073741824000.0)
buffer.Format(_T("%.*f %s"), decimal, count/1073741824.0, GetResString(IDS_GBYTES));
else
buffer.Format(_T("%.*f %s"), decimal, count/1099511627776.0, GetResString(IDS_TBYTES));
}
return buffer;
}
CString CastItoIShort(uint16 count, bool isK, uint32 decimal){
return CastItoIShort((double)count, isK, decimal);
}
CString CastItoIShort(uint32 count, bool isK, uint32 decimal){
return CastItoIShort((double)count, isK, decimal);
}
CString CastItoIShort(uint64 count, bool isK, uint32 decimal){
return CastItoIShort((double)count, isK, decimal);
}
CString CastItoIShort(float count, bool isK, uint32 decimal){
return CastItoIShort((double)count, isK, decimal);
}
CString CastItoIShort(double count, bool isK, uint32 decimal){
if( count <= 0.0 )
{
return _T("0");
}
else if( isK )
{
if( count > 1.7E+300 )
count = 1.7E+300;
else
count *= 1000.0;
}
CString output;
if (count < 1000.0)
output.Format(_T("%.0f"), count);
else if (count < 1000000.0)
output.Format(_T("%.*f%s"), decimal, count/1000.0, GetResString(IDS_KILO));
else if (count < 1000000000.0)
output.Format(_T("%.*f%s"), decimal, count/1000000.0, GetResString(IDS_MEGA));
else if (count < 1000000000000.0)
output.Format(_T("%.*f%s"), decimal, count/1000000000.0, GetResString(IDS_GIGA));
else if (count < 1000000000000000.0)
output.Format(_T("%.*f%s"), decimal, count/1000000000000.0, GetResString(IDS_TERRA));
return output;
}
CString CastSecondsToHM(sint32 count){
CString buffer;
if (count < 0)
buffer = _T("?");
else if (count < 60)
buffer.Format(_T("%i %s"),count,GetResString(IDS_SECS));
else if (count < 3600)
buffer.Format(_T("%i:%s %s"),count/60,LeadingZero(count-(count/60)*60),GetResString(IDS_MINS));
else if (count < 86400)
buffer.Format(_T("%i:%s %s"),count/3600,LeadingZero((count-(count/3600)*3600)/60),GetResString(IDS_HOURS));
else
buffer.Format(_T("%i %s %i %s"),count/86400,GetResString(IDS_DAYS),(count-(count/86400)*86400)/3600,GetResString(IDS_HOURS));
return buffer;
}
// -khaos--+++> Prettier.
CString CastSecondsToLngHM(__int64 count){
CString buffer;
if (count < 0)
buffer = _T("?");
else if (count < 60)
buffer.Format(_T("%I64d %s"),count,GetResString(IDS_LONGSECS));
else if (count < 3600)
buffer.Format(_T("%I64d:%s %s"),count/60,LeadingZero(count-(count/60)*60),GetResString(IDS_LONGMINS));
else if (count < 86400)
buffer.Format(_T("%I64d:%s %s"),count/3600,LeadingZero((count-(count/3600)*3600)/60),GetResString(IDS_LONGHRS));
else {
__int64 cntDays = count/86400;
__int64 cntHrs = (count-(count/86400)*86400)/3600;
if (cntHrs)
buffer.Format(_T("%I64d %s %I64d:%s %s"),cntDays,GetResString(IDS_DAYS2),cntHrs,LeadingZero((uint32)(count-(cntDays*86400)-(cntHrs*3600))/60),GetResString(IDS_LONGHRS));
else
buffer.Format(_T("%I64d %s %u %s"),cntDays,GetResString(IDS_DAYS2),(uint32)(count-(cntDays*86400)-(cntHrs*3600))/60,GetResString(IDS_LONGMINS));
}
return buffer;
}
// <-----khaos-
CString LeadingZero(uint32 units) {
CString temp;
if (units<10) temp.Format(_T("0%i"),units); else temp.Format(_T("%i"),units);
return temp;
}
//<<--9/21/02
void ShellOpenFile(CString name){
ShellExecute(NULL, _T("open"), name, NULL, NULL, SW_SHOW);
}
void ShellOpenFile(CString name, LPCTSTR pszVerb){
ShellExecute(NULL, pszVerb, name, NULL, NULL, SW_SHOW);
}
namespace {
bool IsHexDigit(int c) {
switch (c) {
case '0': return true;
case '1': return true;
case '2': return true;
case '3': return true;
case '4': return true;
case '5': return true;
case '6': return true;
case '7': return true;
case '8': return true;
case '9': return true;
case 'A': return true;
case 'B': return true;
case 'C': return true;
case 'D': return true;
case 'E': return true;
case 'F': return true;
case 'a': return true;
case 'b': return true;
case 'c': return true;
case 'd': return true;
case 'e': return true;
case 'f': return true;
default: return false;
}
}
}
CString URLDecode(const CString& inStr)
{
// decode escape sequences
CString res;
for (int x = 0; x < inStr.GetLength(); x++)
{
if (inStr.GetAt(x) == _T('%') && x + 2 < inStr.GetLength() && IsHexDigit(inStr.GetAt(x+1)) && IsHexDigit(inStr.GetAt(x+2)))
{
TCHAR hexstr[3];
_tcsncpy(hexstr, inStr.Mid(x+1, 2), 2);
hexstr[2] = _T('\0');
x += 2;
// Convert the hex to ASCII
res.AppendChar((TCHAR)_tcstoul(hexstr, NULL, 16));
}
else
{
res.AppendChar(inStr.GetAt(x));
}
}
return res;
}
CString URLEncode(const CString& sInT)
{
CStringA sIn(sInT);
LPCSTR pInBuf = sIn;
CString sOut;
LPTSTR pOutBuf = sOut.GetBuffer(sIn.GetLength() * 3);
if(pOutBuf)
{
// do encoding
while (*pInBuf)
{
if (_istalnum((_TUCHAR)*pInBuf))
*pOutBuf++ = (BYTE)*pInBuf;
else if (_istspace((_TUCHAR)*pInBuf))
*pOutBuf++ = _T('+');
else
{
*pOutBuf++ = _T('%');
*pOutBuf++ = toHex((BYTE)*pInBuf >> 4);
*pOutBuf++ = toHex((BYTE)*pInBuf % 16);
}
pInBuf++;
}
*pOutBuf = _T('\0');
sOut.ReleaseBuffer();
}
return sOut;
}
CString MakeStringEscaped(CString in)
{
in.Replace(_T("&"), _T("&&"));
return in;
}
bool HaveEd2kRegAccess()
{
CRegKey regkey;
DWORD dwRegResult = regkey.Create(HKEY_CLASSES_ROOT, _T("ed2k\\shell\\open\\command"));
regkey.Close();
return (dwRegResult == ERROR_SUCCESS);
}
bool Ask4RegFix(bool checkOnly, bool dontAsk)
{
// Barry - Make backup first
if (!checkOnly)
BackupReg();
// check registry if ed2k links is assigned to emule
CRegKey regkey;
if (regkey.Create(HKEY_CLASSES_ROOT, _T("ed2k\\shell\\open\\command")) == ERROR_SUCCESS)
{
TCHAR rbuffer[500];
ULONG maxsize = ARRSIZE(rbuffer);
regkey.QueryStringValue(NULL, rbuffer, &maxsize);
TCHAR modbuffer[490];
::GetModuleFileName(NULL, modbuffer, ARRSIZE(modbuffer));
CString strCanonFileName = modbuffer;
strCanonFileName.Replace(_T("%"), _T("%%"));
TCHAR regbuffer[520];
_sntprintf(regbuffer, ARRSIZE(regbuffer), _T("\"%s\" \"%%1\""), strCanonFileName);
if (_tcscmp(rbuffer, regbuffer) != 0)
{
if (checkOnly)
return true;
if (dontAsk || (AfxMessageBox(GetResString(IDS_ASSIGNED2K), MB_ICONQUESTION|MB_YESNO) == IDYES))
{
regkey.SetStringValue(NULL, regbuffer);
regkey.Create(HKEY_CLASSES_ROOT, _T("ed2k\\DefaultIcon"));
regkey.SetStringValue(NULL, modbuffer);
regkey.Create(HKEY_CLASSES_ROOT, _T("ed2k"));
regkey.SetStringValue(NULL, _T("URL: ed2k Protocol"));
regkey.SetStringValue(_T("URL Protocol"), _T(""));
regkey.Open(HKEY_CLASSES_ROOT, _T("ed2k"));
regkey.RecurseDeleteKey(_T("ddexec"));
regkey.RecurseDeleteKey(_T("ddeexec"));
}
}
regkey.Close();
}
return false;
}
void BackupReg(void)
{
// Look for pre-existing old ed2k links
CRegKey regkey;
if (regkey.Create(HKEY_CLASSES_ROOT, _T("ed2k\\shell\\open\\command")) == ERROR_SUCCESS)
{
TCHAR rbuffer[500];
ULONG maxsize = ARRSIZE(rbuffer);
// Is it ok to write new values
if ((regkey.QueryStringValue(_T("OldDefault"), rbuffer, &maxsize) != ERROR_SUCCESS) || (maxsize == 0))
{
maxsize = ARRSIZE(rbuffer);
if ( regkey.QueryStringValue(NULL, rbuffer, &maxsize) == ERROR_SUCCESS )
regkey.SetStringValue(_T("OldDefault"), rbuffer);
regkey.Create(HKEY_CLASSES_ROOT, _T("ed2k\\DefaultIcon"));
maxsize = ARRSIZE(rbuffer);
if (regkey.QueryStringValue(NULL, rbuffer, &maxsize) == ERROR_SUCCESS)
regkey.SetStringValue(_T("OldIcon"), rbuffer);
}
regkey.Close();
}
}
// Barry - Restore previous values
void RevertReg(void)
{
// restore previous ed2k links before being assigned to emule
CRegKey regkey;
if (regkey.Create(HKEY_CLASSES_ROOT, _T("ed2k\\shell\\open\\command")) == ERROR_SUCCESS)
{
TCHAR rbuffer[500];
ULONG maxsize = ARRSIZE(rbuffer);
if (regkey.QueryStringValue(_T("OldDefault"), rbuffer, &maxsize) == ERROR_SUCCESS)
{
regkey.SetStringValue(NULL, rbuffer);
regkey.DeleteValue(_T("OldDefault"));
regkey.Create(HKEY_CLASSES_ROOT, _T("ed2k\\DefaultIcon"));
maxsize = ARRSIZE(rbuffer);
if (regkey.QueryStringValue(_T("OldIcon"), rbuffer, &maxsize) == ERROR_SUCCESS)
{
regkey.SetStringValue(NULL, rbuffer);
regkey.DeleteValue(_T("OldIcon"));
}
}
regkey.Close();
}
}
int GetMaxWindowsTCPConnections() {
OSVERSIONINFOEX osvi;
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
if(!GetVersionEx((OSVERSIONINFO*)&osvi)) {
//if OSVERSIONINFOEX doesn't work, try OSVERSIONINFO
osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
if(!GetVersionEx((OSVERSIONINFO*)&osvi))
return -1; //shouldn't ever happen
}
if(osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) // Windows NT product family
return -1; //no limits
if(osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { // Windows 95 product family
if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0) { //old school 95
HKEY hKey;
DWORD dwValue;
DWORD dwLength = sizeof(dwValue);
LONG lResult;
RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("System\\CurrentControlSet\\Services\\VxD\\MSTCP"),
0, KEY_QUERY_VALUE, &hKey);
lResult = RegQueryValueEx(hKey, TEXT("MaxConnections"), NULL, NULL,
(LPBYTE)&dwValue, &dwLength);
RegCloseKey(hKey);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -