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

📄 phonebook.c

📁 MINIGUI code MINIGUI code
💻 C
📖 第 1 页 / 共 2 页
字号:
/*************************************************/
/**                                             **/
/**             电话本模块                      **/
/*************************************************/
/*
 * 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 + -