📄 phonebook.c
字号:
/*************************************************/
/** **/
/** 电话本模块 **/
/*************************************************/
/*
* phonebook.c
*
* created by shhjia@udtech.com.cn 2005/4/24
*
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
#include <minigui/control.h>
#include <minigui/mywindows.h>
#include <minigui/mgext.h>
#include "internal.h"
#define BUTTON_NUM 4
#define LIST_W (90*SCALE_VALUE)
#define LIST_H (18*SCALE_VALUE)
#define IDC_TITLE 0
#define IDC_LISTVIEW 1
#define IDC_HIDE 2
#define ADDRBOOK_UPLOAD_CSV "/udconfig/phonebook_new.csv" //web端传来的文件
#define ADDRBOOK_CLIENT_CSV "/udconfig/phonebook.csv" //本地保存的文件
#define SECTION_NUM 9 //电话本的组成部分数
#define PrSize (sizeof(phoneRecord))
#if 0
static RECT button_rect_pb =
{
10*SCALE_VALUE, MAINWINDOW_H-40*SCALE_VALUE, MAINWINDOW_W-10*SCALE_VALUE, MAINWINDOW_H
};
#else
static RECT button_rect_pb =
{
10*SCALE_VALUE, MAINWINDOW_H-50*SCALE_VALUE, MAINWINDOW_W-10*SCALE_VALUE, MAINWINDOW_H
};
#endif
static BITMAP bmp_button_def[BUTTON_NUM];
static BITMAP bmp_button_sel[BUTTON_NUM];
static BITMAP bmp_button_dis[BUTTON_NUM];
BITMAP pb_bmp_Title;
extern BOOL bIntoList;
extern int save_record;
extern HWND g_phone_numdlg_window_created;
extern void showDetailRecord(HWND hDlg,int index);
//extern int tool_PhoneBook_Dialog(HWND hDlg,int index);
extern int find_PhoneBook_Dialog(HWND hDlg);
extern int add_PhoneBook_Dialog(HWND hDlg);
extern void edit_PhoneBook_Dialog(HWND hDlg,int index);
extern void del_PhoneBook_Dialog(HWND hDlg,int index);
extern int phoneCallRecord(HWND hDlg, int index);
int advanced_PhoneBOOK_Dialog(HWND hDlg);
static void switch_from_pim_to_csv();
static char * captionPhoneBookMain [] =
{
"Name", "Group", "Note", "Email"
};
static CTRLDATA phoneBookInit[] =
{
{
CTRL_STATIC,
WS_CHILD | WS_VISIBLE | SS_LEFT,
TITLE_X, TITLE_Y, TITLE_W, TITLE_H,
IDC_TITLE,
NULL,
0,
WS_EX_TRANSPARENT
},
{
CTRL_LISTVIEW,
WS_CHILD | WS_VISIBLE | WS_VSCROLL,
//10*SCALE_VALUE, 50*SCALE_VALUE, MAINWINDOW_W-16*SCALE_VALUE, 146*SCALE_VALUE,
10*SCALE_VALUE, 50*SCALE_VALUE, 338*SCALE_VALUE, (146)*SCALE_VALUE,
IDC_LISTVIEW,
"",
0,
//WS_EX_TRANSPARENT
},
};
static DLGTEMPLATE phoneBookMode =
{
WS_VISIBLE | WS_BORDER,
WS_EX_NONE,
MAINWINDOW_LX, MAINWINDOW_LY, MAINWINDOW_W, MAINWINDOW_H,
"",
0, 0,
TABLESIZE(phoneBookInit), NULL,
0
};
extern int from_dial;
extern groupName *g_group;
extern EG_SORTDB *g_pdb_addr;
//char phonenumber[32];
static int g_records=0; //记录总数
static int g_cur_record =0;
static HWND hListView;
static int ret_flag = FALSE;
/*
**功能:将每条记录的名字字段显示在列表中
**返回:添加在列表框中的行数(记录数)
*/
static int showAddrlist()
{
int iRow=0,jCol=0;
LVSUBITEM subdata;
LVITEM item;
phoneRecord *pr=NULL;
SendMessage(hListView,LVM_DELALLITEM,0,0);
if (g_pdb_addr==NULL)
addr_db_init();
if (g_pdb_addr==NULL)
return -1;
item.nItemHeight = 48;
eg_sortdb_rewind(g_pdb_addr);
while (pr=(phoneRecord *)eg_sortdb_next_record(g_pdb_addr))
{
item.nItem=iRow; /*添加行*/
SendMessage(hListView,LVM_ADDITEM,0,(LPARAM)&item);
subdata.flags=0;
subdata.image=0;
for (jCol=0; jCol<4; jCol++)
{
subdata.nItem=iRow; /*添加每行中的字段*/
subdata.subItem=jCol;
if (jCol==0)
subdata.pszText=pr->name;
else if (jCol ==1)
{
subdata.pszText=(char*)fh_gettext(g_group->groupName[pr->groupid]);
}
else if (jCol ==2)
subdata.pszText=pr->pmessage;
else if (jCol ==3)
subdata.pszText=pr->email;
subdata.nTextColor = 0;
SendMessage(hListView,LVM_SETSUBITEM,0,(LPARAM)&subdata);
}
iRow++;
}
g_records=SendMessage(hListView,LVM_GETITEMCOUNT,0,0);
if(g_records > 0)
SendMessage (hListView, LVM_SELECTITEM, g_cur_record, 0);
return iRow;
}
char FirstLine[PrSize + 1];
/*
*此函数将用户操作的库文件转为CSV格式的文件
* "/tmp/addrbook_client.csv",此文件有web服务端读取
*/
static void switch_from_pim_to_csv()
{
phoneRecord *pr=NULL;
FILE *fptr=NULL;
int i_row=0;
if (g_pdb_addr==NULL)
{
printf("init datebase\n");
addr_db_init();
}
if (g_pdb_addr==NULL)
return ;
if ((fptr =fopen(ADDRBOOK_CLIENT_CSV,"w+"))==NULL)
{
printf("open file error\n");
return ;
}
eg_sortdb_rewind(g_pdb_addr);
if (FirstLine[0] != 0)
fwrite(FirstLine, PrSize + 1, 1, fptr);
while (pr=(phoneRecord *)eg_sortdb_next_record(g_pdb_addr))
{
fprintf(fptr,"%s,%s,%s,%s,%s,%s,%s,%s,%d\r\n", \
pr->name, pr->phoneno1, pr->phoneno2, pr->phoneno3, pr->phoneno4, pr->phoneno5,pr->email, pr->pmessage, (int)pr->groupid);
i_row++;
}
fclose(fptr);
dbprintf(("i_row=%d\n",i_row));
}
/* strdevide 分割字符串
** 以逗号为分割标志,将字符串buf按照phoneRecord的
** 成员顺序将分割的前num个字段复制给pr
*/
static int strdivide(phoneRecord* pr, char* buf, int num)
{
char *head = NULL;
char *tail = NULL;
int i = 0;
char info = 34; //设定双引号屏蔽逗号的分割功能
int sign = 0;
int first = 0;
head = tail = buf;
if (pr == NULL || buf == NULL || num <= 0)
return -1;
while ((*tail) != '\n' && (*tail) != '\0' && i < num)
{
while ((*tail) != ',')
{
if (*tail == info)
{
if (0 == sign) //如果是指定的屏蔽逗号的首字符
sign = 1;
else //如果是指定的屏蔽逗号的尾字符
sign = 0;
}
tail++;
}
if (0 == sign)
*tail = '\0';
else //逗号在屏蔽字符里
{
tail++;
continue;
}
switch (i) //按照PhoneRecord结构体的成员顺序填充内容
{
case 0:
if ((0 == strcmp(head, "姓名"))|| (0 == strncasecmp(head, "name", ADDR_USERNAME_LEN)))
{
*tail = ',';
first = 1; //如果这行是属性字段行就跳过
break;
}
strncpy(pr->name, head, ADDR_USERNAME_LEN);
break;
case 1:
if (1 == first)
{
*tail = ',';
break;
}
strncpy(pr->phoneno1, head, ADDR_PHONENUM_LEN);
break;
case 2:
if (1 == first)
{
*tail = ',';
break;
}
strncpy(pr->phoneno2, head, ADDR_PHONENUM_LEN);
break;
case 3:
if (1 == first)
{
*tail = ',';
break;
}
strncpy(pr->phoneno3, head, ADDR_PHONENUM_LEN);
break;
case 4:
if (1 == first)
{
*tail = ',';
break;
}
strncpy(pr->phoneno4, head, ADDR_PHONENUM_LEN);
break;
case 5:
if (1 == first)
{
*tail = ',';
break;
}
strncpy(pr->phoneno5, head, ADDR_PHONENUM_LEN);
break;
case 6:
if (1 == first)
{
*tail = ',';
break;
}
strncpy(pr->email, head, ADDR_MAIL_LEN);
break;
case 7:
if (1 == first)
{
*tail = ',';
break;
}
strncpy(pr->pmessage, head, ADDR_PMESSAGE_LEN);
break;
case 8:
if (1 == first)
{
return 1;
}
pr->groupid = atoi(head);
break;
default:
return -1;
}
i++;
tail++;
head = tail;
}
return 0;
}
static void disp_record_info(HWND hDlg)
{
char title[128] = {0};
sprintf(title, "%s (%d/%d)", fh_gettext("Phonebook"), g_records, MAX_ADDR_RECORD_NUM);
SendDlgItemMessage(hDlg, IDC_TITLE, MSG_SETTEXT, 0, (LPARAM)title);
}
/*
* static void switch_from_cvs_to_pim(HWND hDlg)
*此函数判断如果有web服务端上传的CSV文件"/tmp/addrbook_client.csv"
*将替换本地的库文件,如果替换后将该文件删除之
*/
static void switch_from_cvs_to_pim(HWND hDlg)
{
phoneRecord pr;
FILE *fptr=NULL;
int i_row=0, ret;
char RowBuf[PrSize+1];
if ((fptr =fopen(ADDRBOOK_UPLOAD_CSV,"r"))==NULL)
{
printf("open file error\n");
return ;
}
else
{
NotifyData sel;
sel.title = (char*)fh_gettext("警告");
sel.content = ( char*)fh_gettext("\n是否替换电话本?");
sel.wndtype = NT_SELWND|NT_DEFSELOK;
sel.okflag = 0;
sel.addData = 0;
create_notify_window(hDlg, &sel, default_notify_proc);
if (!sel.okflag)
return;
else
{
remove(ADDR_DB);
addr_db_clear(); //清空原来的数据库中的内容
addr_db_deinit();
}
}
if (g_pdb_addr==NULL)
{
dbprintf(("init datebase\n"));
addr_db_init();
}
if (g_pdb_addr==NULL)
return;
while (!feof(fptr))
{
memset(RowBuf, 0, PrSize+1);
memset(&pr , 0 , PrSize);
fgets(RowBuf, PrSize, fptr);
if (RowBuf[0]==0)
break;
RowBuf[PrSize] = '\0';
ret = strdivide(&pr, RowBuf, SECTION_NUM);
if (1 == ret) //如果这行是属性字段行就跳过
{
strncpy(FirstLine, RowBuf, strlen(RowBuf));
FirstLine[PrSize-1] = '\r';
FirstLine[PrSize] = '\n';
dbprintf(("RowBuf=%s", RowBuf));
continue;
}
eg_sortdb_record_add(g_pdb_addr,&pr);
i_row++;
if (i_row > MAX_ADDR_RECORD_NUM)
break;
dbprintf(("i_row=%d RowBuf=%s \n", i_row, RowBuf));
}
fclose(fptr);
remove(ADDRBOOK_UPLOAD_CSV);
}
/*
**函数:static int phoneBookPro1(...)
**功能:创建"电话本"的过程处理函数
*/
static int phoneBookPro1 (HWND hDlg, int message, WPARAM wParam, LPARAM lParam)
{
int i, j;
HWND old_g_phone_numdlg_window_created;
LVITEM item;
LVCOLUMN lvcol;
GHANDLE hitem;
WndData *wndinfo = (WndData *) GetWindowAdditionalData(hDlg);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -