📄 emule.cpp
字号:
TCHAR szSkinResFolder[MAX_PATH];
_tcsncpy(szSkinResFolder, pszSkinProfile, ARRSIZE(szSkinResFolder));
szSkinResFolder[ARRSIZE(szSkinResFolder)-1] = _T('\0');
PathRemoveFileSpec(szSkinResFolder);
_tmakepath(szFullResPath, NULL, szSkinResFolder, szSkinResource, NULL);
}
else
{
_tcsncpy(szFullResPath, szSkinResource, ARRSIZE(szFullResPath));
szFullResPath[ARRSIZE(szFullResPath)-1] = _T('\0');
}
CEnBitmap bmp;
if (bmp.LoadImage(szFullResPath))
return (HBITMAP)bmp.Detach();
}
}
CEnBitmap bmp;
if (bmp.LoadImage(lpszResourceName, pszResourceType))
return (HBITMAP)bmp.Detach();
return NULL;
}
CString CemuleApp::GetSkinFileItem(LPCTSTR lpszResourceName, LPCTSTR pszResourceType) const
{
LPCTSTR pszSkinProfile = thePrefs.GetSkinProfile();
if (pszSkinProfile != NULL && pszSkinProfile[0] != _T('\0'))
{
// load resource file specification from skin profile
TCHAR szSkinResource[MAX_PATH];
GetPrivateProfileString(pszResourceType, lpszResourceName, _T(""), szSkinResource, ARRSIZE(szSkinResource), pszSkinProfile);
if (szSkinResource[0] != _T('\0'))
{
// expand any optional available environment strings
TCHAR szExpSkinRes[MAX_PATH];
if (ExpandEnvironmentStrings(szSkinResource, szExpSkinRes, ARRSIZE(szExpSkinRes)) != 0)
{
_tcsncpy(szSkinResource, szExpSkinRes, ARRSIZE(szSkinResource));
szSkinResource[ARRSIZE(szSkinResource)-1] = _T('\0');
}
// create absolute path to resource file
TCHAR szFullResPath[MAX_PATH];
if (PathIsRelative(szSkinResource))
{
TCHAR szSkinResFolder[MAX_PATH];
_tcsncpy(szSkinResFolder, pszSkinProfile, ARRSIZE(szSkinResFolder));
szSkinResFolder[ARRSIZE(szSkinResFolder)-1] = _T('\0');
PathRemoveFileSpec(szSkinResFolder);
_tmakepath(szFullResPath, NULL, szSkinResFolder, szSkinResource, NULL);
}
else
{
_tcsncpy(szFullResPath, szSkinResource, ARRSIZE(szFullResPath));
szFullResPath[ARRSIZE(szFullResPath)-1] = _T('\0');
}
return szFullResPath;
}
}
return _T("");
}
bool CemuleApp::LoadSkinColor(LPCTSTR pszKey, COLORREF& crColor) const
{
LPCTSTR pszSkinProfile = thePrefs.GetSkinProfile();
if (pszSkinProfile != NULL && pszSkinProfile[0] != _T('\0'))
{
TCHAR szColor[MAX_PATH];
GetPrivateProfileString(_T("Colors"), pszKey, _T(""), szColor, ARRSIZE(szColor), pszSkinProfile);
if (szColor[0] != _T('\0'))
{
UINT red, grn, blu;
int iVals = _stscanf(szColor, _T("%i , %i , %i"), &red, &grn, &blu);
if (iVals == 3)
{
crColor = RGB(red, grn, blu);
return true;
}
}
}
return false;
}
bool CemuleApp::LoadSkinColorAlt(LPCTSTR pszKey, LPCTSTR pszAlternateKey, COLORREF& crColor) const
{
if (LoadSkinColor(pszKey, crColor))
return true;
return LoadSkinColor(pszAlternateKey, crColor);
}
void CemuleApp::ApplySkin(LPCTSTR pszSkinProfile)
{
thePrefs.SetSkinProfile(pszSkinProfile);
AfxGetMainWnd()->SendMessage(WM_SYSCOLORCHANGE);
}
CTempIconLoader::CTempIconLoader(LPCTSTR pszResourceID, int cx, int cy, UINT uFlags)
{
m_hIcon = theApp.LoadIcon(pszResourceID, cx, cy, uFlags);
}
CTempIconLoader::CTempIconLoader(UINT uResourceID, int cx, int cy, UINT uFlags)
{
ASSERT( uFlags == 0 );
m_hIcon = theApp.LoadIcon(uResourceID);
}
CTempIconLoader::~CTempIconLoader()
{
if (m_hIcon)
VERIFY( DestroyIcon(m_hIcon) );
}
void CemuleApp::AddEd2kLinksToDownload(CString strlink, uint8 cat)
{
int curPos = 0;
CString resToken = strlink.Tokenize(_T("\t\n\r"), curPos);
while (resToken != _T(""))
{
if (resToken.Right(1) != _T("/"))
resToken += _T("/");
try
{
CED2KLink* pLink = CED2KLink::CreateLinkFromUrl(resToken.Trim());
if (pLink)
{
if (pLink->GetKind() == CED2KLink::kFile)
{
downloadqueue->AddFileLinkToDownload(pLink->GetFileLink(), cat);
}
else
{
delete pLink;
throw CString(_T("bad link"));
}
delete pLink;
}
}
catch(CString error)
{
TCHAR szBuffer[200];
_sntprintf(szBuffer, ARRSIZE(szBuffer), GetResString(IDS_ERR_INVALIDLINK), error);
LogError(LOG_STATUSBAR, GetResString(IDS_ERR_LINKERROR), szBuffer);
}
resToken = strlink.Tokenize(_T("\t\n\r"), curPos);
}
}
void CemuleApp::SearchClipboard()
{
if (m_bGuardClipboardPrompt)
return;
CString strLinks = CopyTextFromClipboard();
if (strLinks.IsEmpty())
return;
if (strLinks.Compare(m_strLastClipboardContents) == 0)
return;
if (strLinks.Left(13).CompareNoCase(_T("ed2k://|file|")) == 0)
{
m_bGuardClipboardPrompt = true;
if (AfxMessageBox(GetResString(IDS_ED2KLINKFIX) + _T("\r\n\r\n") + GetResString(IDS_ADDDOWNLOADSFROMCB)+_T("\r\n") + strLinks, MB_YESNO | MB_TOPMOST) == IDYES)
AddEd2kLinksToDownload(strLinks, 0);
}
m_strLastClipboardContents = strLinks;
m_bGuardClipboardPrompt = false;
}
void CemuleApp::PasteClipboard(uint8 uCategory)
{
CString strLinks = CopyTextFromClipboard();
strLinks.Trim();
if (strLinks.IsEmpty())
return;
AddEd2kLinksToDownload(strLinks, uCategory);
}
bool CemuleApp::IsEd2kLinkInClipboard(LPCSTR pszLinkType, int iLinkTypeLen)
{
bool bFoundLink = false;
if (IsClipboardFormatAvailable(CF_TEXT))
{
if (OpenClipboard(NULL))
{
HGLOBAL hText = GetClipboardData(CF_TEXT);
if (hText != NULL)
{
// Use the ANSI string
LPCSTR pszText = (LPCSTR)GlobalLock(hText);
if (pszText != NULL)
{
while (*pszText == ' ' || *pszText == '\t' || *pszText == '\r' || *pszText == '\n')
pszText++;
bFoundLink = (strncmp(pszText, pszLinkType, iLinkTypeLen) == 0);
GlobalUnlock(hText);
}
}
CloseClipboard();
}
}
return bFoundLink;
}
bool CemuleApp::IsEd2kFileLinkInClipboard()
{
static const CHAR _szEd2kFileLink[] = "ed2k://|file|"; // Use the ANSI string
return IsEd2kLinkInClipboard(_szEd2kFileLink, ARRSIZE(_szEd2kFileLink)-1);
}
bool CemuleApp::IsEd2kServerLinkInClipboard()
{
static const CHAR _szEd2kServerLink[] = "ed2k://|server|"; // Use the ANSI string
return IsEd2kLinkInClipboard(_szEd2kServerLink, ARRSIZE(_szEd2kServerLink)-1);
}
// Added by MoNKi [MoNKi: -UPnPNAT Support-]
BOOL CemuleApp::AddUPnPNatPort(MyUPnP::UPNPNAT_MAPPING *mapping, bool tryRandom){
CString args;
if(m_UPnPNat.AddNATPortMapping(mapping, tryRandom) == MyUPnP::UNAT_OK ){
if(theApp.emuledlg->IsRunning()){
AddLogLine(false, _T("Added UPnP NAT Support: (%s) NAT ROUTER/FIREWALL:%i -> %s:%i"),
mapping->description, mapping->externalPort, m_UPnPNat.GetLocalIPStr(), mapping->internalPort);
}
return true;
}
else{
if(theApp.emuledlg->IsRunning()){
//AddLogLine(false, _T("Error adding UPnP NAT Support: (%s) NAT ROUTER/FIREWALL:%i -> %s:%i (%s)"), mapping->description, mapping->externalPort, m_UPnPNat.GetLocalIPStr(), mapping->internalPort, m_UPnPNat.GetLastError());
}
return false;
}
}
BOOL CemuleApp::RemoveUPnPNatPort(MyUPnP::UPNPNAT_MAPPING *mapping){
if(m_UPnPNat.RemoveNATPortMapping(*mapping) == MyUPnP::UNAT_OK )
return true;
else
return false;
}
// Elandal:ThreadSafeLogging -->
void CemuleApp::QueueDebugLogLine(bool addtostatusbar, LPCTSTR line, ...)
{
if (!thePrefs.GetVerbose())
return;
m_queueLock.Lock();
TCHAR bufferline[1000];
va_list argptr;
va_start(argptr, line);
_vsntprintf(bufferline, ARRSIZE(bufferline), line, argptr);
va_end(argptr);
SLogItem* newItem = new SLogItem;
newItem->uFlags = LOG_DEBUG | LOG_STATUSBAR;
newItem->line = bufferline;
m_QueueDebugLog.AddTail(newItem);
m_queueLock.Unlock();
}
void CemuleApp::QueueLogLine(bool addtostatusbar, LPCTSTR line,...)
{
m_queueLock.Lock();
TCHAR bufferline[1000];
va_list argptr;
va_start(argptr, line);
_vsntprintf(bufferline, ARRSIZE(bufferline), line, argptr);
va_end(argptr);
SLogItem* newItem = new SLogItem;
newItem->uFlags = LOG_STATUSBAR;
newItem->line = bufferline;
m_QueueLog.AddTail(newItem);
m_queueLock.Unlock();
}
void CemuleApp::QueueDebugLogLineEx(UINT uFlags, LPCTSTR line, ...)
{
if (!thePrefs.GetVerbose())
return;
m_queueLock.Lock();
TCHAR bufferline[1000];
va_list argptr;
va_start(argptr, line);
_vsntprintf(bufferline, ARRSIZE(bufferline), line, argptr);
va_end(argptr);
SLogItem* newItem = new SLogItem;
newItem->uFlags = uFlags | LOG_DEBUG;
newItem->line = bufferline;
m_QueueDebugLog.AddTail(newItem);
m_queueLock.Unlock();
}
void CemuleApp::QueueLogLineEx(UINT uFlags, LPCTSTR line, ...)
{
m_queueLock.Lock();
TCHAR bufferline[1000];
va_list argptr;
va_start(argptr, line);
_vsntprintf(bufferline, ARRSIZE(bufferline), line, argptr);
va_end(argptr);
SLogItem* newItem = new SLogItem;
newItem->uFlags = uFlags;
newItem->line = bufferline;
m_QueueLog.AddTail(newItem);
m_queueLock.Unlock();
}
void CemuleApp::HandleDebugLogQueue()
{
m_queueLock.Lock();
while (!m_QueueDebugLog.IsEmpty())
{
const SLogItem* newItem = m_QueueDebugLog.RemoveHead();
if (thePrefs.GetVerbose())
Log(newItem->uFlags, _T("%s"), newItem->line);
delete newItem;
}
m_queueLock.Unlock();
}
void CemuleApp::HandleLogQueue()
{
m_queueLock.Lock();
while (!m_QueueLog.IsEmpty())
{
const SLogItem* newItem = m_QueueLog.RemoveHead();
Log(newItem->uFlags, _T("%s"), newItem->line);
delete newItem;
}
m_queueLock.Unlock();
}
void CemuleApp::ClearDebugLogQueue(bool bDebugPendingMsgs)
{
m_queueLock.Lock();
while(!m_QueueDebugLog.IsEmpty())
{
if (bDebugPendingMsgs)
TRACE("Queued dbg log msg: %s\n", m_QueueDebugLog.GetHead()->line);
delete m_QueueDebugLog.RemoveHead();
}
m_queueLock.Unlock();
}
void CemuleApp::ClearLogQueue(bool bDebugPendingMsgs)
{
m_queueLock.Lock();
while(!m_QueueLog.IsEmpty())
{
if (bDebugPendingMsgs)
TRACE("Queued log msg: %s\n", m_QueueLog.GetHead()->line);
delete m_QueueLog.RemoveHead();
}
m_queueLock.Unlock();
}
// Elandal:ThreadSafeLogging <--
void CemuleApp::CreateAllFonts()
{
///////////////////////////////////////////////////////////////////////////
// Symbol font
//
VERIFY( m_fontSymbol.CreatePointFont(10 * 10, _T("Marlett")) );
///////////////////////////////////////////////////////////////////////////
// Log-, Message- and IRC-Window fonts
//
LPLOGFONT plfHyperText = thePrefs.GetHyperTextLogFont();
if (plfHyperText==NULL || plfHyperText->lfFaceName[0]==_T('\0') || !m_fontHyperText.CreateFontIndirect(plfHyperText))
m_fontHyperText.CreatePointFont(10 * 10, _T("MS Shell Dlg"));
LPLOGFONT plfLog = thePrefs.GetLogFont();
if (plfLog!=NULL && plfLog->lfFaceName[0]!=_T('\0'))
m_fontLog.CreateFontIndirect(plfLog);
// Why can't this font set via the font dialog??
// HFONT hFontMono = CreateFont(10, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, _T("Lucida Console"));
// m_fontLog.Attach(hFontMono);
///////////////////////////////////////////////////////////////////////////
// Default GUI Font (Bold)
//
CFont* pFont = CFont::FromHandle((HFONT)GetStockObject(DEFAULT_GUI_FONT));
if (pFont)
{
LOGFONT lf;
pFont->GetLogFont(&lf);
lf.lfWeight = FW_BOLD;
VERIFY( m_fontDefaultBold.CreateFontIndirect(&lf) );
}
}
void CemuleApp::CreateBackwardDiagonalBrush()
{
static const WORD awBackwardDiagonalBrushPattern[8] = { 0x0f, 0x1e, 0x3c, 0x78, 0xf0, 0xe1, 0xc3, 0x87 };
CBitmap bm;
if (bm.CreateBitmap(8, 8, 1, 1, awBackwardDiagonalBrushPattern))
{
LOGBRUSH logBrush = {0};
logBrush.lbStyle = BS_PATTERN;
logBrush.lbHatch = (int)bm.GetSafeHandle();
logBrush.lbColor = RGB(0, 0, 0);
VERIFY( m_brushBackwardDiagonal.CreateBrushIndirect(&logBrush) );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -