1 From dd2cb16ab43d21ee25ba6ebfb36cd68ec9879c4f Mon Sep 17 00:00:00 2001
2 From: Dag Andersen <danders@get2net.dk>
3 Date: Mon, 12 Dec 2016 10:07:38 +0100
4 Subject: Plan: Fix crash on close
6 Due to accessing project node during delete
11 plan/libs/kernel/kptnode.cpp | 14 ++++++++++++--
12 plan/libs/kernel/kptnode.h | 5 ++++-
13 plan/libs/kernel/kptproject.cpp | 11 ++++++++++-
14 plan/libs/kernel/kptresource.cpp | 20 ++++++++++++++++----
15 plan/libs/kernel/kptresource.h | 7 ++++++-
16 5 files changed, 48 insertions(+), 9 deletions(-)
18 diff --git a/plan/libs/kernel/kptnode.cpp b/plan/libs/kernel/kptnode.cpp
19 index d8b0e6b..e55f9ca 100644
20 --- a/plan/libs/kernel/kptnode.cpp
21 +++ b/plan/libs/kernel/kptnode.cpp
22 @@ -40,7 +40,8 @@ namespace KPlato
23 Node::Node(Node *parent)
24 : QObject( 0 ), // We don't use qobjects parent
25 m_nodes(), m_dependChildNodes(), m_dependParentNodes(),
28 + m_blockChanged(false)
30 //debugPlan<<"("<<this<<")";
32 @@ -53,7 +54,8 @@ Node::Node(const Node &node, Node *parent)
35 m_dependParentNodes(),
38 + m_blockChanged(false)
40 //debugPlan<<"("<<this<<")";
42 @@ -1225,7 +1227,15 @@ void Node::setRunningAccount(Account *acc)
46 +void Node::blockChanged(bool on)
48 + m_blockChanged = on;
51 void Node::changed(Node *node, int property) {
52 + if (m_blockChanged) {
58 diff --git a/plan/libs/kernel/kptnode.h b/plan/libs/kernel/kptnode.h
59 index cfcbd3e..4c98acc 100644
60 --- a/plan/libs/kernel/kptnode.h
61 +++ b/plan/libs/kernel/kptnode.h
62 @@ -528,6 +528,8 @@ public:
63 virtual void emitDocumentRemoved( Node *node, Document *doc, int idx );
64 virtual void emitDocumentChanged( Node *node, Document *doc, int idx );
66 + void blockChanged(bool on = true);
69 // These shouldn't be available to other than those who inherits
70 /// Calculate the critical path
71 @@ -673,7 +675,8 @@ protected:
72 ResourceRequestCollection m_requests;
77 + bool m_blockChanged;
80 //////////////////////////////// Estimate ////////////////////////////////
81 diff --git a/plan/libs/kernel/kptproject.cpp b/plan/libs/kernel/kptproject.cpp
82 index 30cd450..d2fafb5 100644
83 --- a/plan/libs/kernel/kptproject.cpp
84 +++ b/plan/libs/kernel/kptproject.cpp
85 @@ -94,7 +94,16 @@ void Project::deref()
89 - disconnect(); // NOTE: may be a problem if somebody uses the destroyd() signal
91 + for(Node *n : nodeIdDict) {
94 + for (Resource *r : resourceIdDict) {
97 + for (ResourceGroup *g : resourceGroupIdDict) {
100 delete m_standardWorktime;
101 while ( !m_resourceGroups.isEmpty() )
102 delete m_resourceGroups.takeFirst();
103 diff --git a/plan/libs/kernel/kptresource.cpp b/plan/libs/kernel/kptresource.cpp
104 index 8a3d55e..b32d4e7 100644
105 --- a/plan/libs/kernel/kptresource.cpp
106 +++ b/plan/libs/kernel/kptresource.cpp
107 @@ -44,7 +44,8 @@ namespace KPlato
110 ResourceGroup::ResourceGroup()
113 + m_blockChanged(false)
117 @@ -80,8 +81,13 @@ void ResourceGroup::copy( const ResourceGroup *group )
118 m_name = group->m_name;
121 +void ResourceGroup::blockChanged(bool on)
123 + m_blockChanged = on;
126 void ResourceGroup::changed() {
128 + if (m_project && !m_blockChanged) {
129 m_project->changed( this );
132 @@ -319,7 +325,8 @@ Resource::Resource()
135 m_autoAllocate( false ),
136 - m_currentSchedule( 0 )
137 + m_currentSchedule( 0 ),
138 + m_blockChanged(false)
142 @@ -409,9 +416,14 @@ void Resource::copy(Resource *resource) {
143 //m_externalNames = resource->m_externalNames;
146 +void Resource::blockChanged(bool on)
148 + m_blockChanged = on;
151 void Resource::changed()
154 + if (m_project && !m_blockChanged) {
155 m_project->changed( this );
158 diff --git a/plan/libs/kernel/kptresource.h b/plan/libs/kernel/kptresource.h
159 index 10f6b92..fba020a 100644
160 --- a/plan/libs/kernel/kptresource.h
161 +++ b/plan/libs/kernel/kptresource.h
162 @@ -177,6 +177,8 @@ public:
163 DateTime startTime( long id ) const;
164 DateTime endTime( long id ) const;
166 + void blockChanged(bool on = true);
170 void printDebug( const QString& ident );
171 @@ -199,7 +201,7 @@ private:
174 QList<ResourceGroupRequest*> m_requests;
176 + bool m_blockChanged;
180 @@ -492,6 +494,8 @@ public:
181 /// Set the @p account
182 void setAccount( Account *account );
184 + void blockChanged(bool on = true);
186 // for xml loading code
189 @@ -564,6 +568,7 @@ private:
191 // return this if resource has no calendar and is a material resource
192 Calendar m_materialCalendar;
193 + bool m_blockChanged;