📄 mmires_ring.cpp
字号:
// MMIRes_Ring.cpp: implementation of the CMMIRes class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "resourceeditor.h"
#include "MMIRes.h"
CString CMMIRes::MakeRingID(LPCTSTR pszFileName)
{
_ASSERTE( pszFileName != NULL );
LPCTSTR pFind = _tcsrchr(pszFileName, _T('\\'));
if( NULL == pFind )
pFind = pszFileName;
else
pFind++;
CString strFileName = pFind;
int nLeft = strFileName.ReverseFind(_T('.'));
if( nLeft > 0 )
strFileName = strFileName.Left(nLeft);
strFileName.MakeUpper();
return strFileName;
}
BOOL CMMIRes::LoadRing( LPCTSTR pszFileName, PAUD_RING_DATA_INFO_T * ppRing )
{
_ASSERTE( pszFileName != NULL && ppRing != NULL && *ppRing == NULL );
HANDLE hFile = ::CreateFile( pszFileName, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
NULL );
if( hFile == INVALID_HANDLE_VALUE )
{
_stprintf(m_szErrMsg, _T("The file '%s' not exist!"), pszFileName);
return FALSE;
}
int nSize = ::GetFileSize( hFile, NULL );
if( 0 == nSize )
{
CloseHandle(hFile);
_stprintf(m_szErrMsg, _T("The file '%s''s size is zero!"), pszFileName);
return FALSE;
}
LPBYTE pContent = new BYTE[ nSize ];
if( pContent == NULL )
{
CloseHandle(hFile);
return FALSE;
}
DWORD dwRead = 0;
VERIFY( ReadFile(hFile, pContent, nSize, &dwRead, NULL) );
CloseHandle(hFile);
PAUD_RING_DATA_INFO_T pRing = *ppRing = new MMIAUD_RING_DATA_INFO_T;
if( pRing == NULL )
{
delete []pContent;
return FALSE;
}
pRing->data_len = nSize;
pRing->data_ptr = pContent;
pRing->type = GetRingType(pszFileName);
return TRUE;
}
BOOL CMMIRes::AddRing( LPCTSTR pszID, LPCTSTR pszFileName )
{
_ASSERTE( pszID != NULL && !RingIsExist(pszID) );
_ASSERTE( pszFileName != NULL );
PAUD_RING_DATA_INFO_T pRing = NULL;
if( LoadRing(pszFileName, &pRing) )
{
m_Resource.ToolUsedInfo.nUsedSize += sizeof(MMIAUD_RING_DATA_INFO_T) + pRing->data_len;
m_mapRing.SetAt(pszID, pRing);
return TRUE;
}
return FALSE;
}
AUD_RING_TYPE_E CMMIRes::GetRingType( LPCTSTR pszFileName )
{
_ASSERTE( pszFileName != NULL );
LPCTSTR pExt = _tcsrchr(pszFileName, _T('.'));
_ASSERTE( pExt != NULL );
if( _tcsicmp(pExt, _T(".mid")) == 0 || _tcsicmp(pExt, _T(".midi")) == 0)
return AUD_MIDI_RING;
else if( _tcsicmp(pExt, _T(".mmf")) == 0 )
return AUD_SMAF_RING;
else if( _tcsicmp(pExt, _T(".wav")) == 0 )
return AUD_WAVE_RING;
else if( _tcsicmp(pExt, _T(".mp3")) == 0 )
return AUD_MP3_RING;
_ASSERTE( 0 );
return AUD_RING_TYPE_MAX;
}
PAUD_RING_DATA_INFO_T CMMIRes::GetRing( LPCTSTR pszID )
{
_ASSERTE( pszID != NULL );
PAUD_RING_DATA_INFO_T pRing = NULL;
VERIFY( m_mapRing.Lookup(pszID, pRing) );
return pRing;
}
BOOL CMMIRes::ExportRing( LPCTSTR pszID, LPCTSTR pszFileName )
{
_ASSERTE( pszID != NULL );
_ASSERTE( pszFileName != NULL );
PAUD_RING_DATA_INFO_T pRing = NULL;
VERIFY( m_mapRing.Lookup(pszID, pRing) );
//LPCTSTR pExt = _tcsrchr(pszFileName, _T('.'));
//_ASSERTE( pExt != NULL );
_ASSERTE( pRing->type==GetRingType(pszFileName));
DWORD dwWritten=0;
HANDLE fh;
fh = CreateFile(pszFileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (fh == INVALID_HANDLE_VALUE)
return FALSE;
WriteFile(fh, pRing->data_ptr, pRing->data_len, &dwWritten, NULL);
CloseHandle(fh);
return TRUE;
}
BOOL CMMIRes::DeleteRing( LPCTSTR pszID )
{
_ASSERTE( pszID != NULL );
PAUD_RING_DATA_INFO_T pRing = NULL;
if( !m_mapRing.Lookup(pszID, pRing) )
return TRUE;
m_Resource.ToolUsedInfo.nUsedSize -= sizeof(MMIAUD_RING_DATA_INFO_T) + pRing->data_len;
delete []pRing->data_ptr;
delete pRing;
m_mapRing.RemoveKey(pszID);
return TRUE;
}
BOOL CMMIRes::ReplaceRing( LPCTSTR pszID, LPCTSTR pszFileName, int bCheckLimit /* = FALSE */,
PUINT pOldSize /* = NULL */, PUINT pNewSize /* = NULL */ )
{
_ASSERTE( pszID != NULL && pszFileName != NULL );
PAUD_RING_DATA_INFO_T pOldRing = NULL;
PAUD_RING_DATA_INFO_T pNewRing = NULL;
if( LoadRing(pszFileName, &pNewRing) )
{
VERIFY( m_mapRing.Lookup(pszID, pOldRing) );
if( bCheckLimit && m_Resource.ToolUsedInfo.nMaxLimitSize > 0 )
{
UINT nMaxSize = m_Resource.ToolUsedInfo.nUsedSize;
nMaxSize += ( pNewRing->data_len - pOldRing->data_len );
if( nMaxSize > m_Resource.ToolUsedInfo.nMaxLimitSize )
{
_stprintf(m_szErrMsg, _T("Exceed the limit size %d!"), m_Resource.ToolUsedInfo.nMaxLimitSize );
delete []pNewRing->data_ptr;
delete pNewRing;
return FALSE;
}
}
m_Resource.ToolUsedInfo.nUsedSize += ( pNewRing->data_len - pOldRing->data_len );
if( pOldSize != NULL ) *pOldSize = pOldRing->data_len;
if( pNewSize != NULL ) *pNewSize = pNewRing->data_len;
delete []pOldRing->data_ptr;
delete pOldRing;
m_mapRing.SetAt(pszID, pNewRing);
return TRUE;
}
return FALSE;
}
BOOL CMMIRes::RingIsExist( LPCTSTR pszID)
{
_ASSERTE( pszID != NULL );
PAUD_RING_DATA_INFO_T pRing = NULL;
return m_mapRing.Lookup(pszID, pRing);
}
int CMMIRes::CalcRingResSize(void)
{
int nCount = m_mapRing.GetCount();
int nSize = sizeof(MMIAUD_RING_DATA_INFO_T) * nCount;
CString strKey;
PAUD_RING_DATA_INFO_T pRingInfo = NULL;
POSITION pos = m_mapRing.GetStartPosition();
while( pos != NULL )
{
m_mapRing.GetNextAssoc( pos, strKey, pRingInfo );
_ASSERTE( pRingInfo != NULL );
nSize += pRingInfo->data_len;
}
return nSize;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -