/*

ARIA header files for use with ARNL 1.7.1

Copyright(C) 2004, 2005 ActivMedia Robotics, LLC. 
Copyright(C) 2006, 2007, 2008, 2009 MobileRobots Inc.
All rights reserved.

This copy of Aria was relicensed for use with Arnl and the Arnl
license by MobileRobots Inc.  If you wish to download a seperate
distribution of Aria licensed under the GPL or a commercial license go to
http://www.mobilerobots.com/SOFTWARE/aria.html or contact MobileRobots
Inc, at robots@mobilerobots.com or MobileRobots Inc,
10 Columbia Drive, Amherst, NH 03031; 800-639-9481

MobileRobots Inc hereby grants to other individuals or
organizations permission to use this software with Arnl and in
compliance with the Arnl license.  This software may not be
distributed to others except by MobileRobots Inc.

MobileRobots Inc does not make any representations about the
suitability of this software for any purpose.  It is provided "as is"
without express or implied warranty.

*/
#ifndef ARCLIENTSIMPLECONNECTOR_H
#define ARCLIENTSIMPLECONNECTOR_H

#include "Aria.h"
#include "ArClientBase.h"

/**
   This will let you connect to different hosts, ports, and with
   different users and passwords more easily.

   Some program command line options affect behavior:
   @verbinclude ArClientSimpleConnector_options
   
   To set the host the client will connect to use '<code>-host</code> <i>hostName</i>'
   in the command line parameters
   (no abbreviation for this since <code>-h</code> is for help and it's only 4
   letters).  To set the port the client will connect to use '<code>-port</code>
   <i>portNumber</i>' or '<code>-p</code> <i>portNumber</i>'.  
   To set the user to connect with
   use '<code>-user</code> <i>userName</i>' or '<code>-u</code> <i>userName</i>'.  
   To set the password to
   connect with use '<code>-password</code> <i>password</i>' or 
   '<code>-pwd</code> <i>password</i>'.  To
   use no password use '<code>-nopassword</code>' or '<code>-np</code>'. 
   Note that for using
   passwords you should NOT use that option on the command line since
   that can show everyone what the password is (especially in Linux),
   it's there only for testing.  If you give it a username without a
   password it'll ask you for a password, if you don't have a password
   just use the -nopassword or let it ask you for a password and hit
   enter.  To set the server key (string we need to connect to the
   server) use '<code>-setServerKey</code> <i>serverKey</i>' or 
   '<code>-ssk</code> <i>serverKey</i>'.
 **/
class ArClientSimpleConnector
{
public:
  /// Constructor that takes argument parser (prefered)
  AREXPORT ArClientSimpleConnector(ArArgumentParser *parser);
  /// Constructor that takes args from main (not prefered)
  AREXPORT ArClientSimpleConnector(int *argc, char **argv);
  /// Constructor that takes argument builder (not prefered)
  AREXPORT ArClientSimpleConnector(ArArgumentBuilder *arguments);
  /// Destructor
  AREXPORT ~ArClientSimpleConnector(void);
  /// Connects the client with the options given
  AREXPORT bool connectClient(ArClientBase *client, bool print = true);
  /// Parses the arguments 
  AREXPORT bool parseArgs(void);
  /// Parses the arguments 
  AREXPORT bool parseArgs(ArArgumentParser *parser);
  /// Logs the options the connector has
  AREXPORT void logOptions(void) const;
protected:
  void reset(void);
  const char *myHost;
  const char *myUser;
  const char *myPassword;
  const char *myServerKey;
  int myPort;
  bool myNoPassword;
  bool myLogDataList;
  // our parser
  ArArgumentParser *myParser;
  bool myOwnParser;
  
  ArRetFunctorC<bool, ArClientSimpleConnector> myParseArgsCB;
  ArConstFunctorC<ArClientSimpleConnector> myLogOptionsCB;
};

#endif // ARCLIENTSIMPLECONNECTOR_H
