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

📄 phonehis.c

📁 国家ASIC工程中心使用的嵌入式操作系统
💻 C
📖 第 1 页 / 共 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 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 + -