⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmires_ring.cpp

📁 Resource editor base speadrum Chinese mobile
💻 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 + -