📄 phonehis.c
字号:
case 4: // 拒接电话记录
// 将记录类型转化为字符串
//index[0] = ((U8)(selType-1)) & 0x3f;
//index[1] = '\0';
index = PhHisTypeLst[selType-1][0];
result = LocalFindRecord( lacb, PH_TYPE_FIELD, index, PRECISE_FULL_MATCH );
break;
default:
break;
}
}
en_disp = 1;
}
}
}
else if( msg.lparam == bt_op[3] ) // 保存号码
{
if( *st_content_caption[0] == '\0' ) // 新号码
{
char *number = st_content_caption[1];
char name[MAXNAMELEN] = "";
// 保存新号码到电话本
if( SaveCallIntoPhbook( number, name ) == SAVE_CANCEL )
break;
// 修改通话记录
{
LOCALSEARCHLIST *modify_result;
FIELDVALUELIST modify_lst[PH_INDEX_FIELD_NUM];
WORD len;
modify_result = LocalFindRecord( lacb, PH_PHONE_FIELD, number, PRECISE_FULL_MATCH );
for( i = 0; i < modify_result->num; i++ )
{
data = modify_result->head[i].data;
ReadPhdbData( modify_lst, data );
if( modify_lst[PH_NAME_FIELD].fieldvalue == NULL || *modify_lst[PH_NAME_FIELD].fieldvalue == '\0' )
{
modify_lst[PH_NAME_FIELD].fieldvalue = name;
data = WritePhdbData( &len, modify_lst );
LocalModifyRecord( lacb, modify_result->head[i].index, data, len );
}
}
DelOldSearchList( modify_result );
}
// 重新组织通话记录列表
DelOldSearchList( result );
switch( selType )
{
case 0: // 全部通话记录
result = LocalFindRecord( lacb, PH_TIME_FIELD, NULL, GLOBAL_SEARCH );
break;
case 1: // 已拨电话记录
case 2: // 已接电话记录
case 3: // 未接电话记录
case 4: // 拒接电话记录
// 将记录类型转化为字符串
//index[0] = ((U8)(selType-1)) & 0x3f;
//index[1] = '\0';
index = PhHisTypeLst[selType-1][0];
result = LocalFindRecord( lacb, PH_TYPE_FIELD, index, PRECISE_FULL_MATCH );
break;
default:
break;
}
en_disp = 1;
}
else
{
MessageBox( mainwin, "已有用户使用该号码!", "错误", MB_OK | MB_ICONERROR );
}
}
if( en_disp ) // 更新通话记录
{
if( id == 0 ) // 第一条记录
{
// 禁止“第一条”和“前一条”的操作
EnableWindow( bt_browser[0], FALSE );
EnableWindow( bt_browser[1], FALSE );
}
else
{
// 允许“第一条”和“前一条”的操作
EnableWindow( bt_browser[0], TRUE );
EnableWindow( bt_browser[1], TRUE );
}
if( id >= result->num -1 ) // 最后一条记录
{
// 禁止“后一条”和“最后一条”的操作
EnableWindow( bt_browser[2], FALSE );
EnableWindow( bt_browser[3], FALSE );
}
else
{
// 允许“后一条”和“最后一条”的操作
EnableWindow( bt_browser[2], TRUE );
EnableWindow( bt_browser[3], TRUE );
}
// 读取新的通话记录数据
data = result->head[id].data;
ReadPhdbData( list, data );
Data2History( &history, list );
// 更新通话记录显示
for( i = 0; i < 5; i++ )
RepaintWindow( st_content[i], 0 );
RepaintWindow( st_prompt[0], 0 );
en_disp = 0;
}
break;
case WM_ALARM:
if( msg.wparam == ALARM_PHONE ) // 来电
{
char *name, *number;
// 获取来电号码和来电者姓名
name = (char *)msg.data;
if( *name == '\0' )
name = NULL;
number = (char *)msg.data + 25;
if( *number == '\0' )
number = NULL;
// 通话
TalkingDlg( number, name, PhHisTypeLst[RECEIVED_TYPE][0] );
Lfree( msg.data );
}
break;
case WM_QUIT:
quit = 1;
break;
}
DefWindowProc(msg.message, msg.lparam, msg.data, msg.wparam);
}
DelOldSearchList( result );
DetachDataBase( lacb );
DestroyWindow( mainwin );
dbgprintf( "### Exit 通话详细记录 ###" );
return;
}
BYTE ReadPhdbData( FIELDVALUELIST *his, BYTE *record )
{
WORD field_index[PH_INDEX_FIELD_NUM];
BYTE i;
BYTE *data;
BYTE *field_value;
if( his == NULL || record == NULL )
return 0;
// 读取字段偏移
data = (BYTE *)&((DBRECORDHEAD *)record)->data;
// data = record;
memcpy( field_index, data, PH_INDEX_FIELD_NUM * sizeof(WORD) );
// 根据字段偏移读取字段值
for( i = 0; i < PH_INDEX_FIELD_NUM; i++ )
{
if( field_index[i] != 0 )
{
switch( PhoneHDBFList[i].type )
{
case SINGLE_VALUE_FIELD: // 单值字段
field_value = data + field_index[i];
his[i].fieldvalue = field_value;
break;
case MULTI_VALUE_FIELD: // 多值字段
break;
}
}
else
his[i].fieldvalue = NULL;
}
return 1;
}
void Data2ListCaption( char *s, FIELDVALUELIST *list )
{
if( list[PH_TIME_FIELD].fieldvalue == NULL )
{
s[0] = '\0';
return;
}
memcpy( s, list[PH_TIME_FIELD].fieldvalue + 4, 2 ); // 月
s += 2;
*s = '.';
s++;
memcpy( s, list[PH_TIME_FIELD].fieldvalue + 6, 2 ); // 日
s += 2;
*s = ' ';
s++;
if( list[PH_NAME_FIELD].fieldvalue != NULL && list[PH_NAME_FIELD].fieldvalue[0] != '\0' )
strcpy( s, list[PH_NAME_FIELD].fieldvalue ); // 姓名
else
strcpy( s, list[PH_PHONE_FIELD].fieldvalue ); // 号码
return;
}
void Data2History( PHONEHISDATASTR *his, FIELDVALUELIST *list )
{
char *s, *p;
his->name[0] = '\0';
his->number[0] = '\0';
his->type[0] = '\0';
his->date[0] = '\0';
his->time[0] = '\0';
his->elapse[0] = '\0';
s = his->date;
p = list[PH_TIME_FIELD].fieldvalue;
if( p == NULL )
return;
memcpy( s, p, 4 ); // 年
s += 4;
*s = '.';
s++;
memcpy( s, p+4, 2 ); // 月
s += 2;
*s = '.';
s++;
memcpy( s, p+6, 2 ); // 日
s += 2;
*s = '\0';
s = his->time;
memcpy( s, p+8, 2 ); // 时
s += 2;
*s = ':';
s++;
memcpy( s, p+10, 2 ); // 分
s += 2;
*s = ':';
s++;
memcpy( s, p+12, 2 ); // 秒
s += 2;
*s = '\0';
// 姓名
s = his->name;
p = list[PH_NAME_FIELD].fieldvalue;
if( p != NULL )
strcpy( s, list[PH_NAME_FIELD].fieldvalue );
// 号码
s = his->number;
p = list[PH_PHONE_FIELD].fieldvalue;
if( p != NULL )
strcpy( s, p );
// 记录类型
s = his->type;
p = list[PH_TYPE_FIELD].fieldvalue;
if( p != NULL )
{
strcpy( s, PhHisTypeLst[ p[0] - '0' ][1] );
}
// 通话用时
s = his->elapse;
p = list[PH_CALL_TIME_FIELD].fieldvalue;
if( p != NULL )
{
memcpy( s, p, 2 ); // 时
s += 2;
*s = ':';
s++;
memcpy( s, p+2, 2 ); // 分
s += 2;
*s = ':';
s++;
memcpy( s, p+4, 2 ); // 秒
s += 2;
*s = '\0';
}
return;
}
// 构造通话记录数据块
BYTE *WritePhdbData( WORD *dataLen, FIELDVALUELIST *his )
{
WORD field_index[PH_INDEX_FIELD_NUM];
BYTE i;
BYTE *data, *p;
WORD total, len;
if( his == NULL || dataLen == NULL )
return NULL;
total = sizeof(WORD) * PH_INDEX_FIELD_NUM;
// 获取通话记录数据块长度以及字段偏移
for( i = 0; i < PH_INDEX_FIELD_NUM; i++ )
{
switch( PhoneHDBFList[i].type )
{
case SINGLE_VALUE_FIELD: // 单值字段
if( his[i].fieldvalue != NULL )
{
field_index[i] = total;
len = (WORD)( strlen( his[i].fieldvalue ) + 1 );
total += len;
}
else
field_index[i] = 0;
break;
case MULTI_VALUE_FIELD: // 多值字段
break;
}
}
data = (BYTE *)Lmalloc( total );
if( data == NULL )
return NULL;
// 构造通话记录数据块
memcpy( data, field_index, sizeof(WORD) * PH_INDEX_FIELD_NUM );
for( i = 0; i < PH_INDEX_FIELD_NUM; i++ )
{
if( field_index[i] != 0 )
{
p = data + field_index[i]; // 偏移
switch( PhoneHDBFList[i].type )
{
case SINGLE_VALUE_FIELD: // 单值字段
strcpy( p, his[i].fieldvalue );
break;
case MULTI_VALUE_FIELD: // 多值字段
break;
}
}
}
*dataLen = total;
return data;
}
LOCALSEARCHLIST *RefreshPhoneHistoryLst( DBLACB *lacb, FIELDVALUELIST **list, U16 selType, U16 *first )
{
LOCALSEARCHLIST *search_result;
BYTE *data;
char *index;
U8 i,j;
// 根据类型选择重新组织记录
switch( selType )
{
case 0: // 全部通话记录
search_result = LocalFindRecord( lacb, PH_TIME_FIELD, NULL, GLOBAL_SEARCH );
break;
case 1: // 已拨电话记录
case 2: // 已接电话记录
case 3: // 未接电话记录
case 4: // 拒接电话记录
// 将记录类型转化为字符串
//index[0] = ((U8)(selType-1)) & 0x3f;
//index[1] = '\0';
index = PhHisTypeLst[selType-1][0];
search_result = LocalFindRecord( lacb, PH_TYPE_FIELD, index, PRECISE_FULL_MATCH );
break;
default:
break;
}
if( search_result->num < ITEM_NUM ) // 查找结果不够一页
{
*first = 0;
}
else
if( *first + ITEM_NUM > search_result->num ) // 指定位置不够一页
{
*first = search_result->num - ITEM_NUM;
}
// 重新读取一页记录
for( i = 0; i < ITEM_NUM && i < search_result->num; i++ )
{
data = search_result->head[i].data;
ReadPhdbData( list[i], data );
}
for( ; i < ITEM_NUM; i++ ) // 数据项的个数较少
{
for( j = 0; j < PH_INDEX_FIELD_NUM; j++ )
list[i][j].fieldvalue = NULL;
}
return search_result;
}
// 保存通话记录到数据库
void SavePhoneHistory( DBLACB *lacb, PHONEHISDATA *hisdata )
{
FIELDVALUELIST his[PH_INDEX_FIELD_NUM];
char time_info[15], elapse_info[7];
WORD len;
BYTE *data;
if( lacb == NULL || hisdata == NULL )
return;
sprintf( time_info, "%04d%02d%02d", hisdata->date->year, hisdata->date->month, hisdata->date->day );
sprintf( time_info+8, "%02d%02d%02d", hisdata->time->hour, hisdata->time->minute, hisdata->time->second );
sprintf( elapse_info, "%02d%02d%02d", hisdata->elapse->hour, hisdata->elapse->minute, hisdata->elapse->second );
his[PH_TIME_FIELD].fieldvalue = time_info;
his[PH_NAME_FIELD].fieldvalue = hisdata->name;
his[PH_PHONE_FIELD].fieldvalue = hisdata->number;
his[PH_TYPE_FIELD].fieldvalue = hisdata->type;
his[PH_CALL_TIME_FIELD].fieldvalue = elapse_info;
data = WritePhdbData( &len, his );
LocalAddRecord( lacb, data, len );
Lfree( data );
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -