static void Loc_Cancel( AEECallback *pcb ) { LocState *pts = (LocState *)pcb->pCancelData; if( TRUE == pts->bInNotification ) { /* It is not safe to cleanup from a notification. Defer it. */ pts->bSetForCancellation = TRUE; return; } /* Kill any ongoing process */ CALLBACK_Cancel( &pts->cbInfo ); CALLBACK_Cancel( &pts->cbIntervalTimer ); pts->pcbResp->pfnCancel = 0; pts->pcbResp->pCancelData = 0; IPOSDET_Release( pts->pPos ); ISHELL_Release( pts->pShell ); FREE( pts ); }
/*=========================================================================== ===========================================================================*/ boolean SamplePosDet_GetGPSInfo_HandleEvent( CSamplePosDet *pMe, AEEEvent eCode, uint16 wParam, uint32 dwParam ) { boolean bHandled = FALSE; struct _GetGPSInfo *pGetGPSInfo = SamplePosDet_GetScreenData( pMe ); switch( eCode ) { case EVT_SCREEN: if( wParam == SCREEN_PARAM_INIT ) { if( pGetGPSInfo == 0 ) { pGetGPSInfo = MALLOC( sizeof( struct _GetGPSInfo ) ); if( pGetGPSInfo ) { int nErr = SUCCESS; ZEROAT( pGetGPSInfo ); pGetGPSInfo->theInfo.server = pMe->gpsSettings.server; pGetGPSInfo->theInfo.qos = pMe->gpsSettings.qos; pGetGPSInfo->theInfo.optim = pMe->gpsSettings.optim; pGetGPSInfo->wMainMenuEntry = (uint16)dwParam; SamplePosDet_SetScreenData( pMe, (void *)pGetGPSInfo ); if( ISHELL_CreateInstance( pMe->theApp.m_pIShell, AEECLSID_POSDET, (void **)&pGetGPSInfo->pPosDet ) == SUCCESS ) { CALLBACK_Init( &pGetGPSInfo->cbPosDet, SamplePosDet_GetGPSInfo_Callback, pMe ); CALLBACK_Init( &pGetGPSInfo->cbProgressTimer, SamplePosDet_GetGPSInfo_SecondTicker, pMe ); nErr = Track_Init( pMe->theApp.m_pIShell, pGetGPSInfo->pPosDet, &pGetGPSInfo->cbPosDet, &pGetGPSInfo->pts ); if( pGetGPSInfo->wMainMenuEntry == MAINMENU_ITEM_ONE_SHOT ) { nErr = Track_Start( pGetGPSInfo->pts, TRACK_NETWORK, 1, 0, &pGetGPSInfo->theInfo ); } else if( pGetGPSInfo->wMainMenuEntry == MAINMENU_ITEM_TRACK_LOCAL ) { nErr = Track_Start( pGetGPSInfo->pts, TRACK_LOCAL, 0, 0, &pGetGPSInfo->theInfo ); } else if( pGetGPSInfo->wMainMenuEntry == MAINMENU_ITEM_TRACK_NETWORK ) { nErr = Track_Start( pGetGPSInfo->pts, TRACK_NETWORK, 0, 0, &pGetGPSInfo->theInfo ); } else if( pGetGPSInfo->wMainMenuEntry == MAINMENU_ITEM_TRACK_AUTO ) { nErr = Track_Start( pGetGPSInfo->pts, TRACK_AUTO, 0, 0, &pGetGPSInfo->theInfo ); } else { nErr = EFAILED; } SamplePosDet_DrawScreen( pMe, (uint32)GETGPSINFO_PAINT_ALL ); if( nErr != SUCCESS ) { pGetGPSInfo->theInfo.nErr = nErr; SamplePosDet_DrawScreen( pMe, (uint32)GETGPSINFO_PAINT_ERROR ); } else { ISHELL_SetTimerEx( pMe->theApp.m_pIShell, 1000, &pGetGPSInfo->cbProgressTimer ); } bHandled = TRUE; } } } if( !bHandled ) { SamplePosDet_GotoScreen( pMe, SCREENID_MAINMENU, 0 ); bHandled = TRUE; } } else if( wParam == SCREEN_PARAM_CLOSE ) { if( pGetGPSInfo ) { if( pGetGPSInfo->pPosDet ) { CALLBACK_Cancel( &pGetGPSInfo->cbProgressTimer ); CALLBACK_Cancel( &pGetGPSInfo->cbPosDet ); IPOSDET_Release( pGetGPSInfo->pPosDet ); } FREE( pGetGPSInfo ); } SamplePosDet_SetScreenData( pMe, 0 ); pMe->currentHandler = 0; bHandled = TRUE; } else if( wParam == SCREEN_PARAM_PAINT ) { if( !pGetGPSInfo->bPaused ) { SamplePosDet_GetGPSInfo_Paint( pMe, (GetGPSInfo_PaintRegions)dwParam ); } bHandled = TRUE; } break; case EVT_KEY: if( wParam == AVK_CLR || wParam == AVK_SOFT2) { Track_Stop(pGetGPSInfo->pts); if (pGetGPSInfo) { if (pGetGPSInfo->pPosDet) { CALLBACK_Cancel(&pGetGPSInfo->cbProgressTimer); CALLBACK_Cancel(&pGetGPSInfo->cbPosDet); IPOSDET_Release(pGetGPSInfo->pPosDet); } FREE(pGetGPSInfo); } SamplePosDet_GotoScreen( pMe, SCREENID_MAINMENU, 0 ); bHandled = TRUE; } break; case EVT_DIALOG_START: pGetGPSInfo->bPaused = TRUE; bHandled = TRUE; break; case EVT_DIALOG_END: pGetGPSInfo->bPaused = FALSE; SamplePosDet_DrawScreen( pMe, (uint32)GETGPSINFO_PAINT_ALL ); bHandled = TRUE; break; case EVT_COMMAND: break; } return bHandled; }