Česky
Kamil Dudka

Tiny programs (C, C++, C#, ...)

File detail

Name:Downloadserver.h [Download]
Location: tiny > IPK > trunk
Size:2.3 KB
Last modification:2022-09-09 13:06

Source code

/*
 * file: server.h - Server module
 * project: BSD Sockets (IPK)
 * By Kamil Dudka, xdudka00
 * mailto: xdudka00@gmail.com
 */
 
#ifndef SERVERDB_H
#define SERVERDB_H
 
#include <string>
#include <vector>
#include "netio.h"
 
/*
 * Incoming connection
 */
class AcceptedConn {
public:
	AcceptedConn (TSocket);				// Init netio for incoming request
	~AcceptedConn ();
	AcceptedConn & operator<< (const char *);	// Send plain text to client
	AcceptedConn & operator<< (std::string str) { return operator<< (str.c_str ()); }
	AcceptedConn & operator>> (std::string &);	// Read 1 line from client
 
	class ErrInit { };
	class ErrPut { };
	class ErrGet { };
 
private:
	PNetLine pNL;
};
 
/*
 * One line in db
 */
struct Record {
	std::string name;
	std::string surname;
	std::string login;
	std::string faculty;
 
	Record () { }					// Default (empty) constructor
	Record (std::string &dbLine);			// Read fields from db line
	bool operator<= (const Record &search) const;	// true if search options are valid
 
	class ErrRecData { };
};
 
/*
 * Translate records to output form
 */
class OutputData {
public:
	OutputData (std::string &fields);		// Set visible fields (visible for client)
	void append (Record &);				// Append record to server's answer
	std::string &getText () { return strData; }	// Return all records as plain text
private:
	static const unsigned maxKeys = 4;
	typedef enum {
		FEmpty,
		FName,
		FSurname,
		FLogin,
		FFaculty
	} EFields;
 
	unsigned uKeys;
	EFields eFields [maxKeys];
	std::string strData;
 
	EFields getFieldKey (const char cField) {
		switch (cField) {
			case 'N':	return FName;
			case 'S':	return FSurname;
			case 'L':	return FLogin;
			case 'F': 	return FFaculty;
			default:	return FEmpty;
		}
	}
};
 
/*
 * Parse request from client
 */
class Request {
public:
	Request (AcceptedConn &);				// Connection to read the request
	Record & getSearch() { return search; }			// Return record containing search options
	std::string & getFields() { return fields; }		// Return string determining visible fields
 
	class ErrRqInvalid { };
private:
	Record search;
	std::string fields;
};
 
/*
 * Database
 */
class DbData {
public:
	DbData (const char *);			// Load db from file
	void reply (AcceptedConn &);		// Server's reply
 
	class ErrDbLoad { };
 
private:
	std::vector<Record> data;
	std::string strAnswer;
};
 
#endif