/*========================================================================= Program: Visualization Toolkit Module: vtkSocketController.cxx Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen 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 "vtkSocketController.h" #include "vtkObjectFactory.h" #include "vtkProcessGroup.h" #include "vtkSocketCommunicator.h" #if defined(_WIN32) && !defined(__CYGWIN__) # define VTK_WINDOWS_FULL # include "vtkWindows.h" # define WSA_VERSION MAKEWORD(1,1) #endif int vtkSocketController::Initialized = 0; vtkStandardNewMacro(vtkSocketController); //---------------------------------------------------------------------------- vtkSocketController::vtkSocketController() { this->Communicator = vtkSocketCommunicator::New(); this->RMICommunicator = this->Communicator; } //---------------------------------------------------------------------------- vtkSocketController::~vtkSocketController() { this->Communicator->Delete(); this->Communicator = this->RMICommunicator = nullptr; } //---------------------------------------------------------------------------- void vtkSocketController::Initialize(int* , char***) { if (vtkSocketController::Initialized) { vtkWarningMacro("Already initialized."); return; } #if defined(_WIN32) && !defined(__CYGWIN__) WSAData wsaData; if (WSAStartup(WSA_VERSION, &wsaData)) { vtkErrorMacro("Could not initialize sockets !"); } #endif vtkSocketController::Initialized = 1; } //---------------------------------------------------------------------------- void vtkSocketController::SetCommunicator(vtkSocketCommunicator* comm) { if (comm == this->Communicator) { return; } if (this->Communicator) { this->Communicator->UnRegister(this); } this->Communicator = comm; this->RMICommunicator = comm; if (comm) { comm->Register(this); } } //---------------------------------------------------------------------------- void vtkSocketController::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os,indent); } //---------------------------------------------------------------------------- int vtkSocketController::WaitForConnection(int port) { return vtkSocketCommunicator::SafeDownCast(this->Communicator)-> WaitForConnection(port); } //---------------------------------------------------------------------------- void vtkSocketController::CloseConnection() { vtkSocketCommunicator::SafeDownCast(this->Communicator)-> CloseConnection(); } //---------------------------------------------------------------------------- int vtkSocketController::ConnectTo(const char* hostName, int port ) { return vtkSocketCommunicator::SafeDownCast(this->Communicator)-> ConnectTo(hostName, port); } //---------------------------------------------------------------------------- int vtkSocketController::GetSwapBytesInReceivedData() { return vtkSocketCommunicator::SafeDownCast(this->Communicator)-> GetSwapBytesInReceivedData(); } //----------------------------------------------------------------------------- vtkMultiProcessController *vtkSocketController::CreateCompliantController() { vtkProcessGroup *group = vtkProcessGroup::New(); group->Initialize(this->Communicator); group->RemoveAllProcessIds(); // This hack creates sub controllers with differing orders of the processes // that will map the ids to be unique on each process. if (vtkSocketCommunicator::SafeDownCast(this->Communicator)->GetIsServer()) { group->AddProcessId(1); group->AddProcessId(0); } else { group->AddProcessId(0); group->AddProcessId(1); } vtkMultiProcessController *compliantController = this->CreateSubController(group); group->Delete(); return compliantController; }