void FormatIGCFilenameLong(TCHAR* buffer, const BrokenDate &date, const char *manufacturer, const char *logger_id, unsigned flight_number) { assert(manufacturer != NULL); assert(strlen(manufacturer) == 3); assert(logger_id != NULL); assert(strlen(logger_id) == 3); TCHAR manufacturer_t[4], logger_id_t[4]; /* poor man's char->TCHAR converted; this works because we know we're dealing with ASCII only */ std::copy(manufacturer, manufacturer + 4, manufacturer_t); std::copy(logger_id, logger_id + 4, logger_id_t); FormatIGCFilenameLong(buffer, date, manufacturer_t, logger_id_t, flight_number); }
bool LoggerImpl::StartLogger(const NMEAInfo &gps_info, const LoggerSettings &settings, const char *logger_id) { assert(logger_id != NULL); assert(strlen(logger_id) == 3); /* finish the previous IGC file */ StopLogger(gps_info); assert(writer == NULL); LocalPath(filename, _T("logs")); Directory::Create(filename); const BrokenDate today = gps_info.date_time_utc.IsDatePlausible() ? (const BrokenDate &)gps_info.date_time_utc : BrokenDate::TodayUTC(); StaticString<64> name; for (int i = 1; i < 99; i++) { FormatIGCFilenameLong(name.buffer(), today, "XCS", logger_id, i); LocalPath(filename, _T("logs"), name); if (!File::Exists(filename)) break; // file not exist, we'll use this name } frecord.Reset(); writer = new IGCWriter(filename); if (!writer->IsOpen()) { LogFormat(_T("Failed to create file %s"), filename); delete writer; writer = nullptr; return false; } LogFormat(_T("Logger Started: %s"), filename); return true; }
bool LoggerImpl::StartLogger(const NMEAInfo &gps_info, const LoggerSettings &settings, const char *logger_id) { assert(logger_id != nullptr); assert(strlen(logger_id) == 3); /* finish the previous IGC file */ StopLogger(gps_info); assert(writer == nullptr); const auto logs_path = MakeLocalPath(_T("logs")); const BrokenDate today = gps_info.date_time_utc.IsDatePlausible() ? (const BrokenDate &)gps_info.date_time_utc : BrokenDate::TodayUTC(); StaticString<64> name; for (int i = 1; i < 99; i++) { FormatIGCFilenameLong(name.buffer(), today, "XCS", logger_id, i); filename = AllocatedPath::Build(logs_path, name); if (!File::Exists(filename)) break; // file not exist, we'll use this name } frecord.Reset(); try { writer = new IGCWriter(filename); } catch (...) { LogError(std::current_exception()); return false; } LogFormat(_T("Logger Started: %s"), filename.c_str()); return true; }
void ExternalLogger::DownloadFlightFrom(DeviceDescriptor &device) { MessageOperationEnvironment env; // Download the list of flights that the logger contains RecordedFlightList flight_list; switch (DoReadFlightList(device, flight_list)) { case TriStateJobResult::SUCCESS: break; case TriStateJobResult::ERROR: device.EnableNMEA(env); ShowMessageBox(_("Failed to download flight list."), _("Download flight"), MB_OK | MB_ICONERROR); return; case TriStateJobResult::CANCELLED: return; } // The logger seems to be empty -> cancel if (flight_list.empty()) { device.EnableNMEA(env); ShowMessageBox(_("Logger is empty."), _("Download flight"), MB_OK | MB_ICONINFORMATION); return; } while (true) { // Show list of the flights const RecordedFlightInfo *flight = ShowFlightList(flight_list); if (!flight) break; // Download chosen IGC file into temporary file TCHAR path[MAX_PATH]; LocalPath(path, _T("logs"), _T("temp.igc")); switch (DoDownloadFlight(device, *flight, path)) { case TriStateJobResult::SUCCESS: break; case TriStateJobResult::ERROR: // Delete temporary file File::Delete(path); ShowMessageBox(_("Failed to download flight."), _("Download flight"), MB_OK | MB_ICONERROR); continue; case TriStateJobResult::CANCELLED: // Delete temporary file File::Delete(path); continue; } /* read the IGC header and build the final IGC file name with it */ IGCHeader header; BrokenDate date; ReadIGCMetaData(path, header, date); if (header.flight == 0) header.flight = GetFlightNumber(flight_list, *flight); TCHAR name[64]; FormatIGCFilenameLong(name, date, header.manufacturer, header.id, header.flight); TCHAR final_path[MAX_PATH]; LocalPath(final_path, _T("logs"), name); // Remove a file with the same name if it exists if (File::Exists(final_path)) File::Delete(final_path); // Rename the temporary file to the actual filename File::Rename(path, final_path); if (ShowMessageBox(_("Do you want to download another flight?"), _("Download flight"), MB_YESNO | MB_ICONQUESTION) != IDYES) break; } device.EnableNMEA(env); }
void ExternalLogger::DownloadFlightFrom(DeviceDescriptor &device) { MessageOperationEnvironment env; // Download the list of flights that the logger contains RecordedFlightList flight_list; switch (DoReadFlightList(device, flight_list)) { case TriStateJobResult::SUCCESS: break; case TriStateJobResult::ERROR: device.EnableNMEA(env); ShowMessageBox(_("Failed to download flight list."), _("Download flight"), MB_OK | MB_ICONERROR); return; case TriStateJobResult::CANCELLED: return; } // The logger seems to be empty -> cancel if (flight_list.empty()) { device.EnableNMEA(env); ShowMessageBox(_("Logger is empty."), _("Download flight"), MB_OK | MB_ICONINFORMATION); return; } const auto logs_path = MakeLocalPath(_T("logs")); while (true) { // Show list of the flights const RecordedFlightInfo *flight = ShowFlightList(flight_list); if (!flight) break; // Download chosen IGC file into temporary file FileTransaction transaction(AllocatedPath::Build(logs_path, _T("temp.igc"))); switch (DoDownloadFlight(device, *flight, transaction.GetTemporaryPath())) { case TriStateJobResult::SUCCESS: break; case TriStateJobResult::ERROR: ShowMessageBox(_("Failed to download flight."), _("Download flight"), MB_OK | MB_ICONERROR); continue; case TriStateJobResult::CANCELLED: continue; } /* read the IGC header and build the final IGC file name with it */ IGCHeader header; BrokenDate date; ReadIGCMetaData(transaction.GetTemporaryPath(), header, date); if (header.flight == 0) header.flight = GetFlightNumber(flight_list, *flight); TCHAR name[64]; FormatIGCFilenameLong(name, date, header.manufacturer, header.id, header.flight); transaction.SetPath(AllocatedPath::Build(logs_path, name)); transaction.Commit(); if (ShowMessageBox(_("Do you want to download another flight?"), _("Download flight"), MB_YESNO | MB_ICONQUESTION) != IDYES) break; } device.EnableNMEA(env); }