
Ariel Kalingking wrote:
Hi,
I am looking for a similar functionality and would like to ask your opinion, what would it require to make cli usable across a network? For example I would want to embed it and control an existing application using a telnet like service.
Well I guess for that you would need much more than a CLI. But you can use it in conjunction with some RPC implementation like xml-rpc (http://xmlrpcpp.sourceforge.net/), and bind the cli commands to an XmlRpcClient that would call remote procedure on XmlRpcServer. Something like that: // Code on client side: #define PORT 16000 void sendFile(std::vector<std::string> &args) { XmlRpcClient c(argv[0], PORT); XmlRpcValue server_args, result; server_args.setSize(args.size() - 1); for (int i = 1; i < args.size(); ++i) server_args[i] = args[i]; if (c.execute("send_file", server_args, result)) std::cout << "\nMethods:\n " << result << "\n\n"; else std::cout << "Error calling 'listMethods'\n\n"; } int main(int argc, char **argv) { boost::cli::commands_description desc; desc.add_options() ("sendFile", po::value< std::vector<std::string>
()->notifier(&sendFile), "SendFile <server_ip_address> <file1> ... <filen>") ;
boost::cli::command_line_interpreter cli(desc, ">"); cli.interpret(std::cin); } //Code on server side: // No arguments, result is "Hello". class SendFile : public XmlRpcServerMethod { public: SendFile(XmlRpcServer* s) : XmlRpcServerMethod("send_file", s) {} void execute(XmlRpcValue& params, XmlRpcValue& result) { std::cout << "send_file called on server" << std::endl; // Sends the files in params here! } }; int main(int argc, char **argv) { XmlRpcServer s; s.bindAndListen(PORT); SendFile sf_command(&s); s.work(-1.0); return 0; } Don't forget to use the last version of the cli on http://code.google.com/p/clipo/ ! :) JD