📄 plxbrowpush.c
字号:
/***************************************************************************
*
* Pollex Mobile Platform
*
* Copyright (c) 2004 by Pollex Mobile Software Co., Ltd.
* All Rights Reserved
*
* Module :
*
* Purpose :
*
\**************************************************************************/
#include "PlxConfig.h"
#if defined(PROJECT_BRANCH_06A)
#define __NEWSIMULATOR
#include "FileSystemDef.h"
#undef __NEWSIMULATOR
#endif // defined(PROJECT_BRANCH_06A)
#include "MMI_features.h"
#include "gui.h"
#include "fs_type.h"
#include "fs_func.h"
#include "fs_errcode.h"
#include "settingprot.h"
#include "settingprofile.h"
#include "wgui_status_icons.h"
#include "globalconstants.h"
#include "plxbrowPort.h"
#include "plxBrowDefs.h"
#include "../main/plxDefs.h"
#include "CommonScreens.h"
#include "../Public/PlxPublic.h"
#include "../public/plxPubDefs.h"
#include "plxBrowPublic.h"
#include "plxBrow.h"
#include "PlxBrowPush.h"
#include "plxbrowSetting.h"
#define PUSHITEM_MAIN_NAME_LEN 14 //such as 20051211090807 -year month day hour minute second
#define PUSHITEM_SUB_NAME_LEN (3 + 3) // 3 is reserved
#define PUSHITEM_EXT_MANE_LEN 3
#define PUSHITEM_FULL_NAME_LEN (PUSHITEM_MAIN_NAME_LEN + PUSHITEM_SUB_NAME_LEN + PUSHITEM_EXT_MANE_LEN + 1)
#define PUSHITEM_FILENAME_MAX_LEN (PUSHITEM_FULL_NAME_LEN * 2 + 2)
#define PLXBROW_PUSH_FILENAME_MAX_LEN 100 //PUSHITEM_FILENAME_MAX_LEN * 2 //100
typedef struct tag_Push_File_Item_Info{
PUSHCLASS class;
unsigned long lItemSize;
}FILEUNIT, *PFILEUNIT;
typedef struct tag_SI_File_Item{
unsigned int nRead; //0: unread,1: read
char szCreateTime[DATETIEMLEN];
char szExTime[DATETIEMLEN];
unsigned short nActionType;
unsigned int szTitle;
unsigned int szUrl;
unsigned int szID;
}SIFILEITEM, *PSIFILEITEM;
typedef struct tag_Txt_File_Item{
unsigned int bRead; //0: unread,1: read
}TXTFILEITEM, *PTXTFILEITEM;
typedef struct tag_Push {
S8 fileName[PUSHITEM_FILENAME_MAX_LEN];
FILEUNIT fileUnit;
void *pData;
struct tag_Push * pNext;
}PUSH, *PPUSH;
static PPUSH pPushChain = 0;
static int curPushItems = 0;
#if 0
PPUSH pCurPush;
int bakItemsNum = 0;
PU8 *listItems = 0;
U16 *listIcons=0;
#endif
static S32 curSelItem = 0;
static HDMENU wbPushMenu = NULL;
static U8 *pContent = NULL;
static BOOL bIsPushLoad = FALSE;
static unsigned long nPushHistoryFlag = 0;
//add by jhzhao
//FuncPtr ExternEndKeyDownFuncPtr=NULL;
#define PUSH_NO_IN_HISTORY 0x0000
#define PUSH_BEFORE_BROWSER 0x0001
#define PUSH_AFTER_BROWSER 0x0002
#define PUSH_NEW_PUSH 0x0004
//static BOOL bIsNewPushAdded = FALSE;
static int SetPushDir(void );
//static unsigned long PwbGetTickCount(void);
static void GeneratePushMainName(char* szBuffer, int nBuffLen);
static long NewAndOpenFile(char *RetFileName);
static void AddNewPushComfirmCB(PLIBEVENT event);
void ExitWbPush(void);
static void EnterWBPushScreen(void);
//void EnterWBPushMenu(void);
void DestroyPushChain(void);
int BuildPushItemChain(void);
static void InsertNewItemToSpePushChain(PPUSH pNewPush, PPUSH pStatItem, PPUSH pEndItem, int nNumOfPush);
static void InsertNewItemToPushChain(PPUSH pNewPush);
static void DumpPushChain(void);
static void DumpPush(PPUSH pPush);
//void WBPushParseSIItem(void *pSiData, PSIINFO pSiInfo);
static int WBPushSetReadState(PPUSH pPush, unsigned int bRead);
void WBPushMarkCurSel(S32 selItem);
//static void GetWBPushItemInfo(void);
static U8 PushCBHhandler(void* param);
static pBOOL GetNextPushItem( S32 item_index, UI_string_type str_buff, UI_image_type* img_buff_p, U8 str_img_mask );
static S32 GetNextPushItemHint ( S32 item_index, UI_string_type *hint_array );
//void hilight_pushmenu_read(void);
//void hilight_pushmenu_del(void);
//void hilight_pushmenu_delall(void);
void ConfirmJump (void);
void RejectJump (void);
static void JumpToPushSiUrlConfirmCB(PLIBEVENT event);
static void EntryJumpToPushSIUrlScreen(void);
void WBPushUserRead(void);
static void DelAllPushItemsConfirmCB(PLIBEVENT event);
static void DelSelPushItemConfirmCB(PLIBEVENT event);
void WBPushDelItem(void);
void WBPushDelAllItems(void);
void GoBackToPushList(void);
void WBPushDoDelItem(void);
void WBPushDoDelAllItems(void);
static PPUSH WBPushGetCurSelItem(S32 index);
void WBPushReadTextContent(PPUSH pPush);
void WBPushExitReadText(void);
//key end handler
static BOOL IsAllPushReaded(void);
static void SetIdleScreenWapStatusIcon(BOOL bShow, BOOL bPlayTone);
void PlxBrowSetWapStatusIcon(void);
void WBPushKeyEndHandler(void);
static void PushKeyEndExitLskFunc(void);
//static void PushKeyEndExitConfirmCB(PLIBEVENT event);
int AddPushItem(U16 *fileName);
static int GetNewPushNum(void);
//pushbox menu screen
static void EntryWBPushMenu(void);
static int CreateWBPushMenu(void);
static void ModifyWBPushMenu(void);
static int WBPushMenuNty(HDMENU hMenu, unsigned long id, unsigned long event);
static void EntryNewPushArrivedScreen(void);
extern void ShowCategory164Screen(U16 left_softkey,U16 left_softkey_icon,U16 right_softkey,U16 right_softkey_icon,U16 message,U16 message_icon,U8* history_buffer);
extern void IdleSetStatusIcon(S16 index);
extern void IdleResetStatusIcon(S16 index);
extern void TurnOnBacklight(U8 TimerFlag);
extern void PlayMessageArrivalTone(void);
extern U8 IsKeyPadLockState(void);
extern U8 jumpToBuffer[];
#ifdef __PLXBROW_DEBUG_
extern void PlxTrace(const char * fmt,...);
extern void WAP_DataOut(const unsigned char * pData, unsigned short Length, const unsigned char * pName);
#endif
#ifdef __PLXBROW_PUSH_TEST_
/****************************************************************************
* Function TestPushSave
* Purpose test push
* Params
* Return
* Remarks
\****************************************************************************/
extern int rand(void);
void TestPushSave(int pushClass)
{
char pszUrl[] = "http://wap.163.com";
char pszTitle[100];
SIINFO SiInfo;
static int i = 0;
sprintf(pszTitle,"%d-%d push item", i,rand());
i ++;
if(PUSH_SI == pushClass)
{
SiInfo.pszTitle = pszTitle;
SiInfo.pszUri = pszUrl;
SiInfo.pszId = "100";
SiInfo.nActionType = 200;
SiInfo.nRead = 0;
memset(SiInfo.szCreateTime,'a',DATETIEMLEN);
SiInfo.szCreateTime[DATETIEMLEN-1] = '\0';
memset(SiInfo.szExTime, 'b',DATETIEMLEN);
SiInfo.szExTime[DATETIEMLEN-1] = '\0';
WBPushSaveNew(PUSH_SI, (void *)&SiInfo, 0, 0);
}
else
{
WBPushSaveNew(PUSH_TEXT,(void*)pszUrl, strlen(pszUrl),0);
}
}
void TestSIPush(void)
{
TestPushSave(PUSH_SI);
}
void TestTextPush(void)
{
TestPushSave(PUSH_TEXT);
}
#endif //__PLXBROW_PUSH_TEST_
/****************************************************************************
* Function WBPushSaveNew
* Purpose save a new push item to file
* Params
* Return
* Remarks
\****************************************************************************/
int WBPushSaveNew(PUSHCLASS classPush, void *pData, unsigned int lenData, unsigned short bRead){
FILEUNIT fileUnit;
SIFILEITEM siItem;
TXTFILEITEM txtItem;
PSIINFO pSiInfo;
S32 fileHandle;
UINT written=0;
char szFileName[PLXBROW_PUSH_FILENAME_MAX_LEN];//unicode
#ifdef __PLXBROW_DEBUG_
PlxTrace("[%d] WBPushSaveNew -----> New Push arrived! type= %s", __LINE__, classPush == PUSH_SI ? "PUSH_SI" : "PUSH_TEXT");
#endif
fileUnit.class = classPush;
switch(classPush) {
case PUSH_SI:
if(NULL == pData )
return -1;
pSiInfo = (PSIINFO)pData;
siItem.nRead = bRead; // pSiInfo->nRead means: 1 : read ; 0 : unread;
siItem.nActionType = pSiInfo->nActionType;
PlxAppMemcpy(siItem.szCreateTime, pSiInfo->szCreateTime, DATETIEMLEN);
PlxAppMemcpy(siItem.szExTime, pSiInfo->szExTime, DATETIEMLEN);
if(NULL != pSiInfo->pszTitle)
siItem.szTitle = strlen(pSiInfo->pszTitle) + 1;
else
siItem.szTitle = 0;
if(NULL != pSiInfo->pszUri)
siItem.szUrl = strlen(pSiInfo->pszUri) + 1;
else
siItem.szUrl = 0;
siItem.szID = 0;
fileUnit.lItemSize = sizeof(SIFILEITEM) + siItem.szTitle + siItem.szUrl + siItem.szID + sizeof(FILEUNIT);
if(FALSE == PlxBrowIsFlashAvailabe((unsigned long)fileUnit.lItemSize, (const char *) GetPBUIPushBoxDirectory()))
{
PLIB_MessageBox(PMBTYPE_ERROR, NULL, (const WCHAR * )get_string(STR_ID_PLX_BROW_SAVEPAGE_ERR_NOFLASHSPACE),UI_POPUP_NOTIFYDURATION_TIME);
return -3;
}
fileHandle = NewAndOpenFile(szFileName);
if (0 > fileHandle) {
#ifdef __PLXBROW_DEBUG_
PlxTrace("[%d] WBPushSaveNew ----->PUSH_SI : NewAndOpenFile return failed!", __LINE__);
#endif
return -2;
}
FS_Seek(fileHandle, 0, SEEK_SET);
FS_Write(fileHandle, &fileUnit, sizeof(FILEUNIT), &written);
FS_Write(fileHandle, &siItem, sizeof(SIFILEITEM), &written);
FS_Write(fileHandle, pSiInfo->pszTitle, siItem.szTitle, &written);
FS_Write(fileHandle, pSiInfo->pszUri, siItem.szUrl, &written);
FS_Close(fileHandle);
#ifdef __PLXBROW_DEBUG_
WAP_DataOut((const unsigned char *)szFileName, (unsigned short)PLXBROW_PUSH_FILENAME_MAX_LEN, (const unsigned char *)"WBPushSaveNew ----->szFileName") ;
PlxTrace("[%d] WBPushSaveNew -----> PUSH_SI: write new push to %s",__LINE__, szFileName);
PlxTrace("write fileUnit %d bytes", written);
PlxTrace("fileUnit.class =%d ,fileUnit.lItemSize=%d", fileUnit.class,fileUnit.lItemSize);
PlxTrace("write siItem %d bytes", written);
PlxTrace("siItem.nRead= %d, siItem.nActionType =%d ",siItem.nRead,siItem.nActionType);
PlxTrace("siItem.szTitle= %d :%s, siItem.szUrl =%d : %s ",siItem.szTitle,pSiInfo->pszTitle ,siItem.szUrl, pSiInfo->pszUri);
PlxTrace("siItem.CreateTime= %s, siItem.ExTime =%s ",siItem.szCreateTime,siItem.szExTime);
PlxTrace("write pSiInfo->pszTitle %d bytes", written);
PlxTrace("write pSiInfo->pszUri %d bytes", written);
#endif
break;
case PUSH_TEXT:
if(NULL == pData || 0 >= lenData)
return -1;
txtItem.bRead = bRead;
fileUnit.lItemSize = sizeof(FILEUNIT) + sizeof(TXTFILEITEM /*SIFILEITEM*/) + lenData + 1;
if(FALSE == PlxBrowIsFlashAvailabe((unsigned long)fileUnit.lItemSize, (const char *) GetPBUIPushBoxDirectory()))
{
PLIB_MessageBox(PMBTYPE_ERROR, NULL, (const WCHAR * )get_string(STR_ID_PLX_BROW_SAVEPAGE_ERR_NOFLASHSPACE),UI_POPUP_NOTIFYDURATION_TIME);
return -3;
}
fileHandle = NewAndOpenFile(szFileName);
if (0 > fileHandle) {
#ifdef __PLXBROW_DEBUG_
PlxTrace("[%d] WBPushSaveNew -----> PUSH_TEXT : NewAndOpenFile return failed!", __LINE__);
#endif
return -2;
}
FS_Seek(fileHandle, 0, SEEK_SET);
FS_Write(fileHandle, &fileUnit, sizeof(FILEUNIT), &written);
FS_Write(fileHandle, &txtItem, sizeof(TXTFILEITEM), &written);
FS_Write(fileHandle, pData, lenData + 1, &written);
FS_Close(fileHandle);
#ifdef __PLXBROW_DEBUG_
PlxTrace("[%d] WBPushSaveNew -----> PUSH_SI: Write new push to %s", __LINE__,szFileName);
PlxTrace("write fileUnit %d bytes", written);
PlxTrace("write txtItem %d bytes", written);
PlxTrace("write pData %d bytes", written);
PlxTrace("pData[%d] : %s ",lenData, pData);
#endif
break;
default:
#ifdef __PLXBROW_DEBUG_
PlxTrace("[%d] WBPushSaveNew -----> unknown push type = %d", __LINE__, classPush);
#endif
return -1;
}
if(TRUE == bIsPushLoad)
{
if(0 == AddPushItem((U16 *)szFileName))
curSelItem ++;
}
//enter the new push arrived screen.
EntryNewPushArrivedScreen();
return 0;
}
/****************************************************************************
* Function EntryNewPushArrivedScreen
* Purpose
* Params
* Return
* Remarks
\****************************************************************************/
static void EntryNewPushArrivedScreen(void)
{
int nToneId = 0;
int nImageId = IMG_ID_PLX_BROW_NEW_PUSH_ARRIVED;
SetIdleScreenWapStatusIcon(TRUE, TRUE);
if ( IsKeyPadLockState ()/* && IsMMIInIdleState()*/)
{
PLIB_MessageBox(PMBTYPE_PUSHARRIVE, NULL, (const WCHAR *)get_string(STR_ID_PLX_BROW_PUSHBOX_NEWPUSHARRIVED), 5000);
}
else
{
// if ( GetKeyHandler(KEY_END, KEY_EVENT_DOWN) != WBPushKeyEndHandler )
// ExternEndKeyDownFuncPtr = GetKeyHandler(KEY_END, KEY_EVENT_DOWN);
if(0 == ValidateExEndKeyHandler())
RegisterExEndKeyHandler(GetKeyHandler(KEY_END,KEY_EVENT_DOWN));
PLIB_ConfirmBox(NULL, (const WCHAR *)get_string(STR_ID_PLX_BROW_PUSHBOX_NEWPUSHARRIVED),
NULL, NULL, (void*)&nImageId, 0, (void *)&nToneId, 0,AddNewPushComfirmCB);
SetKeyHandler(WBPushKeyEndHandler, KEY_END,KEY_EVENT_DOWN);
}
}
/****************************************************************************
* Function WBPushGetHeader
* Purpose get push item's header
* Params
* Return
* Remarks
\****************************************************************************/
int WBPushGetHeader(U16 *fileName, PFILEUNIT pFileUnit){
S32 fileHandle;
UINT nRead;
fileHandle = FS_Open(fileName, FS_READ_ONLY);
if (fileHandle < 0) {
#ifdef __PLXBROW_DEBUG_
char utf8[128];
PlxWideCharToUTF8((char *)fileName, pixtel_UI_strlen((unsigned short*)fileName), utf8, sizeof(utf8));
PlxTrace ("[%d] WBPushGetHeader -----> FS_Open[%s][%d]", __LINE__, utf8, fileHandle);
#endif
return -1;
}
FS_Seek(fileHandle, 0, SEEK_SET);
FS_Read(fileHandle, pFileUnit, sizeof(FILEUNIT), &nRead);
if(nRead != sizeof(FILEUNIT))
{
FS_Close(fileHandle);
#ifdef __PLXBROW_DEBUG_
PlxTrace ("[%d] WBPushGetHeader -----> sizeof(FILEUNIT) != nRead!", __LINE__);
#endif
return -2;
}
#ifdef __PLXBROW_DEBUG_
PlxTrace ("[%d] WBPushGetHeader -----> pFileUnit->class =%d pFileUnit->lItemSize=%d!", __LINE__,pFileUnit->class, pFileUnit->lItemSize);
#endif
if(pFileUnit->class != PUSH_TEXT && pFileUnit->class != PUSH_SI)
{
FS_Close(fileHandle);
#ifdef __PLXBROW_DEBUG_
PlxTrace ("[%d] WBPushGetHeader -----> pFileUnit->class is error!", __LINE__);
#endif
return -3;
}
if((pFileUnit->class == PUSH_SI && pFileUnit->lItemSize < sizeof(FILEUNIT) + sizeof(SIFILEITEM)) ||
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -