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

📄 appsviewer.cpp

📁 C++实现的brew程序管理器例子
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/////////////////////////////////////////////////////////////////////
// Project : Appsviewer
// File: Appsviewer.h
// 2005/07/26
/////////////////////////////////////////////////////////////////////


//---------------- Inculde ------------------
#include ".\appsviewer.h"
#include "appsviewer.bid"
#include "appsviewer.brh"
#ifdef IP56
#include "stdAfx_1.h"
#else
#include "stdafx.h"
#endif
//-------------------------------------------

//---------------- Define -------------------
// The current window
#define m_pCurrWnd (m_arpWnd[m_wIndex])
// The current state
#define m_wCurrState (m_arwState[m_wIndex])


#define	EMULATOR_IMSI					"13301011012"

#define STATE_MAINMENU			0x0001	//Remind user to order
#define STATE_CONNECTING		0x0002	//Current is connecting
#define STATE_CHARGETYPE		0x0003	//List menu used to select charge type
#define STATE_CONNECTFAIL		0x0004	//Connection failed
#define STATE_CHARGEDETAIL		0x0005	//Introduce charge
#define STATE_ORDERRESULT		0x0006	//Display result of user’s order
#define STATE_ERRORALART		0x0007	//Display error messager
#define STATE_NOPOLICY			0x0008	//服务器没有相关资费策略
#define STATE_APP_DISABLE		0x0009	//应用不可用
#define STATE_ORDER_SUCCESS		0x000A	//定购完成
#define STATE_HELP				0x000B
#define	STATE_ABOUT				0x000C
#define STATE_NO_APP_DOWN		0x000D
#define STATE_APP_LIST			0x000E
#define STATE_SHOW_BILLING		0x000F	//显示已定购的关系
#define STATE_SERVICE_CATALOG	0x0010	//服务分类查询
#define STATE_POLICY_OPTION		0x0011 //资费选项
#define STATE_POLICY_RENEW		0x0012
#define STATE_CONFIRM			0x0013


#define STATE_LIMITATIONNOTIFY	0x0010	//Notify user to charge

#define APPCLS_BUFF_SIZE				20

#define URL_PARAM_CLASSID				"ClassID="
#define URL_PARAM_IMSI					"IMSI="
#define	URL_PARAM_BILLINGPOLICY			"BillingPolicy="
#define URL_PARAM_CATALOG				"CatalogID="
#define URL_PARAM_ISRENEW				"IsRenew="
#define URL_PARAM_SYMBOL_AND			"&"

#define DATEBASE_FILENAME		"orderinfo.db"
//-------------------------------------------

//static const AECHAR wszAppName[] = {'T', 'e', 's', 't', '!', 0};
//-------------------------------------------

//////////////////////////////////////////////////////////////////////
int AEEClsCreateInstance(AEECLSID ClsId,IShell * pIShell,IModule * po,void ** ppObj)
{
	*ppObj = NULL;

	if(ClsId == AEECLSID_APPSVIEWER)
	{
		if(AEEApplet_New(sizeof(CAppsViewer), ClsId, pIShell,po,(IApplet**)ppObj,
			(AEEHANDLER)CAppsViewer::HandleEvent,(PFNFREEAPPDATA)CAppsViewer::FreeAppData)
			== TRUE)
		{
			// Add your code here .....
			if(CAppsViewer::InitAppData((IApplet *)*ppObj))
			{
				return (AEE_SUCCESS);
			}
		}
	}
	return (EFAILED);
}

//初始化应用程序数据
boolean CAppsViewer::OnInitData()
{
//===========系统生成,请勿修改,开始========
	//使用IShell接口m_pIShell创建类CShell对象
	m_pShell = CShell::FromHandle(m_applet.m_pIShell, FALSE);
	//使用IDisplay接口m_pIDisplay创建类CDisplay对象
	m_pDisplay = CDisplay::FromHandle(m_applet.m_pIDisplay, FALSE);
	if(!m_pShell || !m_pDisplay)
		return FALSE;
//===========系统生成,请勿修改,结束========
//--------------your codes---------------
	m_wIndex = 0;
	m_arpWnd[0] = NULL;
	m_pWebAction = NULL;
	m_pWebUtil = NULL;
	m_bConnectionAction = FALSE;
	m_pBillingPolicys = NULL;
	m_pAppInfos = NULL;
	// Read order infomation

	return TRUE;
}

//释放应用程序资源
void  CAppsViewer::OnFreeData()
{
//-----------------your codes---------------
//...
	int i;
	for(i=0; i<=m_wIndex; i++)
	{
		if(m_arpWnd[i])
		{
			delete m_arpWnd[i];
			m_arpWnd[i] = NULL;
		}
	}

	if(m_pWebUtil)
	{
		m_pWebUtil->Release();
		delete m_pWebUtil;
	}

	if(m_pWebAction)
	{
		m_pWebAction->ReleaseWeb();
		delete m_pWebAction;
	}

	FREEIF(m_pSvrUrl);
	FREEIF(m_pBillingPolicys);
	FREEIF(m_pAppInfos);
//===========系统生成,请勿修改,开始========
	//释放Shell指针
	if(m_pShell)
		delete m_pShell;
	//释放Display指针
	if(m_pDisplay)
		delete m_pDisplay;
//===========系统生成,请勿修改,结束========
}

//处理应用程序消息,事件
boolean CAppsViewer::OnEvent(AEEEvent evt, uint16 wParam, uint32 dwParam)
{
	if(m_pCurrWnd && m_pCurrWnd->HandleEvent(evt, wParam, wParam))
	{
		return TRUE;
	}

	switch(evt)
	{
	case EVT_APP_START:			//开始
		//应用程序开始事件处理
		return OnAppStart();
	case EVT_APP_STOP:			//停止
		//应用程序停止事件处理,一般不用处理
		return TRUE;
	case EVT_APP_SUSPEND:		//暂停
		//应用程序挂起事件处理,需要设置挂起标志,并保存当前界面状态,以免在挂起状态中出来按键等消息
		//...
		return TRUE;
	case EVT_APP_RESUME:		//恢复
		//应用程序恢复事件处理,需要清除挂起标志,并恢复到挂起前的界面状态
		//...
		return TRUE;
	case EVT_KEY:				//按键事件
		//不处理AVK_SEND消息
		if(wParam == AVK_SEND)
			return FALSE;
		//其它按键处理
		if(wParam == AVK_CLR)
			return OnClrKeyEvent();
		//...
		break;
	case EVT_COMMAND:
		//
		return OnCommand(wParam, dwParam);
	
	//...
	default:
		break;
	}
	//...

	return FALSE;
}
//////////////////////////////////////////////////////////////////////////

// Handle EVT_APP_START event
// wParam: This parameter of event which is uint16 type.
// dwParam: This parameter is uint32 type. It’s a pointer of AEEAppStart
boolean CAppsViewer::OnAppStart(/*uint16 wParam, uint32 dwParam*/)
{
	//获取手机IMSI
#ifdef WIN32
	STRNCPY(m_szIMSI, EMULATOR_IMSI, MOBILE_ID_LEN);
	m_szIMSI[MOBILE_ID_LEN] = 0;
#else
	CTAPI *pTAPI = new CTAPI();
	if(pTAPI == NULL)
	{
		//get imsi fail
		return ShowMessageWnd(IDS_SOFTKEY_OK, 0, IDS_ALART_CLSERROR, STATE_ERRORALART);
	}
	else
	{
		TAPIStatus ps;
		if(m_pShell->CreateInstance(AEECLSID_TAPI, pTAPI) != SUCCESS)
		{
			delete pTAPI;
			return ShowMessageWnd(IDS_SOFTKEY_OK, 0, IDS_ALART_IMSIERROR, STATE_ERRORALART);
		}
		if(SUCCESS == pTAPI->GetStatus(&ps))
		{
			STRNCPY(m_szIMSI, ps.szMobileID, MOBILE_ID_LEN);
			m_szIMSI[MOBILE_ID_LEN] = 0;
			delete pTAPI;
		}
		else
		{
			//get imsi fail
			delete pTAPI;
			return ShowMessageWnd(IDS_SOFTKEY_OK, 0, IDS_ALART_CLSERROR, STATE_ERRORALART);
		}
	}
#endif
	
	//初始化类指针
	m_pWebUtil = new CWebUtil();
	//网络连接对象
	m_pWebAction = new CGatewayProxyWeb(this);
	if(!m_pWebUtil || !m_pWebAction)
	{
		return ShowMessageWnd(IDS_SOFTKEY_OK, 0, IDS_ALART_WEBERROR, STATE_ERRORALART);
	}

	//创建WebUtil实例
	if(!m_pWebUtil->GetHandle() && m_pShell->CreateInstance(AEECLSID_WEBUTIL, m_pWebUtil) != SUCCESS)
		return ShowMessageWnd(IDS_SOFTKEY_OK, 0, IDS_ALART_WEBERROR, STATE_ERRORALART);
	//创建WebAction
	if(!m_pWebAction->Create(m_pShell, m_pWebUtil))
		return ShowMessageWnd(IDS_SOFTKEY_OK, 0, IDS_ALART_WEBERROR, STATE_ERRORALART);


	//New first window
	CBaseWnd *pWnd = CreateBaseWnd(BASEWND_TYPE_MENU, 0, 0);
	if(!pWnd)
	{
		return FALSE;
	}
	/*
	for(int i = IDS_MAINMENU_ALL; i <= IDS_MAINMENU_HELP; i++)
	{
		AECHAR *pwszTemp = m_pShell->LoadResString(APPSVIEWER_RES_FILE, i);
		if(!pwszTemp)
			return FALSE;

		pWnd->AddItemEx(APPSVIEWER_RES_FILE, IDB_BASEWND_ITEM1, 0, i, pwszTemp, 0);
		FREEIF(pwszTemp);
	}
	*/
	AECHAR *pwszTemp = m_pShell->LoadResString(APPSVIEWER_RES_FILE, IDS_MAINMENU_ALL);
	if(!pwszTemp)
		return FALSE;
	pWnd->AddItemEx(APPSVIEWER_RES_FILE, IDB_BASEWND_ITEM1, 0, IDS_MAINMENU_ALL, pwszTemp, 0);
	FREEIF(pwszTemp);
	InsertWindow(pWnd, STATE_MAINMENU);
	return TRUE;
}

// Handle EVT_KEY(AVK_CLR) event
boolean CAppsViewer::OnClrKeyEvent()
{
	switch(m_wCurrState)
	{
	case STATE_MAINMENU:
		//Close this Applet
		m_pShell->CloseApplet(FALSE);
		return TRUE;
	case STATE_CONNECTING:
		//cancel connection
		m_bConnectionAction = FALSE;
	case STATE_CONNECTFAIL:		//Connection failed
	case STATE_CHARGEDETAIL:	//Introduce charge
	case STATE_ABOUT:
	case STATE_HELP:
	case STATE_NO_APP_DOWN:
	case STATE_SHOW_BILLING:
	case STATE_SERVICE_CATALOG:
	case STATE_APP_LIST:
	case STATE_POLICY_OPTION:
	case STATE_ORDER_SUCCESS:
	case STATE_POLICY_RENEW:
	case STATE_ORDERRESULT:
	case STATE_CONFIRM:
	case STATE_APP_DISABLE:
	case STATE_CHARGETYPE:
		//Back to previous window, if there are the first window, then close applet
		delete m_pCurrWnd;
		m_pCurrWnd = NULL;
		//First window?
		if(m_wIndex == 0)
		{
			m_pShell->CloseApplet(FALSE);
			return TRUE;
		}
		//Back to previous window
		m_wIndex--;
		m_pCurrWnd->Resume();
		return TRUE;
	case STATE_NOPOLICY:
	//	StartTargetApp();		
		return TRUE;
	default:
		break;
	}
	return FALSE;
}

// Handle EVT_COMMAND event
// wParam: Item ID
// dwParam: The control which send out this event
boolean CAppsViewer::OnCommand(uint16 wParam, uint32 dwParam)
{
	switch(m_wCurrState)
	{
	case STATE_MAINMENU:
		return OnMainMenu(wParam);
	case STATE_CONNECTING:		//Current is connecting
		if(wParam == IDS_SOFTKEY_CANCEL)
		{
			return OnClrKeyEvent();
		}
		break;
	case STATE_CONNECTFAIL:		//Connection failed
		if(wParam == IDS_SOFTKEY_CANCEL)
		{
			return OnClrKeyEvent();
		}
		else if(wParam == IDS_SOFTKEY_RETRY)
		{
			//Remove current window
			delete m_pCurrWnd;
			m_wIndex--;
			//
			//Start to connect with network
			if(m_pWebAction)
			{
				//Start web connect success?
				if(m_pWebAction->CreateWeb()
					&& m_pWebAction->WebConnect((const char *)m_pSvrUrl, NULL))
				{
					ShowMessageWnd(IDS_SOFTKEY_OK, 0, IDS_ALART_WEBERROR, STATE_ERRORALART);
					return TRUE;
				}
				else
				{
					ShowMessageWnd(IDS_SOFTKEY_CANCEL, 0, IDS_ALART_CHECK, STATE_CONNECTING);
					return TRUE;
				}
			}
			return TRUE;
		}
		break;
	case STATE_APP_DISABLE:
		delete m_pCurrWnd;
		m_wIndex--;
		return OnClrKeyEvent();
	case STATE_NOPOLICY:
	case STATE_ORDER_SUCCESS:
		return OnClrKeyEvent();
	case STATE_SHOW_BILLING:
		if(wParam == IDS_SOFTKEY_OK){
			return OnClrKeyEvent();
		}
		else if(wParam == IDS_SOFTKEY_CHECKOUT)
		{
			//退定接口

		}
		break;
	case STATE_POLICY_OPTION:
		//资费选项
		if(wParam == IDS_SOFTKEY_CANCEL)
		{
			return OnClrKeyEvent();
		}
		else if(wParam == IDS_SOFTKEY_OK)
		{
			uint32 lData;
			CMenuCtl *pMenuCtl = m_pCurrWnd->GetMenuCtl();
			if(!pMenuCtl)
				return TRUE;
			pMenuCtl->GetItemData(m_nPolicyIndex, &lData);
			m_nIsRenew =(uint16) lData;

			delete m_pCurrWnd;
			m_wIndex--;
		
			CtlAddItem ai;
			pMenuCtl = m_pCurrWnd->GetMenuCtl();
			pMenuCtl->GetItem(m_nPolicyIndex, &ai);
			return CreateConfirmWnd((AECHAR *)ai.pText);
		}
		else
		{
			//选项切换
			CMenuCtl *pMenuCtl =  m_pCurrWnd->GetMenuCtl();//(CMenuCtl *)dwParam;
		//	if(pMenuCtl == m_pCurrWnd->GetMenuCtl())
			{
				uint32 lData;
				pMenuCtl->GetItemData(wParam, &lData);
				CtlAddItem *pai = (CtlAddItem*)MALLOC(sizeof(CtlAddItem));
				if(!pai)
				{
					return TRUE;
				}
				pai->pszResImage = APPSVIEWER_RES_FILE;
				pai->pszResText = APPSVIEWER_RES_FILE;
				pai->wImage = lData == 1 ? IDB_OPTION_YES : IDB_OPTION_NO;	//状态图标
				pai->dwData = lData == 1 ? 0 : 1;
				pai->wText = IDS_OPTION_ITEM;
				pMenuCtl->SetItem(wParam, MSIF_IMAGE | MSIF_DATA, pai);
				FREE(pai);
				pMenuCtl->Redraw();
			}
			return TRUE;
		}
		break;
	case STATE_CHARGETYPE:		
		//List menu used to select charge type
		if(wParam == IDS_SOFTKEY_CANCEL)
		{
			return OnClrKeyEvent();
		}
		else if(wParam == IDS_SOFTKEY_DOWNLOAD)
		{
			return m_pCurrWnd->HandleEvent(EVT_KEY, AVK_SELECT, 0);
		}
		else
		{
			if(m_nViewType == APP_TYPE_DOWNLOADED)
			{
				uint32 lData;
				CMenuCtl *pMenu = m_pCurrWnd->GetMenuCtl();
				if(pMenu)
				{	
					pMenu->GetItemData(wParam, &lData);
				}
				if(lData == 0)
				{
					m_nPolicyIndex = wParam;
					m_nIsRenew = 1;
					CtlAddItem ai;
					pMenu->GetItem(wParam, &ai);
					return CreateConfirmWnd((AECHAR*)ai.pText);
				}
				else
				{
					//有续定选项
					//--goto 选择是否自动续定
					m_nPolicyIndex = wParam;
					return CreatePolicyOption(wParam);
				}
			}
			else
			{
				ShowMessageWnd(IDS_SOFTKEY_OK, 0, IDS_NOTIFY_DISABLE, STATE_APP_DISABLE);
			}
			
		}
		break;
	case STATE_CONFIRM:
		if(wParam == IDS_SOFTKEY_CANCEL)
		{
			return OnClrKeyEvent();
		}
		else if(wParam == IDS_SOFTKEY_OK)
		{
			delete m_pCurrWnd;
			m_wIndex--;
		
			if(StartOrder(m_nPolicyIndex, m_nIsRenew))
			{
				return ShowMessageWnd(IDS_SOFTKEY_CANCEL, 0, IDS_ALART_ORDER, STATE_CONNECTING);
			}
			else
			{
				return ShowMessageWnd(IDS_SOFTKEY_OK, 0, IDS_ALART_WEBERROR, STATE_ERRORALART);
			}
		}
		break;
	case STATE_APP_LIST:
	case STATE_SERVICE_CATALOG:	
		uint32 lData;
		boolean nRtn;
		m_pCurrWnd->GetMenuItemData(wParam, &lData);
		if(	m_wCurrState == STATE_SERVICE_CATALOG)
		{
			//分类目录
			nRtn = StartGetService(wParam);
		}
		else if(m_wCurrState ==	STATE_APP_LIST)
		{
			//应用列表
			if(m_nViewType == APP_TYPE_DOWNLOADED)
			{
				return CreatePolicyRenew(wParam, m_pAppInfos[lData].isCancel, m_pAppInfos[lData].isRenew, m_pAppInfos[lData].wszPolicy); 
			}
			else
			{
				nRtn = StartGetSubscription(lData);
			}
		}
		if(nRtn)
		{
			return ShowMessageWnd(IDS_SOFTKEY_CANCEL, 0, IDS_ALART_CHECK, STATE_CONNECTING);
		}
		else
		{
			return ShowMessageWnd(IDS_SOFTKEY_OK, 0, IDS_ALART_WEBERROR, STATE_ERRORALART);
		}
		break;
	case STATE_POLICY_RENEW:
		if(wParam == IDS_SOFTKEY_CANCEL)
		{
			return OnClrKeyEvent();
		}
		else if(wParam == IDS_SOFTKEY_OK)
		{
			return m_pCurrWnd->HandleEvent(EVT_KEY, AVK_SELECT, 0);
		}
		else
		{	
			uint32 lData;
			m_pCurrWnd->GetMenuItemData(wParam, &lData);
			boolean nRtn = FALSE;
			if(wParam == IDS_MENU_RENEW)
			{
				//续定
				nRtn = StartRenew(lData);
			}
			if(wParam == IDS_MENU_CANCEL)
			{
				//退定
				nRtn = StartCancel(lData);
			}
			if(nRtn)
			{
				return ShowMessageWnd(IDS_SOFTKEY_CANCEL, 0, IDS_ALART_CHECK, STATE_CONNECTING);
			}
			else
			{
				return ShowMessageWnd(IDS_SOFTKEY_OK, 0, IDS_ALART_WEBERROR, STATE_ERRORALART);
			}
		}
		break;
	default:
		break;
	}
	return FALSE;

}

// Insert a window to list and suspend previous window, show current window
// pWnd: Window to be inserted

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -