#ifndef HEADER_SERVERDCC
#define HEADER_SERVERDCC

#include <errno.h>
#include <strings.h>

//#include <map>

#include "config.h"

#include <string>
#ifdef USING_STD_STRING
using std::string;
#endif

#ifdef DMALLOC
#include <dmalloc.h>
#endif

#include "defines.h"
#include "support.h"
#include "llist.h"
#include "nick.h"
#include "channel.h"
#include "query.h"
#include "illist.h"
#include "hash.h"
#include "network.h"

enum {
  DCC_OVERWRITE = 1<<0
};

class thide {
public:
  int n315;
  int n352;
  int n353;
  int n366;
  thide() {
    n315=0;
    n352=0;
    n353=0;
    n366=0;
  }
};

class tacceptitem {
 private:
  char *nick;
 public:
  int type;
  int port;
  char ip[IPLEN];
  int id;
  int size;
  char file[TEMPLEN];

  int operator>=(tacceptitem &acceptitem) {
    return(id==acceptitem.id);
  }
  int operator==(tacceptitem &acceptitem) {
    return(id==acceptitem.id);
  }

  const char *getnick(void) {
    return nick;
  }

  void setnick(const char *n) {
    free(nick);
    nick = mystrdup(n);
  }

  tacceptitem(tacceptitem &t) {
    nick = mystrdup(t.nick);
    type = t.type;
    port = t.port;
    memcpy(ip, t.ip, IPLEN);
    id = t.id;
    size = t.size;
    memcpy(file, t.file, TEMPLEN);
  }

  tacceptitem() {
    nick = mystrdup("");
  }
  
  ~tacceptitem() {
    free(nick);
  }
};

class tdcc : public handleable {
 private:
    char *nick;
  public:
    int port;
    int connected;
    int connecting;
    int listening;
    char ip[IPLEN];
    class tserver* server;
    char buffer[BUFLEN];
    char pathname[20];
    int errortest;
    char file[TEMPLEN]; 
    char destfile[TEMPLEN];
    int index;
    int entryindex;
    int flags;
    int checkflags;
    int sockfd;
    int filefd;
    int type;
    int lastchunk;
    long size;
    int transmitted;
    int written;
    int acknowledged;
    long long timestarted;
    long dccseconds;
    long dccmilliseconds;
    tdcc(class tserver *serverp, const char *thenick);
    tdcc(class tserver *serverp,
	 const char *thenick,
	 const char *thefile);
    tdcc(class tserver *serverp, const char *thenick, char *theip, int theport);
    tdcc(class tserver *serverp, const char *thenick, char *theip, int theport,
	 char *thefile, int thesize, int dccflags, const char *renamedfile);
    int operator>=(tdcc &dcc) {
      if(strlen(dcc.nick)) return 0; else return 0;
    }
    int operator==(tdcc &dcc) {
      return(!strcasecmp(nick,dcc.nick)||!strcmp(pathname,dcc.pathname));
    }

    const char *getnick(void) {
      return nick;
    }

    void setnick(const char *n) {
      free(nick);
      nick = mystrdup(n);
    }

    void handle(int mask);
    int getflags();
    int getsockfd();
    void sendchunk();
    int handle_incoming();
    void usedata();
    void handle_outgoing();
    void complete_connect(void);
    int senddata(const char *);
    int disconnect(void);
    void do_accept(void);
    void perror(char *message);
    void perror(char *message, int number);
    void filemessage(char *message);
    ~tdcc();
};

class tdccentry {
 public:
  int index;
  tdcc *dcc;
  int operator>=(tdccentry &entryitem) {
    return (index-entryitem.index);
  }
  int operator==(tdccentry &entryitem) {
    return(index==entryitem.index||dcc==entryitem.dcc);
  }
  tdccentry() {
    index=-1;
    dcc=0;
  }
};

class tpair {
 public:
  string name;
  string value;
  int operator>=(const tpair &pair) {
    return 0;
  }
  int operator==(const tpair &pair) {
    return (name==pair.name);
  }
};

class tfullpair {
 public:
  string name;
  string value;
  int operator>=(const tfullpair &fullpair) {
    return 0;
  }
  int operator==(const tfullpair &fullpair) {
    return (name==fullpair.name && value==fullpair.value);
  }
};

class tuserlist {
 public:
  string type;
  string info;
  list<tpair> flags;
  int index;
  int operator>=(const tuserlist &userlist) {
    return (index>=userlist.index);
  }
  int operator==(const tuserlist &userlist) {
    return (type==userlist.type && info==userlist.info);
  }
};

class tuserlistalias {
 public:
  string name;
  list<tfullpair> typeinfos;
  int operator>=(const tuserlistalias &userlistalias) {
    return 0;
  }
  int operator==(const tuserlistalias &userlistalias) {
    return(name==userlistalias.name);
  }
};

class tserver : public handleable {
  private:
    char temp[TEMPLEN];
    char *mynick;
  public:
    hash ial;
    //map<string,string> ial;
    char *name;
    char *desc;
    thide hide;
    int port;
    char ip[IPLEN];
    char localip[IPLEN];
    char buffer[BUFLEN];
    int flags;
    int sockfd;
    int connected;
    int connecting;
    char pathname[20];
    string pass;
    int index;
    list<tchan> chanlist;
    list<tquery> querylist;
    list<tglobalnick> nicklist;
    list<tacceptitem> acceptlist;
    list<tuserlistalias> aliaslist;
    ilist<tuserlist> userlist;
    int userlist_nocase;
    ilist<tdccentry> dcclist;

    int script(char *name, char *format, ...);
    void ial_prefix(char *);
    void ial_add(char *, char *);
    void perror(char *);
    void perror(char *message, int number);
    void createchannel(const char *);
    void createquery(const char *);
    tserver(const char *address, int theport, const char *password);
    void server(const char *address, int theport, const char *password);
    ~tserver();
    void usedata();

    tserver() {}

    // Network Handling
    void handle(int mask);
    void handle_connect(void);
    int getflags();
    int getsockfd();

    // Network Functions
    int senddata(const char *);
    int do_connect(void);
    int disconnect(int);

    // Dynamic nick management
    const char *getmynick(void) {
      return mynick;
    }

    void setmynick(const char *n) {
      free(mynick);
      mynick = mystrdup(n);
    }

};

#endif


syntax highlighted by Code2HTML, v. 0.9.1