📄 knownfile.cpp
字号:
if ( result->size > 354 )
result->PackPacket();
if (thePrefs.GetDebugSourceExchange())
AddDebugLogLine(false, _T("SXSend: Client source response; Count=%u, %s, File=\"%s\""), nCount, forClient->DbgGetClientInfo(), GetFileName());
return result;
}
void CKnownFile::LoadComment()
{
CIni ini(thePrefs.GetFileCommentsFilePath(), md4str(GetFileHash()));
m_strComment = ini.GetStringUTF8(_T("Comment")).Left(MAXFILECOMMENTLEN);
m_uRating = ini.GetInt(_T("Rate"), 0);
m_bCommentLoaded = true;
}
const CString& CKnownFile::GetFileComment() /*const*/
{
if (!m_bCommentLoaded)
LoadComment();
return m_strComment;
}
void CKnownFile::SetFileComment(LPCTSTR pszComment)
{
if (m_strComment.Compare(pszComment) != 0)
{
CIni ini(thePrefs.GetFileCommentsFilePath(), md4str(GetFileHash()));
ini.WriteStringUTF8(_T("Comment"), pszComment);
m_strComment = pszComment;
for (POSITION pos = m_ClientUploadList.GetHeadPosition();pos != 0;)
m_ClientUploadList.GetNext(pos)->SetCommentDirty();
}
}
uint8 CKnownFile::GetFileRating() /*const*/
{
if (!m_bCommentLoaded)
LoadComment();
return m_uRating;
}
void CKnownFile::SetFileRating(uint8 uRating)
{
if (m_uRating != uRating)
{
CIni ini(thePrefs.GetFileCommentsFilePath(), md4str(GetFileHash()));
ini.WriteInt(_T("Rate"), uRating);
m_uRating = uRating;
for (POSITION pos = m_ClientUploadList.GetHeadPosition();pos != 0;)
m_ClientUploadList.GetNext(pos)->SetCommentDirty();
}
}
void CKnownFile::UpdateAutoUpPriority(){
if( !IsAutoUpPriority() )
return;
if ( GetQueuedCount() > 20 ){
if( GetUpPriority() != PR_LOW ){
SetUpPriority( PR_LOW );
theApp.emuledlg->sharedfileswnd->sharedfilesctrl.UpdateFile(this);
}
return;
}
if ( GetQueuedCount() > 1 ){
if( GetUpPriority() != PR_NORMAL ){
SetUpPriority( PR_NORMAL );
theApp.emuledlg->sharedfileswnd->sharedfilesctrl.UpdateFile(this);
}
return;
}
if( GetUpPriority() != PR_HIGH){
SetUpPriority( PR_HIGH );
theApp.emuledlg->sharedfileswnd->sharedfilesctrl.UpdateFile(this);
}
}
void CKnownFile::SetUpPriority(uint8 iNewUpPriority, bool bSave)
{
m_iUpPriority = iNewUpPriority;
ASSERT( m_iUpPriority == PR_VERYLOW || m_iUpPriority == PR_LOW || m_iUpPriority == PR_NORMAL || m_iUpPriority == PR_HIGH || m_iUpPriority == PR_VERYHIGH );
if( IsPartFile() && bSave )
((CPartFile*)this)->SavePartFile();
}
void SecToTimeLength(unsigned long ulSec, CStringA& rstrTimeLength)
{
// this function creates the content for the "length" ed2k meta tag which was introduced by eDonkeyHybrid
// with the data type 'string' :/ to save some bytes we do not format the duration with leading zeros
if (ulSec >= 3600){
UINT uHours = ulSec/3600;
UINT uMin = (ulSec - uHours*3600)/60;
UINT uSec = ulSec - uHours*3600 - uMin*60;
rstrTimeLength.Format("%u:%02u:%02u", uHours, uMin, uSec);
}
else{
UINT uMin = ulSec/60;
UINT uSec = ulSec - uMin*60;
rstrTimeLength.Format("%u:%02u", uMin, uSec);
}
}
void SecToTimeLength(unsigned long ulSec, CStringW& rstrTimeLength)
{
// this function creates the content for the "length" ed2k meta tag which was introduced by eDonkeyHybrid
// with the data type 'string' :/ to save some bytes we do not format the duration with leading zeros
if (ulSec >= 3600){
UINT uHours = ulSec/3600;
UINT uMin = (ulSec - uHours*3600)/60;
UINT uSec = ulSec - uHours*3600 - uMin*60;
rstrTimeLength.Format(L"%u:%02u:%02u", uHours, uMin, uSec);
}
else{
UINT uMin = ulSec/60;
UINT uSec = ulSec - uMin*60;
rstrTimeLength.Format(L"%u:%02u", uMin, uSec);
}
}
void CKnownFile::RemoveMetaDataTags()
{
static const struct
{
uint8 nID;
uint8 nType;
} _aEmuleMetaTags[] =
{
{ FT_MEDIA_ARTIST, 2 },
{ FT_MEDIA_ALBUM, 2 },
{ FT_MEDIA_TITLE, 2 },
{ FT_MEDIA_LENGTH, 3 },
{ FT_MEDIA_BITRATE, 3 },
{ FT_MEDIA_CODEC, 2 }
};
// 05-J鋘-2004 [bc]: ed2k and Kad are already full of totally wrong and/or not properly attached meta data. Take
// the chance to clean any available meta data tags and provide only tags which were determined by us.
// Remove all meta tags. Never ever trust the meta tags received from other clients or servers.
for (int j = 0; j < ARRSIZE(_aEmuleMetaTags); j++)
{
int i = 0;
while (i < taglist.GetSize())
{
const CTag* pTag = taglist[i];
if (pTag->GetNameID() == _aEmuleMetaTags[j].nID)
{
delete pTag;
taglist.RemoveAt(i);
}
else
i++;
}
}
m_uMetaDataVer = 0;
}
void CKnownFile::UpdateMetaDataTags()
{
// 05-J鋘-2004 [bc]: ed2k and Kad are already full of totally wrong and/or not properly attached meta data. Take
// the chance to clean any available meta data tags and provide only tags which were determined by us.
RemoveMetaDataTags();
if (thePrefs.GetExtractMetaData() == 0)
return;
TCHAR szExt[_MAX_EXT];
_tsplitpath(GetFileName(), NULL, NULL, NULL, szExt);
_tcslwr(szExt);
if (_tcscmp(szExt, _T(".mp3"))==0 || _tcscmp(szExt, _T(".mp2"))==0 || _tcscmp(szExt, _T(".mp1"))==0 || _tcscmp(szExt, _T(".mpa"))==0)
{
TCHAR szFullPath[MAX_PATH];
_tmakepath(szFullPath, NULL, GetPath(), GetFileName(), NULL);
try{
USES_CONVERSION;
ID3_Tag myTag;
myTag.Link(T2A(szFullPath));
const Mp3_Headerinfo* mp3info;
mp3info = myTag.GetMp3HeaderInfo();
if (mp3info)
{
// length
if (mp3info->time){
CTag* pTag = new CTag(FT_MEDIA_LENGTH, (uint32)mp3info->time);
AddTagUnique(pTag);
m_uMetaDataVer = META_DATA_VER;
}
// here we could also create a "codec" ed2k meta tag.. though it would probable not be worth the
// extra bytes which would have to be sent to the servers..
// bitrate
UINT uBitrate = mp3info->bitrate/1000;
if (uBitrate){
CTag* pTag = new CTag(FT_MEDIA_BITRATE, (uint32)uBitrate);
AddTagUnique(pTag);
m_uMetaDataVer = META_DATA_VER;
}
}
ID3_Tag::Iterator* iter = myTag.CreateIterator();
const ID3_Frame* frame;
while ((frame = iter->GetNext()) != NULL)
{
ID3_FrameID eFrameID = frame->GetID();
switch (eFrameID)
{
case ID3FID_LEADARTIST:{
char* pszText = ID3_GetString(frame, ID3FN_TEXT);
CString strText(pszText);
strText.Trim();
if (!strText.IsEmpty()){
CTag* pTag = new CTag(FT_MEDIA_ARTIST, strText);
AddTagUnique(pTag);
m_uMetaDataVer = META_DATA_VER;
}
delete[] pszText;
break;
}
case ID3FID_ALBUM:{
char* pszText = ID3_GetString(frame, ID3FN_TEXT);
CString strText(pszText);
strText.Trim();
if (!strText.IsEmpty()){
CTag* pTag = new CTag(FT_MEDIA_ALBUM, strText);
AddTagUnique(pTag);
m_uMetaDataVer = META_DATA_VER;
}
delete[] pszText;
break;
}
case ID3FID_TITLE:{
char* pszText = ID3_GetString(frame, ID3FN_TEXT);
CString strText(pszText);
strText.Trim();
if (!strText.IsEmpty()){
CTag* pTag = new CTag(FT_MEDIA_TITLE, strText);
AddTagUnique(pTag);
m_uMetaDataVer = META_DATA_VER;
}
delete[] pszText;
break;
}
}
}
delete iter;
}
catch(...){
if (thePrefs.GetVerbose())
AddDebugLogLine(false, _T("Unhandled exception while extracting file meta (MP3) data from \"%s\""), szFullPath);
ASSERT(0);
}
}
else if (thePrefs.GetExtractMetaData() > 1)
{
// starting the MediaDet object takes a noticeable amount of time.. avoid starting that object
// for files which are not expected to contain any Audio/Video data.
// note also: MediaDet does not work well for too short files (e.g. 16K)
EED2KFileType eFileType = GetED2KFileTypeID(GetFileName());
if ((eFileType == ED2KFT_AUDIO || eFileType == ED2KFT_VIDEO) && GetFileSize() >= 32768)
{
// Avoid processing of some file types which are known to crash due to bugged DirectShow filters.
TCHAR szExt[_MAX_EXT];
_tsplitpath(GetFileName(), NULL, NULL, NULL, szExt);
_tcslwr(szExt);
if (_tcscmp(szExt, _T(".ogm"))!=0 && _tcscmp(szExt, _T(".ogg"))!=0 && _tcscmp(szExt, _T(".mkv"))!=0)
{
TCHAR szFullPath[MAX_PATH];
_tmakepath(szFullPath, NULL, GetPath(), GetFileName(), NULL);
try{
CComPtr<IMediaDet> pMediaDet;
HRESULT hr = pMediaDet.CoCreateInstance(__uuidof(MediaDet));
if (SUCCEEDED(hr))
{
USES_CONVERSION;
if (SUCCEEDED(hr = pMediaDet->put_Filename(CComBSTR(T2W(szFullPath)))))
{
// Get the first audio/video streams
long lAudioStream = -1;
long lVideoStream = -1;
double fVideoStreamLengthSec = 0.0;
DWORD dwVideoBitRate = 0;
DWORD dwVideoCodec = 0;
double fAudioStreamLengthSec = 0.0;
DWORD dwAudioBitRate = 0;
//DWORD dwAudioCodec = 0;
long lStreams;
if (SUCCEEDED(hr = pMediaDet->get_OutputStreams(&lStreams)))
{
for (long i = 0; i < lStreams; i++)
{
if (SUCCEEDED(hr = pMediaDet->put_CurrentStream(i)))
{
GUID major_type;
if (SUCCEEDED(hr = pMediaDet->get_StreamType(&major_type)))
{
if (major_type == MEDIATYPE_Video)
{
if (lVideoStream == -1){
lVideoStream = i;
pMediaDet->get_StreamLength(&fVideoStreamLengthSec);
AM_MEDIA_TYPE mt = {0};
if (SUCCEEDED(hr = pMediaDet->get_StreamMediaType(&mt))){
if (mt.formattype == FORMAT_VideoInfo){
VIDEOINFOHEADER* pVIH = (VIDEOINFOHEADER*)mt.pbFormat;
// do not use that 'dwBitRate', whatever this number is, it's not
// the bitrate of the encoded video stream. seems to be the bitrate
// of the uncompressed stream divided by 2 !??
//dwVideoBitRate = pVIH->dwBitRate / 1000;
// for AVI files this gives that used codec
// for MPEG(1) files this just gives "Y41P"
dwVideoCodec = pVIH->bmiHeader.biCompression;
}
}
if (mt.pUnk != NULL)
mt.pUnk->Release();
if (mt.pbFormat != NULL)
CoTaskMemFree(mt.pbFormat);
}
}
else if (major_type == MEDIATYPE_Audio)
{
if (lAudioStream == -1){
lAudioStream = i;
pMediaDet->get_StreamLength(&fAudioStreamLengthSec);
AM_MEDIA_TYPE mt = {0};
if (SUCCEEDED(hr = pMediaDet->get_StreamMediaType(&mt))){
if (mt.formattype == FORMAT_WaveFormatEx){
WAVEFORMATEX* wfx = (WAVEFORMATEX*)mt.pbFormat;
dwAudioBitRate = ((wfx->nAvgBytesPerSec * 8.0) + 500.0) / 1000.0;
}
}
if (mt.pUnk != NULL)
mt.pUnk->Release();
if (mt.pbFormat != NULL)
CoTaskMemFree(mt.pbFormat);
}
}
else{
TRACE("%s - Unknown stream type\n", GetFileName());
}
if (lVideoStream != -1 && lAudioStream != -1)
break;
}
}
}
}
uint32 uLengthSec = 0.0;
CStringA strCodec;
uint32 uBitrate = 0;
if (fVideoStreamLengthSec > 0.0){
uLengthSec = fVideoStreamLengthSec;
if (dwVideoCodec == BI_RGB)
strCodec = "rgb";
else if (dwVideoCodec == BI_RLE8)
strCodec = "rle8";
else if (dwVideoCodec == BI_RLE4)
strCodec = "rle4";
else if (dwVideoCodec == BI_BITFIELDS)
strCodec = "bitfields";
else{
memcpy(strCodec.GetBuffer(4), &dwVideoCodec, 4);
strCodec.ReleaseBuffer(4);
strCodec.MakeLower();
}
uBitrate = dwVideoBitRate;
}
else if (fAudioStreamLengthSec > 0.0){
uLengthSec = fAudioStreamLengthSec;
uBitrate = dwAudioBitRate;
}
if (uLengthSec){
CTag* pTag = new CTag(FT_MEDIA_LENGTH, (uint32)uLengthSec);
AddTagUnique(pTag);
m_uMetaDataVer = META_DATA_VER;
}
if (!strCodec.IsEmpty()){
CTag* pTag = new CTag(FT_MEDIA_CODEC, CString(strCodec));
AddTagUnique(pTag);
m_uMetaDataVer = META_DATA_VER;
}
if (uBitrate){
CTag* pTag = new CTag(FT_MEDIA_BITRATE, (uint32)uBitrate);
AddTagUnique(pTag);
m_uMetaDataVer = META_DATA_VER;
}
}
}
}
catch(...){
if (thePrefs.GetVerbose())
AddDebugLogLine(false, _T("Unhandled exception while extracting meta data (MediaDet) from \"%s\""), szFullPath);
ASSERT(0);
}
}
}
}
}
void CKnownFile::SetPublishedED2K(bool val){
m_PublishedED2K = val;
theApp.emuledlg->sharedfileswnd->sharedfilesctrl.UpdateFile(this);
}
void CKnownFile::SetPublishedKadSrc(){
m_PublishedKadSrc++;
theApp.emuledlg->sharedfileswnd->sharedfilesctrl.UpdateFile(this);
}
bool CKnownFile::PublishSrc()
{
if( m_lastPublishTimeKadSrc > 0)
{
if( ((uint32)time(NULL)-m_lastPublishTimeKadSrc) < KADEMLIAREPUBLISHTIMES)
{
return false;
}
}
m_lastPublishTimeKadSrc = (uint32)time(NULL);
return true;
}
bool CKnownFile::IsMovie() const
{
return (ED2KFT_VIDEO == GetED2KFileTypeID(GetFileName()) );
}
// function assumes that this file is shared and that any needed permission to preview exists. checks have to be done before calling!
bool CKnownFile::GrabImage(uint8 nFramesToGrab, double dStartTime, bool bReduceColor, uint16 nMaxWidth, void* pSender)
{
return GrabImage(GetPath() + CString("\\") + GetFileName(), nFramesToGrab, dStartTime, bReduceColor, nMaxWidth, pSender);
}
bool CKnownFile::GrabImage(CString strFileName,uint8 nFramesToGrab, double dStartTime, bool bReduceColor, uint16 nMaxWidth, void* pSender)
{
if (!IsMovie())
return false;
CFrameGrabThread* framegrabthread = (CFrameGrabThread*) AfxBeginThread(RUNTIME_CLASS(CFrameGrabThread), THREAD_PRIORITY_NORMAL,0, CREATE_SUSPENDED);
framegrabthread->SetValues(this, strFileName, nFramesToGrab, dStartTime, bReduceColor, nMaxWidth, pSender);
framegrabthread->ResumeThread();
return true;
}
// imgResults[i] can be NULL
void CKnownFile::GrabbingFinished(CxImage** imgResults, uint8 nFramesGrabbed, void* pSender)
{
// continue processing
if (pSender == theApp.mmserver){
theApp.mmserver->PreviewFinished(imgResults, nFramesGrabbed);
}
else if (theApp.clientlist->IsValidClient((CUpDownClient*)pSender)){
((CUpDownClient*)pSender)->SendPreviewAnswer(this, imgResults, nFramesGrabbed);
}
else{
//probably a client which got deleted while grabbing the frames for some reason
if (thePrefs.GetVerbose())
AddDebugLogLine(false, _T("Couldn't find Sender of FrameGrabbing Request"));
}
//cleanup
for (int i = 0; i != nFramesGrabbed; i++){
if (imgResults[i] != NULL)
delete imgResults[i];
}
delete[] imgResults;
}
/*// #zegzav:updcliuplst
void CKnownFile::UpdateClientUploadList()
{
// remove non-existent clients / add missing clients
theApp.clientlist->GetClientListByFileID(&m_ClientUploadList, GetFileHash());
m_iQueuedCount = m_ClientUploadList.GetCount();
UpdateAutoUpPriority();
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -