Files
ThirdParty-6/ParaView-5.0.1/ParaViewCore/ServerImplementation/Core/vtkSIProperty.cxx

214 lines
5.8 KiB
C++

/*=========================================================================
Program: ParaView
Module: vtkSIProperty.cxx
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.
=========================================================================*/
#include "vtkSIProperty.h"
#include "vtkClientServerInterpreter.h"
#include "vtkClientServerStream.h"
#include "vtkObjectFactory.h"
#include "vtkSIProxy.h"
#include "vtkSMMessage.h"
#include "vtkPVXMLElement.h"
//****************************************************************************/
// Internal Classes and typedefs
//****************************************************************************/
class vtkSIProperty::vtkInternals
{
public:
vtkInternals()
{
this->CacheValue = NULL;
}
~vtkInternals()
{
this->ClearCache();
}
void ClearCache()
{
if(this->CacheValue)
{
delete this->CacheValue;
this->CacheValue = NULL;
}
}
bool HasCache()
{
return this->CacheValue != NULL;
}
void SaveToCache(const ProxyState_Property *newValue)
{
this->ClearCache();
this->CacheValue = new ProxyState_Property();
this->CacheValue->CopyFrom(*newValue);
}
ProxyState_Property *CacheValue;
};
//****************************************************************************/
vtkStandardNewMacro(vtkSIProperty);
//----------------------------------------------------------------------------
vtkSIProperty::vtkSIProperty()
{
this->Command = NULL;
this->XMLName = NULL;
this->IsInternal = false;
this->InformationOnly = false;
this->Repeatable = false;
this->SIProxyObject = NULL;
this->Internals = new vtkInternals();
}
//----------------------------------------------------------------------------
vtkSIProperty::~vtkSIProperty()
{
this->SetCommand(NULL);
this->SetXMLName(NULL);
delete this->Internals;
}
//----------------------------------------------------------------------------
bool vtkSIProperty::ReadXMLAttributes(
vtkSIProxy* proxyhelper, vtkPVXMLElement* element)
{
this->SIProxyObject = proxyhelper;
const char* xmlname = element->GetAttribute("name");
if(xmlname)
{
this->SetXMLName(xmlname);
}
const char* command = element->GetAttribute("command");
if (command)
{
this->SetCommand(command);
}
int repeatable;
if (element->GetScalarAttribute("repeatable", &repeatable))
{
this->Repeatable = (repeatable != 0);
}
// Yup, both mean the same thing :).
int repeat_command;
if (element->GetScalarAttribute("repeat_command", &repeat_command))
{
this->Repeatable = (repeat_command != 0);
}
int information_only;
if (element->GetScalarAttribute("information_only", &information_only))
{
this->InformationOnly = (information_only != 0);
}
int is_internal;
if (element->GetScalarAttribute("is_internal", &is_internal))
{
this->SetIsInternal(is_internal != 0);
}
return true;
}
//----------------------------------------------------------------------------
vtkSIObject* vtkSIProperty::GetSIObject(vtkTypeUInt32 globalid)
{
if (this->SIProxyObject)
{
return this->SIProxyObject->GetSIObject(globalid);
}
return NULL;
}
//----------------------------------------------------------------------------
bool vtkSIProperty::ProcessMessage(vtkClientServerStream& stream)
{
if (this->SIProxyObject && this->SIProxyObject->GetVTKObject())
{
return this->SIProxyObject->GetInterpreter()->ProcessStream(stream) != 0;
}
return this->SIProxyObject ? true : false;
}
//----------------------------------------------------------------------------
vtkObjectBase* vtkSIProperty::GetVTKObject()
{
if (this->SIProxyObject)
{
return this->SIProxyObject->GetVTKObject();
}
return NULL;
}
//----------------------------------------------------------------------------
const vtkClientServerStream& vtkSIProperty::GetLastResult()
{
if (this->SIProxyObject)
{
return this->SIProxyObject->GetInterpreter()->GetLastResult();
}
static vtkClientServerStream stream;
return stream;
}
//----------------------------------------------------------------------------
void vtkSIProperty::PrintSelf(ostream& os, vtkIndent indent)
{
this->Superclass::PrintSelf(os, indent);
}
//----------------------------------------------------------------------------
// CAUTION: This method should only be called for Command property only
// and not for value property.
bool vtkSIProperty::Push(vtkSMMessage*, int)
{
if (this->InformationOnly || !this->Command || this->GetVTKObject() == NULL)
{
return true;
}
vtkClientServerStream stream;
stream << vtkClientServerStream::Invoke;
stream << this->GetVTKObject() << this->Command;
stream << vtkClientServerStream::End;
return this->ProcessMessage(stream);
}
//----------------------------------------------------------------------------
// CAUTION: This method should only be called to retreive the cache value of the
// property.
bool vtkSIProperty::Pull(vtkSMMessage* msg)
{
if(!this->InformationOnly && this->Internals->HasCache())
{
ProxyState_Property *newProp = msg->AddExtension(ProxyState::property);
newProp->CopyFrom(*this->Internals->CacheValue);
}
return true;
}
//----------------------------------------------------------------------------
void vtkSIProperty::SaveValueToCache(vtkSMMessage* message, int offset)
{
const ProxyState_Property *prop =
&message->GetExtension(ProxyState::property, offset);
this->Internals->SaveToCache(prop);
}