Files
ThirdParty-6/ParaView-5.0.1/ParaViewCore/ServerManager/Core/vtkSMRemoteObject.h

193 lines
6.7 KiB
C++

/*=========================================================================
Program: ParaView
Module: vtkSMRemoteObject.h
Copyright (c) Kitware, Inc.
All rights reserved.
See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
// .NAME vtkSMRemoteObject - baseclass for all proxy-objects that have counter
// parts on server as well as client processes.
// .SECTION Description
// Abstract class involved in ServerManager class hierarchy that has a
// corresponding SIObject which can be local or remote.
#ifndef vtkSMRemoteObject_h
#define vtkSMRemoteObject_h
#include "vtkPVServerManagerCoreModule.h" //needed for exports
#include "vtkSMSessionObject.h"
#include "vtkSMMessageMinimal.h" // needed for vtkSMMessage
#include "vtkWeakPointer.h" // needed for vtkWeakPointer
class vtkClientServerStream;
class vtkSMSession;
class vtkSMProxyLocator;
class vtkSMLoadStateContext;
class VTKPVSERVERMANAGERCORE_EXPORT vtkSMRemoteObject : public vtkSMSessionObject
{
// My friends are...
friend class vtkSMStateHelper; // To pull state
friend class vtkSMStateLoader; // To set GlobalId as the originals
public:
vtkTypeMacro(vtkSMRemoteObject,vtkSMSessionObject);
void PrintSelf(ostream& os, vtkIndent indent);
// Description:
// Get/Set the location where the underlying VTK-objects are created. The
// value can be contructed by or-ing vtkSMSession::ServerFlags
vtkSetMacro(Location, vtkTypeUInt32);
vtkGetMacro(Location, vtkTypeUInt32);
// Description:
// Override the SetSession so if the object already have an ID
// we automatically register it to the associated session
virtual void SetSession(vtkSMSession*);
// Description:
// Get the global unique id for this object. If none is set and the session is
// valid, a new global id will be assigned automatically.
virtual vtkTypeUInt32 GetGlobalID();
const char* GetGlobalIDAsString();
// Description:
// Allow the user to test if the RemoteObject has already a GlobalID without
// assigning a new one to it.
bool HasGlobalID();
// Description:
// Allow user to set the remote object to be discard for Undo/Redo
// action. By default, any remote object is Undoable.
vtkBooleanMacro(Prototype, bool);
bool IsPrototype() {return this->Prototype;}
vtkSetMacro(Prototype, bool);
//BTX
// Description:
// This method return the full object state that can be used to create that
// object from scratch.
// This method will be used to fill the undo stack.
// If not overriden this will return NULL.
virtual const vtkSMMessage* GetFullState()
{ return NULL; }
// Description:
// This method is used to initialise the object to the given state
// If the definitionOnly Flag is set to True the proxy won't load the
// properties values and just setup the new proxy hierarchy with all subproxy
// globalID set. This allow to split the load process in 2 step to prevent
// invalid state when property refere to a sub-proxy that does not exist yet.
virtual void LoadState( const vtkSMMessage* msg, vtkSMProxyLocator* locator)
{
(void) msg;
(void) locator;
}
// Description:
// Allow to switch off any push of state change to the server for that
// particular object.
// This is used when we load a state based on a server notification. In that
// particular case, the server is already aware of that new state, so we keep
// those changes local.
virtual void EnableLocalPushOnly();
// Description:
// Enable the given remote object to communicate its state normaly to the
// server location.
virtual void DisableLocalPushOnly();
// Description:
// Let the session be aware that even if the Location is client only,
// the message should not be send to the server for a general broadcast
virtual bool IsLocalPushOnly() { return this->ClientOnlyLocationFlag; }
protected:
// Description:
// Default constructor.
vtkSMRemoteObject();
// Description:
// Destructor.
virtual ~vtkSMRemoteObject();
// Description:
// Subclasses can call this method to send a message to its state
// object on the server processes specified.
void PushState(vtkSMMessage* msg);
// Description:
// Subclasses can call this method to pull the state from the
// state-object on the server processes specified. Returns true on successful
// fetch. The message is updated with the fetched state.
bool PullState(vtkSMMessage* msg);
// Description:
// Set the GlobalUniqueId
void SetGlobalID(vtkTypeUInt32 guid);
// Global-ID for this vtkSMRemoteObject. This is assigned when needed.
// Assigned at :
// - First push
// - or when the RemoteObject is created by the ProcessModule remotely.
// - or when state is loaded from protobuf messages
vtkTypeUInt32 GlobalID;
// Location flag identify the processes on which the vtkSIObject
// corresponding to this vtkSMRemoteObject exist.
vtkTypeUInt32 Location;
// Allow remote object to be discard for any state management such as
// Undo/Redo, Register/UnRegister (in ProxyManager) and so on...
bool Prototype;
// Field that store the Disable/EnableLocalPushOnly() state information
bool ClientOnlyLocationFlag;
// Convenient method used to return either the local Location or a filtered
// version of it based on the ClientOnlyLocationFlag
vtkTypeUInt32 GetFilteredLocation();
private:
vtkSMRemoteObject(const vtkSMRemoteObject&); // Not implemented
void operator=(const vtkSMRemoteObject&); // Not implemented
char* GlobalIDString;
//ETX
};
/// This defines a manipulator for the vtkClientServerStream that can be used
/// to indicate to the interpreter that the placeholder is to be replaced by
/// the vtkSIProxy instance for the given vtkSMProxy instance.
/// e.g.
/// \code
/// vtkClientServerStream stream;
/// stream << vtkClientServerStream::Invoke
/// << SIOBJECT(proxyA)
/// << "MethodName"
/// << vtkClientServerStream::End;
/// \endcode
/// Will result in calling the vtkSIProxy::MethodName() when the stream in
/// interpreted.
class VTKPVSERVERMANAGERCORE_EXPORT SIOBJECT
{
vtkSMRemoteObject* Reference;
friend VTKPVSERVERMANAGERCORE_EXPORT vtkClientServerStream& operator<<(
vtkClientServerStream& stream, const SIOBJECT& manipulator);
public:
SIOBJECT(vtkSMRemoteObject* rmobject) : Reference(rmobject) {}
};
VTKPVSERVERMANAGERCORE_EXPORT vtkClientServerStream& operator<< (vtkClientServerStream& stream,
const SIOBJECT& manipulator);
#endif // #ifndef vtkSMRemoteObject_h