📄 sms.c
字号:
/*************************************************************************
*
* Copyright 2000 National ASIC Center, All right Reserved
*
* FILE NAME: sms.c
* PROGRAMMER: Yushaofeng
* Date of Creation: 2002/08/13
*
* DESCRIPTION: It's the sms module.
*
* NOTE:
* 从外部调用的函数 char* SearchTelephoneBook() 查找号码 电话本模块
* void SupSearch(S16 *num, SMSHISTORY **list) 高级搜索
* STATUS AddPhonetoBook(char *number) 保存到电话本 电话本模块
* STATUS SaveSmsNote(SMS *sms) 保存到记事本 记事本模块
* //char* searchname(char *number) 根据号码查姓名 电话本模块
* char* SearchNotepad(char *type) 从记事本导入内容 记事本模块
*
* FUNCTIONS LIST:
* -------------------------------------------------------------------------
* STATUS EditSMS(void); //(完成)完成了短信的编辑功能
* STATUS SendSMS(SMS *sms); //(完成)完成发送短信的过程
* STATUS SaveSMS(SMS *sms, S16 savetype); //(完成)按照类型
* 保存短信
* void ChoosePhrase(char *phs); //(完成)常用语的选择
* void GetPhrase(S16 *phsnum); //(完成)常用语列表的初始化
* 即从文件读入
* STATUS ReplySMS(char *phone) //(完成)回复短信
* STATUS TransmitSMS(char *content) //(完成)转发短信
* STATUS Add2SMSHistory(SMS *sms, char *type, char *time) //(完成)保存短信到历史记录
* void LoadHistory(char *type, S16 *num, SMSHISTORY **list)
* //(完成)(这里的历史记录暂时自己写,应该是通过数据库读取)
* SEARCH *SupSearch(S16 *num, SMSHISTORY **list); //(完成)短信搜索
* GLOBAL VARS LIST:
*
*
**************************************************************************
*
* MODIFICATION HISTORY
*
*
* 2002/08/13 by Yushaofeng Creation of this file
*
*************************************************************************/
#include <stdio.h>
#include <string.h>
#include <asixwin.h>
#include <asixapp.h>
#include <asixwin\asix_ed.h>
#include <asixwin\asix_mn.h>
#include <asixwin\asix_tb.h>
//#include <database\appdb.h>
#include <database\SMShdb.h>
#include <database\CARDdb.h>
#include <asixwin\select.h>
//#include <ppsm.h>
#include <service\psst\at_rps.h>
#include <service\psst\psat.h>
#include "sms.h"
#include <..\app\notepad\notepad.h>
#include <..\app\phbook\phbook.h>
#include <resource\bitmap.h>
#include <resource\sysicon.h>
//注册表
TASKDESCRIPTION SMSTskDesp =
{"EditSMS", ASIX_APP, 0, zi_massage, 4096, 1, LCD_WIDTH, LCD_HEIGHT, EditSMS, APP_PRI};
// 编辑短信主窗口
//---------------------------------------------------------------
// EditSMS()
//
// Operate SMS.
//
// Parameters:
//
// Returns:
// SMS_OK : OK.
// SMS_ERROR : ERROR.
//---------------------------------------------------------------
STATUS EditSMS(void)
{
// 窗口和控件id
U32 mainwin; // 主窗口
U32 send, phrase, history, notepad, /*keyb, */search;
//按钮,分别是发送、常用语、历史记录、记事本、软键盘和查找。
U32 numedit, smsedit; //编辑栏,号码和短信
U32 keyboard; //软键盘
U32 tskbar; //底部静态文本框
U32 savemenu; //保存类型选择菜单
// 函数用变量
MSG msg;
S16 quit;
SMS *newsms; // 编辑的新短消息
S16 savetype; // 保存类型值
char phs[PHS_MAX_SIZE + 1]; // 常用语
char note[TEXT_SIZE + 1]; //读进的记事本
S16 numflag = 1; //是否显示“输入号码”提示的标志
S16 smsflag = 1; //是否显示“输入短信”提示的标志
S16 listnum;
SMSHISTORY *nowlist[HIS_MAX_NUM]; //当前显示列表
// 初始化参数
struct MENU_ITEM menuitem[] = //保存的类型菜单
{
1, 1, "历史记录",
1, 1, "电话本",
1, 1, "记事本",
0, 0, NULL,
};
dbgprintf( "### Enter 编辑短信 ###" );
quit = 0;
if((newsms = (SMS *)Lmalloc(sizeof(SMS))) == NULL)
goto ERROR;
memset(newsms, 0x00, sizeof(SMS));
// CreateDataBase(); //创建数据库文件
// 窗口和控件的创建
mainwin = CreateWindow(WNDCLASS_WIN, "短信", WS_OVERLAPPEDWINDOW, 0, 0, PHY_LCD_W, PHY_LCD_H, 0, 0, NULL);
send = CreateWindow(WNDCLASS_BUTTON, "\\发送短信", WS_CHILD|BS_REGULAR, (LCD_WIDTH - 120)/2, 23, BUTTON_W, BUTTON_W, mainwin, 0x00140014, (char *)zi_fasongduanxin);
savemenu = CreateWindow(WNDCLASS_MENU, (CHAR *)zi_save, WS_CHILD|MNS_ICON, (LCD_WIDTH - 120)/2 + 25, 23, BUTTON_W, BUTTON_W, mainwin, 0, menuitem); //图形未完成
phrase = CreateWindow(WNDCLASS_BUTTON, "\\读入常用语", WS_CHILD|BS_REGULAR, (LCD_WIDTH - 120)/2 + 50, 23, BUTTON_W, BUTTON_W, mainwin, 0x00140014, (char *)zi_changyongyu);
history = CreateWindow(WNDCLASS_BUTTON, "\\浏览历史纪录", WS_CHILD|BS_REGULAR, (LCD_WIDTH - 120)/2 + 75, 23, BUTTON_W, BUTTON_W, mainwin, 0x00140014, (char *)zi_lishijiluchazhao);
notepad = CreateWindow(WNDCLASS_BUTTON, "\\读入记事本文件", WS_CHILD|BS_REGULAR, (LCD_WIDTH - 120)/2 + 100, 23, BUTTON_W, BUTTON_W, mainwin, 0x00140014, (char *)zi_jishibenchazhao);
search = CreateWindow(WNDCLASS_BUTTON, "\\查找", WS_CHILD|BS_REGULAR, (LCD_WIDTH - 150)/2 + 125, 46, BUTTON_W, BUTTON_W, mainwin, 0x00140014, (char *)zi_dianhuabenchazhao);
// keyb = CreateWindow(WNDCLASS_BUTTON, "KB", WS_CHILD|BS_REGULAR, 30, 220, BUTTON_W, BUTTON_W, mainwin, 0, NULL);
numedit = CreateWindow(WNDCLASS_EDITOR, "请输入号码", WS_CHILD|ES_SINGLELINE|ES_RIGHT, (LCD_WIDTH - 150)/2, 46, 110, 20, mainwin, PHONE_MAX + 1, NULL);
smsedit = CreateWindow(WNDCLASS_EDITOR, "请输入短信", WS_CHILD|ES_MULTI_REGULAR, (LCD_WIDTH - 150)/2, 68, 155, 60, mainwin, SMS_MAX + 1, NULL);
// bottom = CreateWindow(WNDCLASS_STATIC, "", WS_CHILD|SS_BOARD, 0, 220, 160, 20, mainwin, 0, NULL);
keyboard = CreateWindow(WNDCLASS_KEYBD, NULL, WS_CHILD|KBS_HANDWRITE|0xff, 1, 144, 157, 70, mainwin, 0, NULL);
tskbar = CreateWindow(WNDCLASS_TSKBAR, NULL, WS_CHILD|TBS_TYPICAL, 0, 0, 0, 0,mainwin, 0, NULL);
// SetFocus(numedit);
// 程序开始
while(!quit)
{
ASIXGetMessage(&msg, NULL, 0, 0);
switch(msg.message)
{
case WM_COMMAND:
if(msg.lparam == send) //点击发送按钮
{
GetEditorStr(numedit, newsms->number, PHONE_MAX);
GetEditorStr(smsedit, newsms->content, SMS_MAX);
if((strlen(newsms->number) == 0)||(strlen(newsms->content) == 0)||(numflag == 1)||(smsflag == 1)) //判断号码和短信内容是否为空,是否显示的是提示
{
if(MessageBox(mainwin, "请输入号码和短信内容!", "提醒", MB_ICONEXCLAMATION|MB_OK) == IDOK) ; //弹出提示框提醒
}
else
SendSMS(newsms); //发送短信
}
else
if(msg.lparam == savemenu) //点选保存菜单
{
switch(msg.wparam)
{
case 0:
savetype = SMS_HISTORY; //保存到历史记录
break;
case 1:
savetype = SMS_PHONEBOOK; //保存到电话本
break;
case 2:
savetype = SMS_NOTEBOOK; //保存到电话本
break;
}
if(savetype == SMS_PHONEBOOK) //保存号码时
{
GetEditorStr(numedit, newsms->number, PHONE_MAX);
if((strlen(newsms->number) == 0)||(numflag == 1)) //号码栏为空和显示提示时
MessageBox(mainwin, "请输入号码!", "提醒", MB_ICONEXCLAMATION|MB_OK); //弹出提示框提醒
else
if(SaveSMS(newsms, savetype) == SAVE_SMS_FAIL)
MessageBox(mainwin, "保存失败!", "提醒", MB_ICONEXCLAMATION|MB_OK);
else
MessageBox(mainwin, "保存完毕!", "提醒", MB_ICONEXCLAMATION|MB_OK);
}
else //保存短信内容时
{
GetEditorStr(smsedit, newsms->content, SMS_MAX);
if((strlen(newsms->content) == 0)||(smsflag == 1))
MessageBox(mainwin, "请输入短信内容!", "提醒", MB_ICONEXCLAMATION|MB_OK); //弹出提示框提醒
else
{
GetEditorStr(numedit, newsms->number, PHONE_MAX);
if((numflag == 1)||(strlen(newsms->number) == 0 ))
{
strcpy(newsms->number, "\0");
}
if(SaveSMS(newsms, savetype) == SAVE_SMS_OK)
// MessageBox(mainwin, "保存失败!", "提醒", MB_ICONEXCLAMATION|MB_OK);
// else
MessageBox(mainwin, "保存完毕!", "提醒", MB_ICONEXCLAMATION|MB_OK);
}
}
}
else
if(msg.lparam == phrase) //点选常用语菜单
{
ChoosePhrase(phs);
if(smsflag == 1)
{
SetWindowText(smsedit, "", NULL);
smsflag = 0;
}
GetEditorStr(smsedit, newsms->content, SMS_MAX);
if(strlen(phs) >= (SMS_MAX - strlen(newsms->content))) //判断短信内容加上常用语是否溢出
*(phs + (SMS_MAX - strlen(newsms->content))) = '\0'; //截除多余的部分
strcat(newsms->content, phs); //把phrase显示在编辑栏中的短信末尾;
SetWindowText(smsedit, newsms->content, NULL);
}
else
if(msg.lparam == history) // 点击历史记录按钮
{
DestroyWindow(keyboard); //由于不能打开两个手写,这里先关掉,在调用结束后再重新创建
BrowseSMSHistory();
keyboard = CreateWindow(WNDCLASS_KEYBD, NULL, WS_CHILD|KBS_HANDWRITE|0xff, 1, 144, 157, 70, mainwin, 0, NULL);
}
else
if(msg.lparam == search) // 点击查找按钮
{
char *number;
number = SearchTelephoneBook();
if( number != NULL )
{
if( strlen( number ) > PHONE_MAX )
{
// 号码长度超出
MessageBox( mainwin, "号码过长!", "提醒", MB_OK | MB_ICONINFORMATION );
}
else
{
//查找返回号码不为空时,显示在号码编辑栏
strcpy( newsms->number, number );
SetWindowText( numedit, newsms->number, NULL);
numflag = 0;
}
}
Lfree(number);
}
else
if(msg.lparam == notepad) //点击记事本菜单,导入内容
{
char* content;
if(smsflag == 1)
{
SetWindowText(smsedit, "", NULL);
smsflag = 0;
}
DestroyWindow(keyboard); //由于不能打开两个手写,这里先关掉,在调用结束后再重新创建
content = SearchNotepad(NAME_STYPE);
strcpy(note, content);
GetEditorStr(smsedit, newsms->content, SMS_MAX);
strncat(newsms->content, note, (SMS_MAX - strlen(newsms->content)));
SetWindowText(smsedit, newsms->content, NULL);
keyboard = CreateWindow(WNDCLASS_KEYBD, NULL, WS_CHILD|KBS_HANDWRITE|0xff, 1, 144, 157, 70, mainwin, 0, NULL);
Lfree(content);
}
break;
case WM_PENDOWN:
if(msg.lparam == numedit) //点击号码输入栏
{
if(numflag ==1)
{
SetWindowText(numedit, "", NULL);
numflag = 0;
}
}
else
if(msg.lparam == smsedit) //点击短信内容输入栏
{
if(smsflag == 1)
{
SetWindowText(smsedit, "", NULL);
smsflag = 0;
}
}
break;
case WM_ALARM: //收到短信
/* if(msg.lparam == smh)
{
DestroyWindow(keyboard); //由于不能打开两个手写,这里先关掉,在调用结束后再重新创建
BrowseSMSHistory();
keyboard = CreateWindow(WNDCLASS_KEYBD, NULL, WS_CHILD|KBS_HANDWRITE|0xff, 1, 144, 157, 70, mainwin, 0, NULL);
}
else
*/ if(msg.wparam == ALARM_SMS)
{
DestroyWindow(keyboard); //由于不能打开两个手写,这里先关掉,在调用结束后再重新创建
LoadHistory(SMS_UNREAD, &listnum, nowlist); //读入未读历史纪录
ReadSMSHistory(0, listnum, nowlist);
keyboard = CreateWindow(WNDCLASS_KEYBD, NULL, WS_CHILD|KBS_HANDWRITE|0xff, 1, 144, 157, 70, mainwin, 0, NULL);
}
break;
// 关闭窗口的消息
case WM_QUIT:
GetEditorStr(smsedit, newsms->content, SMS_MAX);
if(strlen(newsms->content) != 0 && smsflag == 0) //如果短信内容不为空,询问是否保存(保存到历史记录);
{
if(MessageBox(mainwin, "是否保存短信?", "提醒", MB_ICONEXCLAMATION|MB_YESNO) == IDYES) //弹出提示框提醒
{
GetEditorStr(numedit, newsms->number, PHONE_MAX);
if(numflag == 1 || (strlen(newsms->number) == 0))
strcpy(newsms->number, "\0");
Add2SMSHistory(newsms, SMS_SEND, NULL);
}
}
if(MessageBox(mainwin, "确定要退出吗?", "提醒", MB_ICONEXCLAMATION|MB_OKCANCEL) == IDOK) //询问是否退出;
quit = 1;
break;
}
DefWindowProc(msg.message, msg.lparam, msg.data, msg.wparam);
}
DestroyWindow( mainwin );
Lfree(newsms); //释放空间
dbgprintf( "### Exit 编辑短信 ###" );
EndofTask();
// 返回编辑结果
return SMS_OK;
ERROR:
dbgprintf( "### Exit 编辑短信 ###" );
return SMS_ERROR;
}
// 发送短信
//---------------------------------------------------------------
// SendSMS()
//
// Send the SMS.
//
// Parameters:
// SMS *newsms - the SMS to be sended.
//
// Returns:
// SEND_OK : success sending.
// SEND_FAIL : fail to send.
//---------------------------------------------------------------
STATUS SendSMS(SMS *newsms) //未加入图形
{
// 定义窗口和控件id
U32 mainwin; //“发送”窗口
U32 tip; // 提示静态文本框
U32 resend, cancel; //按钮,重发和取消/确定
// 函数用变量
MSG msg;
DWORD t_id; //定时器
S16 quit = 0;
S16 nowstatus; //标识目前状态
S16 saveflag = 0; //判断是否保存的标志
U16 tip_w = LCD_WIDTH / 2;
U16 mainwin_w = LCD_WIDTH * 2 / 3;
dbgprintf( "### Enter 短信发送 ###" );
// 窗口和控件的创建(这里没有创建左边的贴图)
mainwin = CreateWindow(WNDCLASS_WIN, "发送中···", WS_POPUP|WS_CAPTION|WS_THICKFRAME, (LCD_WIDTH - mainwin_w)/2, 60, mainwin_w, 110, 0, 0, NULL);
tip = CreateWindow(WNDCLASS_STATIC, "短信发送中,请稍等···", WS_CHILD|SS_TEXT|SS_MULTILINE, (LCD_WIDTH - tip_w)/2, 90, tip_w, 40, mainwin, 0, NULL);
cancel = CreateWindow(WNDCLASS_BUTTON, "取消", WS_CHILD|BS_REGULAR, (LCD_WIDTH - 40)/2, 140, 40, 20, mainwin, 0, NULL);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -