Skip to content

Commit

Permalink
Added deregistering organs in the temporary directory that do not mor…
Browse files Browse the repository at this point in the history
…e exist #1660 (#1682)
  • Loading branch information
oleg68 authored Oct 16, 2023
1 parent 8b62bfd commit 4828535
Show file tree
Hide file tree
Showing 6 changed files with 45 additions and 15 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
- Added deregistering organs in the temporary directory that do not more exist https://github.com/GrandOrgue/grandorgue/issues/1660
- Fixed error messages after multiple runs of GrandOrgue ftom Appimage with a demo organ https://github.com/GrandOrgue/grandorgue/issues/1660
# 3.13.0 (2023-10-11)
- Implemented option to send MIDI Note Off as 0x8X or 0x9X with velocity 0 https://github.com/GrandOrgue/grandorgue/issues/1640
Expand Down
18 changes: 11 additions & 7 deletions src/core/GOOrgan.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,6 @@ const wxString &GOOrgan::GetRecordingDetail() const {
return m_RecordingDetail;
}

const wxString &GOOrgan::GetArchiveID() const { return m_ArchiveID; }

GOMidiReceiverBase &GOOrgan::GetMIDIReceiver() { return m_midi; }

const wxString GOOrgan::GetUITitle() const {
Expand Down Expand Up @@ -121,13 +119,19 @@ bool GOOrgan::Match(const GOMidiEvent &e) {
}

bool GOOrgan::IsUsable(const GOOrganList &organs) const {
if (m_ArchiveID != wxEmptyString) {
const GOArchiveFile *archive = organs.GetArchiveByID(m_ArchiveID, true);
bool res;

if (!m_ArchiveID.IsEmpty()) {
const GOArchiveFile *archive = m_ArchivePath.IsEmpty()
? organs.GetArchiveByID(m_ArchiveID, true)
: organs.GetArchiveByPath(m_ArchivePath);

if (!archive)
return false;
return archive->IsComplete(organs);
res = false;
res = archive->IsComplete(organs);
} else
return wxFileExists(m_ODF);
res = wxFileExists(m_ODF);
return res;
}

const wxString GOOrgan::GetOrganHash() const {
Expand Down
5 changes: 4 additions & 1 deletion src/core/GOOrgan.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,14 @@ class GOOrgan {
const wxString &GetChurchName() const;
const wxString &GetOrganBuilder() const;
const wxString &GetRecordingDetail() const;
const wxString &GetArchiveID() const;
const wxString &GetArchiveID() const { return m_ArchiveID; }
const wxString &GetArchivePath() const { return m_ArchivePath; }
void SetArchivePath(const wxString &archivePath) {
m_ArchivePath = archivePath;
}
const wxString &GetPath() const {
return m_ArchiveID.IsEmpty() ? m_ODF : m_ArchivePath;
}
const wxString GetOrganHash() const;
long GetLastUse() const;
const wxString GetUITitle() const;
Expand Down
26 changes: 21 additions & 5 deletions src/core/GOOrganList.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,15 @@

#include <algorithm>

#include "GOOrgan.h"
#include <wx/dir.h>
#include <wx/stdpaths.h>

#include "archive/GOArchiveFile.h"
#include "config/GOConfigReader.h"
#include "config/GOConfigWriter.h"

#include "GOOrgan.h"

GOOrganList::GOOrganList() : m_OrganList(), m_ArchiveList() {}

GOOrganList::~GOOrganList() {}
Expand Down Expand Up @@ -44,11 +48,23 @@ void GOOrganList::Save(GOConfigWriter &cfg, GOMidiMap &map) {
m_OrganList[i]->Save(cfg, wxString::Format(wxT("Organ%03d"), i + 1), map);
}

const ptr_vector<GOOrgan> &GOOrganList::GetOrganList() const {
return m_OrganList;
}
void GOOrganList::RemoveInvalidTmpOrgans() {
const wxString tmpDirPrefix
= wxDir(wxStandardPaths::Get().GetTempDir()).GetNameWithSep();

ptr_vector<GOOrgan> &GOOrganList::GetOrganList() { return m_OrganList; }
for (int i = m_OrganList.size() - 1; i >= 0; i--) {
const GOOrgan &o = *m_OrganList[i];

if (!o.IsUsable(*this) && o.GetPath().StartsWith(tmpDirPrefix))
m_OrganList.erase(i);
}
for (int i = m_ArchiveList.size() - 1; i >= 0; i--) {
const GOArchiveFile &aF = *m_ArchiveList[i];

if (!aF.IsUsable(*this) && aF.GetPath().StartsWith(tmpDirPrefix))
m_ArchiveList.erase(i);
}
}

static bool LRUCompare(const GOOrgan *a, const GOOrgan *b) {
return a->GetLastUse() > b->GetLastUse();
Expand Down
5 changes: 3 additions & 2 deletions src/core/GOOrganList.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,9 @@ class GOOrganList {
~GOOrganList();

void AddOrgan(const GOOrgan &organ);
const ptr_vector<GOOrgan> &GetOrganList() const;
ptr_vector<GOOrgan> &GetOrganList();
void RemoveInvalidTmpOrgans();
const ptr_vector<GOOrgan> &GetOrganList() const { return m_OrganList; }
ptr_vector<GOOrgan> &GetOrganList() { return m_OrganList; }
std::vector<const GOOrgan *> GetLRUOrganList();

void AddArchive(const GOArchiveFile &archive);
Expand Down
5 changes: 5 additions & 0 deletions src/grandorgue/GOFrame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -522,6 +522,11 @@ void GOFrame::Init(wxString filename) {
event.SetClientData(pReasons);
GetEventHandler()->AddPendingEvent(event);
}

// Remove demo organs that have been registered from temporary (appimage)
// directories and they are not more valid
m_config.RemoveInvalidTmpOrgans();

GOArchiveManager manager(m_config, m_config.OrganCachePath());
manager.RegisterPackageDirectory(m_config.GetPackageDirectory());
manager.RegisterPackageDirectory(m_config.OrganPackagePath());
Expand Down

0 comments on commit 4828535

Please sign in to comment.