/*======================================================================= Function: Loc_ReadGPSSettings() Description: Reads the GPS configuration settings from the configuration file. =======================================================================*/ static uint32 Loc_ReadGPSSettings(IFile * pIFile, AEEGPSConfig *gpsConfig) { char *pszBuf = NULL; char *pszTok = NULL; char *pszSvr = NULL; char *pszDelimiter = ";"; int32 nResult = 0; FileInfo fiInfo; if (pIFile == NULL || gpsConfig == NULL) return EFAILED; if ( SUCCESS != IFILE_GetInfo( pIFile, &fiInfo ) ) { return EFAILED; } if ( fiInfo.dwSize == 0 ) { return EFAILED; } // Allocate enough memory to read the full text into memory pszBuf = MALLOC( fiInfo.dwSize ); nResult = IFILE_Read( pIFile, pszBuf, fiInfo.dwSize ); if ( (uint32)nResult < fiInfo.dwSize ) { FREE( pszBuf ); return EFAILED; } // Check for an optimization mode setting in the file: pszTok = STRSTR( pszBuf, LOC_CONFIG_OPT_STRING ); if ( pszTok ) { pszTok = pszTok + STRLEN( LOC_CONFIG_OPT_STRING ); gpsConfig->optim = (AEEGPSOpt)STRTOUL( pszTok, &pszDelimiter, 10 ); } // Check for a QoS setting in the file: pszTok = STRSTR( pszBuf, LOC_CONFIG_QOS_STRING ); if ( pszTok ) { pszTok = pszTok + STRLEN( LOC_CONFIG_QOS_STRING ); gpsConfig->qos = (AEEGPSQos)STRTOUL( pszTok, &pszDelimiter, 10 ); } // Check for a server type setting in the file: pszTok = STRSTR( pszBuf, LOC_CONFIG_SVR_TYPE_STRING ); if ( pszTok ) { pszTok = pszTok + STRLEN( LOC_CONFIG_SVR_TYPE_STRING ); gpsConfig->server.svrType = STRTOUL( pszTok, &pszDelimiter, 10 ); // If the server type is IP, we need to find the ip address and the port number if ( AEEGPS_SERVER_IP == gpsConfig->server.svrType ) { pszTok = STRSTR( pszBuf, LOC_CONFIG_SVR_IP_STRING ); if ( pszTok ) { pszTok = pszTok + STRLEN( LOC_CONFIG_SVR_IP_STRING ); nResult = DistToSemi( pszTok ); pszSvr = MALLOC( nResult+1 ); STRNCPY( pszSvr, pszTok, nResult ); *(pszSvr+nResult) = 0; // Need to manually NULL-terminate the string if ( !INET_ATON( pszSvr, &gpsConfig->server.svr.ipsvr.addr ) ) { FREE( pszBuf ); FREE( pszSvr ); return EFAILED; } FREE( pszSvr ); } pszTok = STRSTR( pszBuf, LOC_CONFIG_SVR_PORT_STRING ); if ( pszTok ) { pszTok = pszTok + STRLEN( LOC_CONFIG_SVR_PORT_STRING ); gpsConfig->server.svr.ipsvr.port = AEE_htons((INPort)STRTOUL( pszTok, &pszDelimiter, 10 )); } } } FREE( pszBuf ); return SUCCESS; }
/*======================================================================= Function: SamplePosDet_PortSettings_HandleEvent() Description: Event handler function for the port settings menu. Prototype: boolean SamplePosDet_PortSettings_HandleEvent(CSamplePosDet *pMe, AEEEvent eCode, uint16 wParam, uint32 dwParam) Parameters: pMe: [in]. CSamplePosDet instance. eCode: [in]. Event code. wParam: [in]. Event wParam. dwParam: [in]. Event dwParam. Return Value: TRUE - If the event was handled by this menu. FALSE - If the event was not handled. Comments: None Side Effects: None See Also: None =======================================================================*/ boolean SamplePosDet_PortSettings_HandleEvent(CSamplePosDet *pMe, AEEEvent eCode, uint16 wParam, uint32 dwParam) { boolean bHandled = FALSE; CTextCtlData *ptcd = SamplePosDet_GetScreenData( pMe ); ITextCtl *pTextCtl = NULL; IMenuCtl *pSoftKeyMenu = NULL; char * pszStr; AECHAR * pPort; uint32 nResult; if (ptcd) { pSoftKeyMenu = ptcd->pSoftKey; pTextCtl = ptcd->pTextCtl; } switch( eCode ) { case EVT_SCREEN: if( wParam == SCREEN_PARAM_INIT ) { if( pTextCtl ) { /* This is not expected to happen */ SamplePosDet_DrawScreen( pMe, 0 ); bHandled = TRUE; } else { if( ISHELL_CreateInstance( pMe->theApp.m_pIShell, AEECLSID_TEXTCTL, (void **)&pTextCtl ) == SUCCESS ) { if (ISHELL_CreateInstance(pMe->theApp.m_pIShell, AEECLSID_SOFTKEYCTL, (void **)&pSoftKeyMenu) == SUCCESS) { IMENUCTL_AddItem( pSoftKeyMenu, SAMPLEPOSDET_RES_FILE, IDS_SOFTKEY_SAVE, IDS_SOFTKEY_SAVE, NULL, (uint32)pSoftKeyMenu ); ITEXTCTL_SetSoftKeyMenu( pTextCtl, pSoftKeyMenu ); ITEXTCTL_SetTitle( pTextCtl, SAMPLEPOSDET_RES_FILE, IDS_PORT_SETTINGS_TITLE, NULL ); ITEXTCTL_SetInputMode( pTextCtl, AEE_TM_NUMBERS ); // Load the current port number, if it exists if (AEEGPS_SERVER_IP == pMe->gpsSettings.server.svrType) { pszStr = MALLOC(50); pPort = MALLOC(100); SPRINTF(pszStr, "%d", AEE_ntohs(pMe->gpsSettings.server.svr.ipsvr.port)); STRTOWSTR(pszStr, pPort, 100); ITEXTCTL_SetText(pTextCtl, pPort, -1); FREE(pszStr); FREE(pPort); } ptcd = MALLOC( sizeof(CTextCtlData) ); ptcd->pSoftKey = pSoftKeyMenu; ptcd->pTextCtl = pTextCtl; SamplePosDet_SetScreenData( pMe, (void *)ptcd ); SamplePosDet_DrawScreen( pMe, 0 ); bHandled = TRUE; } } } } else if( wParam == SCREEN_PARAM_CLOSE ) { ITEXTCTL_Release( pTextCtl ); IMENUCTL_Release( pSoftKeyMenu ); FREE( ptcd ); SamplePosDet_SetScreenData( pMe, 0 ); pMe->currentHandler = 0; bHandled = TRUE; } else if( wParam == SCREEN_PARAM_PAINT ) { if( ITEXTCTL_IsActive( pTextCtl ) ) { ITEXTCTL_Redraw( pTextCtl ); } else { ITEXTCTL_SetActive( pTextCtl, TRUE ); /* Also causes a menu draw */ } } break; case EVT_KEY: case EVT_KEY_PRESS: case EVT_KEY_RELEASE: bHandled = ITEXTCTL_HandleEvent( pTextCtl, eCode, wParam, dwParam ); if (!bHandled) { bHandled = IMENUCTL_HandleEvent( pSoftKeyMenu, eCode, wParam, dwParam ); if(!bHandled && wParam == AVK_CLR && eCode == EVT_KEY) { SamplePosDet_GotoScreen( pMe, SCREENID_CONFIG, 0 ); bHandled = TRUE; } } break; case EVT_COMMAND: bHandled = ITEXTCTL_HandleEvent( pTextCtl, eCode, wParam, dwParam ); if (!bHandled) { if (IDS_SOFTKEY_SAVE == wParam) { // Need to validate and save the Port settings here pPort = ITEXTCTL_GetTextPtr(pTextCtl); pszStr = MALLOC(50); WSTRTOSTR(pPort, pszStr, 50); if (0 != (nResult = STRTOUL(pszStr, NULL, 10))) { pMe->gpsSettings.server.svr.ipsvr.port = AEE_htons((unsigned short)nResult); SamplePosDet_SaveGPSSettings(pMe); SamplePosDet_GotoScreen(pMe, SCREENID_CONFIG, 0); } else { ITEXTCTL_SetTitle(pTextCtl, SAMPLEPOSDET_RES_FILE, IDS_PORT_SETTINGS_INVALID, NULL); ITEXTCTL_Redraw(pTextCtl); } FREE(pszStr); // add code to save the new PDE IP address bHandled = TRUE; } } break; } return bHandled; }