home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 35 Internet / 35-Internet.zip / wpbif094.zip / tcpsock.hpp < prev    next >
Text File  |  1995-12-29  |  5KB  |  154 lines

  1. /*
  2.    Class TCPSock interface
  3.  
  4.     Copyright VOS 1995
  5.     Author: Vitaly S. Gumirov
  6.  
  7.     email: vos@ifshop.ict.nsk.su
  8.  
  9. */
  10.  
  11. #include <os2.h>
  12. #include <types.h>
  13. #include <netinet\in.h>
  14. #include <sys\socket.h>
  15. #include <netdb.h>
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18. #include <stdarg.h>
  19.  
  20. class IP_AbstractAddr {
  21.    char * addr;
  22. public:
  23.    IP_AbstractAddr(char * a) { addr=a; }
  24.    IP_AbstractAddr(const char * a) { addr=((char*)a);}
  25.    IP_AbstractAddr(unsigned char * a){ addr=((char*)a);}
  26.    IP_AbstractAddr(signed char * a){ addr=((char*)a);}
  27.    IP_AbstractAddr(const unsigned char * a){ addr=((char*)a);}
  28.    IP_AbstractAddr(const signed char * a){ addr=((char*)a);}
  29.    char * _get_addr() {return addr; }
  30. };
  31.  
  32. class IP_Name : public IP_AbstractAddr {
  33. // name address;
  34. public:
  35.    IP_Name(char * a): IP_AbstractAddr(a) {};
  36.    IP_Name(const char * a): IP_AbstractAddr((char*)a) {};
  37.    IP_Name(unsigned char * a): IP_AbstractAddr((char*)a) {};
  38.    IP_Name(signed char * a): IP_AbstractAddr((char*)a) {};
  39.    IP_Name(const unsigned char * a): IP_AbstractAddr((char*)a) {};
  40.    IP_Name(const signed char * a): IP_AbstractAddr((char*)a) {};
  41. };
  42.  
  43.  
  44. class IP_Addr : public IP_AbstractAddr {
  45. // dotted address
  46. public:
  47.    IP_Addr(char * a): IP_AbstractAddr(a) {};
  48.    IP_Addr(const char * a):IP_AbstractAddr((char*)a) {};
  49.    IP_Addr(unsigned char * a): IP_AbstractAddr((char*)a) {};
  50.    IP_Addr(signed char * a): IP_AbstractAddr((char*)a) {};
  51.    IP_Addr(const unsigned char * a): IP_AbstractAddr((char*)a) {};
  52.    IP_Addr(const signed char * a): IP_AbstractAddr((char*)a) {};
  53. };
  54.  
  55. extern const char *empty_string;
  56.  
  57. class TCPSockError {
  58. protected:
  59.    char * default_msg;
  60.    void _set_default_msg(char *msg) { if(msg) default_msg=strdup(msg); else default_msg=0; }
  61. public:
  62.    TCPSockError(char * d_msg=0) { _set_default_msg(d_msg); };
  63.    TCPSockError(TCPSockError & from){ _set_default_msg(from.default_msg); };
  64.    ~TCPSockError() { if(default_msg) delete default_msg; }
  65.  
  66.    virtual int sock_errno() { return ::sock_errno(); }
  67.    void psock_errno(char *msg=0) { if(!msg) msg=default_msg; if(!msg) msg=""; ::psock_errno(msg);}
  68.    virtual const char * sock_errmsg();
  69.    
  70. };
  71.  
  72. class TCPSock {
  73. protected:
  74.    unsigned short port;       /* server port */
  75.    struct sockaddr_in server; /* server address */
  76.    struct hostent *hostnm;    /* server host name information             */
  77.    int s;                     /* client socket                            */
  78.  
  79.    void TCPSock_Init(struct hostent *hostnm_server, unsigned short server_port) throw(TCPSockError) ;
  80. public:
  81.    TCPSock(IP_Name srv, unsigned short server_port) {
  82.       TCPSock_Init(gethostbyname(srv._get_addr()), server_port);
  83.    }
  84.    TCPSock(IP_Addr srv, unsigned short server_port) {
  85.       char * s =srv._get_addr();
  86.       TCPSock_Init(gethostbyaddr(s,strlen(s),AF_INET), server_port);
  87.    }
  88.    TCPSock(char * str_name, unsigned short server_port) {
  89.       TCPSock_Init(gethostbyname(str_name), server_port);
  90.    }
  91.  
  92. /*    ~TCPSock() {if(hostnm) delete hostnm; } */
  93.    int connect() throw(TCPSockError);
  94.    int sockclose() {return ::soclose(s);}
  95.    int soclose() {return ::soclose(s);}
  96.    int sock_errno() { return ::sock_errno(); }
  97.    void psock_errno(char *msg) { ::psock_errno(msg); }
  98.    int send(char * buf, int len=0, int flags=0) throw(TCPSockError); 
  99.    int recv(char *buf, int buf_size, int flags=0) throw(TCPSockError) ;
  100.    int sock_printf(char *format,...);
  101.    BOOL IsInitialized() { 
  102.     return ((hostnm != (struct hostent *)0) && s>=0 ); }
  103.  
  104. };
  105.  
  106. class POP3SockError: public TCPSockError {
  107. public:
  108.    enum POP3SockErrorCode { ERR_NULL=0, MIN_ERRNO=SOCBASEERR+100,
  109.       INVALID_ARGUMENTS=MIN_ERRNO,
  110.       NOT_INITIALIZED,
  111.       ERR_GREETING,
  112.       ERR_USER,
  113.       ERR_PASSWD,
  114.       ERR_STAT,
  115.       MAX_ERRNO };
  116. protected:
  117.    POP3SockErrorCode errcode;
  118. public:
  119.    POP3SockError(POP3SockError & from): TCPSockError(from.default_msg), errcode(from.errcode) {}
  120.    POP3SockError(char * msg, POP3SockErrorCode code=ERR_NULL ): TCPSockError(msg) { errcode=code; }
  121.    virtual int sock_errno() {if(errcode!=ERR_NULL) return errcode; else return TCPSockError::sock_errno(); }
  122.    virtual const char * sock_errmsg(); // overriden
  123. };
  124.  
  125. class POP3Sock: public TCPSock {
  126.    char * user;
  127.    char * passwd;
  128.  
  129. public:
  130.    POP3Sock(IP_Addr addr, char *_user, char * _passwd, unsigned short port=110) throw (POP3SockError):
  131.       TCPSock(addr, port), user(_user), passwd(_passwd) {
  132.       if(!_user || !_passwd) throw POP3SockError("POP3Sock",POP3SockError::INVALID_ARGUMENTS);
  133.    }
  134.    POP3Sock(IP_Name name, char *_user, char * _passwd, unsigned short port=110) throw (POP3SockError):
  135.       TCPSock(name, port), user(_user), passwd(_passwd) {
  136.       if(!_user || !_passwd) throw POP3SockError("POP3Sock",POP3SockError::INVALID_ARGUMENTS);
  137.    }
  138.    void _set_user(char *_user) throw(POP3SockError) {
  139.       if(_user) user=_user;
  140.       else throw POP3SockError("POP3Sock",POP3SockError::INVALID_ARGUMENTS);
  141.    }
  142.    void _set_passwd(char *_passwd) throw(POP3SockError) {
  143.       if(_passwd) passwd=_passwd;
  144.       else throw POP3SockError("POP3Sock",POP3SockError::INVALID_ARGUMENTS);
  145.    }
  146.  
  147.    BOOL logon();
  148.    BOOL quit();
  149.    BOOL reset();
  150.    long number_of_msgs();
  151.    inline BOOL check_ok(char *buf);
  152. };
  153.  
  154.