open_toontown_panda3d/pandatool/src/mayaprogs/mayaConversionClient.cxx

193 lines
4.8 KiB
C++

/**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file mayaConversionClient.cxx
* @author Derzsi Dániel
* @date 2020-10-01
*/
#include "mayaConversionClient.h"
#include "mayaConversionServer.h"
#include "datagramIterator.h"
/**
* Initializes the Maya conversion client.
*/
MayaConversionClient::
MayaConversionClient()
{
_qManager = new QueuedConnectionManager();
_qReader = new QueuedConnectionReader(_qManager, 0);
_cWriter = new ConnectionWriter(_qManager, 0);
}
/**
* Cleans up the Maya conversison client's pending connections.
*/
MayaConversionClient::
~MayaConversionClient() {
close();
}
/**
* Attempts to connect to a Maya conversion server.
* If a connection is already active, it will be removed.
*
* Returns true if the connection was created successfully.
*/
bool MayaConversionClient::
connect(NetAddress server) {
if (_conn) {
// Remove this connection from the readers list
_qReader->remove_connection(_conn);
_conn = nullptr;
}
// Attempt to open a connection
_conn = _qManager->open_TCP_client_connection(server, 0);
if (!_conn || _conn.is_null()) {
// This connection could not be opened
return false;
}
// Add this connection to the readers list
_qReader->add_connection(_conn);
return true;
}
/**
* Sends a conversion workload to the Maya conversion server.
* It will be processed as soon as the server's queue is empty.
*
* Specify the working directory in where the models are located,
* the command line arguments, and the conversion type.
*
* Returns true if the workload has been successfully sent.
*/
bool MayaConversionClient::
queue(Filename working_directory, int argc, char *argv[], MayaConversionServer::ConversionType conversion_type) {
if (!_conn) {
return false;
}
std::string s_cwd = (std::string) working_directory.to_os_specific();
NetDatagram datagram;
// First part of the datagram is the argc
datagram.add_uint8(argc);
// Add the rest of the arguments as strings to the datagram
for (int i = 0; i < argc; i++) {
datagram.add_string(argv[i]);
}
// Add the current working dir as a string to the datagram
datagram.add_string(s_cwd);
// Lastly, add the conversion type
datagram.add_uint8(conversion_type);
// Send the conversion request
if (!_cWriter->send(datagram, _conn) || !_conn->flush()) {
nout << "Failed to send workload to server process.\n";
return false;
}
// Wait for a response
while (_conn->get_socket()->Active() && !_qReader->data_available()) {
_qReader->poll();
}
if (!_qReader->data_available()) {
// No response has been given by the server.
nout << "No response has been given by the conversion server.\n";
return false;
}
NetDatagram response;
// Let's read the response now!
if (!_qReader->get_data(response)) {
nout << "The conversion response could not be read.\n";
return false;
}
// Iterate through the response.
DatagramIterator response_data(response);
// Read the first and only argument.
// Did our conversion request succeed?
bool converted = response_data.get_bool();
if (!converted) {
nout << "The server reported that the conversion has failed.\n"
<< "Please check the server logs for further information.\n";
return false;
}
return true;
}
/**
* Closes the current connection to the Maya conversion server,
* waiting for all currently queued requests to finish.
*
* Does nothing if the connection has not been made yet.
*/
void MayaConversionClient::
close() {
if (!_conn) {
return;
}
while (true) {
_qReader->data_available();
if (_qManager->reset_connection_available()) {
PT(Connection) connection;
if (_qManager->get_reset_connection(connection)) {
_qManager->close_connection(_conn);
_conn = nullptr;
return;
}
}
Thread::sleep(0.1);
}
}
/**
* The entrypoint to this Maya conversion client.
*
* Connects to the default server at port 4242, queues
* one conversion request and waits for its completion.
*/
int MayaConversionClient::
main(int argc, char *argv[], MayaConversionServer::ConversionType conversion_type) {
NetAddress server;
// We assume the server is local and on port 4242
server.set_host("localhost", 4242);
if (!connect(server)) {
nout << "Failed to open port to server process.\n"
<< "Make sure maya2egg -server or egg2maya -server is running on localhost!\n";
return 1;
}
if (!queue(ExecutionEnvironment::get_cwd(), argc, argv, conversion_type)) {
return 1;
}
nout << "Conversion successful!\n";
close();
return 0;
}