You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gentoo-overlay/app-office/calligra/files/calligra-3.0.0-plan-crash.p...

200 lines
5.2 KiB

From dd2cb16ab43d21ee25ba6ebfb36cd68ec9879c4f Mon Sep 17 00:00:00 2001
From: Dag Andersen <danders@get2net.dk>
Date: Mon, 12 Dec 2016 10:07:38 +0100
Subject: Plan: Fix crash on close
Due to accessing project node during delete
BUG: 373527
FIXED-IN: 3.0.0
---
plan/libs/kernel/kptnode.cpp | 14 ++++++++++++--
plan/libs/kernel/kptnode.h | 5 ++++-
plan/libs/kernel/kptproject.cpp | 11 ++++++++++-
plan/libs/kernel/kptresource.cpp | 20 ++++++++++++++++----
plan/libs/kernel/kptresource.h | 7 ++++++-
5 files changed, 48 insertions(+), 9 deletions(-)
diff --git a/plan/libs/kernel/kptnode.cpp b/plan/libs/kernel/kptnode.cpp
index d8b0e6b..e55f9ca 100644
--- a/plan/libs/kernel/kptnode.cpp
+++ b/plan/libs/kernel/kptnode.cpp
@@ -40,7 +40,8 @@ namespace KPlato
Node::Node(Node *parent)
: QObject( 0 ), // We don't use qobjects parent
m_nodes(), m_dependChildNodes(), m_dependParentNodes(),
- m_estimate( 0 )
+ m_estimate( 0 ),
+ m_blockChanged(false)
{
//debugPlan<<"("<<this<<")";
m_parent = parent;
@@ -53,7 +54,8 @@ Node::Node(const Node &node, Node *parent)
m_nodes(),
m_dependChildNodes(),
m_dependParentNodes(),
- m_estimate( 0 )
+ m_estimate( 0 ),
+ m_blockChanged(false)
{
//debugPlan<<"("<<this<<")";
m_parent = parent;
@@ -1225,7 +1227,15 @@ void Node::setRunningAccount(Account *acc)
changed();
}
+void Node::blockChanged(bool on)
+{
+ m_blockChanged = on;
+}
+
void Node::changed(Node *node, int property) {
+ if (m_blockChanged) {
+ return;
+ }
switch ( property) {
case Type:
case StartupCost:
diff --git a/plan/libs/kernel/kptnode.h b/plan/libs/kernel/kptnode.h
index cfcbd3e..4c98acc 100644
--- a/plan/libs/kernel/kptnode.h
+++ b/plan/libs/kernel/kptnode.h
@@ -528,6 +528,8 @@ public:
virtual void emitDocumentRemoved( Node *node, Document *doc, int idx );
virtual void emitDocumentChanged( Node *node, Document *doc, int idx );
+ void blockChanged(bool on = true);
+
public:
// These shouldn't be available to other than those who inherits
/// Calculate the critical path
@@ -673,7 +675,8 @@ protected:
ResourceRequestCollection m_requests;
private:
- void init();
+ void init();
+ bool m_blockChanged;
};
//////////////////////////////// Estimate ////////////////////////////////
diff --git a/plan/libs/kernel/kptproject.cpp b/plan/libs/kernel/kptproject.cpp
index 30cd450..d2fafb5 100644
--- a/plan/libs/kernel/kptproject.cpp
+++ b/plan/libs/kernel/kptproject.cpp
@@ -94,7 +94,16 @@ void Project::deref()
Project::~Project()
{
debugPlan;
- disconnect(); // NOTE: may be a problem if somebody uses the destroyd() signal
+ disconnect();
+ for(Node *n : nodeIdDict) {
+ n->blockChanged();
+ }
+ for (Resource *r : resourceIdDict) {
+ r->blockChanged();
+ }
+ for (ResourceGroup *g : resourceGroupIdDict) {
+ g->blockChanged();
+ }
delete m_standardWorktime;
while ( !m_resourceGroups.isEmpty() )
delete m_resourceGroups.takeFirst();
diff --git a/plan/libs/kernel/kptresource.cpp b/plan/libs/kernel/kptresource.cpp
index 8a3d55e..b32d4e7 100644
--- a/plan/libs/kernel/kptresource.cpp
+++ b/plan/libs/kernel/kptresource.cpp
@@ -44,7 +44,8 @@ namespace KPlato
{
ResourceGroup::ResourceGroup()
- : QObject( 0 )
+ : QObject( 0 ),
+ m_blockChanged(false)
{
m_project = 0;
m_type = Type_Work;
@@ -80,8 +81,13 @@ void ResourceGroup::copy( const ResourceGroup *group )
m_name = group->m_name;
}
+void ResourceGroup::blockChanged(bool on)
+{
+ m_blockChanged = on;
+}
+
void ResourceGroup::changed() {
- if ( m_project ) {
+ if (m_project && !m_blockChanged) {
m_project->changed( this );
}
}
@@ -319,7 +325,8 @@ Resource::Resource()
m_project(0),
m_parent( 0 ),
m_autoAllocate( false ),
- m_currentSchedule( 0 )
+ m_currentSchedule( 0 ),
+ m_blockChanged(false)
{
m_type = Type_Work;
m_units = 100; // %
@@ -409,9 +416,14 @@ void Resource::copy(Resource *resource) {
//m_externalNames = resource->m_externalNames;
}
+void Resource::blockChanged(bool on)
+{
+ m_blockChanged = on;
+}
+
void Resource::changed()
{
- if ( m_project ) {
+ if (m_project && !m_blockChanged) {
m_project->changed( this );
}
}
diff --git a/plan/libs/kernel/kptresource.h b/plan/libs/kernel/kptresource.h
index 10f6b92..fba020a 100644
--- a/plan/libs/kernel/kptresource.h
+++ b/plan/libs/kernel/kptresource.h
@@ -177,6 +177,8 @@ public:
DateTime startTime( long id ) const;
DateTime endTime( long id ) const;
+ void blockChanged(bool on = true);
+
#ifndef NDEBUG
void printDebug( const QString& ident );
@@ -199,7 +201,7 @@ private:
Type m_type;
QList<ResourceGroupRequest*> m_requests;
-
+ bool m_blockChanged;
};
/**
@@ -492,6 +494,8 @@ public:
/// Set the @p account
void setAccount( Account *account );
+ void blockChanged(bool on = true);
+
// for xml loading code
class WorkInfoCache
@@ -564,6 +568,7 @@ private:
// return this if resource has no calendar and is a material resource
Calendar m_materialCalendar;
+ bool m_blockChanged;
#ifndef NDEBUG
public:
--
cgit v0.11.2