// Copyright (c) 2002 David Muse
// See the COPYING file for more information.

#ifndef RUDIMENTS_UNIXCLIENTSOCKET_H
#define RUDIMENTS_UNIXCLIENTSOCKET_H

#include <rudiments/private/unixclientsocketincludes.h>

// The unixclientsocket class allows you to write programs that can talk to
// other programs on the same machine over TCP stream sockets.
//
// Inet sockets (see the inetclientsocket class) can be used by clients and
// servers on the same machine as well, but Unix sockets generally perform
// better.
//
// The inetclientsocket class provides methods for connecting to servers.
// Its ultimate parent class: filedescriptor provides methods for reading and 
// writing data and closing connections.

#ifdef RUDIMENTS_NAMESPACE
namespace rudiments {
#endif

class unixclientsocketprivate;

class unixclientsocket : public clientsocket, private unixsocketutil {
        public:

                                unixclientsocket();
                                unixclientsocket(const unixclientsocket &u);
                unixclientsocket        &operator=(const unixclientsocket &u);
                virtual               ~unixclientsocket();

                int   connect(const char *filename,
                                        long timeoutsec,
                                        long timeoutusec,
                                        unsigned long retrywait,
                                        unsigned long retrycount);
                        // Convenience method that calls the initialize() and
                        // connect() methods defined below.
                        //
                        // Returns RESULT_SUCCESS on success and RESULT_ERROR
                        // on failure.



                // These methods are split up in case you need to use them
                // seperately.
                void  initialize(constnamevaluepairs *cd);
                        // Queries namevaluepairs "cd" for "filename",
                        // "timeoutsec", "timeoutusec", "retrywait" and
                        // "retrycount".  Initializes the class to use the
                        // result when connect() is called.
                void  initialize(const char *filename,
                                                long timeoutsec,
                                                long timeoutusec,
                                                unsigned long retrywait,
                                                unsigned long retrycount);
                        // Initializes the class to use "filename",
                        // "timeoutsec", "timeoutusec", "retrywait" and
                        // "retrycount" when connect() is called.

                int   connect();
                        // Attempts to connect to the "filename" set earlier.
                        // If the connection fails, it will retry "retrycount"
                        // times, waiting "retrywait" seconds between tries.
                        //
                        // Setting "retrycount" to 0 will cause it to try to 
                        // connect indefinitely.  Setting "retrywait" to 0
                        // will cause it to try to connect over and over
                        // as fast as possible (not recommended).
                        //
                        // Each attempt to connect will wait "timeoutsec"
                        // seconds and "timeoutusec" microseconds for the
                        // connect to succeed.  Specifying -1 for either
                        // parameter will cause the attempt to wait until the
                        // underlying protocol times out which may be up to 2
                        // minutes.
                        //
                        // Returns RESULT_SUCCESS on success and RESULT_ERROR
                        // on failure.

        #include <rudiments/private/unixclientsocket.h>
};

#ifdef RUDIMENTS_NAMESPACE
}
#endif

#endif