void ReadWayPoints(WayPointList &way_points, RasterTerrain &terrain) { StartupStore(TEXT("ReadWayPoints\n")); TCHAR szFile1[MAX_PATH] = TEXT("\0"); TCHAR szFile2[MAX_PATH] = TEXT("\0"); bool file_embedded = false; // JMW TODO protect with mutex (whole waypoint list class) CloseWayPoints(way_points); GetRegistryString(szRegistryWayPointFile, szFile1, MAX_PATH); SetRegistryString(szRegistryWayPointFile, TEXT("\0")); if (_tcslen(szFile1)>0) { ExpandLocalPath(szFile1); } else { file_embedded = true; GetRegistryString(szRegistryMapFile, szFile1, MAX_PATH); ExpandLocalPath(szFile1); _tcscat(szFile1, TEXT("/")); _tcscat(szFile1, TEXT("waypoints.xcw")); } globalFileNum = 0; if (ReadWayPointFile(szFile1, way_points, terrain)) { // read OK, so set the registry to the actual file name if (!file_embedded) { printf("save\n"); ContractLocalPath(szFile1); SetRegistryString(szRegistryWayPointFile, szFile1); } } else { StartupStore(TEXT("No waypoint file 1\n")); } // read additional waypoint file GetRegistryString(szRegistryAdditionalWayPointFile, szFile2, MAX_PATH); SetRegistryString(szRegistryAdditionalWayPointFile, TEXT("\0")); if (_tcslen(szFile2)>0){ ExpandLocalPath(szFile2); globalFileNum = 1; if (ReadWayPointFile(szFile2, way_points, terrain)) { // read OK, so set the registry to the actual file name ContractLocalPath(szFile2); SetRegistryString(szRegistryAdditionalWayPointFile, szFile2); } else { StartupStore(TEXT("No waypoint file 2\n")); } } }
void CloseAirfieldDetails() { if (zAirfieldDetails == NULL) { return; } // file was OK, so save the registry ContractLocalPath(szAirfieldDetailsFile); _tcscpy(szAirfieldFile,szAirfieldDetailsFile); zzip_fclose(zAirfieldDetails); zAirfieldDetails = NULL; };
/** * Reads the selected LanguageFile into the cache */ void ReadLanguageFile() { StartupStore(TEXT("Loading language file\n")); TCHAR szFile1[MAX_PATH] = TEXT("\0"); FILE *fp=NULL; // Read the language filename from the registry GetRegistryString(szRegistryLanguageFile, szFile1, MAX_PATH); ExpandLocalPath(szFile1); // Reset filename in registry in case language // loading crashes the application SetRegistryString(szRegistryLanguageFile, TEXT("\0")); // If the language file is not set use the default one if (_tcslen(szFile1)==0) { _tcscpy(szFile1,TEXT("default.xcl")); } // Open the language file fp = _tfopen(szFile1, TEXT("rt")); // Return if file error if (fp == NULL) return; // TODO code: Safer sizes, strings etc - use C++ (can scanf restrict length?) TCHAR buffer[2049]; // key from scanf TCHAR key[2049]; // key from scanf TCHAR value[2049]; // value from scanf int found; // Entries found from scanf // Read from the file while ((GetTextData_Size < MAXSTATUSMESSAGECACHE) && _fgetts(buffer, 2048, fp) && ((found = _stscanf(buffer, TEXT("%[^#=]=%[^\r\n][\r\n]"), key, value)) != EOF)) { // Check valid line? if ((found != 2) || key[0] == 0 || value[0] == 0) continue; // Save parsed translation to the cache GetTextData[GetTextData_Size].key = StringMallocParse(key); GetTextData[GetTextData_Size].text = StringMallocParse(value); // Global counter GetTextData_Size++; } // file was OK, so save filename to registry again ContractLocalPath(szFile1); SetRegistryString(szRegistryLanguageFile, szFile1); fclose(fp); }
void ProfileMap::SetPath(const char *key, const TCHAR *value) { TCHAR path[MAX_PATH]; if (StringIsEmpty(value)) path[0] = '\0'; else { CopyString(path, value, MAX_PATH); ContractLocalPath(path); } Set(key, path); }
bool ConfigPanel::FinishFileField(const WndProperty &wp, const TCHAR *profile_key) { const DataFieldFileReader *dfe = (const DataFieldFileReader *)wp.GetDataField(); TCHAR new_value[MAX_PATH]; _tcscpy(new_value, dfe->GetPathFile()); ContractLocalPath(new_value); if (!ProfileStringModified(profile_key, new_value)) return false; Profile::Set(profile_key, new_value); return true; }
bool RowFormWidget::SaveValueFileReader(unsigned i, const TCHAR *registry_key) { const DataFieldFileReader *dfe = (const DataFieldFileReader *)GetControl(i).GetDataField(); TCHAR new_value[MAX_PATH]; _tcscpy(new_value, dfe->GetPathFile()); ContractLocalPath(new_value); const TCHAR *old_value = Profile::Get(registry_key, _T("")); if (_tcscmp(old_value, new_value) == 0) return false; Profile::Set(registry_key, new_value); return true; }
bool RowFormWidget::SaveValueFileReader(unsigned i, const char *registry_key) { const auto *dfe = (const FileDataField *)GetControl(i).GetDataField(); Path new_value = dfe->GetPathFile(); const auto contracted = ContractLocalPath(new_value); if (contracted != nullptr) new_value = contracted; const WideToUTF8Converter new_value2(new_value.c_str()); if (!new_value2.IsValid()) return false; const char *old_value = Profile::Get(registry_key, ""); if (StringIsEqual(old_value, new_value2)) return false; Profile::Set(registry_key, new_value2); return true; }
void StatusMessageList::LoadFile() { StartupStore(TEXT("Loading status file\n")); TCHAR szFile1[MAX_PATH] = TEXT("\0"); FILE *fp=NULL; // Open file from registry GetRegistryString(szRegistryStatusFile, szFile1, MAX_PATH); ExpandLocalPath(szFile1); SetRegistryString(szRegistryStatusFile, TEXT("\0")); if (_tcslen(szFile1)>0) fp = _tfopen(szFile1, TEXT("rt")); // Unable to open file if (fp == NULL) return; // TODO code: Safer sizes, strings etc - use C++ (can scanf restrict length?) TCHAR buffer[2049]; // Buffer for all TCHAR key[2049]; // key from scanf TCHAR value[2049]; // value from scanf int ms; // Found ms for delay const TCHAR **location; // Where to put the data int found; // Entries found from scanf bool some_data; // Did we find some in the last loop... // Init first entry _init_Status(StatusMessageData_Size); some_data = false; /* Read from the file */ while ( (StatusMessageData_Size < MAXSTATUSMESSAGECACHE) && _fgetts(buffer, 2048, fp) && ((found = _stscanf(buffer, TEXT("%[^#=]=%[^\n]\n"), key, value)) != EOF) ) { // Check valid line? If not valid, assume next record (primative, but works ok!) if ((found != 2) || key[0] == 0 || value[0] == 0) { // Global counter (only if the last entry had some data) if (some_data) { StatusMessageData_Size++; some_data = false; _init_Status(StatusMessageData_Size); } } else { location = NULL; if (_tcscmp(key, TEXT("key")) == 0) { some_data = true; // Success, we have a real entry location = &StatusMessageData[StatusMessageData_Size].key; } else if (_tcscmp(key, TEXT("sound")) == 0) { StatusMessageData[StatusMessageData_Size].doSound = true; location = &StatusMessageData[StatusMessageData_Size].sound; } else if (_tcscmp(key, TEXT("delay")) == 0) { if (_stscanf(value, TEXT("%d"), &ms) == 1) StatusMessageData[StatusMessageData_Size].delay_ms = ms; } else if (_tcscmp(key, TEXT("hide")) == 0) { if (_tcscmp(value, TEXT("yes")) == 0) StatusMessageData[StatusMessageData_Size].doStatus = false; } // Do we have somewhere to put this && is it currently empty ? (prevent lost at startup) if (location && (_tcscmp(*location, TEXT("")) == 0)) { // TODO code: this picks up memory lost from no entry, but not duplicates - fix. if (*location) { // JMW fix memory leak free((void*)*location); } *location = StringMallocParse(value); } } } // How many we really got (blank next just in case) StatusMessageData_Size++; _init_Status(StatusMessageData_Size); // file was ok, so save it to registry ContractLocalPath(szFile1); SetRegistryString(szRegistryStatusFile, szFile1); fclose(fp); }
void TopologyStore::Open() { StartupStore(TEXT("OpenTopology\n")); XCSoarInterface::CreateProgressDialog(gettext(TEXT("Loading Topology File..."))); Poco::ScopedRWLock protect(lock, true); // Start off by getting the names and paths static TCHAR szOrigFile[MAX_PATH] = TEXT("\0"); static TCHAR szFile[MAX_PATH] = TEXT("\0"); static TCHAR Directory[MAX_PATH] = TEXT("\0"); for (int z=0; z<MAXTOPOLOGY; z++) { topology_store[z] = 0; } GetRegistryString(szRegistryTopologyFile, szFile, MAX_PATH); ExpandLocalPath(szFile); _tcscpy(szOrigFile,szFile); // make copy of original ContractLocalPath(szOrigFile); // remove it in case it causes a crash (will restore later) SetRegistryString(szRegistryTopologyFile, TEXT("\0")); if (_tcslen(szFile)==0) { // file is blank, so look for it in a map file static TCHAR szMapFile[MAX_PATH] = TEXT("\0"); GetRegistryString(szRegistryMapFile, szMapFile, MAX_PATH); if (_tcslen(szMapFile)==0) { return; } ExpandLocalPath(szMapFile); // Look for the file within the map zip file... _tcscpy(Directory,szMapFile); _tcscat(Directory,TEXT("/")); szFile[0]=0; _tcscat(szFile,Directory); _tcscat(szFile,TEXT("topology.tpl")); } else { ExtractDirectory(Directory,szFile); } // Ready to open the file now.. static ZZIP_FILE* zFile; char zfilename[MAX_PATH]; unicode2ascii(szFile, zfilename, MAX_PATH); zFile = zzip_fopen(zfilename, "rt"); if (!zFile) { StartupStore(TEXT("No topology file\n%s\n"), szFile); return; } TCHAR ctemp[80]; TCHAR TempString[READLINE_LENGTH+1]; TCHAR ShapeName[50]; double ShapeRange; long ShapeIcon; long ShapeField; TCHAR wShapeFilename[MAX_PATH]; TCHAR *Stop; int numtopo = 0; char ShapeFilename[MAX_PATH]; while(ReadString(zFile,READLINE_LENGTH,TempString)) { if((_tcslen(TempString) > 0) && (_tcsstr(TempString,TEXT("*")) != TempString)) // Look For Comment { BYTE red, green, blue; // filename,range,icon,field // File name PExtractParameter(TempString, ctemp, 0); _tcscpy(ShapeName, ctemp); _tcscpy(wShapeFilename, Directory); _tcscat(wShapeFilename,ShapeName); _tcscat(wShapeFilename,TEXT(".shp")); #ifdef _UNICODE WideCharToMultiByte( CP_ACP, 0, wShapeFilename, _tcslen(wShapeFilename)+1, ShapeFilename, 200, NULL, NULL); #else strcpy(ShapeFilename, wShapeFilename); #endif // Shape range PExtractParameter(TempString, ctemp, 1); ShapeRange = StrToDouble(ctemp,NULL); // Shape icon PExtractParameter(TempString, ctemp, 2); ShapeIcon = _tcstol(ctemp, &Stop, 10); // Shape field for text display // sjt 02NOV05 - field parameter enabled PExtractParameter(TempString, ctemp, 3); if (_istalnum(ctemp[0])) { ShapeField = _tcstol(ctemp, &Stop, 10); ShapeField--; } else { ShapeField = -1; } // Red component of line / shading colour PExtractParameter(TempString, ctemp, 4); red = (BYTE)_tcstol(ctemp, &Stop, 10); // Green component of line / shading colour PExtractParameter(TempString, ctemp, 5); green = (BYTE)_tcstol(ctemp, &Stop, 10); // Blue component of line / shading colour PExtractParameter(TempString, ctemp, 6); blue = (BYTE)_tcstol(ctemp, &Stop, 10); if ((red==64) && (green==96) && (blue==240)) { // JMW update colours to ICAO standard red = 85; // water colours green = 160; blue = 255; } if (ShapeField<0) { Topology* newtopo; newtopo = new Topology(ShapeFilename, Color(red,green,blue)); topology_store[numtopo] = newtopo; } else { TopologyLabel *newtopol; newtopol = new TopologyLabel(ShapeFilename, Color(red,green,blue), ShapeField); topology_store[numtopo] = newtopol; } if (ShapeIcon!=0) topology_store[numtopo]->loadBitmap(ShapeIcon); topology_store[numtopo]->scaleThreshold = ShapeRange; numtopo++; } } zzip_fclose(zFile); // file was OK, so save it SetRegistryString(szRegistryTopologyFile, szOrigFile); }
void RasterTerrain::OpenTerrain(void) { terrain_initialised = false; #if TESTBENCH StartupStore(TEXT(". Loading Terrain... %s"),NEWLINE); #endif CreateProgressDialog(gettext(TEXT("_@M900_"))); // Loading Terrain File... TCHAR szFile[MAX_PATH] = _T("\0"); _tcscpy(szFile,szTerrainFile); TCHAR szOrigFile[MAX_PATH] = _T("\0"); ExpandLocalPath(szFile); _tcscpy(szOrigFile, szFile); ContractLocalPath(szOrigFile); // If no terrain will be found, the registry will be invalid on next run _tcscpy(szTerrainFile,_T("")); #ifdef LKMTERRAIN static TCHAR szMFile[MAX_PATH] = TEXT("\0"); if (_tcslen(szFile)==0) { StartupStore(_T(". NO TERRAIN file configured%s"),NEWLINE); _tcscpy(szMFile,szMapFile); ExpandLocalPath(szMFile); _tcscpy(szFile,szMFile); _tcscpy(szFile,szMFile); _tcscat(szFile, _T("/terrain.dem")); StartupStore(_T(". Attempting to use DEM <%s> inside mapfile%s"),szFile,NEWLINE); } if (CreateTerrainMap(szFile)) { _tcscpy(szTerrainFile,szOrigFile); terrain_initialised = true; return; } else { _tcscpy(szFile,szMFile); _tcscat(szFile, _T("/terrain.dat")); StartupStore(_T(". Attempting to use DAT <%s> inside mapfile%s"),szFile,NEWLINE); if (CreateTerrainMap(szFile)) { _tcscpy(szTerrainFile,szOrigFile); terrain_initialised = true; return; } } #else if ( (_tcslen(szFile)>0) && ( _tcsstr(szFile, _T(".DEM")) || _tcsstr(szFile, _T(".dem")) ) ) { if (CreateTerrainMap(szFile)) { _tcscpy(szterrainFile,szOrigFile); terrain_initialised = true; return; } else { StartupStore(_T("... INVALID TERRAIN file <%s>%s"),szFile,NEWLINE); } } #endif if (TerrainMap) { TerrainMap->Close(); delete TerrainMap; TerrainMap = NULL; } terrain_initialised = false; StartupStore(_T(". NO TERRAIN file available.%s"),NEWLINE); }
bool InterfaceConfigPanel::Save(bool &_changed) { UISettings &settings = CommonInterface::SetUISettings(); bool changed = false;; #ifdef HAVE_BLANK changed |= SaveValue(AutoBlank, ProfileKeys::AutoBlank, settings.display.enable_auto_blank); #endif if (SaveValueFileReader(InputFile, ProfileKeys::InputFile)) require_restart = changed = true; #ifndef HAVE_NATIVE_GETTEXT WndProperty *wp = (WndProperty *)&GetControl(LanguageFile); if (wp != NULL) { DataFieldEnum &df = *(DataFieldEnum *)wp->GetDataField(); TCHAR old_value[MAX_PATH]; if (!Profile::GetPath(ProfileKeys::LanguageFile, old_value)) old_value[0] = _T('\0'); const TCHAR *old_base = BaseName(old_value); if (old_base == NULL) old_base = old_value; TCHAR buffer[MAX_PATH]; const TCHAR *new_value, *new_base; switch (df.GetValue()) { case 0: new_value = new_base = _T("auto"); break; case 1: new_value = new_base = _T("none"); break; default: _tcscpy(buffer, df.GetAsString()); ContractLocalPath(buffer); new_value = buffer; new_base = BaseName(new_value); if (new_base == NULL) new_base = new_value; break; } if (_tcscmp(old_value, new_value) != 0 && _tcscmp(old_base, new_base) != 0) { Profile::Set(ProfileKeys::LanguageFile, new_value); LanguageChanged = changed = true; } } #endif if (SaveValueFileReader(StatusFile, ProfileKeys::StatusFile)) require_restart = changed = true; unsigned menu_timeout = GetValueInteger(MenuTimeout) * 2; if (settings.menu_timeout != menu_timeout) { settings.menu_timeout = menu_timeout; Profile::Set(ProfileKeys::MenuTimeout, menu_timeout); changed = true; } #ifdef HAVE_VIBRATOR changed |= SaveValueEnum(HapticFeedback, ProfileKeys::HapticFeedback, settings.haptic_feedback); #endif _changed |= changed; return true; }
void ReadWayPoints(void) { #if TESTBENCH StartupStore(TEXT(". ReadWayPoints%s"),NEWLINE); #endif TCHAR szFile1[MAX_PATH] = TEXT("\0"); TCHAR szFile2[MAX_PATH] = TEXT("\0"); ZZIP_FILE *fp=NULL; LockTaskData(); CloseWayPoints(); // BUGFIX 091104 duplicate waypoints entries InitVirtualWaypoints(); // 091103 _tcscpy(szFile1,szWaypointFile); _tcscpy(szWaypointFile,_T("")); if (_tcslen(szFile1)>0) { ExpandLocalPath(szFile1); fp = openzip(szFile1, "rt"); } else { } if(fp != NULL) { globalFileNum = 0; WpFileType[1]=ReadWayPointFile(fp, szFile1); zzip_fclose(fp); fp = 0; // read OK, so set the registry to the actual file name ContractLocalPath(szFile1); _tcscpy(szWaypointFile,szFile1); } else { StartupStore(TEXT("--- No waypoint file 1%s"),NEWLINE); } // read additional waypoint file // reset to empty until we verified it is existing _tcscpy(szFile2,szAdditionalWaypointFile); _tcscpy(szAdditionalWaypointFile,_T("")); if (_tcslen(szFile2)>0){ ExpandLocalPath(szFile2); fp = openzip(szFile2, "rt"); if(fp != NULL){ globalFileNum = 1; WpFileType[2]=ReadWayPointFile(fp, szFile2); zzip_fclose(fp); fp = NULL; // read OK, so set the registry to the actual file name ContractLocalPath(szFile2); _tcscpy(szAdditionalWaypointFile,szFile2); } else { StartupStore(TEXT("--- No waypoint file 2%s"),NEWLINE); } } // each time we load WayPoint, we need to init WaypointCalc !! InitWayPointCalc(); UnlockTaskData(); }
bool InterfaceConfigPanel::Save(bool &_changed) { UISettings &settings = CommonInterface::SetUISettings(); bool changed = false;; if (SaveValueEnum(UIScale, ProfileKeys::UIScale, settings.scale)) require_restart = changed = true; if (SaveValueFileReader(InputFile, ProfileKeys::InputFile)) require_restart = changed = true; #ifndef HAVE_NATIVE_GETTEXT WndProperty *wp = (WndProperty *)&GetControl(LanguageFile); if (wp != nullptr) { DataFieldEnum &df = *(DataFieldEnum *)wp->GetDataField(); const auto old_value_buffer = Profile::GetPath(ProfileKeys::LanguageFile); Path old_value = old_value_buffer; if (old_value == nullptr) old_value = Path(_T("")); auto old_base = old_value.GetBase(); if (old_base == nullptr) old_base = old_value; AllocatedPath buffer = nullptr; const TCHAR *new_value, *new_base; switch (df.GetValue()) { case 0: new_value = new_base = _T("auto"); break; case 1: new_value = new_base = _T("none"); break; default: new_value = df.GetAsString(); buffer = ContractLocalPath(Path(new_value)); if (!buffer.IsNull()) new_value = buffer.c_str(); new_base = Path(new_value).GetBase().c_str(); if (new_base == nullptr) new_base = new_value; break; } if (old_value != Path(new_value) && old_base != Path(new_base)) { Profile::Set(ProfileKeys::LanguageFile, new_value); LanguageChanged = changed = true; } } #endif unsigned menu_timeout = GetValueInteger(MenuTimeout) * 2; if (settings.menu_timeout != menu_timeout) { settings.menu_timeout = menu_timeout; Profile::Set(ProfileKeys::MenuTimeout, menu_timeout); changed = true; } if (HasPointer()) changed |= SaveValueEnum(TextInput, ProfileKeys::AppTextInputStyle, settings.dialog.text_input_style); #ifdef HAVE_VIBRATOR changed |= SaveValueEnum(HapticFeedback, ProfileKeys::HapticFeedback, settings.haptic_feedback); #endif _changed |= changed; return true; }