#ifndef CPP011
#define CPP011

#include "Server.h"

Server::Server()
{
 cPoint P;
 Set(P,10);
};

int Server::DupClient(char Name[30])
{
 ClientList.tobegin();
 if (!ClientList.Empty())
  {
   char S[30];
   while (!ClientList.TheEnd())
    {
     ((ClientList.GetDate()).GetCl()).GetName(S);
     if (strcmp(Name,S) == 0)
      return 1;
     ClientList.move();
    };
    ((ClientList.GetDate()).GetCl()).GetName(S);
    if (strcmp(Name,S) == 0)
     return 1;
  };
 return 0;
}


void Server::addClient(char Name[30],cColTriangle T)
{
 if (DupClient(Name))
  cout<<"Server : Client "<<Name<<" is already in list."<<endl;
 else
  {
   trclient Cl(Name);
   Cl.SetColor(T.GetColor());
   int i;
   for (i=0;i<3;i++)
    {
     Cl.SetTopXY(i,T.GetX(i),T.GetY(i));
    };
   if (inboard(Cl.GetX(0),Cl.GetY(0))&&
       inboard(Cl.GetX(1),Cl.GetY(1))&&
       inboard(Cl.GetX(2),Cl.GetY(2)))
    {
     Sdate C;
     C.SetCl(Cl);
     C.SetNReq(0);
     ClientList.add(C);
     cout<<"Server : Client "<<Name<<" added."<<endl;
    }
   else
    {
     cout<<"Server : Impossible to add. Not in-board coordinates"; 
    }
  };
};

void Server::add(Sdate C)
{
 ClientList.add(C);
}

void Server::delClient(char Name[30])
{
 if (DupClient(Name))
  {
   ClientList.del();
   cout<<"Server : Client "<<Name<<" deleted."<<endl;
  }
};

void Server::personalmsg(char Name[30],msg M)
{
  if (DupClient(Name))
   {
    Sdate C;
    C = (ClientList.GetCur());
    trclient Cl;
    Cl = C.GetCl();
    Cl.getmsg(M);
    C.SetNReq(C.GetNReq() + 1);
    C.SetCl(Cl);
    cout<<"Server: message to client "<<Name<<" sent"<<endl;

    if (inboard(Cl.GetX(0),Cl.GetY(0))&&
        inboard(Cl.GetX(1),Cl.GetY(1))&&
        inboard(Cl.GetX(2),Cl.GetY(2)))
     {
      add(C);
     }
   }
};

void Server::broadcastmsg(msg M)
{
 Sdate ND;
 trclient Cl;
 linlist<Sdate> NS;
 while (!ClientList.Empty())
  {
   ClientList.tobegin();
   ND = ClientList.GetCur();
   Cl = ND.GetCl();
   Cl.getmsg(M);
   ND.SetNReq(ND.GetNReq() + 1);
   ND.SetCl(Cl);
   NS.add(ND);
  };
 ClientList.Set(NS);
};

void Server::correctlist()
{
 char S[30];
 Sdate ND;
 trclient Cl;
 linlist<Sdate> NS;
 while (!ClientList.Empty())
  {
   ClientList.tobegin();
   ND = ClientList.GetCur();
   Cl = ND.GetCl();
   if ( inboard(Cl.GetX(0),Cl.GetY(0))&&
        inboard(Cl.GetX(1),Cl.GetY(1))&&
        inboard(Cl.GetX(2),Cl.GetY(2)))
    {
     ND.SetCl(Cl);
     NS.add(ND);
    }
  };
 ClientList.Set(NS);
};

void Server::SetBoard(double X0, double Y0, double R0)
 {
  cPoint P0(X0,Y0);
  Set(P0,R0);
  correctlist();
 }


void Server::requestcheck()
{
 char S[30];
 Sdate ND;
 trclient Cl;
 linlist<Sdate> NS;
 while (!ClientList.Empty())
  {
   ClientList.tobegin();
   ND = ClientList.GetCur();
   Cl = ND.GetCl();
   while (Cl.sendrequest())
    {
     Cl.GetName(S);
     cout<<"Client "<<S<<" message delivered"<<endl;
     ND.SetNReq(ND.GetNReq()-1);
    };
   ND.SetCl(Cl);
   NS.add(ND);
  };
 ClientList.Set(NS);
};

void Server::workaccount()
{
 cout<<endl<<"Server working account:"<<endl;
 if (!ClientList.Empty())
  {
   ClientList.tobegin();
   char S[30];
   int UnDel,UnRep;
   while (!ClientList.TheEnd())
    {
     ((ClientList.GetDate()).GetCl()).GetName(S);
     UnRep = ((ClientList.GetDate()).GetCl()).getreq();
     UnDel = (ClientList.GetDate()).GetNReq();
     if (UnRep != 0)
      cout <<"Client "<<S<<" : "<<UnRep<<" messages are without request"<<endl;
     if (UnDel != 0)
      cout <<"Client "<<S<<" : "<<UnDel<<" messages are not yet delivered"<<endl;
     if (UnDel > UnRep)
      cout <<"Client "<<S<<" : "<<(UnDel-UnRep)<<" messages are lost!"<<endl;
     if ((UnDel == 0)&&(UnRep == 0))
      cout <<"Client "<<S<<" : "<<"all is OK"<<endl;
     ClientList.move();
    }
   ((ClientList.GetDate()).GetCl()).GetName(S);
   UnRep = ((ClientList.GetDate()).GetCl()).getreq();
   UnDel = (ClientList.GetDate()).GetNReq();
   if (UnRep != 0)
    cout <<"Client "<<S<<" : "<<UnRep<<" messages are without request"<<endl;
   if (UnDel != 0)
    cout <<"Client "<<S<<" : "<<UnDel<<" messages are not yet delivered"<<endl;
   if (UnDel > UnRep)
    cout <<"Client "<<S<<" : "<<(UnDel-UnRep)<<" messages are lost!"<<endl;
   if ((UnDel == 0)&&(UnRep == 0))
    cout <<"Client "<<S<<" : "<<"all is OK"<<endl;
  };
 getch();
 cout<<endl;
}

void Server::SystemInfo()
{
 cout<<"System information:"<<endl;
 cout<<"Server: (("<<GetX()<<";"<<GetY()<<");"<<GetRad()<<")"<<endl;
 cout<<"Clients:"<<endl;
 if (ClientList.Empty())
  {
   cout<<"No registered clients"<<endl;
  }
 else
  {
   ClientList.tobegin();
   while (!ClientList.TheEnd())
    {
     ClientList.GetDate().GetCl().out();
     ClientList.move();
    };
   ClientList.GetDate().GetCl().out();
  };
 getch();
 cout<<endl;
}


Server::~Server()
{}

#endif

Соседние файлы в папке Курсовая работа Обмен сообщениями по схеме Клиент-Сервер