Program do aukcji

Za zadanie dostaliśmy do napisania program do przeprowadzania anonimowych aukcji w sieci lokalnej.
Podawany był IP serwera, a klienci mogli tam wystawiać aukcje i podbijać ceny.
Nie pamiętam dużo więcej, natomiast wyraźnie pamiętam że długo się zastanawiałem po co komu taki program.
Doszedłem do oczywistego wniosku, iż na przykład handlarze bronią, albo ludzkim towarem też musza jakoś sprzedawać swoje towary, a zgodie z regulaminem Allegro, tam tego zrobić nie mogą.

Oto zatem odpowiedni program do sprzedawania broni na aukcjach:

[adsense]

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include

using namespace std;
class Allegro;
class Klient;
class Pytanie;
class GenerujKomunikat;
Allegro* allegro;

int str2int(string dane)
{
	int wynik=0;
	for(int i=0;i0)
	{
		reszta=liczba%10;
		liczba=(liczba-reszta)/10;
		wynik=(char)(reszta+48)+wynik;
	}

	if(wynik.length()==0)
	{
		wynik="0";
	}

	return wynik;
}

class kieszenie
{
public:

	//Klasa posredniczaca w polaczeniu socket

	int KKlienta;
	int port;
	int KNasluchujaca;
	int iStat;

	kieszenie()
	{
		iStat = 0;
		KKlienta = 0;
		port = 8345;
	}

	~kieszenie()
	{
		close(KKlienta);
	}

	int podlaczony()
	{
		return iStat;
	}

	void sluchaj()
	{
		cout << "Stawiam serwern";

		struct sockaddr_in local;
		local.sin_family=AF_INET;
		local.sin_addr.s_addr=INADDR_ANY;
		local.sin_port=htons((u_short)port);
		KNasluchujaca=socket(AF_INET,SOCK_STREAM,0);

		if(KNasluchujaca<0)
		{
			cout << "nBlad tworzenia gniazda nasluchujacegon";
			return;
		}

		if(bind(KNasluchujaca,(sockaddr*)&local,sizeof(local))!=0)
		{
			cout << "nBlad podczas przypisywania adresu, najprawdopodobniej dany port jest zajety.n";
			return;
		}

		if(listen(KNasluchujaca,10)!=0)
			{
			cout << "nBlad podczas nasluchiwanian";
				return;
			}

		sockaddr_in from;
			socklen_t fromlen=sizeof(from);
	}	

	void akceptuj()
	{
		sockaddr_in from;
		socklen_t fromlen=sizeof(from);
		KKlienta=accept(KNasluchujaca,(struct sockaddr*)&from,&fromlen);
		//cout << "nZaakceptowano polaczenien";
	}

	int wysli(string wiadomosc)
	{
		iStat = send(KKlienta,wiadomosc.c_str(),wiadomosc.size()+1,0);
		//cout<h_addr,
			 (char *)&serv_addr.sin_addr.s_addr,
			 server->h_length);
		serv_addr.sin_port = htons(port);
		iStat=connect(KKlienta,(sockaddr*)&serv_addr,sizeof(serv_addr));

		//cout<<"["< udzialowcy;

	Aukcja(int i,int c,string n,string cz)
	{

		id=i;
		cena=c;
		nazwa=n;
		czas=cz;
		ustaw_czas(cz);
		sekund();
		prowadzi="";
		trwa=1;

	}

	bool udzialowiec(Klient* klient)
	{
		//Czy en ktos bierze udzial w aukcji?
		bool zwroc=false;

		for(int i=0;i0)
		{
			wynik+=int2str(dni)+" dni, ";
		}

		if(godzin>0)
		{
			wynik+=int2str(godzin)+" godzin, ";
		}

		wynik+=int2str(minut)+" minut."; 

		return wynik;
	}

	void ustaw_czas(string ciag_czas)
	{
		time_t rawtime;
		struct tm * timeinfo;

		time ( &rawtime );
		timeinfo = localtime ( &rawtime );
		timeinfo->tm_year = str2int(ciag_czas.substr(0,4)) - 1900;
		timeinfo->tm_mon = str2int(ciag_czas.substr(4,2)) - 1;
		timeinfo->tm_mday = str2int(ciag_czas.substr(6,2));
		timeinfo->tm_hour = str2int(ciag_czas.substr(8,2));
		timeinfo->tm_min = str2int(ciag_czas.substr(10,2));
		timeinfo->tm_sec=0;
		czas_ob=mktime ( timeinfo );
		//cout<id;
		odpowiedziano=0;
		odpowiedz="";
	}

};

class Klient
{

	//Klasa reprezentujaca klienta.
	public:

	kieszenie kieszen;
	string email;
	string moj_email;			//moj wlasny email
	int id;
	bool dziala;				//czy klient nie jest zombie. Ustawiane na false imituje skasowanie klienta
	vector Aukcje;		//Aukje nalezace do klienta
	vector
 Pytania;	//Pytania zadane przez klienta

	Klient()
	{
		dziala=true;
	}

	~Klient()
	{
		for(int i=0;iWyslijANSWER(numer_aukcji,odp,plik);
	odpowiedziano=1;
}

/////////////////////////////////////////////////////////////
//Generatory i interpreatory komunikatow

//Klasa GenerujKomunikat ma metody odpowiadajace roznym komunikatom. Klasa RozpoznajKomunikat po niej dziedziczy.Dzieki temu defuiniujac komunikat w GenerujKomunikat, jest tworzona metoda w RozpoznajKomunikat.

class GenerujKomunikat
{
	public:
	string email;
	string bufor;
	int id_kom;
	Klient* klient;

	GenerujKomunikat() {};

	virtual int inicjuj(string email)
	{
		dodaj(email,32);
		//cout<ile)
		{
			bufor+=co.substr(0,ile);
		}
		else
		{
			bufor+=co;
		}

		bufor+="|";//(char)8;

		for(int i=0;iAukcje.size();
		dodaj(dlugosc,32);

		for(int i=0;i
Aukcje.at(i)->id,klient->Aukcje.at(i)->nazwa,klient->Aukcje.at(i)->cena,klient->Aukcje.at(i)->czas);
		}

		id_kom=2;

	}	

	void apply(int &id)
	{
		id_kom=14;
		dodaj(id,32);
	}

	void confirmation_acceptance(int &id)
	{
		id_kom=4;
		dodaj(id,32);
	}

	void refusal_acceptance(int &id,string &reason)
	{
		id_kom=5;
		dodaj(id,32);
		dodaj(reason,128);
	}

	void question(int &id,string &question)
	{
		id_kom=6;
		dodaj(id,32);
		dodaj(question,128);
	}

	void answer(int &id,string &answer,int &file_length,string &rozszerzenie,string &file)
	{
		id_kom=7;
		dodaj(id,32);
		dodaj(answer,128);
		dodaj(file_length,64);
		dodaj(rozszerzenie,3);
		//dodaj(file,file_length);
	}

	void bid(int &id,int &price)
	{
		id_kom=8;
		dodaj(id,32);
		dodaj(price,32);
	}

	void confirmation_bid(int &id,int &price)
	{
		id_kom=9;
		dodaj(id,32);
		dodaj(price,32);
	}

	void publicise_actual_price(int &id,int &price)
	{
		id_kom=10;
		dodaj(id,32);
		dodaj(price,32);
	}

	void error_bid(int &id,int &price,string &reason)
	{
		id_kom=11;
		dodaj(id,32);
		dodaj(price,32);
		dodaj(reason,128);
	}

	void publicise_my_auctions(int &id)
	{
		id_kom=12;
		dodaj(id,32);
	}

	void publicise_end_of_auction(int &id)
	{
		id_kom=13;
		dodaj(id,32);
	}

	void przetworz(int dane)
	{
	}

};

class RozpoznajKomunikat: public GenerujKomunikat
{
	public:
	int pozycja;
	int rozmiar;
	Klient* klient;

	RozpoznajKomunikat() {};

	int inicjuj(string kom)
	{
		pozycja=0;
		bufor=kom;
		string email="";
		email="";
		id_kom=str2int(2);
		pozycja++;
		rozmiar=str2int(16);
		pozycja++;

		if((rozmiar>0)&&(id_kom>0)&&(id_kom<15)) 		{ 			dodaj(email,32); 			klient->ustaw_email(email);
			return 1;
		}
		else
		{
			return 0;
		}
	}

	RozpoznajKomunikat(Klient* kli,string k)
	{
		klient=kli;
		if(inicjuj(k))
		{
			przetworz();
		}
	}

	int str2int(int dlugosc)
	{
		int wynik=0;

		int koniec=pozycja+dlugosc;

		while(pozycjanowaAukcja(id,cena,nazwa,czas);
		}

	}	

	void przetworz()
	{
		string s1="";
		string s2="";
		string s3="";
		int l1=0;
		int l2=0;
		ofstream myfile;

		//cout<<"["<ustaw_email(email);
				klient->OdebranoGET_LIST();
				//wypisz("GET_LIST",l1,l2,s1,s2);
			break;
			case 2:
				my_auctions(klient);
			break;
			case 14:
				apply(l1);
				klient->OdebranoAPPLY(l1);
				//wypisz("APPLY",l1,l2,s1,s2);
			break;
			case 4:
				confirmation_acceptance(l1);
				klient->OdebranoCONFIRMATION_ACCEPTANCE(l1);
				//wypisz("CONFIRMATION_ACCEPTANCE",l1,l2,s1,s2);
			break;
			case 5:
				refusal_acceptance(l1,s1);
				klient->OdebranoREFUSAL_ACCEPTANCE(l1,s1);
				//wypisz("REFUSAL_ACCEPTANCE",l1,l2,s1,s2);
			break;
			case 6:
				question(l1,s1);
				klient->OdebranoQUESTION(l1,s1);
				//wypisz("QUESTION",l1,l2,s1,s2);
			break;
			case 7:
				{
				answer(l1,s1,l2,s3,s2);
				klient->OdebranoANSWER(l1,s1,l2,s3,s2);
				}
				//wypisz("ANSWER",l1,l2,s1,s2);
			break;
			case 8:
				bid(l1,l2);
				klient->OdebranoBID(l1,l2);
				//wypisz("BID",l1,l2,s1,s1);
			break;
			case 9:
				confirmation_bid(l1,l2);
				klient->OdebranoCONFIRMATION_BID(l1,l2);
				//wypisz("CONFIRMATION_BID",l1,l2,s1,s2);
			break;
			case 10:
				publicise_actual_price(l1,l2);
				klient->OdebranoPUBLICISE_ACTUAL_PRICE(l1,l2);
				//wypisz("PUBLICISE_ACTUAL_PRICE",l1,l2,s1,s2);
			break;
			case 11:
				error_bid(l1,l2,s1);
				klient->OdebranoERROR_BID(l1,l2,s1);
				//cout<OdebranoPUBLICISE_MY_AUCTIONS(l1);
				//wypisz("PUBLICISE_MY_AUCTIONS",l1,l2,s1,s2);
			break;
			case 13:
				publicise_end_of_auction(l1);
				klient->OdebranoPUBLICISE_END_OF_AUCTION(l1);
				//wypisz("PUBLICISE_END_OF_AUCTION",l1,l2,s1,s2);
			break;
			default:
				//cout< klienci;
	Klient* ja;

	Allegro(Klient* i)
	{
		ja=i;
	}

	void usun(Klient * usuwany)
	{
		usuwany->dziala=false;
	}

	~Allegro()
	{
		for(int i=0;idziala))
		{
			wynik=klienci.at(id);
		}
		/*
		else
		{
			for(int i=0;iid=id)&&(klienci.at(id)->dziala))
				{
					wynik=klienci.at(i);
					break;
				}
			}
		}
		*/

		return wynik;

	}

	void dodaj(Klient* klient)
	{
		int id=klienci.size();
		klienci.push_back(klient);
		klient->ustaw(id);
		klient->moj_email=ja->email;
	}

	Klient* ZnajdzKlienta(string email)
	{
		Klient* wynik=NULL;
		for(int i=0;iemail==email)
			{
				wynik=DajKlient(i);
				break;
			}

		}

		return wynik;
	}

	void wypisz_aukcje()
	{
		cout<<"AUKCJAtPROWADZItNAZWAttCENAtZOSTALOn";
		for(int i=0;ipodlaczony())
			{
				DajKlient(i)->wypisz_aukcje(1);
			}
		}
	}

	void wypisz_pytania()
	{
		cout<<"PYTANIEtAUKCJAtPYTANIEn";
		for(int i=0;ipodlaczony())
			{
				DajKlient(i)->wypisz_pytania();
			}
		}
	}

	void Podbij(int klient,int aukcja,int cena)
	{
		if(DajKlient(klient)!=NULL && DajKlient(klient)->podlaczony())
		{
			DajKlient(klient)->WyslijBID(aukcja,cena);
		}
		else
		{
			cout<<"Nie mozesz podbic, klient nie podlaczony! n"; 		} 	} 	 	void Pytanie(int klient,int aukcja,string pytanie) 	{ 		if(DajKlient(klient)!=NULL && DajKlient(klient)->podlaczony())
		{
			DajKlient(klient)->WyslijQUESTION(aukcja,pytanie);
		}
		else
		{
			cout<<"Nie mozesz zadac pytania, klient nie jest podlaczony! n"; 		} 	} 	 	void Zapisz(int klient,int aukcja) 	{ 		if(DajKlient(klient)!=NULL && DajKlient(klient)->podlaczony())
		{
			DajKlient(klient)->WyslijAPPLY(aukcja);
		}
		else
		{
			cout<<"Nie mozesz zapisac sie do aukcji. klient nie jest podlaczony! n";
		}
	}

	void PublikujCene(Aukcja* aukcja)
	{
		//cout<<"Publikacja ceny n";
		for(int i=0;iudzialowcy.size();i++)
		{
			if(aukcja->udzialowcy.at(i)->dziala &&aukcja->udzialowcy.at(i)->podlaczony())
			{
				//cout<udzialowcy.at(i)->WyslijPUBLICISE_ACTUAL_PRICE(aukcja->id,aukcja->cena);
			}
		}
	}

	void KoniecAukcji(Aukcja* aukcja)
	{
		//cout<<"Publikacja konca aukcji n";
		for(int i=0;ipodlaczony())
			{
				//cout<WyslijPUBLICISE_END_OF_AUCTION(aukcja->id);
			}
		}

		if(aukcja->prowadzi.length()>0)
		{
			cout<<"Aukcja ["<id<<"] zakonczona z wynikiem ["<wypisz_cena()<<"] , wygral "<prowadzi<<" n";
		}
		else
		{
			cout<<"Aukcja ["<id<<"] zakonczona. Nie bylo chetnych n";
		}
	}

	void Tick()
	{
		//zdarzenie zegara.
		//przechodzimy przez wszystkie aukcje wlasciciela
		for(int i=0;iAukcje.size();i++)
		{
			if(ja->Aukcje.at(i)->trwa)
			{
				if(ja->Aukcje.at(i)->sekund()<1) 				{ 					//aukcja dobiegla konca 					KoniecAukcji(ja->Aukcje.at(i));
				}
			}
		}
	}

};

//////////////////////////////////////////////////////////////////////
//Metody klienta

	void Klient::start()
	{
		kieszen.akceptuj();
	}

	void Klient::ustaw(int numer)
	{
		id=numer;
	}

	void Klient::ustaw_email(string  e)
	{
		if(email.length()<2) 		{ 			 			Klient* wynik=allegro->ZnajdzKlienta(e);
			//ok. poszukajmy czy nie bylismy polaczeni.

			if(wynik!=NULL)
			{
			//znaleziono
					if(!wynik->podlaczony())
					{
						//rozlaczylismy sie w poprzedniej sesji i zalogowalismy znowu
						wynik->kieszen=this->kieszen;
						allegro->usun(this);
					}
			}

			email=e;
		}
	}

	int Klient::Wyslij(string komunikat)
	{
		kieszen.wysli(komunikat);
		return kieszen.iStat;
	}

	void Klient::dzialaj()
	{
		char ret;
		//Pobiera komunikaty i przetwarza
		while (kieszen.iStat>0) //komunikacja.
		{
			RozpoznajKomunikat* kom2 = new RozpoznajKomunikat(this,kieszen.odbierz(kieszen.KKlienta));
		}

		cout<<"Klient ["<trwa==trwajace)
				{
					cout<id<<"t"<prowadzi<<"tt"<nazwa<<"tt"<cena<<"t"<wypisz_czas()<<"n";
				}
			}
		}
	}

	void Klient::wypisz_pytania()
	{
		if(podlaczony())
		{
			for(int i=0;i
aukcja->trwa && Pytania.at(i)->odpowiedziano==0)
				{
					cout<id<<"t"<
aukcja->id<<" "<
aukcja->nazwa<<"t"<
pytanie<<"n";
				}
			}
		}
	}

	void Klient::WczytajAukcje(string plik)
	{
		//wczytuje aukcje z pliku
		char* pl=(char*)plik.c_str();
		string line;
		ifstream myfile(pl);
		int j=0;
		if (myfile.is_open())
		{
			while (!myfile.eof())
			{

				getline (myfile,line);
				string nazwa="";
				string data="";
				string tmp="";
				int cena=-1;

				for(int i=0;i
7)
				{
				nowaAukcja(j,cena,nazwa,data);
				}
				j++;
			}

			myfile.close();
		}
		else
		{
			cout<<"Blad przy wczytywaniu aukcji z pliku! n";
		}
	}

	Aukcja* Klient::znajdzAukcje(int id)
	{
		//Znajduje aukcje o tym id
		Aukcja* wynik=NULL;

		if((idid==id))
		{
			//Jesli jest na przewidywanej pozycji
			wynik=Aukcje.at(id);
		}
		else
		{
		//cout<<"{"<id<<"]"; 				if(Aukcje.at(i)->id==id)
				{
					wynik=Aukcje.at(i);
					break;
				}
			}
		}

		if(wynik==NULL)
		{
			//cout<<"["<ja->znajdzAukcje(id_aukcji);

		if(aukcja==NULL)
		{
			WyslijREFUSAL_ACCEPTANCE(id_aukcji,"Nie ma takiej aukcji!");
		}
		else
		{

			if(!aukcja->udzialowiec(this))
			{
				aukcja->udzialowcy.push_back(this);
			}

			WyslijCONFIRMATION_ACCEPTANCE(id_aukcji);
		}
	}

	void Klient::OdebranoCONFIRMATION_ACCEPTANCE(int id_aukcji)
	{
		cout<<"Zostales zapisany do aukcji nr "<ja->znajdzAukcje(id_aukcji);

		if(aukcja!=NULL)
		{
			int pytid=Pytania.size();
			Pytanie* pyt=new Pytanie(aukcja,this,pytanie);
			pyt->id=pytid;
			Pytania.push_back(pyt);

			cout<<"klient ["<nazwa<<"}. Pytanie brzmi: n"<
ja->znajdzAukcje(aukc);
		string powod;

		if(aukcja!=NULL)
		{
			//jesli jest aukcja
			if(aukcja->Trwa())
			{
				//jesli aukcja jeszcze trwa
				if(aukcja->udzialowiec(this))
				{
					//jesli mozemy brac udzial
					if(nowaCena>aukcja->cena)
					{
						//jesli zaproponowalismy wyzsza cene
						aukcja->cena=nowaCena;
						aukcja->prowadzi=email;
						WyslijCONFIRMATION_BID(aukc,nowaCena);
						allegro->PublikujCene(aukcja);
						//podbito.
					}
					else
					{
						powod="Za malo zaproponowales. Teraz przedmiot kosztuje ";
						powod+=aukcja->wypisz_cena();
					}
				}
				else
				{
					powod="Nie zapisales sie do tej aukcji!";
				}
			}
			else
			{
				powod="Niestety aukcja byla zakonczona ";
				powod+=aukcja->wypisz_czas();
				powod+=" temu";
			}
		}
		else
		{
			powod="Nie ma takiej aukcji!";
		}

		if(powod.length()>1)
		{
			WyslijERROR_BID(aukc,nowaCena,powod);
			//cout<<"{"<
cenacena=nowaCena;
				aukc->prowadzi="Nie ja";
				cout<<"Nowa cena w aukcji {"<prowadzi<<"n"; 			} 		} 	} 	 	void Klient::OdebranoCONFIRMATION_BID(int auk,int cena) 	{ 		Aukcja* aukcja=znajdzAukcje(auk); 		if(aukcja!=NULL) 		{ 			aukcja->cena=cena;
			aukcja->prowadzi="JA";
			cout<<"Podbito aukcje {"<trwa=0;
			cout<<"Aukcja {"<prowadzi=="JA")
			{
				cout<<"Gratulacje! Wygrales!n Wiszisz ["<wypisz_cena()<<" zlotych. n"; 			} 		} 		 	}	 	 	//wysylanie. 	 	 	int Klient::Podlacz(char* ip) 	{ 		kieszen.podlacz(ip); 		GenerujKomunikat* kom = new GenerujKomunikat(moj_email); 		kom->klient=this;
		Wyslij("");
		kom->get_list();
		Wyslij(kom->zwroc());
		Wyslij("");
		delete(kom);
		return 0;
	}

	void Klient::lista()
	{
		GenerujKomunikat* kom = new GenerujKomunikat(moj_email);
		Wyslij("");
		kom->get_list();
		Wyslij(kom->zwroc());
		Wyslij("");
		delete(kom);
	}

	void Klient::WyslijMY_AUCTIONS()
	{

		GenerujKomunikat* kom=new GenerujKomunikat(moj_email);
		Wyslij("");
		kom->my_auctions(allegro->ja);
		Wyslij(kom->zwroc());
		Wyslij("");
		delete(kom);
	}

	void Klient::WyslijAPPLY(int aukcja)
	{
		int nowaCena=50;
		GenerujKomunikat* kom=new GenerujKomunikat(moj_email);
		kom->apply(aukcja);
		Wyslij(kom->zwroc());
		Wyslij("");
		delete(kom);
	}

	void Klient::WyslijCONFIRMATION_ACCEPTANCE(int aukcja)
	{
		GenerujKomunikat* kom=new GenerujKomunikat(moj_email);
		Wyslij("");
		kom->confirmation_acceptance(aukcja);
		Wyslij(kom->zwroc());
		Wyslij("");
		delete(kom);
	}

	void Klient::WyslijREFUSAL_ACCEPTANCE(int aukcja,string powod)
	{
		GenerujKomunikat* kom=new GenerujKomunikat(moj_email);
		Wyslij("");
		kom->refusal_acceptance(aukcja,powod);
		Wyslij(kom->zwroc());
		Wyslij("");
		delete(kom);
	}

	void Klient::WyslijBID(int aukcja,int nowaCena)
	{
		GenerujKomunikat* kom=new GenerujKomunikat(moj_email);
		kom->bid(aukcja,nowaCena);
		Wyslij(kom->zwroc());
		Wyslij("");
		delete(kom);
	}

	void Klient::WyslijCONFIRMATION_BID(int aukcja,int nowaCena)
	{
		GenerujKomunikat* kom=new GenerujKomunikat(moj_email);
		kom->confirmation_bid(aukcja,nowaCena);
		Wyslij(kom->zwroc());
		Wyslij("");
		delete(kom);
	}

	void Klient::WyslijERROR_BID(int aukcja,int nowaCena,string powod)
	{
		GenerujKomunikat* kom=new GenerujKomunikat(moj_email);
		//cout<<"{"<
error_bid(aukcja,nowaCena,powod);
		Wyslij(kom->zwroc());
		Wyslij("");
		delete(kom);
	}

	void Klient::WyslijPUBLICISE_ACTUAL_PRICE(int aukcja,int nowaCena)
	{
		GenerujKomunikat* kom=new GenerujKomunikat(moj_email);
		kom->publicise_actual_price(aukcja,nowaCena);
		Wyslij(kom->zwroc());
		Wyslij("");
		delete(kom);
	}

	void Klient::WyslijPUBLICISE_END_OF_AUCTION(int aukcja)
	{
		GenerujKomunikat* kom=new GenerujKomunikat(moj_email);
		kom->publicise_end_of_auction(aukcja);
		Wyslij(kom->zwroc());
		Wyslij("");
		delete(kom);
	}

	void Klient::WyslijQUESTION(int aukcja,string pytanie)
	{
		GenerujKomunikat* kom=new GenerujKomunikat(moj_email);
		kom->question(aukcja,pytanie);
		Wyslij(kom->zwroc());
		Wyslij("");
		delete(kom);
	}

	void Klient::WyslijANSWER(int aukcja,string odpowiedz,string plik)
	{
		char* pl=(char*)plik.c_str();

		//rozszerzenie pliku
		char rozszerzenie[3];
		plik.copy(rozszerzenie,3,plik.size()-3);
		rozszerzenie[3]='';
		string roz=(string)rozszerzenie;

		GenerujKomunikat* kom=new GenerujKomunikat(moj_email);

		struct stat results;
		//cout<<"Wysylanie answer:n"; 		if(stat(pl, &results) == 0) 		{ 			int rozmiar=results.st_size; 			string zawartosc=""; 			kom->answer(aukcja,odpowiedz,rozmiar,roz,zawartosc);
			Wyslij(kom->zwroc_raw(kom->bufor.length()+rozmiar));
			//cout<<"Rozmiar pliku: "<kieszen.wysli("");
	klient->dzialaj();
}

void* zegar(void *ptr)
{
	//watek zegara do znajdywania konczacych sie aukcji
	while(1)
	{
		allegro->Tick();
		sleep(10);
	}
}

void* serwer(void *argument)
{
	//watek serwera do przyjmowania polaczen
	Klient* klient;
	kieszenie kieszen;
	pthread_t tr;
	int iret1;

	kieszen.sluchaj();

	while(1)
	{
		klient = new Klient;
		klient->kieszen=kieszen;
		klient->start();
		allegro->dodaj(klient);
		iret1 = pthread_create( &tr, NULL,thr, (void*)klient);
	}
}

void gui()
{
	//Interfejs uzytkownika
	string line="";
	string lista_polecen="Dostepne polecenia:n* exit - wychodzi z programun* aukcje - wypisuje aukcje. W pierwszej kolumnie dane do zidentyfikowania aukcju.n* serwer [nazwa_pliku_z_aukcjami] - wcztuje aukcje z pliku i stawia serwer aukcji.n* podbij [nr_klienta] [nr_aukcji] [cena] -podbija aukcje. nr_klienta i nr_aukcji wypisane w pierwszej kolumnie po wpisaniu 'aukcje'.n* zapisz [nr_klienta] [nr_aukcji] - zapisuje cie, abys mogl wziac udzial w aukcji. n* pytanie [nr_klienta] [nr_aukcji] - zadaje pytanie odnosnie aukcji. n* pytania - wyswietla zadane ci pytania.n* odpowiedz [nr_aukcji] [nr_pytania] - odpowiada na pytanie. Bedziesz mial mozliwosc zalaczenia pliku. n* moje - wyswietla twoje aukcje n* podlacz [adres_komputera] - podlacza cie do serwera aukcji.nPolecenie:n";

	cout<<"Witaj! Oto lista polecen: n"<
ja->ZachowajAukcje(ciag(line,i));
			delete(allegro);
			break;
		}
		else if(polecenie=="aukcje")
		{
			allegro->wypisz_aukcje();
		}
		else if(polecenie=="serwer")
		{
			allegro->ja->WczytajAukcje(ciag(line,i));
			pthread_t tr2;
			pthread_create( &tr2, NULL,serwer,(void*)allegro);
			pthread_create( &tr2, NULL,zegar,(void*)allegro);
			//cout<<"Teraz inni moga brac udzial w twoich aukcjach!"; 		} 		else if(polecenie=="podbij") 		{ 			int wlasciciel=str2int(ciag(line,i)); 			int aukcja=str2int(ciag(line,i)); 			int cena=str2int(ciag(line,i)); 			allegro->Podbij(wlasciciel,aukcja,cena);
			//cout<Zapisz(wlasciciel,aukcja);
			//cout<Pytanie(wlasciciel,aukcja,line);
			//cout<wypisz_pytania();
		}
		else if(polecenie=="odpowiedz")
		{
			int wlasciciel=str2int(ciag(line,i));
			int pytanie=str2int(ciag(line,i));

			Klient* wlas=allegro->DajKlient(wlasciciel);
			if(wlas!=NULL)
			{
				Pytanie* pyt=wlas->Pytania.at(pytanie);
				cout<<"Pytanie dotyczy aukcji ["<
aukcja->nazwa<<"] i brzmi: "<
pytanie<<". Twoja odpowiedz: n";
				string odp;
				getline(std::cin, odp);
				cout<<"Nazwa pliku do dolaczenia: n"; 				string plik; 				getline(std::cin, plik); 				pyt->Odpowiedz(odp,plik);
			}
			else
			{
				cout<<"Nie ma klienta o takim numerze, lub klient rozlaczony!"; 			} 			 		} 		else if(polecenie=="lista") 		{ 			int wlasciciel=str2int(ciag(line,i)); 			 			Klient* wlas=allegro->DajKlient(wlasciciel);
			if(wlas!=NULL)
			{
				wlas->lista();
				cout<<"Poproszono o liste aukcji!";
			}
			else
			{
				cout<<"Nie ma klienta o takim numerze, lub klient rozlaczony!"; 			} 			 		} 		else if(polecenie=="podlacz") 		{ 			string adres=ciag(line,i); 			char* adr=(char*)adres.c_str(); 			Klient* ziom=new Klient(); 			allegro->dodaj(ziom);
			//cout<<"{"<Podlacz(adr);
			pthread_t tr;
			pthread_create( &tr, NULL,thr, (void*)ziom);
		}
		else if(polecenie=="moje")
		{
			cout<<"========================MOJE AUKCJE:=======================n";
			cout<<"Trwajace: n";
			cout<<"AUKCJAtPROWADZItNAZWAtCENAtZOSTALOn"; 			allegro->ja->wypisz_aukcje(1);
			cout<<"Zakonczone: n";
			cout<<"AUKCJAtWYGRALtNAZWAtCENAtSKONCZONEn"; 			allegro->ja->wypisz_aukcje(0);
		}
		else
		{
				cout<<"Nie ma tekiego polecenia! n"<
id=-1;
		allegro=new Allegro(ja);
		ja->ustaw_email(argv[1]);
		ja->moj_email=argv[1];
		gui();
	}

	return 0;
}

Leave a Reply