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

📄 mindex.cpp

📁 基于dialogic语音卡的IVR系统源代码
💻 CPP
字号:
// Mindex.cpp: implementation of the CMindex class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Mindex.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMindex::CMindex()
{
	memset( DestPath, 0x0, 256 );
	pCombIdx  = new IDXINFO[256];
	memset( (char *)pCombIdx, 0x0, sizeof(IDXINFO)*256 );
	pCombBuf = new char[4000]; 
	memset( pCombBuf, 0x08, 4000 );
	Count      = 1;
	CombBufLen = 4000;
	pCombIdx[0].Id     = ' ';
	pCombIdx[0].Offset = 0;
	pCombIdx[0].Length = 4000;
	strcpy( pCombIdx[0].Note, "静音" );
}

CMindex::~CMindex()
{
	if ( pCombIdx != NULL )	delete pCombIdx;
	if ( pCombBuf != NULL ) delete pCombBuf ;
}

void CMindex::ResetComb(void)
{
	if ( pCombIdx != NULL )	delete pCombIdx;
	if ( pCombBuf != NULL ) delete pCombBuf ;
	memset( DestPath, 0x0, 256 );
	pCombIdx  = new IDXINFO[256];
	memset( (char *)pCombIdx, 0x0, sizeof(IDXINFO)*256 );
	pCombBuf = new char[4000]; 
	memset( pCombBuf, 0x80, 4000 );
	Count      = 1;
	CombBufLen = 4000;
	pCombIdx[0].Id     = ' ';
	pCombIdx[0].Offset = 0;
	pCombIdx[0].Length = 4000;
	strcpy( pCombIdx[0].Note, "静音" );
}

void CMindex::SetPath( char *m_Path)
{
	int  Length;
	if( m_Path != NULL )
	{
		strcpy( DestPath, m_Path );
		Length = strlen( DestPath );
		if( DestPath[ Length-1 ] != '\\' )	strcat( DestPath, "\\" );
	}
}

int CMindex::ReadIdx( void )
{
	CFile   pFile;
	int	    Length;
	char    m_File[256], Debugbuf[256];
	
	strcpy( m_File, DestPath );
	strcat( m_File, "Combvoc.idx") ;

	if ( !pFile.Open( m_File, CFile::modeRead|CFile::typeBinary ) )
	{
		sprintf( Debugbuf, "Open File %s Error!", m_File );
		AfxMessageBox(Debugbuf);
		return 0;
	}
	Length  = pFile.GetLength();
	Count   = Length / sizeof(IDXINFO);
	pFile.Read( (char *) pCombIdx, Length );
	pFile.Close();
	return(Count);
}

int CMindex::WriteIdx( void )
{
	CFile   pFile;
	char    m_File[256], Debugbuf[256];
	
	strcpy( m_File, DestPath );
	strcat( m_File, "Combvoc.idx") ;

	if ( !pFile.Open( m_File, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary ) )
	{
		sprintf( Debugbuf, "Create File %s Error!", m_File );
		AfxMessageBox(Debugbuf);
		return 0;
	}
	pFile.Write( (char *) pCombIdx, Count*sizeof(IDXINFO));
	pFile.Close();
	return(Count);
}

int CMindex::ReadBuf( void )
{
	CFile   pFile;
	char    m_File[256], Debugbuf[256];
	
	strcpy( m_File, DestPath );
	strcat( m_File, "Combvoc.vox") ;

	if ( !pFile.Open( m_File, CFile::modeRead|CFile::typeBinary ) )
	{
		sprintf( Debugbuf, "Open File %s Error!", m_File );
		AfxMessageBox(Debugbuf);
		return 0;
	}
	CombBufLen  = pFile.GetLength();
	RallocComb( CombBufLen );
	pFile.ReadHuge( pCombBuf, CombBufLen );
	pFile.Close();
	return(CombBufLen);
}

int CMindex::WriteBuf( void )
{
	CFile   pFile;
	char    m_File[256], Debugbuf[256];
	
	strcpy( m_File, DestPath );
	strcat( m_File, "Combvoc.vox") ;

	if ( !pFile.Open( m_File, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary ) )
	{
		sprintf( Debugbuf, "Create File %s Error!", m_File );
		AfxMessageBox(Debugbuf);
		return 0;
	}
	pFile.WriteHuge( pCombBuf, CombBufLen );
	pFile.Close();
	return(CombBufLen);
}

int CMindex::FindId( char m_Id, int &m_Offset, int &m_Length )
{
	int	i = 0;

	if( Count == 0 )
	{
		m_Offset = 0;
		m_Length = 0;
		return 0;
	}
	
	for( i=0; i<Count; i++ )
	{
		if( pCombIdx[i].Id == m_Id ) break;
	}
	
	if( i<Count ) 
	{
		m_Offset = pCombIdx[i].Offset;
		m_Length = pCombIdx[i].Length;
		return (i+1);
	}
	else 
	{
		m_Offset = pCombIdx[Count-1].Offset + pCombIdx[Count-1].Length;
		m_Length = 0;
		return 0;
	}
}

int CMindex::GetCount( void )
{
	return Count;
}

IDXINFO *CMindex::GetCombIdx( void )
{
	return pCombIdx;
}

int CMindex::GetCombBufLen( void )
{
	return CombBufLen;
}

char  *CMindex::GetCombBuf( void )
{
	return pCombBuf;
}

int  CMindex::RallocComb( int length )
{
	char *newBuf;
	newBuf = new char[length];
	memcpy( newBuf, pCombBuf, CombBufLen );
	delete pCombBuf ;
	pCombBuf = newBuf ;
	return 1;
}

int  CMindex::AddNode( char ID, char *TagFile, char *TagNote)
{
	CFile   pFile;
	int     m_Length;
	char    Debugbuf[256];
	char	DestFile[128];
	char    *VoxBuf;
	
	strcpy( DestFile, DestPath );
	strcat( DestFile, TagFile );

	if ( !pFile.Open( DestFile, CFile::modeRead|CFile::typeBinary ) )
	{
		sprintf( Debugbuf, "Open File %s Error!", DestFile );
		AfxMessageBox(Debugbuf);
		return 0;
	}
	
	pFile.SeekToEnd();
	m_Length = pFile.GetLength();
	VoxBuf   = new char[ m_Length ];
	pFile.SeekToBegin();
	pFile.Read( VoxBuf, m_Length );
	pFile.Close();

	Count ++;
	pCombIdx[Count-1].Id = ID;
	if( Count <2 )
	{
		pCombIdx[Count-1].Offset  =  0;
	}
	else
	{
		pCombIdx[Count-1].Offset  = pCombIdx[Count-2].Offset + pCombIdx[Count-2].Length;
	}
	pCombIdx[Count-1].Length  =  m_Length;
	strcpy( pCombIdx[Count-1].Note, TagNote );

	//以下处理pCombBuf
	RallocComb( CombBufLen + m_Length );
	memcpy( &pCombBuf[CombBufLen], VoxBuf, m_Length );
	CombBufLen = CombBufLen + m_Length ;
	
	delete VoxBuf;
	return 1;
}

int	CMindex::DelNode( char ID )
{
	int i = 0 , No;
	int m_Offset, m_Length;
	
	No = FindId( ID, m_Offset, m_Length );
	if( No < 1 ) return (0) ;
	for ( i=No-1; i<Count-1 ; i++ )
	{
		pCombIdx[i].Id     = pCombIdx[i+1].Id;
		pCombIdx[i].Offset = pCombIdx[i+1].Offset - m_Length;
		pCombIdx[i].Length = pCombIdx[i+1].Length;
		strcpy( pCombIdx[i].Note, pCombIdx[i+1].Note );
	}
	Count --;
	memset( (char *)&pCombIdx[Count].Id, 0x0, sizeof(IDXINFO) );
	
	//以下处理pCombBuf
	memcpy( &pCombBuf[m_Offset], &pCombBuf[m_Offset+m_Length], CombBufLen-m_Offset-m_Length );
	CombBufLen = CombBufLen - m_Length ;
	
	return 1;
}

int	CMindex::InitCombvox( char *IniFile, char *Section )
{
	char COMBTAG[100] = "";
	char COMBTAGEU[2] = "";
	char TagPath[128] = "";
	char TagFile[128] = "";
	char TagNote[128] = "";
	char TagBuff[128] = "";
	int  i=0, maxtag=0;

	if( GetProfile(IniFile,"PATH", Section, TagPath ) == NULL )
	{
		GetCurrentDirectory( 128, TagPath );
	}
	SetPath( TagPath );

	if( GetProfile(IniFile,Section, "TAGS", COMBTAG ) == NULL )
	{
		AfxMessageBox("Read Tags Error !");
		return -1;
	}
	maxtag = strlen( COMBTAG );
	
	for( i=0; i<maxtag; i++ )
	{
		COMBTAGEU[0] = COMBTAG[i];
		if( GetProfile(IniFile,Section,COMBTAGEU, TagBuff ) != NULL )
		{
			SplitTextAndNote( TagBuff, TagFile, TagNote );
			AddNode( COMBTAGEU[0], TagFile, TagNote );
		}
	}
	return 0;
}

int	CMindex::ReadEnglish( char *IniFile, char *Section )
{
	char COMBTAG[200] = "";
	char COMBTAGEU[20] = "";

	char TagPath[128] = "";
	char TagFile[128] = "";
	char TagNote[128] = "";
	char TagBuff[128] = "";
	int  i=0, maxtag=0;

	if( GetProfile(IniFile,"PATH", Section, TagPath ) == NULL )
	{
		GetCurrentDirectory( 128, TagPath );
	}
	SetPath( TagPath );

	if( GetProfile(IniFile,Section, "TAGS", COMBTAG ) == NULL )
	{
		AfxMessageBox("Read Tags Error !");
		return -1;
	}
	maxtag = atoi( COMBTAG );

	for( i=0; i<=maxtag; i++ )
	{
		sprintf( COMBTAGEU,"%d", i );
		if( GetProfile(IniFile,Section,COMBTAGEU, TagBuff ) != NULL )
		{
			SplitTextAndNote( TagBuff, TagFile, TagNote );
			AddNode( i+1, TagFile, TagNote );
		}
	}
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -