mirror of
https://github.com/OpenFOAM/ThirdParty-6.git
synced 2025-12-08 06:57:43 +00:00
205 lines
5.7 KiB
C++
205 lines
5.7 KiB
C++
/*=========================================================================
|
|
|
|
Program: ParaView
|
|
Module: vtkSMRemoteObject.cxx
|
|
|
|
Copyright (c) Kitware, Inc.
|
|
All rights reserved.
|
|
See Copyright.txt or http://www.kitware.com/Copyright.htm 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.
|
|
|
|
=========================================================================*/
|
|
#include "vtkSMRemoteObject.h"
|
|
|
|
#include "vtkObjectFactory.h"
|
|
#include "vtkProcessModule.h"
|
|
#include "vtkSMMessage.h"
|
|
#include "vtkSMSession.h"
|
|
|
|
#include <vtksys/SystemTools.hxx>
|
|
#include <sstream>
|
|
|
|
//----------------------------------------------------------------------------
|
|
vtkSMRemoteObject::vtkSMRemoteObject()
|
|
{
|
|
this->GlobalID = 0;
|
|
this->GlobalIDString = NULL;
|
|
this->Location = 0;
|
|
this->Session = NULL;
|
|
this->Prototype = false;
|
|
this->ClientOnlyLocationFlag = false;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
vtkSMRemoteObject::~vtkSMRemoteObject()
|
|
{
|
|
if(this->Session && this->GlobalID != 0)
|
|
{
|
|
this->Session->UnRegisterRemoteObject(this->GlobalID, this->Location);
|
|
}
|
|
this->SetSession(0);
|
|
delete [] this->GlobalIDString;
|
|
this->GlobalIDString = NULL;
|
|
}
|
|
//----------------------------------------------------------------------------
|
|
void vtkSMRemoteObject::SetSession(vtkSMSession* session)
|
|
{
|
|
this->Superclass::SetSession(session);
|
|
// Register object if possible
|
|
if(this->Session && this->GlobalID != 0)
|
|
{
|
|
this->Session->RegisterRemoteObject(this->GlobalID, this->Location, this);
|
|
}
|
|
}
|
|
//----------------------------------------------------------------------------
|
|
void vtkSMRemoteObject::PrintSelf(ostream& os, vtkIndent indent)
|
|
{
|
|
this->Superclass::PrintSelf(os, indent);
|
|
os << indent << "GlobalID: " << this->GlobalID << endl;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
bool vtkSMRemoteObject::HasGlobalID()
|
|
{
|
|
return this->GlobalID != 0;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
vtkTypeUInt32 vtkSMRemoteObject::GetGlobalID()
|
|
{
|
|
if (this->Session != NULL && this->GlobalID == 0)
|
|
{
|
|
this->SetGlobalID(this->GetSession()->GetNextGlobalUniqueIdentifier());
|
|
}
|
|
|
|
return this->GlobalID;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
const char* vtkSMRemoteObject::GetGlobalIDAsString()
|
|
{
|
|
if (!this->GlobalIDString)
|
|
{
|
|
std::ostringstream cname;
|
|
cname << this->GetGlobalID();
|
|
|
|
delete [] this->GlobalIDString;
|
|
this->GlobalIDString = vtksys::SystemTools::DuplicateString(
|
|
cname.str().c_str());
|
|
}
|
|
|
|
return this->GlobalIDString;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void vtkSMRemoteObject::SetGlobalID(vtkTypeUInt32 guid)
|
|
{
|
|
if(this->GlobalID == guid)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(this->GlobalID != 0)
|
|
{
|
|
vtkErrorMacro("GlobalID must NOT be changed once it has been assigned.\n"
|
|
"Try to set " << guid << " to replace the current "
|
|
<< this->GlobalID << " value.");
|
|
abort();
|
|
}
|
|
|
|
// Keep new ID
|
|
this->GlobalID = guid;
|
|
|
|
// Register object if possible
|
|
if(this->Session && this->GlobalID != 0)
|
|
{
|
|
this->Session->RegisterRemoteObject(this->GlobalID, this->Location, this);
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void vtkSMRemoteObject::PushState(vtkSMMessage* msg)
|
|
{
|
|
vtkTypeUInt32 filteredLocation = this->GetFilteredLocation();
|
|
if(filteredLocation == 0)
|
|
{
|
|
return; // This object is a prototype and has no location
|
|
}
|
|
|
|
// Check if a GUID has been assigned to that object otherwise assign a new one
|
|
vtkTypeUInt32 gid = this->GetGlobalID();
|
|
msg->set_global_id(gid);
|
|
msg->set_location(filteredLocation);
|
|
if (this->GetSession())
|
|
{
|
|
this->GetSession()->PushState(msg);
|
|
}
|
|
else
|
|
{
|
|
// no session, nothing to do.
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
bool vtkSMRemoteObject::PullState(vtkSMMessage* msg)
|
|
{
|
|
if(this->Location == 0)
|
|
{
|
|
return true; // This object is a prototype and has no location
|
|
}
|
|
|
|
msg->set_global_id(this->GlobalID);
|
|
msg->set_location(this->Location);
|
|
if(this->GetSession())
|
|
{
|
|
this->GetSession()->PullState(msg);
|
|
}
|
|
else
|
|
{
|
|
vtkErrorMacro("Attempting to PullState() on a " << this->GetClassName()
|
|
<< " after the session has been destroyed.");
|
|
return false;
|
|
}
|
|
return true; // Successful call
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void vtkSMRemoteObject::EnableLocalPushOnly()
|
|
{
|
|
this->ClientOnlyLocationFlag = true;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void vtkSMRemoteObject::DisableLocalPushOnly()
|
|
{
|
|
this->ClientOnlyLocationFlag = false;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
vtkTypeUInt32 vtkSMRemoteObject::GetFilteredLocation()
|
|
{
|
|
if(this->ClientOnlyLocationFlag)
|
|
{
|
|
return (this->Location & vtkPVSession::CLIENT);
|
|
}
|
|
else
|
|
{
|
|
return this->Location;
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
vtkClientServerStream& operator<< (vtkClientServerStream& stream,
|
|
const SIOBJECT& manipulator)
|
|
{
|
|
vtkClientServerStream substream;
|
|
substream << vtkClientServerStream::Invoke
|
|
<< vtkClientServerID(1) // ID for the vtkSMSessionCore helper.
|
|
<< "GetSIObject"
|
|
<< manipulator.Reference->GetGlobalID()
|
|
<< vtkClientServerStream::End;
|
|
stream << substream;
|
|
return stream;
|
|
}
|