/* * * 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 #include #include #include #include #include #include #include #include #include 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; }