vtkSMSessionProxyManagerInternals.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (c) Kitware Inc.
2 // SPDX-License-Identifier: BSD-3-Clause
3 
4 #ifndef vtkSMSessionProxyManagerInternals_h
5 #define vtkSMSessionProxyManagerInternals_h
6 
7 #include "vtkObjectBase.h"
8 #include "vtkSMLink.h" // for vtkSMLink
9 #include "vtkSMMessage.h" // for vtkSMMessage
10 #include "vtkSMProxyLocator.h" // for vtkSMProxyLocator
11 #include "vtkSMProxySelectionModel.h" // for vtkSMProxySelectionModel
12 #include "vtkSmartPointer.h" // for vtkSmartPointer
13 
14 #include <map> // for std::map
15 #include <set> // for std::set
16 #include <vector> // for std::vector
17 #include <vtksys/RegularExpression.hxx> // for regexes
18 
19 class vtkSMProxyLocator;
21 
22 // Sub-classed to avoid symbol length explosion.
24 {
25 public:
27  void PrintSelf(ostream& os, vtkIndent indent) override
28  {
29  this->Superclass::PrintSelf(os, indent);
30  }
31 
33  unsigned long ModifiedObserverTag;
34  unsigned long StateChangedObserverTag;
35  unsigned long UpdateObserverTag;
37 
39  {
40  // This is required everytime we're implementing our own New() to avoid
41  // "Deleting unknown object" warning from vtkDebugLeaks.
43  ret->InitializeObjectBase();
44  return ret;
45  }
46 
48  void operator=(const vtkSMProxyManagerProxyInfo&) = delete;
49 
50 private:
52  {
53  this->ModifiedObserverTag = 0;
54  this->StateChangedObserverTag = 0;
55  this->UpdateObserverTag = 0;
56  this->UpdateInformationObserverTag = 0;
57  }
58  ~vtkSMProxyManagerProxyInfo() override
59  {
60  // Remove observers.
61  if (this->ModifiedObserverTag && this->Proxy.GetPointer())
62  {
63  this->Proxy.GetPointer()->RemoveObserver(this->ModifiedObserverTag);
64  this->ModifiedObserverTag = 0;
65  }
66  if (this->StateChangedObserverTag && this->Proxy.GetPointer())
67  {
68  this->Proxy.GetPointer()->RemoveObserver(this->StateChangedObserverTag);
69  this->StateChangedObserverTag = 0;
70  }
71  if (this->UpdateObserverTag && this->Proxy.GetPointer())
72  {
73  this->Proxy.GetPointer()->RemoveObserver(this->UpdateObserverTag);
74  this->UpdateObserverTag = 0;
75  }
76  if (this->UpdateInformationObserverTag && this->Proxy.GetPointer())
77  {
78  this->Proxy.GetPointer()->RemoveObserver(this->UpdateInformationObserverTag);
79  this->UpdateInformationObserverTag = 0;
80  }
81  }
82 };
83 
84 //-----------------------------------------------------------------------------
86  : public std::vector<vtkSmartPointer<vtkSMProxyManagerProxyInfo>>
87 {
88 public:
89  // Returns if the proxy exists in this vector.
90  bool Contains(vtkSMProxy* proxy)
91  {
92  vtkSMProxyManagerProxyListType::iterator iter = this->begin();
93  for (; iter != this->end(); ++iter)
94  {
95  if (iter->GetPointer()->Proxy == proxy)
96  {
97  return true;
98  }
99  }
100  return false;
101  }
102  vtkSMProxyManagerProxyListType::iterator Find(vtkSMProxy* proxy)
103  {
104  vtkSMProxyManagerProxyListType::iterator iter = this->begin();
105  for (; iter != this->end(); ++iter)
106  {
107  if (iter->GetPointer()->Proxy.GetPointer() == proxy)
108  {
109  return iter;
110  }
111  }
112  return this->end();
113  }
114 };
115 
116 //-----------------------------------------------------------------------------
117 class vtkSMProxyManagerProxyMapType : public std::map<std::string, vtkSMProxyManagerProxyListType>
118 {
119 };
120 //-----------------------------------------------------------------------------
122 {
123  std::string Group;
124  std::string Name;
126 
127  vtkSMProxyManagerEntry(const char* group, const char* name, vtkSMProxy* proxy)
128  {
129  this->Group = group;
130  this->Name = name;
131  this->Proxy = proxy;
132  }
133 
134  bool operator==(const vtkSMProxyManagerEntry& other) const
135  {
136  return this->Group == other.Group && this->Name == other.Name &&
137  this->Proxy->GetGlobalID() == other.Proxy->GetGlobalID();
138  }
139 
140  bool operator<(const vtkSMProxyManagerEntry& other) const
141  {
142  if (this->Proxy->GetGlobalID() < other.Proxy->GetGlobalID())
143  {
144  return true;
145  }
146  else if (this->Proxy->GetGlobalID() == other.Proxy->GetGlobalID() && this->Group == other.Group)
147  {
148  return this->Name < other.Name;
149  }
150  else if (this->Proxy->GetGlobalID() == other.Proxy->GetGlobalID())
151  {
152  return this->Group < other.Group;
153  }
154  return false;
155  }
156 
157  bool operator>(const vtkSMProxyManagerEntry& other) const
158  {
159  if (this->Proxy->GetGlobalID() > other.Proxy->GetGlobalID())
160  {
161  return true;
162  }
163  else if (this->Proxy->GetGlobalID() == other.Proxy->GetGlobalID() && this->Group == other.Group)
164  {
165  return this->Name > other.Name;
166  }
167  else if (this->Proxy->GetGlobalID() == other.Proxy->GetGlobalID())
168  {
169  return this->Group > other.Group;
170  }
171  return false;
172  }
173 };
174 //-----------------------------------------------------------------------------
176 {
177  // This data structure stores actual proxy instances grouped in
178  // collections.
179  typedef std::map<std::string, vtkSMProxyManagerProxyMapType> ProxyGroupType;
180  ProxyGroupType RegisteredProxyMap;
181 
182  // This data structure stores the tuples(group, name, proxy) to compute
183  // diff when a state is loaded.
184  typedef std::set<vtkSMProxyManagerEntry> GroupNameProxySet;
185  GroupNameProxySet RegisteredProxyTuple;
186 
187  // This data structure stores a set of proxies that have been modified.
188  typedef std::set<vtkSMProxy*> SetOfProxies;
189  SetOfProxies ModifiedProxies;
190 
191  // Data structure to save registered links.
192  typedef std::map<std::string, vtkSmartPointer<vtkSMLink>> LinkType;
194 
195  // Data structure for selection models.
196  typedef std::map<std::string, vtkSmartPointer<vtkSMProxySelectionModel>> SelectionModelsType;
197  SelectionModelsType SelectionModels;
198 
199  // Data structure for storing the fullState
201 
202  // Keep ref to the proxyManager to access the session
204 
205  // Helper methods -----------------------------------------------------------
206  void FindProxyTuples(vtkSMProxy* proxy, std::set<vtkSMProxyManagerEntry>& tuplesFounds)
207  {
208  std::set<vtkSMProxyManagerEntry>::iterator iter;
209  iter = this->RegisteredProxyTuple.begin();
210  while (iter != this->RegisteredProxyTuple.end())
211  {
212  if (iter->Proxy == proxy)
213  {
214  tuplesFounds.insert(*iter);
215  }
216  iter++;
217  }
218  }
219 
220  // --------------------------------------------------------------------------
221  void ComputeDelta(const vtkSMMessage* newState, vtkSMProxyLocator* locator,
222  std::set<vtkSMProxyManagerEntry>& toRegister, std::set<vtkSMProxyManagerEntry>& toUnregister)
223  {
224  // Fill equivalent temporary data structure
225  std::set<vtkSMProxyManagerEntry> newStateContent;
226  int max = newState->ExtensionSize(PXMRegistrationState::registered_proxy);
227  for (int cc = 0; cc < max; cc++)
228  {
229  PXMRegistrationState_Entry reg =
230  newState->GetExtension(PXMRegistrationState::registered_proxy, cc);
231  vtkSMProxy* proxy = locator->LocateProxy(reg.global_id());
232  if (proxy)
233  {
234  newStateContent.insert(
235  vtkSMProxyManagerEntry(reg.group().c_str(), reg.name().c_str(), proxy));
236  }
237  }
238 
239  // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
240  // FIXME there might be a better way to do that
241  // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
242 
243  // Look for proxy to Register
244  std::set<vtkSMProxyManagerEntry>::iterator iter;
245  iter = newStateContent.begin();
246  while (iter != newStateContent.end())
247  {
248  if (this->RegisteredProxyTuple.find(*iter) == this->RegisteredProxyTuple.end())
249  {
250  toRegister.insert(*iter);
251  }
252  iter++;
253  }
254 
255  // Look for proxy to Unregister
256  iter = this->RegisteredProxyTuple.begin();
257  vtksys::RegularExpression prototypesRe("_prototypes$");
258  while (iter != this->RegisteredProxyTuple.end())
259  {
260  if (newStateContent.find(*iter) == newStateContent.end() &&
261  !prototypesRe.find(iter->Group.c_str()))
262  {
263  toUnregister.insert(*iter);
264  }
265  iter++;
266  }
267  }
268 
269  // --------------------------------------------------------------------------
270  void RemoveTuples(const char* name, std::set<vtkSMProxyManagerEntry>& removedEntries)
271  {
272  // Convert param
273  std::string nameString = name;
274 
275  // Deal with set
276  GroupNameProxySet resultSet;
277  std::set<vtkSMProxyManagerEntry>::iterator iter;
278  iter = this->RegisteredProxyTuple.begin();
279  while (iter != this->RegisteredProxyTuple.end())
280  {
281  if (iter->Name != nameString)
282  {
283  resultSet.insert(*iter);
284  }
285  iter++;
286  }
287  this->RegisteredProxyTuple = resultSet;
288 
289  // Deal with map only (true)
290  vtkSMSessionProxyManagerInternals::ProxyGroupType::iterator it =
291  this->RegisteredProxyMap.begin();
292  for (; it != this->RegisteredProxyMap.end(); it++)
293  {
294  vtkSMProxyManagerProxyMapType::iterator it2 = it->second.find(name);
295  if (it2 != it->second.end())
296  {
297  this->RemoveTuples(it->first.c_str(), name, removedEntries, true);
298  }
299  }
300 
301  // Deal with State
302  vtkSMMessage backup;
303  backup.CopyFrom(this->State);
304  int nbRegisteredProxy = this->State.ExtensionSize(PXMRegistrationState::registered_proxy);
305  this->State.ClearExtension(PXMRegistrationState::registered_proxy);
306  for (int cc = 0; cc < nbRegisteredProxy; ++cc)
307  {
308  const PXMRegistrationState_Entry* reg =
309  &backup.GetExtension(PXMRegistrationState::registered_proxy, cc);
310 
311  if (reg->name() != nameString) // Keep it
312  {
313  this->State.AddExtension(PXMRegistrationState::registered_proxy)->CopyFrom(*reg);
314  }
315  }
316  }
317 
318  // --------------------------------------------------------------------------
319  void RemoveTuples(const char* group, const char* name,
320  std::set<vtkSMProxyManagerEntry>& removedEntries, bool doMapOnly)
321  {
322  // Convert parameters
323  std::string groupString = group;
324  std::string nameString = name;
325 
326  // Deal with set
327  if (!doMapOnly)
328  {
329  GroupNameProxySet resultSet;
330  std::set<vtkSMProxyManagerEntry>::iterator iter;
331  iter = this->RegisteredProxyTuple.begin();
332  while (iter != this->RegisteredProxyTuple.end())
333  {
334  if (iter->Group != groupString || iter->Name != nameString)
335  {
336  resultSet.insert(*iter);
337  }
338  iter++;
339  }
340  this->RegisteredProxyTuple = resultSet;
341  }
342 
343  // Deal with map
344  vtkSMSessionProxyManagerInternals::ProxyGroupType::iterator it =
345  this->RegisteredProxyMap.find(group);
346  if (it != this->RegisteredProxyMap.end())
347  {
348  vtkSMProxyManagerProxyMapType::iterator it2 = it->second.find(name);
349  if (it2 != it->second.end())
350  {
351  vtkSMProxyManagerProxyListType::iterator it3 = it2->second.begin();
352  while (it3 != it2->second.end())
353  {
354  removedEntries.insert(vtkSMProxyManagerEntry(group, name, (*it3)->Proxy));
355  it3++;
356  }
357  it->second.erase(it2);
358  }
359  }
360 
361  // Deal with state
362  vtksys::RegularExpression prototypesRe("_prototypes$");
363  if (!doMapOnly && !prototypesRe.find(group))
364  {
365  vtkSMMessage backup;
366  backup.CopyFrom(this->State);
367  int nbRegisteredProxy = this->State.ExtensionSize(PXMRegistrationState::registered_proxy);
368  this->State.ClearExtension(PXMRegistrationState::registered_proxy);
369  for (int cc = 0; cc < nbRegisteredProxy; ++cc)
370  {
371  const PXMRegistrationState_Entry* reg =
372  &backup.GetExtension(PXMRegistrationState::registered_proxy, cc);
373 
374  if (reg->group() != groupString || reg->name() != nameString) // Keep it
375  {
376  this->State.AddExtension(PXMRegistrationState::registered_proxy)->CopyFrom(*reg);
377  }
378  }
379  }
380  }
381 
382  // --------------------------------------------------------------------------
383  // Return true if the given tuple has been found
384  bool RemoveTuples(const char* group, const char* name, vtkSMProxy* proxy)
385  {
386  // Convert parameters
387  std::string groupString = group;
388  std::string nameString = name;
389 
390  // Will be overridden if the proxy is found
391  bool found = false;
392 
393  // Deal with set
394  this->RegisteredProxyTuple.erase(vtkSMProxyManagerEntry(group, name, proxy));
395 
396  // Deal with map
397  vtkSMSessionProxyManagerInternals::ProxyGroupType::iterator it =
398  this->RegisteredProxyMap.find(group);
399  if (it != this->RegisteredProxyMap.end())
400  {
401  vtkSMProxyManagerProxyMapType::iterator it2 = it->second.find(name);
402  if (it2 != it->second.end())
403  {
404  vtkSMProxyManagerProxyListType::iterator it3 = it2->second.Find(proxy);
405  if (it3 != it2->second.end())
406  {
407  found = true;
408  it2->second.erase(it3);
409  }
410  if (it2->second.empty())
411  {
412  it->second.erase(it2);
413  }
414  }
415  }
416 
417  // Deal with state
418  vtksys::RegularExpression prototypesRe("_prototypes$");
419  if (!prototypesRe.find(group))
420  {
421  vtkSMMessage backup;
422  backup.CopyFrom(this->State);
423 
424  int nbRegisteredProxy = this->State.ExtensionSize(PXMRegistrationState::registered_proxy);
425  this->State.ClearExtension(PXMRegistrationState::registered_proxy);
426 
427  for (int cc = 0; cc < nbRegisteredProxy; ++cc)
428  {
429  const PXMRegistrationState_Entry* reg =
430  &backup.GetExtension(PXMRegistrationState::registered_proxy, cc);
431 
432  if (reg->group() == groupString && reg->name() == nameString &&
433  reg->global_id() == proxy->GetGlobalID())
434  {
435  // Do not keep it
436  }
437  else
438  {
439  // Keep it
440  this->State.AddExtension(PXMRegistrationState::registered_proxy)->CopyFrom(*reg);
441  }
442  }
443  }
444 
445  return found;
446  }
447 
448  // --------------------------------------------------------------------------
450  {
451  this->State.ClearExtension(PXMRegistrationState::registered_selection_model);
452  std::map<std::string, vtkSmartPointer<vtkSMProxySelectionModel>>::iterator iter;
453  for (iter = this->SelectionModels.begin(); iter != this->SelectionModels.end(); iter++)
454  {
455  PXMRegistrationState_Entry* selModel =
456  this->State.AddExtension(PXMRegistrationState::registered_selection_model);
457  selModel->set_name(iter->first);
458  selModel->set_global_id(iter->second->GetGlobalID());
459  }
460  }
461  // --------------------------------------------------------------------------
463  {
464  this->State.ClearExtension(PXMRegistrationState::registered_link);
465 
466  LinkType::iterator iter;
467  for (iter = this->RegisteredLinkMap.begin(); iter != this->RegisteredLinkMap.end(); iter++)
468  {
469  PXMRegistrationState_Entry* linkEntry =
470  this->State.AddExtension(PXMRegistrationState::registered_link);
471  linkEntry->set_name(iter->first);
472  linkEntry->set_global_id(iter->second->GetGlobalID());
473  }
474  }
475  // --------------------------------------------------------------------------
476 };
477 
478 #endif
479 
480 // VTK-HeaderTest-Exclude: vtkSMSessionProxyManagerInternals.h
bool operator>(const vtkSMProxyManagerEntry &other) const
void ComputeDelta(const vtkSMMessage *newState, vtkSMProxyLocator *locator, std::set< vtkSMProxyManagerEntry > &toRegister, std::set< vtkSMProxyManagerEntry > &toUnregister)
static vtkSMProxyManagerProxyInfo * New()
vtkSMProxyManagerEntry(const char *group, const char *name, vtkSMProxy *proxy)
void RemoveTuples(const char *name, std::set< vtkSMProxyManagerEntry > &removedEntries)
void RemoveObserver(unsigned long tag)
virtual vtkSMProxy * LocateProxy(vtkTypeUInt32 globalID)
Locate a proxy with the given "name".
void operator=(const vtkSMProxyManagerProxyInfo &)=delete
void PrintSelf(ostream &os, vtkIndent indent) override
Header class that setup every thing in order to use Protobuf messages in a transparent manner...
void FindProxyTuples(vtkSMProxy *proxy, std::set< vtkSMProxyManagerEntry > &tuplesFounds)
std::map< std::string, vtkSmartPointer< vtkSMProxySelectionModel > > SelectionModelsType
bool operator<(const vtkSMProxyManagerEntry &other) const
std::set< vtkSMProxyManagerEntry > GroupNameProxySet
bool RemoveTuples(const char *group, const char *name, vtkSMProxy *proxy)
The vtkSMSessionProxyManager is esponsible for creating and managing proxies for a given session...
void RemoveTuples(const char *group, const char *name, std::set< vtkSMProxyManagerEntry > &removedEntries, bool doMapOnly)
proxy for a VTK object(s) on a server
Definition: vtkSMProxy.h:140
is used to locate proxies referred to in state xmls while loading state files.
vtkSMProxyManagerProxyListType::iterator Find(vtkSMProxy *proxy)
T * GetPointer() const
bool operator==(const vtkSMProxyManagerEntry &other) const
vtkBaseTypeMacro(vtkSMProxyManagerProxyInfo, vtkObjectBase)
std::map< std::string, vtkSMProxyManagerProxyMapType > ProxyGroupType
virtual vtkTypeUInt32 GetGlobalID()
Get the global unique id for this object.
vtkSmartPointer< vtkSMProxy > Proxy
#define max(a, b)
std::map< std::string, vtkSmartPointer< vtkSMLink > > LinkType