📄 shareazaurl.cpp
字号:
//
// ShareazaURL.cpp
//
// Copyright (c) Shareaza Development Team, 2002-2004.
// This file is part of SHAREAZA (www.shareaza.com)
//
// Shareaza 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.
//
// Shareaza 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 Shareaza; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
#include "StdAfx.h"
#include "Shareaza.h"
#include "Settings.h"
#include "ShareazaURL.h"
#include "Transfer.h"
#include "QuerySearch.h"
#include "DiscoveryServices.h"
#include "TigerTree.h"
#include "SHA.h"
#include "MD5.h"
#include "ED2K.h"
#include "BTInfo.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// CShareazaURL construction
CShareazaURL::CShareazaURL()
{
m_pTorrent = NULL;
Clear();
}
CShareazaURL::CShareazaURL(CBTInfo* pTorrent)
{
m_pTorrent = NULL;
Clear();
m_nAction = uriDownload;
m_pTorrent = pTorrent;
m_bBTH = TRUE;
m_pBTH = pTorrent->m_pInfoSHA1;
m_bSHA1 = pTorrent->m_bDataSHA1;
m_pSHA1 = pTorrent->m_pDataSHA1;
m_sName = pTorrent->m_sName;
m_bSize = TRUE;
m_nSize = pTorrent->m_nTotalSize;
}
CShareazaURL::~CShareazaURL()
{
Clear();
}
//////////////////////////////////////////////////////////////////////
// CShareazaURL clear
void CShareazaURL::Clear()
{
m_nAction = uriNull;
m_bSHA1 = FALSE;
m_bTiger = FALSE;
m_bMD5 = FALSE;
m_bED2K = FALSE;
m_bBTH = FALSE;
m_bSize = FALSE;
m_nPort = GNUTELLA_DEFAULT_PORT;
if ( m_pTorrent != NULL ) delete m_pTorrent;
m_pTorrent = NULL;
}
//////////////////////////////////////////////////////////////////////
// CShareazaURL root parser
BOOL CShareazaURL::Parse(LPCTSTR pszURL)
{
Clear();
if ( _tcsnicmp( pszURL, _T("magnet:?"), 8 ) == 0 )
{
pszURL += 8;
return ParseMagnet( pszURL );
}
else if ( _tcsnicmp( pszURL, _T("shareaza:"), 9 ) == 0 ||
_tcsnicmp( pszURL, _T("gnutella:"), 9 ) == 0 )
{
SkipSlashes( pszURL, 9 );
return ParseShareaza( pszURL );
}
else if ( _tcsnicmp( pszURL, _T("gnet:"), 5 ) == 0 )
{
SkipSlashes( pszURL, 5 );
return ParseShareaza( pszURL );
}
else if ( _tcsnicmp( pszURL, _T("ed2k:"), 5 ) == 0 )
{
SkipSlashes( pszURL, 5 );
return ParseDonkey( pszURL );
}
else if ( _tcsnicmp( pszURL, _T("mp2p:"), 5 ) == 0 )
{
SkipSlashes( pszURL, 5 );
return ParsePiolet( pszURL );
}
else if ( _tcsnicmp( pszURL, _T("http://"), 7 ) == 0 )
{
m_sURL = pszURL;
m_nAction = uriSource;
return TRUE;
}
else if ( _tcsnicmp( pszURL, _T("ftp://"), 6 ) == 0 )
{
m_sURL = pszURL;
m_nAction = uriSource;
return TRUE;
}
return FALSE;
}
//////////////////////////////////////////////////////////////////////
// CShareazaURL parse "magnet:" URLs
BOOL CShareazaURL::ParseMagnet(LPCTSTR pszURL)
{
CString strURL( pszURL );
for ( strURL += '&' ; strURL.GetLength() ; )
{
CString strPart = strURL.SpanExcluding( _T("&") );
strURL = strURL.Mid( strPart.GetLength() + 1 );
int nEquals = strPart.Find( '=' );
if ( nEquals < 0 ) continue;
CString strKey = CTransfer::URLDecode( strPart.Left( nEquals ) );
CString strValue = CTransfer::URLDecode( strPart.Mid( nEquals + 1 ) );
SafeString( strKey );
SafeString( strValue );
if ( strKey.IsEmpty() || strValue.IsEmpty() ) continue;
if ( _tcsicmp( strKey, _T("xt") ) == 0 ||
_tcsicmp( strKey, _T("xs") ) == 0 ||
_tcsicmp( strKey, _T("as") ) == 0 )
{
if ( _tcsnicmp( strValue, _T("urn:"), 4 ) == 0 ||
_tcsnicmp( strValue, _T("sha1:"), 5 ) == 0 ||
_tcsnicmp( strValue, _T("bitprint:"), 9 ) == 0 ||
_tcsnicmp( strValue, _T("tree:tiger:"), 11 ) == 0 ||
_tcsnicmp( strValue, _T("tree:tiger/:"), 12 ) == 0 ||
_tcsnicmp( strValue, _T("tree:tiger/1024:"), 16 ) == 0 ||
_tcsnicmp( strValue, _T("md5:"), 4 ) == 0 ||
_tcsnicmp( strValue, _T("ed2k:"), 5 ) == 0 )
{
m_bSHA1 |= CSHA::HashFromURN( strValue, &m_pSHA1 );
m_bTiger |= CTigerNode::HashFromURN( strValue, &m_pTiger );
m_bMD5 |= CMD5::HashFromURN( strValue, &m_pMD5 );
m_bED2K |= CED2K::HashFromURN( strValue, &m_pED2K );
}
else if ( _tcsnicmp( strValue, _T("http://"), 7 ) == 0 ||
_tcsnicmp( strValue, _T("http%3A//"), 9 ) == 0 ||
_tcsnicmp( strValue, _T("ftp://"), 6 ) == 0 ||
_tcsnicmp( strValue, _T("ftp%3A//"), 8 ) == 0 )
{
Replace( strValue, _T(" "), _T("%20") );
Replace( strValue, _T("p%3A//"), _T("p://") );
if ( _tcsicmp( strKey, _T("xt") ) == 0 )
{
CString strURL = _T("@") + strValue;
if ( m_sURL.GetLength() )
m_sURL = strURL + _T(", ") + m_sURL;
else
m_sURL = strURL;
}
else
{
if ( m_sURL.GetLength() ) m_sURL += _T(", ");
m_sURL += strValue;
}
}
}
else if ( _tcsicmp( strKey, _T("dn") ) == 0 )
{
m_sName = strValue;
}
else if ( _tcsicmp( strKey, _T("kt") ) == 0 )
{
m_sName = strValue;
m_bSHA1 = FALSE;
}
}
if ( m_bSHA1 || m_bTiger || m_bMD5 || m_bED2K || m_sURL.GetLength() )
{
m_nAction = uriDownload;
return TRUE;
}
else if ( m_sName.GetLength() )
{
m_nAction = uriSearch;
return TRUE;
}
return FALSE;
}
//////////////////////////////////////////////////////////////////////
// CShareazaURL parse "shareaza:" URLs
BOOL CShareazaURL::ParseShareaza(LPCTSTR pszURL)
{
int nIP[4];
if ( _stscanf( pszURL, _T("%i.%i.%i.%i"), &nIP[0], &nIP[1], &nIP[2], &nIP[3] ) == 4 )
{
return ParseShareazaHost( pszURL );
}
if ( _tcsnicmp( pszURL, _T("host:"), 5 ) == 0 ||
_tcsnicmp( pszURL, _T("node:"), 5 ) == 0 )
{
return ParseShareazaHost( pszURL + 5 );
}
else if ( _tcsnicmp( pszURL, _T("hub:"), 4 ) == 0 )
{
return ParseShareazaHost( pszURL + 4 );
}
else if ( _tcsnicmp( pszURL, _T("server:"), 7 ) == 0 )
{
return ParseShareazaHost( pszURL + 7 );
}
else if ( _tcsnicmp( pszURL, _T("browse:"), 7 ) == 0 )
{
return ParseShareazaHost( pszURL + 7, TRUE );
}
else if ( _tcsnicmp( pszURL, _T("gwc:"), 4 ) == 0 )
{
return ParseDiscovery( pszURL + 4, CDiscoveryService::dsWebCache );
}
else if ( _tcsnicmp( pszURL, _T("meturl:"), 7 ) == 0 )
{
return ParseDiscovery( pszURL + 7, CDiscoveryService::dsServerMet );
}
else
{
return ParseShareazaFile( pszURL );
}
}
//////////////////////////////////////////////////////////////////////
// CShareazaURL parse shareaza host URL
BOOL CShareazaURL::ParseShareazaHost(LPCTSTR pszURL, BOOL bBrowse)
{
m_sName = pszURL;
m_sName = m_sName.SpanExcluding( _T("/\\") );
int nPos = m_sName.Find( ':' );
if ( nPos >= 0 )
{
_stscanf( m_sName.Mid( nPos + 1 ), _T("%i"), &m_nPort );
m_sName = m_sName.Left( nPos );
}
m_sName.TrimLeft();
m_sName.TrimRight();
m_nAction = bBrowse ? uriBrowse : uriHost;
return m_sName.GetLength();
}
//////////////////////////////////////////////////////////////////////
// CShareazaURL parse shareaza file URL
BOOL CShareazaURL::ParseShareazaFile(LPCTSTR pszURL)
{
CString strURL( pszURL );
for ( strURL += '/' ; strURL.GetLength() ; )
{
CString strPart = strURL.SpanExcluding( _T("/|") );
strURL = strURL.Mid( strPart.GetLength() + 1 );
strPart.TrimLeft();
strPart.TrimRight();
if ( strPart.IsEmpty() ) continue;
if ( _tcsnicmp( strPart, _T("urn:"), 4 ) == 0 ||
_tcsnicmp( strPart, _T("sha1:"), 5 ) == 0 ||
_tcsnicmp( strPart, _T("bitprint:"), 9 ) == 0 ||
_tcsnicmp( strPart, _T("tree:tiger:"), 11 ) == 0 ||
_tcsnicmp( strPart, _T("tree:tiger/:"), 12 ) == 0 ||
_tcsnicmp( strPart, _T("tree:tiger/1024:"), 16 ) == 0 ||
_tcsnicmp( strPart, _T("md5:"), 4 ) == 0 ||
_tcsnicmp( strPart, _T("ed2k:"), 5 ) == 0 )
{
m_bSHA1 |= CSHA::HashFromURN( strPart, &m_pSHA1 );
m_bTiger |= CTigerNode::HashFromURN( strPart, &m_pTiger );
m_bMD5 |= CMD5::HashFromURN( strPart, &m_pMD5 );
m_bED2K |= CED2K::HashFromURN( strPart, &m_pED2K );
}
else if ( _tcsnicmp( strPart, _T("source:"), 7 ) == 0 )
{
CString strSource = CTransfer::URLDecode( strPart.Mid( 7 ) );
SafeString( strSource );
if ( m_sURL.GetLength() ) m_sURL += ',';
m_sURL += _T("http://");
m_sURL += CTransfer::URLEncode( strSource );
m_sURL += _T("/(^name^)");
}
else if ( _tcsnicmp( strPart, _T("name:"), 5 ) == 0 ||
_tcsnicmp( strPart, _T("file:"), 5 ) == 0 )
{
m_sName = CTransfer::URLDecode( strPart.Mid( 5 ) );
SafeString( m_sName );
}
else if ( _tcschr( strPart, ':' ) == NULL )
{
m_sName = CTransfer::URLDecode( strPart );
SafeString( m_sName );
}
}
if ( m_sURL.GetLength() )
{
if ( m_sName.GetLength() )
{
Replace( m_sURL, _T("(^name^)"), CTransfer::URLEncode( m_sName ) );
Replace( m_sURL, _T("\\"), _T("/") );
}
else
{
m_sURL.Empty();
}
}
if ( m_bSHA1 || m_bTiger || m_bMD5 || m_bED2K || m_sURL.GetLength() )
{
m_nAction = uriDownload;
return TRUE;
}
else if ( m_sName.GetLength() )
{
m_nAction = uriSearch;
return TRUE;
}
return FALSE;
}
//////////////////////////////////////////////////////////////////////
// CShareazaURL parse "ed2k:" URLs
BOOL CShareazaURL::ParseDonkey(LPCTSTR pszURL)
{
if ( _tcsnicmp( pszURL, _T("|file|"), 6 ) == 0 )
{
return ParseDonkeyFile( pszURL + 6 );
}
else if ( _tcsnicmp( pszURL, _T("|server|"), 8 ) == 0 )
{
return ParseDonkeyServer( pszURL + 8 );
}
else if ( _tcsnicmp( pszURL, _T("|meturl|"), 8 ) == 0 )
{
return ParseDiscovery( pszURL + 8, CDiscoveryService::dsServerMet );
}
else
{
return FALSE;
}
}
//////////////////////////////////////////////////////////////////////
// CShareazaURL parse eDonkey2000 file URL
BOOL CShareazaURL::ParseDonkeyFile(LPCTSTR pszURL)
{
CString strURL( pszURL ), strPart;
int nSep;
nSep = strURL.Find( '|' );
if ( nSep < 0 ) return FALSE;
strPart = strURL.Left( nSep );
strURL = strURL.Mid( nSep + 1 );
m_sName = CTransfer::URLDecode( strPart );
SafeString( m_sName );
if ( m_sName.IsEmpty() ) return FALSE;
nSep = strURL.Find( '|' );
if ( nSep < 0 ) return FALSE;
strPart = strURL.Left( nSep );
strURL = strURL.Mid( nSep + 1 );
if ( _stscanf( strPart, _T("%I64i"), &m_nSize ) != 1 ) return FALSE;
m_bSize = TRUE;
nSep = strURL.Find( '|' );
if ( nSep < 0 ) return FALSE;
strPart = strURL.Left( nSep );
strURL = strURL.Mid( nSep + 1 );
m_bED2K = CED2K::HashFromString( strPart, &m_pED2K );
m_nAction = uriDownload;
return TRUE;
}
// ed2k://|file|Shareaza1600.exe|789544|3fb626ed1a9f4cb9921107f510148370|/
//////////////////////////////////////////////////////////////////////
// CShareazaURL parse eDonkey2000 server URL
BOOL CShareazaURL::ParseDonkeyServer(LPCTSTR pszURL)
{
LPCTSTR pszPort = _tcschr( pszURL, '|' );
if ( pszPort == NULL ) return FALSE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -