Workaround for CFITSIO failing to load path containing non-ASCI chars

This commit is contained in:
2026-04-19 13:25:32 +02:00
parent 8b8759facb
commit f1b5ec81c0
3 changed files with 96 additions and 30 deletions
+49 -5
View File
@@ -100,6 +100,28 @@ bool loadFITS(const QString path, ImageInfoData &info, std::shared_ptr<RawImage>
}; };
fits_open_diskfile(&file, path.toLocal8Bit().data(), READONLY, &status); fits_open_diskfile(&file, path.toLocal8Bit().data(), READONLY, &status);
QByteArray buffer;
size_t bufferSize = 0;
void *bufferPtr = nullptr;
if(status == FILE_NOT_OPENED)
{
qWarning() << "Could not open file directly tring memfile workaround" << path;
QFile fr(path);
if(fr.open(QIODevice::ReadOnly))
{
buffer = fr.readAll();
bufferSize = buffer.size();
bufferPtr = buffer.data();
status = 0;
fits_open_memfile(&file, "memfile", READONLY, &bufferPtr, &bufferSize, 0, NULL, &status);
}
else
{
qWarning() << "QFile failed to open file" << path;
return false;
}
}
if(status)return checkError(); if(status)return checkError();
fits_get_num_hdus(file, &num, &status); fits_get_num_hdus(file, &num, &status);
if(status)return checkError(); if(status)return checkError();
@@ -344,15 +366,37 @@ bool loadXISF(const QString &path, ImageInfoData &info, std::shared_ptr<RawImage
bool readFITSHeader(const QString &path, ImageInfoData &info) bool readFITSHeader(const QString &path, ImageInfoData &info)
{ {
fitsfile *fr; fitsfile *file;
int status = 0; int status = 0;
QString path2 = makeUNCPath(path); QString path2 = makeUNCPath(path);
fits_open_diskfile(&fr, path2.toLocal8Bit().data(), READONLY, &status); fits_open_diskfile(&file, path2.toLocal8Bit().data(), READONLY, &status);
if(fr && status == 0) QByteArray buffer;
size_t bufferSize = 0;
void *bufferPtr = nullptr;
if(status == FILE_NOT_OPENED)
{ {
status = loadFITSHeader(fr, info); qWarning() << "Could not open file directly tring memfile workaround" << path;
fits_close_file(fr, &status); QFile fr(path);
if(fr.open(QIODevice::ReadOnly))
{
buffer = fr.readAll();
bufferSize = buffer.size();
bufferPtr = buffer.data();
status = 0;
fits_open_memfile(&file, "memfile", READONLY, &bufferPtr, &bufferSize, 0, NULL, &status);
}
else
{
qWarning() << "QFile failed to open file" << path;
return false;
}
}
if(file && status == 0)
{
status = loadFITSHeader(file, info);
fits_close_file(file, &status);
} }
return status == 0; return status == 0;
} }
+26 -25
View File
@@ -1,37 +1,38 @@
#include "about.h"
#include "batchprocessing.h"
#include "filemanager.h"
#include "histogram.h"
#include "loadrunable.h"
#include "mainwindow.h" #include "mainwindow.h"
#include <QScrollArea> #include "markedfiles.h"
#include "settingsdialog.h"
#include "statusbar.h"
#include <QActionGroup>
#include <QDebug>
#include <QDesktopServices>
#include <QDir> #include <QDir>
#include <QDockWidget>
#include <QFileDialog>
#include <QGuiApplication>
#include <QImageReader>
#include <QImageWriter>
#include <QJsonDocument>
#include <QKeyEvent> #include <QKeyEvent>
#include <QMenu> #include <QMenu>
#include <QMenuBar> #include <QMenuBar>
#include <QFileDialog>
#include <QStandardPaths>
#include <QMessageBox> #include <QMessageBox>
#include <QMimeDatabase>
#include <QNetworkReply>
#include <QProgressDialog> #include <QProgressDialog>
#include <QDebug> #include <QScrollArea>
#include <QDockWidget> #include <QSettings>
#include <QActionGroup> #include <QStandardPaths>
#include <QStatusBar>
#include <QThreadPool>
#include <QSessionManager>
#include <QTimer>
#include <signal.h> #include <signal.h>
#include <unistd.h> #include <unistd.h>
#include <QSettings>
#include <QGuiApplication>
#include <QThreadPool>
#include <QStatusBar>
#include <QImageReader>
#include <QImageWriter>
#include <QMimeDatabase>
#include <QDesktopServices>
#include <QJsonDocument>
#include <QNetworkReply>
#include <QTimer>
#include "loadrunable.h"
#include "markedfiles.h"
#include "about.h"
#include "statusbar.h"
#include "settingsdialog.h"
#include "histogram.h"
#include "batchprocessing.h"
#include "filemanager.h"
#ifdef __linux__ #ifdef __linux__
#include <sys/ioctl.h> #include <sys/ioctl.h>
+21
View File
@@ -676,6 +676,27 @@ bool File::modifyFITSRecords(const FITSRecordModify *modify)
int status = 0; int status = 0;
QString path = makeUNCPath(_path); QString path = makeUNCPath(_path);
fits_open_diskfile(&file, path.toLocal8Bit().data(), READWRITE, &status); fits_open_diskfile(&file, path.toLocal8Bit().data(), READWRITE, &status);
QByteArray buffer;
size_t bufferSize = 0;
void *bufferPtr = nullptr;
if(status == FILE_NOT_OPENED)
{
qWarning() << "Could not open file directly tring memfile workaround" << path;
QFile fr(path);
if(fr.open(QIODevice::ReadOnly))
{
buffer = fr.readAll();
bufferSize = buffer.size();
bufferPtr = buffer.data();
status = 0;
fits_open_memfile(&file, "memfile", READONLY, &bufferPtr, &bufferSize, 0, NULL, &status);
}
else
{
qWarning() << "QFile failed to open file" << path;
return false;
}
}
int num = 0; int num = 0;
fits_get_num_hdus(file, &num, &status); fits_get_num_hdus(file, &num, &status);
if(status) if(status)