diff options
Diffstat (limited to 'ktalkd/ktalkd/machines/talkconn.h')
-rw-r--r-- | ktalkd/ktalkd/machines/talkconn.h | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/ktalkd/ktalkd/machines/talkconn.h b/ktalkd/ktalkd/machines/talkconn.h new file mode 100644 index 00000000..dd08e10a --- /dev/null +++ b/ktalkd/ktalkd/machines/talkconn.h @@ -0,0 +1,135 @@ +/* + * Copyright (c) 1983 Regents of the University of California, (c) 1998 David Faure + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + * + * (BSD License, from kdelibs/doc/common/bsd-license.html) + */ +#ifndef TALKCONNECTION_H +#define TALKCONNECTION_H + +#include "../includ.h" + +enum ProtocolType {noProtocol, talkProtocol, ntalkProtocol}; + +class TalkConnection +{ + public: + + /** Global initialization. To be called once. */ + static void init(); + + /** Create a talk connection. + * @param r_addr Remote machine IP address + * @param r_name Remote user name + * @param l_name Local user name + * @param _protocol Caller's protocol */ + TalkConnection(struct in_addr r_addr, + char * r_name, + char * l_name, + ProtocolType _protocol); + + /** Destructor. Closes the sockets if opened.*/ + ~TalkConnection(); + + /** Create the sockets */ + void open_sockets(); + /** Close the sockets */ + void close_sockets(); + + /** Methods for talking to remote daemon */ + void ctl_transact(int type, int id_num); + int look_for_invite(int mandatory); + + /** Connect with address given back in response to LOOK_UP. */ + int connect(); + /** Prepare to accept a connection from another talk client */ + void listen(); + /** Accept a connection from another talk client */ + int accept(); + + /** Exchange the first 3 characters, which are edit characters */ + void set_edit_chars(); + + /** Write data into the socket, by 16 char blocks. */ + void write_banner(char * banner); + + // Methods to retrieve some information + /** Returns the erase char used by the caller. */ + char get_char_erase() { return char_erase; } + /** Returns the caller's name. */ + char * get_caller_name() { return new_msg.r_name; } // idem in old_msg + /** Returns socket, for reading or writing */ + int get_sockt() { return sockt; } + /** Returns response answer and id_num. Allows protocol independence. + * Each param can be null (0L). Then it isn't filled.*/ + void getResponseItems(uint8_t * answer, uint32_t * id_num, struct talk_addr * addr); + /** Returns connection socket address. For FWT. */ + const struct talk_addr get_addr() { return new_msg.addr; } // idem in old_msg + + // Methods to cheat with this talk connection + // Used by the forwarding machine + void set_addr(const struct talk_addr * addr); + void set_ctl_addr(const struct talk_addr * ctl_addr); + + /** Prints the system error message in the log and exits the current thread */ + static void p_error(const char * str); + + protected: + + /** Used by open_sockets. */ + int open_socket (struct sockaddr_in *addr, int type); + /** Check remote protocol. Used by ctl_transact. */ + void findProtocol(); + /** Find the correct IP address that the daemon at host + "destination" has to respond to */ + static struct in_addr getReplyAddr (struct in_addr destination); + static struct in_addr defaultReplyAddr; + + static short int talkDaemonPort; // Port number of talk demon (517) + static short int ntalkDaemonPort; // Port number of ntalk demon (518) + + ProtocolType protocol; + + /* inet addresses of the two machines */ + struct in_addr my_machine_addr; + struct in_addr his_machine_addr; + + int ctl_sockt; + int sockt; + + OLD_CTL_MSG old_msg; // holds interesting data + NEW_CTL_MSG new_msg; // holds interesting data + OLD_CTL_RESPONSE old_resp; // only convenience structure for responses + NEW_CTL_RESPONSE new_resp; // only convenience structure for responses + struct talk_addr lookup_addr; // address returned by LOOKUP. Points to xxx_resp.addr + + char char_erase; +}; + +#endif |