Drobné programy (C, C++, C#, ...)
Detail souboru
Zdrojový kód
/*
* 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