예제 #1
0
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);
}
예제 #2
0
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);
}