diff options
Diffstat (limited to 'qpid/cpp/src/tests/qrsh.cpp')
-rw-r--r-- | qpid/cpp/src/tests/qrsh.cpp | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/qpid/cpp/src/tests/qrsh.cpp b/qpid/cpp/src/tests/qrsh.cpp new file mode 100644 index 0000000000..0cb52b6b05 --- /dev/null +++ b/qpid/cpp/src/tests/qrsh.cpp @@ -0,0 +1,169 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ + +#include <qpid/client/Connection.h> +#include <qpid/client/Session.h> +#include <qpid/client/AsyncSession.h> +#include <qpid/client/Message.h> +#include <qpid/client/MessageListener.h> +#include <qpid/client/SubscriptionManager.h> + +#include <stdio.h> +#include <cstdlib> +#include <iostream> + +#include <sstream> + +using namespace qpid::client; +using namespace qpid::framing; + +using namespace std; + +namespace qpid { +namespace tests { + +class ResponseListener : public MessageListener +{ + public : + + int exitCode; + + ResponseListener ( SubscriptionManager & subscriptions ) + : exitCode(-1), + subscriptions ( subscriptions ) + { + } + + virtual void + received ( Message & message ) + { + char first_word[1000]; + sscanf ( message.getData().c_str(), "%s", first_word ); + + if ( ! strcmp ( first_word, "wait_response" ) ) + { + // If we receive a message here, parse out the exit code. + sscanf ( message.getData().c_str(), "%*s%d", & exitCode ); + subscriptions.cancel(message.getDestination()); + } + else + if ( ! strcmp ( first_word, "get_response" ) ) + { + // The remainder of the message is the file we requested. + fprintf ( stdout, + "%s", + message.getData().c_str() + strlen("get_response" ) + ); + subscriptions.cancel(message.getDestination()); + } + } + + + private : + + SubscriptionManager & subscriptions; +}; + +}} // namespace qpid::tests + +using namespace qpid::tests; + +/* + * argv[1] host + * argv[2] port + * argv[3] server name + * argv[4] command name + * argv[5..N] args to the command + */ +int +main ( int argc, char ** argv ) +{ + const char* host = argv[1]; + int port = atoi(argv[2]); + + + Connection connection; + + try + { + connection.open ( host, port ); + Session session = connection.newSession ( ); + + // Make a queue and bind it to fanout. + string myQueue = session.getId().getName(); + + session.queueDeclare ( arg::queue=myQueue, + arg::exclusive=true, + arg::autoDelete=true + ); + + session.exchangeBind ( arg::exchange="amq.fanout", + arg::queue=myQueue, + arg::bindingKey="my-key" + ); + + // Get ready to listen for the wait-response. + // or maybe a get-response. + // ( Although this may not be one of those types + // of command, get ready anyway. + SubscriptionManager subscriptions ( session ); + ResponseListener responseListener ( subscriptions ); + subscriptions.subscribe ( responseListener, myQueue ); + + bool response_command = false; + if(! strcmp("exec_wait", argv[4] )) + response_command = true; + else + if(! strcmp("exited", argv[4] )) + response_command = true; + else + if(! strcmp("get", argv[4] )) + response_command = true; + + // Send the payload message. + // Skip "qrsh host_name port" + Message message; + stringstream ss; + for ( int i = 3; i < argc; ++ i ) + ss << argv[i] << ' '; + + message.setData ( ss.str() ); + + session.messageTransfer(arg::content=message, + arg::destination="amq.fanout"); + + if ( response_command ) + subscriptions.run(); + + session.close(); + connection.close(); + return responseListener.exitCode; + } + catch ( exception const & e) + { + cerr << e.what() << endl; + } + + return 1; +} + + + |