Skip to content

Instantly share code, notes, and snippets.

@MisterTimur
Last active February 13, 2017 19:50
Show Gist options
  • Save MisterTimur/20cdf917a917a84520d406bb241b7492 to your computer and use it in GitHub Desktop.
Save MisterTimur/20cdf917a917a84520d406bb241b7492 to your computer and use it in GitHub Desktop.
TrSite.cpp
// Абудлов Тимур 2017 год .
#pragma region ----- Заголовок .
#include "stdafx.h"
#undef UNICODE
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <ctime>
#include <cmath>
#include <fstream>
#define DEFAULT_PORT "8080" // Номер порта
#pragma comment (lib, "Ws2_32.lib")
#pragma endregion
#pragma region ----- Всякие мелочи .
bool EstBuk(char C,char iZna[]){ // Ищит букву в строке
bool Rez=false;
for (int f=0;((iZna[f]!=0)&&(Rez==false));f++)
if (iZna[f]==C) Rez=true;
return Rez;
};
char HEXTOINT(char i){ // Переводит букву в число A-10 F-15
char Rez=0;
if ((i>='0') && (i<='9')) Rez=i-'0' ;else
if ((i>='A') && (i<='F')) Rez=i-'A'+10;else
if ((i>='a') && (i<='f')) Rez=i-'a'+10;
return Rez;
}
#pragma endregion
#pragma region ----- Структура описывающая Строку .
int KolStr=0;// Всего строк в системе создано количество
const int MaxLenStr=1024*64;// Максимальная длина строки
class TStr{ // структура описывающася строку
public:
int Len;// Длина строки в конце строки всегда 0 Byte[Len]=0;
char Byte[MaxLenStr];// Буквы из котрых состоит строка
void AddBuk(char c){ // Добавляет букву в конец строки
if (Len<MaxLenStr) { // Проверка строки на переполнение
Byte[Len]=c; // Дописываю букву
Len=Len+1 ; // Увеличиваю длину строки
Byte[Len]=0; // Дописываю ноль в конце строки
}
}
void AddBukS(char c){ // Добавляет букву в начало строки
if (Len<MaxLenStr) { // Проверка строки на переполнение
for(int f=Len;f>=0;f--) Byte[f+1]=Byte[f];
Byte[0]=c ; // Дописываю букву
Len=Len+1 ; // Увеличиваю длину строки
Byte[Len]=0; // Дописываю ноль в конце строки
}
}
void SetZna(char c[]){ // Создает строку с заданым текстом SetZna("Текст")
Len=0;
while ((Len<MaxLenStr)&&(c[Len]!=0)) AddBuk(c[Len]);
Byte[Len]=0;
};
void SetZna(TStr*iStr){ // Создает строку с заданым текстом SetZna("Текст")
SetZna(iStr->Byte);
};
void DelDo(TStr*iRez,char iZna[]){ // Удаляет бувы из строки до заданых символов
iRez->SetZna("");
int f=0 ;
while ((f<Len) && (EstBuk(Byte[f],iZna)==false))
{iRez->AddBuk(Byte[f]);f++;}
int n=f;// сдвигаю оригинальную строку
while (f<Len) {Byte[f-n]=Byte[f];f++;};
Len=Len-n;
Byte[Len]=0;
}
void DelTo(TStr*iRez,char iZna[]){ // Удаляет буквы из строки до заданых символов включая сам сивол
DelDo(iRez,iZna);
if (Len>0){
for (int f=0;f<Len;f++)
Byte[f]=Byte[f+1];
Len=Len-1;
Byte[Len]=0;}
}
void DelTo(char iZna[]){
TStr*iRez=new TStr;
DelTo(iRez,iZna);
delete iRez;
}
void DelSp() { // Удаляет все пробелы из строки
int f1=0;int f2=0;
while (f1<Len){
if (Byte[f1]==' '){
for (f2=f1;f2<Len;f2++)
Byte[f2]=Byte[f2+1];
Len=Len-1;}
f1=f1+1;}}
void AddStr(TStr*iStr){ // Добавлят строку в конец
for (int f=0;f<iStr->Len;f++) AddBuk(iStr->Byte[f]);
}
void AddLn(){ // Добавляет перевод строки
AddBuk(13);AddBuk(10);
}
void SetNom(int iNom){ // записывает число как строку
int f=0;char S[11];
do {
S[f]=iNom % 10 + '0';f++;iNom /= 10;
} while (iNom!=0);S[f]=0;Len=f;
for (f=1;f<=Len;f++)
Byte[f-1]=S[Len-f];
Byte[Len]=0;
}
void AddNom(int iNom){ // Добавляет число как строку в конец строки
TStr*Str=new TStr();
Str->SetNom(iNom);
AddStr(Str);
delete Str;
}
void AddStrLn(TStr*iStr){ // Добавляет строку и перевод строки в конец строки
AddStr(iStr);
AddLn();
}
void AddStrLn(char iStr[]){
TStr*Str =new TStr;
Str->SetZna(iStr);
AddStrLn(Str);
delete Str;
}
void A(char iStr[]){
AddStrLn(iStr);
}
void AddStr(char iStr[]){ // Добавляет строку в конец строки
TStr*Str = new TStr;
Str->SetZna(iStr);
AddStr(Str);
delete Str;
}
void Gen(int n){ // Гененрирует строку из случайных букв длиной n
Len=n;
srand((unsigned int)time(0));
for (int f=0;f<Len;f++)
Byte[f]='a'+rand()%26;
Byte[Len]=0;
}
void HexToBin(){ // Переводит строку HEX в текст
for (int f=0;f<Len/2;f++){
Byte[f]=HEXTOINT((unsigned char)Byte[f*2]) *16+
HEXTOINT((unsigned char)Byte[f*2+1]);
}
Len=Len/2;
Byte[Len]=0;
}
void AddNol(int iKol){ // добавляет нули AddNol(3) 3 -> 003
int f=0;int Kol=iKol-Len;
for(f=1;f<=Kol;f++) AddBukS('0');
}
TStr() { // Конструктор
Len=0; // Длина строки 0
Byte[Len]=0; // В конце строки 0
KolStr=KolStr+1; // Сщетчик Количество всего созданых строк
}
~TStr() { // Детруктор строки
Len=0;
Byte[Len]=0;
KolStr=KolStr-1; // Уменьшаю Количество всего созданых строк
}
};
#pragma endregion
#pragma region ----- Операции с строками .
void Cop(TStr *iS1,TStr *iS2){ // Копирует значения из строки iS2 в строку iS1
for (int f=0;f<=iS2->Len;f++)iS1->Byte[f]=iS2->Byte[f];
iS1->Len=iS2->Len;
}
void Cop(TStr *iS1,char iS2[]){
TStr*S2=new TStr();
S2->SetZna(iS2);
Cop(iS1,S2);
delete S2;
}
bool Rav(TStr *iS1,TStr *iS2){ // Сравнивает строки
bool Rez=false;
if (iS1->Len==iS2->Len) {
int f=0;Rez=true;
while ((f<iS1->Len)&&(Rez==true))
if (iS1->Byte[f]!=iS2->Byte[f]) Rez=false;else f++; }
return Rez;
}
bool Rav(TStr *iS1,char iS2[]){ // Сравнивает строки
TStr*S2=new TStr;
S2->SetZna(iS2);
bool Rez=Rav(iS1,S2);
delete S2;
return Rez;
}
#pragma endregion
#pragma region ----- Структура описывающая Переменные .
const int MaxKolPer=32;
class TPer{
public:
int Kol;
TStr *PUT;
TStr *RAS;
TStr *SES;
TStr *LOG;
TStr *PAS;
int NSE;// Номер в масиве сесий
int NLO;// Номер пользователя
TStr *Nams[MaxKolPer];
TStr *Znas[MaxKolPer];
void Add(TStr *iNam,TStr *iZna){
if (Kol<MaxKolPer){
Kol=Kol+1;
Nams[Kol] = new TStr;
Znas[Kol] = new TStr;
Cop(Nams[Kol],iNam);
Cop(Znas[Kol],iZna);
}
}
void Add(char c[],TStr *iZna){
TStr *Nam = new TStr;
Nam->SetZna(c);
Add(Nam,iZna);
delete Nam;
}
void Add(char iNam[],char iZna[]){
TStr *Nam = new TStr;
TStr *Zna = new TStr;
Nam->SetZna(iNam);
Zna->SetZna(iZna);
printf("[%s]",iNam);
Add(Nam,Zna);
delete Nam;
delete Zna;
}
int FinNam(TStr *iNam){
int f=1 ; int Rez = 0 ;
while ((f<=Kol)&&(Rez==0))
if (Rav(Nams[f],iNam)) Rez=f ; else f++ ;
return Rez;
}
int FinNam(char iNam[]){
TStr*Nam=new TStr;
Nam->SetZna(iNam);
int Rez = FinNam(Nam);
delete Nam;
return Rez;
}
void SetZna(TStr *iNam,TStr *iZna){
int Rez;
Rez=FinNam(iNam);
if (Rez!=0) Cop(Znas[Rez],iZna);else
if (Kol<MaxKolPer) Add(iNam,iZna);
}
void SetZna(char iNam[],TStr*iZna){
TStr*Nam=new TStr;
Nam->SetZna(iNam);
SetZna(Nam,iZna) ;
delete Nam ;
}
void SetZna(char iNam[],char iZna[]){
TStr*Nam=new TStr;
TStr*Zna=new TStr;
Nam->SetZna(iNam);
Zna->SetZna(iZna);
SetZna(Nam,Zna) ;
delete Nam ;
delete Zna ;
}
void GetZna(TStr*iRez,TStr *iNam){
int N=FinNam(iNam);
if (N!=0) Cop(iRez,Znas[N]);
}
void GetZna(TStr*iRez,char iNam[]){
TStr *Nam= new TStr;
Nam->SetZna(iNam);
int N=FinNam(Nam);
if (N!=0) Cop(iRez,Znas[N]);
delete Nam;
}
void HexToStr(){
for (int f=1;f<Kol;f++) Znas[f]->HexToBin();
}
void LNN(TStr *iStr) { // Разбивает строку на строки
TStr *S=new TStr;// ПРомежуточная строка
int f=0;// Счетчик букв
while (f<iStr->Len) {
if (iStr->Byte[f]==13 ) {Add("",S);S->SetZna("");} else
if (iStr->Byte[f]>=' ') S->AddBuk(iStr->Byte[f]);
f++;}
delete S;
}
void PST(TStr *iStr){ // Парсинг строки
int f=0 ; // Читает строку типа ИМЯ=ЗНАЧЕНИЕ&X=12;Z=14
TStr*Nam = new TStr;
TStr*Zna = new TStr;
while (f<iStr->Len){
iStr->DelTo(Nam,"=" );Nam->DelSp();
iStr->DelTo(Zna,"&; ");Zna->DelSp();
if (Nam->Len!=0) SetZna(Nam,Zna);
}
delete Nam;
delete Zna;
}
void PZA(TStr *iStr) { // Парсер запроса от браузера
//======================================================
TPer*LNN=new TPer() ;// Строки с запросом
TStr*SSS=new TStr() ;// ПРомежуточная переменная
LNN->LNN(iStr) ;// Разбиваю запрос на строки
//======================================================
Cop(SSS,LNN->Znas[1]); // Достаю первую строку запроса
SSS->DelTo(PUT,"/?") ; // Удаляю надпись GET
SSS->DelTo(PUT,"? ") ; // ЧИтаю путь файла
PUT->DelSp() ; // удаляю пробелы
if (PUT->Len==0) PUT->SetZna("index.html");
RAS->SetZna(PUT) ; // Читаю расширение файла
RAS->DelTo(".") ; // Читаю расширение файла
PST(SSS) ; // Парсирую GET Запрос
//======================================================
// Читаем зачения Имя : Значение
TStr*NAM = new TStr ; // Наименование переменой
TStr*ZNA = new TStr ; // Значение переменой
int n=2 ; // Номер строки
while ((n<MaxKolPer)&&(LNN->Znas[n]->Len!=0)){
Cop(ZNA,LNN->Znas[n]);
ZNA->DelTo(NAM,":");NAM->DelSp();
ZNA->DelSp();
Add(NAM,ZNA);
n++;}
delete NAM ; // Удаляю времные переменные
delete ZNA ; // Удаляю времные переменные
//======================================================
// Парсирую коки
GetZna(SSS,"Cookie") ;
PST(SSS);
//======================================================
// Парсирую DataSend
GetZna(SSS,"DataSend");
if (SSS->Len>0) {
SSS->HexToBin();
PST(SSS);
}
//======================================================
// Читаю сесмюю если нету назначаю
GetZna(SES,"SES");
if (SES->Len==0) SES->Gen(16);
SetZna("SES",SES);
//======================================================
// удаляю временые переменные
delete SSS;
delete LNN;
}
TPer(){
Kol=0;
Nams[0] =new TStr();
Znas[0] =new TStr();
PUT=new TStr(); // Путь к Файлу
RAS=new TStr(); // Расширение файла
SES=new TStr(); // Номер сессии
LOG=new TStr(); // Номер сессии
PAS=new TStr(); // Номер сессии
}
~TPer(){
delete PUT ;
delete RAS ;
delete SES ;
delete LOG ;
delete PAS ;
delete Nams[0];
delete Znas[0];
for (int f=1;f<=Kol;f++){
delete Nams[f];
delete Znas[f];
}
}
};
#pragma endregion
#pragma region ----- Структура описывающая качпу .
struct TCOL {
public:
unsigned char R, G, B, A;// Цвета и альфа канал
int Y;// Яркость
void SetCol(unsigned char iR,unsigned char iG,unsigned char iB,unsigned char iA,int iY){
R=iR;
G=iG;
B=iB;
A=iA;
Y=iY;
}; // Метод для установки уветов
}; // Описание цвета
struct TCOO{
int x=0;
int y=0;
void SetCoo(int iX,int iY){
x=iX;
y=iY;
}; // Метод для установки уветов
};
struct TLI{
TCOL C;
TCOO A;
TCOO B;
};
const int MaxKolin=16;
struct TTrSim{
int Kol=0;
TLI LIN[MaxKolin];
void AddLin(int x1,int y1,int x2,int y2){
LIN[Kol].A.x=x1;
LIN[Kol].A.y=y1;
LIN[Kol].B.x=x2;
LIN[Kol].B.y=y2;
Kol=Kol+1;
}
void SetCoo(int iX,int iY){
for (int f=0;f<Kol;f++){
LIN[f].A.x=LIN[f].A.x+iX;
LIN[f].A.y=LIN[f].A.y+iY;
LIN[f].B.x=LIN[f].B.x+iX;
LIN[f].B.y=LIN[f].B.y+iY;
}
}
void SetCoo(TCOO iCoo){
SetCoo(iCoo.x,iCoo.y);
}
void SetSiz(float iSiz){
for (int f=0;f<Kol;f++){
LIN[f].A.x=(int)((float)LIN[f].A.x*iSiz);
LIN[f].A.y=(int)((float)LIN[f].A.y*iSiz);
LIN[f].B.x=(int)((float)LIN[f].B.x*iSiz);
LIN[f].B.y=(int)((float)LIN[f].B.y*iSiz);
}
}
void SetSiz(TCOO iCoo){
SetSiz(1);
}
};
struct TTrSims{
TTrSim TrSims[255];
TTrSims(){
TrSims['A'].AddLin(0 ,0 ,50 ,100);
TrSims['A'].AddLin(50 ,100,100,0 );
TrSims['A'].AddLin(25 ,50 ,75 ,50 );
TrSims['B'].AddLin(0 ,0 ,0 ,100);
TrSims['B'].AddLin(0 ,100,50 ,100);
TrSims['B'].AddLin(50 ,100,100,90 );
TrSims['B'].AddLin(100,90 ,100,80 );
TrSims['B'].AddLin(100,80 ,25 ,70 );
TrSims['B'].AddLin(50 ,70 ,0 ,70 );
TrSims['B'].AddLin(50 ,70 ,100,60 );
TrSims['B'].AddLin(100,60 ,100,10 );
TrSims['B'].AddLin(100,10 ,50 ,0 );
TrSims['B'].AddLin(50 ,0 ,0 ,0 );
TrSims['C'].AddLin(0 ,0 ,0 ,100);
TrSims['C'].AddLin(0 ,100,100 ,100);
TrSims['C'].AddLin(0 ,0 ,100 ,0);
TrSims['D'].AddLin(0 ,0 ,0 ,100);
TrSims['D'].AddLin(0 ,100,50 ,100);
TrSims['D'].AddLin(50 ,100,100 ,75 );
TrSims['D'].AddLin(100,75 ,100 ,25 );
TrSims['D'].AddLin(100,25 ,50 ,0 );
TrSims['D'].AddLin(50 ,0 ,0 ,0 );
TrSims['E'].AddLin(0 ,0 ,0 ,100);
TrSims['E'].AddLin(0 ,0 ,100 ,0 );
TrSims['E'].AddLin(0 ,50 ,100 ,50 );
TrSims['E'].AddLin(0 ,100,100 ,100);
TrSims['F'].AddLin(0 ,0 ,0 ,100);
TrSims['F'].AddLin(0 ,50 ,75 ,50 );
TrSims['F'].AddLin(0 ,100,100 ,100);
TrSims['G'].AddLin(0 ,25 ,0 ,75 );
TrSims['G'].AddLin(0 ,75 ,25 ,100);
TrSims['G'].AddLin(25 ,100,75 ,100);
TrSims['G'].AddLin(75 ,100,100 ,75 );
TrSims['G'].AddLin(0 ,25 ,25 ,0 );//--
TrSims['G'].AddLin(25 ,0 ,75 ,0 );
TrSims['G'].AddLin(75 ,0 ,100 ,25 );
TrSims['G'].AddLin(100,25 ,50 ,25 );
TrSims['H'].AddLin(0 ,0 ,0 ,100);
TrSims['H'].AddLin(0 ,50 ,100 ,50 );
TrSims['H'].AddLin(100,0 ,100 ,100);
TrSims['I'].AddLin(25 ,100,75 ,100);
TrSims['I'].AddLin(25 ,0 ,75 ,0 );
TrSims['I'].AddLin(50 ,0 ,50 ,100);
TrSims['J'].AddLin(0 ,25 ,25 ,0 );
TrSims['J'].AddLin(25 ,0 ,50 ,0 );
TrSims['J'].AddLin(50 ,0 ,75 ,25 );
TrSims['J'].AddLin(75 ,25 ,75 ,100);
TrSims['J'].AddLin(75 ,100,25 ,100);
TrSims['K'].AddLin(0 ,0 ,0 ,100);
TrSims['K'].AddLin(0 ,50 ,100 ,100);
TrSims['K'].AddLin(0 ,50 ,100 ,0 );
TrSims['L'].AddLin(0 ,0 ,0 ,100);
TrSims['L'].AddLin(0 ,0 ,100 ,0 );
TrSims['M'].AddLin(0 ,0 ,0 ,100);
TrSims['M'].AddLin(100,0 ,100 ,100);
TrSims['M'].AddLin(0 ,100,50 ,50 );
TrSims['M'].AddLin(50 ,50 ,100 ,100);
TrSims['N'].AddLin(0 ,0 ,0 ,100);
TrSims['N'].AddLin(100,0 ,100 ,100);
TrSims['N'].AddLin(0 ,100,100 , 0);
TrSims['O'].AddLin(0 ,25 ,0 ,75 );
TrSims['O'].AddLin(0 ,75 ,25 ,100 );
TrSims['O'].AddLin(25 ,100,75 ,100 );
TrSims['O'].AddLin(75 ,100,100,75 );
TrSims['O'].AddLin(100,75 ,100,25 );
TrSims['O'].AddLin(100,25 ,75 ,0 );
TrSims['O'].AddLin(75 ,0 ,25 ,0 );
TrSims['O'].AddLin(25 ,0 ,0 ,25 );
TrSims['P'].AddLin(0 ,0 ,0 ,100);
TrSims['P'].AddLin(0 ,50 ,75 ,50 );
TrSims['P'].AddLin(75 ,50 ,100 ,60 );
TrSims['P'].AddLin(100,60 ,100 ,80 );
TrSims['P'].AddLin(100,80 ,75 ,100);
TrSims['P'].AddLin(75 ,100,0 ,100);
TrSims['Q'].AddLin(0 ,25 ,0 ,75 );
TrSims['Q'].AddLin(0 ,75 ,25 ,100 );
TrSims['Q'].AddLin(25 ,100,75 ,100 );
TrSims['Q'].AddLin(75 ,100,100,75 );
TrSims['Q'].AddLin(100,75 ,100,25 );
TrSims['Q'].AddLin(100,25 ,75 ,0 );
TrSims['Q'].AddLin(75 ,0 ,25 ,0 );
TrSims['Q'].AddLin(25 ,0 ,0 ,25 );
TrSims['Q'].AddLin(100,0 ,50 ,50 );
TrSims['R'].AddLin(0 ,0 ,0 ,100);
TrSims['R'].AddLin(0 ,50 ,75 ,50 );
TrSims['R'].AddLin(75 ,50 ,100 ,60 );
TrSims['R'].AddLin(100,60 ,100 ,80 );
TrSims['R'].AddLin(100,80 ,75 ,100);
TrSims['R'].AddLin(75 ,100,0 ,100);
TrSims['R'].AddLin(75 ,50 ,100 , 0);
TrSims['S'].AddLin(100,75 ,75 ,100 );
TrSims['S'].AddLin(75 ,100,25 ,100 );
TrSims['S'].AddLin(25 ,100,0 ,50 );
TrSims['S'].AddLin(0 ,50 ,75 ,50 );
TrSims['S'].AddLin(75 ,50 ,100,25 );
TrSims['S'].AddLin(100,25 ,75 ,0 );
TrSims['S'].AddLin(75 ,0 ,25 ,0 );
TrSims['S'].AddLin(25 ,0 ,0 ,25 );
TrSims['T'].AddLin(10 ,100,90 ,100 );
TrSims['T'].AddLin(50 ,100,50 ,0 );
TrSims['U'].AddLin(0 ,100,0 ,25 );
TrSims['U'].AddLin(0 ,25 ,25 ,0 );
TrSims['U'].AddLin(25 ,0 ,75 ,0 );
TrSims['U'].AddLin(75 ,0 ,100,25 );
TrSims['U'].AddLin(100,25 ,100,100 );
TrSims['V'].AddLin(0 ,100,50 ,0 );
TrSims['V'].AddLin(50 ,0 ,100,100 );
TrSims['W'].AddLin(0 ,100,25 ,0 );
TrSims['W'].AddLin(25 ,0 ,50 ,50 );
TrSims['W'].AddLin(50 ,50 ,75 ,0 );
TrSims['W'].AddLin(75 ,0 ,100,100 );
TrSims['X'].AddLin(0 ,0 ,100,100 );
TrSims['X'].AddLin(0 ,100,100,0 );
TrSims['Y'].AddLin(50 ,0 ,50 ,50 );
TrSims['Y'].AddLin(50 ,50 ,0 ,100 );
TrSims['Y'].AddLin(50 ,50 ,100,100 );
TrSims['Z'].AddLin(0 ,100,100 ,100 );
TrSims['Z'].AddLin(0 ,0 ,100 ,100 );
TrSims['Z'].AddLin(0 ,0 ,100 ,0 );
}
};
TTrSims TrSims;
const int MAxHirTex=200;
const int MAxVisTex=200;
class TTe { // Структура описывающая картинку
public:
char NAM[1000]; // Имя картинки
unsigned int TEX; // Идентификатор структуры
int Hir; // Ширина
int Vis; // Высота
char DAT[(MAxHirTex*MAxVisTex * 4)+255]; // Массив с пикселями
void Cle() {
for (int f = 1; f<MAxHirTex*MAxVisTex * 4; f++)
DAT[f] = 200;
}; // Очистка массива
void WPi(int iX, int iY, TCOL iCol) {
DAT[(((iY - 1)*Hir + iX) - 1) * 4 + 0] = iCol.R;
DAT[(((iY - 1)*Hir + iX) - 1) * 4 + 1] = iCol.G;
DAT[(((iY - 1)*Hir + iX) - 1) * 4 + 2] = iCol.B;
DAT[(((iY - 1)*Hir + iX) - 1) * 4 + 3] = iCol.A;
};// Записать пиксель
TCOL RPi(int iX, int iY) {
TCOL Rez;
Rez.R = DAT[(((iY - 1)*Hir + iX) - 1) * 4 + 0];
Rez.G = DAT[(((iY - 1)*Hir + iX) - 1) * 4 + 1];
Rez.B = DAT[(((iY - 1)*Hir + iX) - 1) * 4 + 2];
Rez.A = DAT[(((iY - 1)*Hir + iX) - 1) * 4 + 3];
return Rez;
};// Прочитать пиксель
void LoadFromFile(char iNam[]) {
// Написано по матерьялам http://www.gamedev.ru/code/articles/TGA
// и http://cppstudio.com/post/446/
// http://www.cplusplus.com/reference/istream/istream/read/
char * buf = new char [MAxHirTex*MAxVisTex * 4];
int SiHe;// Длина текстовой информации в конце заголовка файла
char KOlBI;// Количество бит на цвет ;
int NBM = 0;// номер байта читаемого после заголовка он же номер куда нужно записывать в масиве
int NBF = 1;// Номер читаемого байта из файла
int len = 0;
std::ifstream fin(iNam,std::ios_base::binary); // открыли бинарный файл для чтения
if (fin.is_open()==true) // если файл открыт
{
fin.read(buf,(MAxHirTex*MAxVisTex * 4)); // читаю файл в буфер
fin.close(); // закрываем файл
len = (MAxHirTex*MAxVisTex * 4);// тут нужно будет дописать количество реально прочитаных байт
if (len > 18) { // Если файл удалося прочитать
SiHe = (BYTE)buf[0];// Длина текстовой информации после первого 18-ти байтового блока. Может быть использована для описания файла
Hir = ((unsigned char) buf[12] + ((unsigned char)buf[13] * 256));// Читаем ширину изображения
Vis = ((unsigned char) buf[14] + ((unsigned char)buf[15] * 256));// Читаем Высоту изображения
KOlBI = buf[16];// Читаем количество бит на пиксель 24 или 32
NBF = 17 + SiHe;// читаем после заголовка
NBM = 0;// записываем пиксели с нулегого байта в масив
if (KOlBI == 32)
while ((NBF + 3) <= len) { // читаем пкоа не кончился (файл буфер)
DAT[NBM + 0] = buf[NBF + 3];// Переворачиваем последовательность ABGR в RGBA
DAT[NBM + 1] = buf[NBF + 2];
DAT[NBM + 2] = buf[NBF + 1];
DAT[NBM + 3] = buf[NBF + 0];
NBF = NBF + 4;// Номер читаемого байа
NBM = NBM + 4;// Номер записываемого байта
};
}
}
}
void Rehetka(){
TCOL col1 ; // Используеться для рисования картинки по умолчаню
col1.R = 0;// указываю фоновый цвет
col1.G = 0;
col1.B = 0;
col1.A = 255;// НЕ прозрачный
col1.Y = 0;
TCOL col2 ; // Используеться для рисования картинки по умолчаню
col2.R = 200;// указываю фоновый цвет
col2.G = 200;
col2.B = 200;
col2.A = 255;// НЕ прозрачный
col2.Y = 0 ;
for (int x = 1; x <= Hir; x++) // В цикле рисуем сетку квадратиками
for (int y = 1; y <= Vis; y++)
if(((x == 1) || (x == Hir))
|| ((y == 1) || (y == Vis))
|| (((double)x / 5) == round(x / 5))
|| (((double)y / 5) == round(y / 5)))
{WPi(x, y, col1);} else {WPi(x, y, col2);}
}
void Line(int x1, int y1, int x2, int y2,TCOL iCol){
int RasX = x2 - x1 ;
int RasY = y2 - y1 ;
int MRas=abs(RasY); if (abs(RasX)>abs(RasY)) MRas=abs(RasX);
float HagX=(float)RasX/(float)MRas;
float HagY=(float)RasY/(float)MRas;
float x=(float)x1;
float y=(float)y1;
for (int f=0;f<=MRas;f++){
WPi((int)x,(int)y,iCol);
x=x+HagX;
y=y+HagY;
}
}
void Line(TLI iLin,TCOL iCol){
Line(iLin.A.x,iLin.A.y,iLin.B.x,iLin.B.y,iCol);
}
void Bukv(TTrSim iBuk,TCOO iCoo,float iSiz,TCOL iCol){
iBuk.SetSiz(iSiz);
iBuk.SetCoo(iCoo);
for (int l=0;l<iBuk.Kol;l++) Line(iBuk.LIN[l],iCol);
}
TTrSim Bukv(char iBuk,TCOO iCoo,float iSiz,TCOL iCol){
TTrSim Buk=TrSims.TrSims[iBuk];
Bukv(Buk,iCoo,iSiz,iCol);
return Buk;
}
void Text(TStr*iStr ,TCOO iCoo,float iSiz,TCOL iCol){
for (int f=0;f<iStr->Len;f++){
Bukv(iStr->Byte[f],iCoo,iSiz,iCol);
iCoo.x=iCoo.x+(int)(120*iSiz);
}
}
void Text(char iStr[],TCOO iCoo,float iSiz,TCOL iCol){
TStr*Str = new TStr;
Str->SetZna(iStr);
Text(Str,iCoo,iSiz,iCol);
delete Str;
}
TStr*TgaAsStr(){
TStr*Rez = new TStr();
Rez->Byte[0 ]=0;//Длина текстовой информации после первого 18-ти байтового блока. Может быть использована для описания файла
Rez->Byte[1 ]=0;//Идентификатор наличия цветовой карты, здесь не описан - устарел
Rez->Byte[2 ]=0;//Тип данных - запакованный или нет
Rez->Byte[3 ]=0;//Информация о цветовой карте - нужно пропустить эти 5 байт
Rez->Byte[4 ]=0;//Информация о цветовой карте - нужно пропустить эти 5 байт
Rez->Byte[5 ]=0;//Информация о цветовой карте - нужно пропустить эти 5 байт
Rez->Byte[6 ]=0;//Информация о цветовой карте - нужно пропустить эти 5 байт
Rez->Byte[7 ]=0;//Информация о цветовой карте - нужно пропустить эти 5 байт
Rez->Byte[8 ]=0;// int Начало изображения по оси X
Rez->Byte[9 ]=0;// int Начало изображения по оси X
Rez->Byte[10]=0;// int Начало изображения по оси Y
Rez->Byte[11]=0;// int Начало изображения по оси Y
Rez->Byte[12]=0;// int Ширина изображения
Rez->Byte[13]=0;// int Ширина изображения
Rez->Byte[14]=0;// int высота изображения
Rez->Byte[15]=0;// int высота изображения
Rez->Byte[16]=24;//Кол-во бит на пиксель - здесь только 24 или 32
Rez->Byte[17]=0 ;//Описание - пропускайте если длина описания 0 то сздесь начинаються данные
Rez->Byte[18]=0 ;//если длина описания 0 то сздесь начинаються данные
TCOL COO;Rez->Len=18;
for (int x = 1; x <= Hir; x++) // В цикле рисуем сетку квадратиками
for (int y = 1; y <= Vis; y++) {
COO=RPi(x,y);
Rez->Byte[Rez->Len+0]=COO.R;
Rez->Byte[Rez->Len+1]=COO.G;
Rez->Byte[Rez->Len+2]=COO.B;
Rez->Len=Rez->Len+3;
}
return Rez;
}
TStr*BmpAsStr() // В каждом элементе упаковано все три RGB-байта
{ // Написано по матерьялам
// http://math.ivanovo.ac.ru/dalgebra/Khashin/gr/bmp/bmp.html
// http://gamesmaker.ru/programming/graphics/format-dannyh-bmp-bitmap/
// http://c-site.h1.ru/infa/bmp_struct.htm
TStr*Rez = new TStr();
//--------------------------------------------------------------------------------------------------
Rez->Byte[0 ]=0x42;// WORD bfType; // 0x4d42 | 0x4349 | 0x5450
Rez->Byte[1 ]=0x4d;// WORD bfType; // 0x4d42 | 0x4349 | 0x5450
Rez->Byte[2 ]=0 ;// int bfSize; // размер файла 14+40+100*100*4
Rez->Byte[3 ]=0 ;// int bfSize; // размер файла
Rez->Byte[4 ]=0 ;// int bfSize; // размер файла
Rez->Byte[5 ]=0 ;// int bfSize; // размер файла
Rez->Byte[2]=54+(Vis*Hir);
Rez->Byte[6 ]=0 ;// int bfReserved; // зарезервировано
Rez->Byte[7 ]=0 ;// int bfReserved; // зарезервировано
Rez->Byte[8 ]=0 ;// int bfReserved; // зарезервировано
Rez->Byte[9 ]=0 ;// int bfReserved; // зарезервировано
Rez->Byte[10]=54 ;// int bfOffBits; // смещение до поля данных, 14+40
Rez->Byte[11]=0 ;// int bfOffBits; // смещение до поля данных,
Rez->Byte[12]=0 ;// int bfOffBits; // смещение до поля данных,
Rez->Byte[13]=0 ;// int bfOffBits; // смещение до поля данных,
//--------------------------------------------------------------------------------------------------
Rez->Byte[14]=40 ;// int biSize; // размер струкуры в байтах: 40(BITMAPINFOHEADER) или 108(BITMAPV4HEADER) или 124(BITMAPV5HEADER)
Rez->Byte[15]=0 ;// int biSize; // размер струкуры в байтах: 40(BITMAPINFOHEADER) или 108(BITMAPV4HEADER) или 124(BITMAPV5HEADER)
Rez->Byte[16]=0 ;// int biSize; // размер струкуры в байтах: 40(BITMAPINFOHEADER) или 108(BITMAPV4HEADER) или 124(BITMAPV5HEADER)
Rez->Byte[17]=0 ;// int biSize; // размер струкуры в байтах: 40(BITMAPINFOHEADER) или 108(BITMAPV4HEADER) или 124(BITMAPV5HEADER)
Rez->Byte[18]=Hir ;// int biWidth; // ширина в точках
Rez->Byte[19]=0 ;// int biWidth; // ширина в точках
Rez->Byte[20]=0 ;// int biWidth; // ширина в точках
Rez->Byte[21]=0 ;// int biWidth; // ширина в точках
Rez->Byte[22]=Vis ;// int biHeight; // высота в точках
Rez->Byte[23]=0 ;// int biHeight; // высота в точках
Rez->Byte[24]=0 ;// int biHeight; // высота в точках
Rez->Byte[25]=0 ;// int biHeight; // высота в точках
Rez->Byte[26]=1 ;// WORD biPlanes; // всегда должно быть 1
Rez->Byte[27]=0 ;// WORD biPlanes; // всегда должно быть 1
Rez->Byte[28]=32 ;// WORD biBitCount; // 0 | 1 | 4 | 8 | 16 | 24 | 32
Rez->Byte[29]=0 ;// WORD biBitCount; // 0 | 1 | 4 | 8 | 16 | 24 | 32
Rez->Byte[30]=0 ;// int biCompression; // BI_RGB | BI_RLE8 | BI_RLE4 |// BI_BITFIELDS | BI_JPEG | BI_PNG// реально используется лишь BI_RGB
Rez->Byte[31]=0 ;// int biCompression; // BI_RGB | BI_RLE8 | BI_RLE4 |// BI_BITFIELDS | BI_JPEG | BI_PNG// реально используется лишь BI_RGB
Rez->Byte[32]=0 ;// int biCompression; // BI_RGB | BI_RLE8 | BI_RLE4 |// BI_BITFIELDS | BI_JPEG | BI_PNG// реально используется лишь BI_RGB
Rez->Byte[33]=0 ;// int biCompression; // BI_RGB | BI_RLE8 | BI_RLE4 |// BI_BITFIELDS | BI_JPEG | BI_PNG// реально используется лишь BI_RGB
Rez->Byte[34]=0 ;// int biSizeImage; // Количество байт в поле данных // Обычно устанавливается в 0
Rez->Byte[35]=0 ;// int biSizeImage; // Количество байт в поле данных // Обычно устанавливается в 0
Rez->Byte[36]=0 ;// int biSizeImage; // Количество байт в поле данных // Обычно устанавливается в 0
Rez->Byte[37]=0 ;// int biSizeImage; // Количество байт в поле данных // Обычно устанавливается в 0
Rez->Byte[38]=0 ;// int biXPelsPerMeter;// горизонтальное разрешение, точек на дюйм
Rez->Byte[39]=0 ;// int biXPelsPerMeter;// горизонтальное разрешение, точек на дюйм
Rez->Byte[40]=0 ;// int biXPelsPerMeter;// горизонтальное разрешение, точек на дюйм
Rez->Byte[41]=0 ;// int biXPelsPerMeter;// горизонтальное разрешение, точек на дюйм
Rez->Byte[42]=0 ;// int biYPelsPerMeter;// вертикальное разрешение, точек на дюйм
Rez->Byte[43]=0 ;// int biYPelsPerMeter;// вертикальное разрешение, точек на дюйм
Rez->Byte[44]=0 ;// int biYPelsPerMeter;// вертикальное разрешение, точек на дюйм
Rez->Byte[45]=0 ;// int biYPelsPerMeter;// вертикальное разрешение, точек на дюйм
Rez->Byte[46]=0 ;// int biClrUsed; // Количество используемых цветов // (если есть таблица цветов)
Rez->Byte[47]=0 ;// int biClrUsed; // Количество используемых цветов // (если есть таблица цветов)
Rez->Byte[48]=0 ;// int biClrUsed; // Количество используемых цветов // (если есть таблица цветов)
Rez->Byte[49]=0 ;// int biClrUsed; // Количество используемых цветов // (если есть таблица цветов)
Rez->Byte[50]=0 ;// int biClrImportant; // Количество существенных цветов. // Можно считать, просто 0
Rez->Byte[51]=0 ;// int biClrImportant; // Количество существенных цветов. // Можно считать, просто 0
Rez->Byte[52]=0 ;// int biClrImportant; // Количество существенных цветов. // Можно считать, просто 0
Rez->Byte[53]=0 ;// int biClrImportant; // Количество существенных цветов. // Можно считать, просто 0
TCOL COO;Rez->Len=54;
for (int y = 1; y <= Vis; y++)
for (int x = 1; x <= Hir; x++) {// В цикле рисуем сетку квадратиками
COO=RPi(x,y);
Rez->Byte[Rez->Len+0]=COO.B;
Rez->Byte[Rez->Len+1]=COO.G;
Rez->Byte[Rez->Len+2]=COO.R;
Rez->Byte[Rez->Len+3]=COO.A;
Rez->Len=Rez->Len+4;
}
return Rez;
}
TTe(char iNam[], int iHir, int iVis) {
Hir = iHir;// Указываю Ширину картинки
Vis = iVis;// указываю высоту картинки
//Rehetka();
Cle();
TCOL Col;
//Col.SetCol(0,0,0,0,0);
//LoadFromFile(iNam);// если существует Картинка с таким именем то загружаем
};// Конструктор картинок
};
#pragma endregion
#pragma region ----- Структура описывающая Пользователей .
const int MaxKolLog=16;// максимальное количество пользователей
int NewLog[MaxKolLog];
class TLogs {
public:
TPer Logs[MaxKolLog];
int Fin(TStr*iLog){
int Rez=0;int f=1;
while ((f<MaxKolLog) && (Rez==0)){
if (Rav(Logs[f].LOG,iLog)) Rez=f;
f++;}
return Rez;
}
int New(int iNomZap){
NewLog[iNomZap]=-1;
while (NewLog[iNomZap]==-1) Sleep(100);
int Rez=NewLog[iNomZap];
return Rez;
}
int Add(TStr*iLog,TStr*iPas,int iNomZap) {
int Rez=New(iNomZap);
if (Rez!=0){
Logs[Rez].LOG->SetZna(iLog);
Logs[Rez].PAS->SetZna(iPas);
}
return Rez;
}
TLogs(){
}
~TLogs(){
}
};
TLogs Logs;
#pragma endregion
#pragma region ----- Структура описывающая Сессии .
const int MaxKolSes=16; // Максимальное воличество сесий
int NewSes[MaxKolSes];
class TSess{
public:
TPer Ses[MaxKolSes];
int Fin(TStr*iSes){ // Поиск сесии в списке
int Rez=0;int f=1;
while ((f<MaxKolSes) && (Rez==0)){
if (Rav(Ses[f].SES,iSes)==true) Rez=f;
f++;
}
return Rez;
}
int New(TStr*iSes,int iNomZap){
NewSes[iNomZap]=-1;
while (NewSes[iNomZap]==-1) Sleep(100);
int Rez=NewSes[iNomZap];
return Rez;
}
int Con(TPer*iPer,int iNomZap){ // Достает списко хранимых значений если есть
int Rez=0;// Номер куда записал сесию в масиве
if (iPer->SES->Len!=0) // Если в списке параметров есть поле SES
{//--------------------------------------------------------------------
Rez=Fin(iPer->SES);// Ищю сесию с таким номером в масиве сесий
if (Rez==0) Rez=New(iPer->SES,iNomZap);// Если сесии не существует ищим место
if (Rez!=0) { // Копирую нужные значения
TStr*SSS=new TStr;// Создаю временую строку
Cop(Ses[Rez].SES,iPer->SES);// Записываю номер сесси
if (iPer->FinNam("RegReg")!=0) {iPer->GetZna(SSS,"RegReg");Ses[Rez].SetZna("RegReg",SSS);}
if (iPer->FinNam("EntEnt")!=0) {iPer->GetZna(SSS,"EntEnt");Ses[Rez].SetZna("EntEnt",SSS);}
delete SSS;// Удаляю временую строку
}
}//--------------------------------------------------------------------
// присоеденяю логин --------------------------------------------------
// --------------------------------------------------------------------
return Rez;
}
TSess(){ // Конструктор
};
~TSess(){ // Деструктор
};
};
TSess Sess;// Сдесь храняться данные от всех сесий
#pragma endregion
#pragma region ----- Структура описывающая Сообщения .
int KolId=1;
class TMes { // Структура для хранения сообщений
public:
int Id; // Уникальный идентификатор сообщения
time_t Data; // Дата сообщения
bool Priv; // ПРиватное особщенеи или нет
int Tip; // Тип сообщения чат нвоость уведомление
TStr *Chat; // К Какому чату разделу относиться сообщение
TStr *Log1; // ОТ кого сообщение
TStr *Log2; // Кому сообщение
TStr *Text; // Текст сообщения
bool Edit; // Зпись редактируеться
void Cre(){ // ПРосто создает все поля пока так сойдет
Chat=new TStr();
Text=new TStr();
Log1=new TStr();
Log2=new TStr();
}
TMes(){
Data=(int)0;
Edit=false;
Tip=0;
Priv=false;
Chat=NULL;
Text=NULL;
Log1=NULL;
Log2=NULL;
Id=KolId;
KolId=KolId+1;
}
~TMes(){
if (Chat!=NULL) delete Chat;
if (Text!=NULL) delete Text;
if (Log1!=NULL) delete Log1;
if (Log2!=NULL) delete Log2;
}
};
void Cop(TMes*iMes1,TMes*iMes2){ // Копирет сообщение создает нужные поля если нужно
iMes1->Data=iMes2->Data;
iMes1->Edit=iMes2->Edit;
iMes1->Priv=iMes2->Priv;
iMes1->Tip =iMes2->Tip ;
iMes1->Id =iMes2->Id ;
if (iMes1->Chat==NULL) iMes1->Chat=new TStr();
if (iMes1->Text==NULL) iMes1->Text=new TStr();
if (iMes1->Log1==NULL) iMes1->Log1=new TStr();
if (iMes1->Log2==NULL) iMes1->Log2=new TStr();
Cop(iMes1->Chat,iMes2->Chat);
Cop(iMes1->Text,iMes2->Text);
Cop(iMes1->Log1,iMes2->Log1);
Cop(iMes1->Log2,iMes2->Log2);
}
TMes CreMes(TStr*iMes){
TMes Rez;
Rez.Data=time(NULL);
Rez.Data=time(NULL);
return Rez;
}
const int MaxKolMes=16; // Максимальное количество сообщений
int NewMes[MaxKolMes];
class TCha{ // time (NULL); // Массив с ссообщениями
public:
int Kol;//
TMes*Mess[MaxKolMes]; // Масив где храняться сообщения
int New(TMes*iMes,int iNomZap){ // Ищим самое старое сообщение
NewMes[iNomZap]=-1;
while (NewMes[iNomZap]==-1) Sleep(100);
int Rez=NewMes[iNomZap];
return Rez;
}
void Add(TMes*iMes,int iNomZap) { // Добавить сообщение
int R=New(iMes,iNomZap); // ТО куда будем записывать сообщение
if (R!=0) {
Cop(Mess[R],iMes); // копируем сообщение
Mess[R]->Edit=true; // Разрешаю редактирование
}
}
int AddH(TMes*iMes,int iKol){ // Добавляет сообщения в списке в хронологическом порядке
int f=1 ; int Rez=0;
while ((f<=MaxKolMes)&&(f<=iKol)&&(Rez==0)){
if (Mess[f]->Data<iMes->Data){
delete Mess[iKol+1];
for (int f2=iKol;f2>=f;f2--) Mess[f2+1]=Mess[f2];
Rez=f;
Mess[Rez]=new TMes;
Cop(Mess[Rez],iMes);// копирую сообщение
if (Kol<=iKol)Kol=Kol+1;
}f++;
}
return Rez;
}
TCha*Get(TPer*Per,int iKol){ // Получить последнии сообщения
TCha*Rez = new TCha;// Список выводимых сообщенй
int f=0 ;
for (f=1;(f<MaxKolMes);f++)
Rez->AddH(Mess[f],iKol);
return Rez;
}
TCha (){ // Конструктор
Kol=0;
for (int f=0;f<MaxKolMes;f++) // пока так упсть будет
Mess[f]=new TMes();
}
~TCha (){ // Деструктор
for (int f=0;f<MaxKolMes;f++) // Для отладки сойдет и так
delete Mess[f];
}
};
TCha*Cha=new TCha();
void PrintCha(TCha*iCha) {
for (int f=0;f<MaxKolMes;f++)
{
printf("[ ");
printf(" %d ",f);
if (iCha->Mess[f]->Text!=NULL)
printf(" %s ",iCha->Mess[f]->Text->Byte);
printf(" ] \n\r");
}
};
#pragma endregion
#pragma region ----- Страницы сайта .
void JS_convertFromHex(TStr*Rez){
// Преобразует строку в HEX
Rez->AddStrLn("function convertFromHex(hex) {");
Rez->AddStrLn("var hex = hex.toString();");
Rez->AddStrLn("var str = '';");
Rez->AddStrLn("for (var i = 0; i < hex.length; i += 2)");
Rez->AddStrLn("str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));");
Rez->AddStrLn("return str;");
Rez->AddStrLn("}");
Rez->AddLn();
}
void JS_convertToHex(TStr*Rez){
// Преобразует строку в HEX
Rez->AddStrLn("function convertToHex(str) {");
Rez->AddStrLn("var hex = '';");
Rez->AddStrLn("for(var i=0;i<str.length;i++) {");
Rez->AddStrLn("hex += ''+str.charCodeAt(i).toString(16);");
Rez->AddStrLn("}");
Rez->AddStrLn("return hex;");
Rez->AddStrLn("}") ;
}
void JS_AddMesInChat(TStr*Rez){
// Добавляет сообщение в Чат
Rez->AddStrLn("function AddMesInChat(iId,iTex){");
Rez->AddStrLn("if (document.getElementById(iId)==null){");
Rez->AddStrLn(" var newDiv = document.createElement('div');");
Rez->AddStrLn(" newDiv.style.marginTop='1%';");
Rez->AddStrLn(" newDiv.style.paddingLeft='1%';");
Rez->AddStrLn(" newDiv.id=iId;");
Rez->AddStr (" newDiv.innerHTML=iTex;");
Rez->AddStrLn(" if (document.getElementById('cha')!=null){");
Rez->AddStrLn(" var cha=document.getElementById('cha');");
Rez->AddStrLn(" var i = 0 ; var ex=false ; ");
Rez->AddStrLn(" while ((i<cha.children.length)&&(ex==false)) { ");
Rez->AddStrLn(" if (cha.children[i].getAttribute('id')>iId) ");
Rez->AddStrLn(" {ex=true;cha.insertBefore(newDiv,cha.children[i]);}else");
Rez->AddStrLn(" if (cha.children[i].getAttribute('id')==iId){ ex=true;");
Rez->AddStrLn(" if (cha.children[iS].innerHTML!=iTex) ");
Rez->AddStrLn(" cha.children[i].innerHTML=iTex; ");
Rez->AddStrLn(" } i++;} ");
Rez->AddStrLn(" if (ex==false) cha.appendChild(newDiv); ");
Rez->AddStrLn("} } } ");
}
void JS_GetData(TStr*R){
R->A(" function GetData() { ");
// Заголовок ==================================================
R->A(" DataSend='VER='+convertToHex('01')+';'; ");
R->A(" var nam=document.getElementById('nam'); ");
// Пакетная передача ==================================================
R->A(" if (AcaAca!=''){ ");
R->A(" DataSend=DataSend+'AcaAca='+convertToHex(AcaAca)+';' ");
R->A(" AcaAca=''; ");
R->A(" } ");
R->A(" if (ChaCha!=''){ ");
R->A(" DataSend=DataSend+'ChaCha='+convertToHex(ChaCha)+';' ");
R->A(" ChaCha=''; ");
R->A(" } ");
R->A(" if (RegReg!=''){ ");
R->A(" DataSend=DataSend+'RegReg='+convertToHex(RegReg)+';' ");
R->A(" RegReg=''; ");
R->A(" } ");
R->A(" if (EntEnt!=''){ ");
R->A(" DataSend=DataSend+'EntEnt='+convertToHex(EntEnt)+';' ");
R->A(" EntEnt=''; ");
R->A(" } ");
R->A("}");
}
void JS_add_script(TStr*Rez){
// Код обмена данными клиент сервер
// Отправляет запрос DataSend серверу
// И Выполняет полученый JavaScript
Rez->AddStrLn("function add_script() { ");
Rez->AddStrLn("var newScript = document.createElement('script');");
Rez->AddStrLn("newScript.type = 'text/javascript';");
Rez->AddStrLn("newScript.language = 'javascript';");
Rez->AddStrLn("GetData();");
Rez->AddStrLn("UR='http://192.168.0.107:8080/script.js?DataSend='+convertToHex(DataSend); ");
Rez->AddStrLn("newScript.src=UR;");
Rez->AddStrLn("document.getElementsByTagName('head')[0].appendChild(newScript);");
Rez->AddStrLn("document.getElementsByTagName('head')[0].removeChild(newScript);");
Rez->AddStrLn("}");
}
void JS_InitEvent(TStr*R){
R->A(" if (document.getElementById('aca')!=null){ ");
R->A(" document.getElementById('aca').onkeypress=function() { ");
R->A(" AcaAca=AcaAca+'nam='+convertToHex(document.getElementById('nam').value)+';'; ");
R->A(" Add_script(); ");
R->A(" } ");
R->A(" } ");
R->A(" if (document.getElementById('cha')!=null){ ");
R->A(" document.getElementById('cha').onclick=function(){ ");
R->A(" ChaCha=ChaCha+'Mes='+convertToHex(document.getElementById('Mes').value)+';'; ");
R->A(" document.getElementById('Mes').value=''; ");
R->A(" Add_script(); ");
R->A(" } ");
R->A(" } ");
R->A(" if (document.getElementById('reg')!=null){ ");
R->A(" document.getElementById('reg').onclick=function() { ");
R->A(" RegReg=RegReg+'log='+convertToHex(document.getElementById('log').value)+';'; ");
R->A(" RegReg=RegReg+'pas='+convertToHex(document.getElementById('pas').value)+';'; ");
R->A(" RegReg=RegReg+'cap='+convertToHex(document.getElementById('cap').value)+';'; ");
R->A(" add_script(); ");
R->A(" } ");
R->A(" } ");
R->A(" if (document.getElementById('ent')!=null){ ");
R->A(" document.getElementById('ent').onclick=function() { ");
R->A(" EntEnt=EntEnt+'log='+convertToHex(document.getElementById('log').value)+';'; ");
R->A(" EntEnt=EntEnt+'pas='+convertToHex(document.getElementById('pas').value)+';'; ");
R->A(" add_script(); ");
R->A(" } ");
R->A(" } ");
}
void AddMesInChat(TStr*Rez,int iId,TStr*iTex){
Rez->AddStr("AddMesInChat('");
Rez->AddStr("cha");
TStr*s=new TStr();
s->SetNom(iId);
s->AddNol(9);
Rez->AddStr(s);
delete s;
Rez->AddStr("','");
Rez->AddStr(iTex);
Rez->AddStrLn("');");
}
void SiteJava(TStr*Rez,TPer*Per){
// Скрипт находящийся на каждой странице
Rez->AddLn();
Rez->AddStrLn("<script type='application/javascript'>");
Rez->AddStrLn("var DataSend='';");// ОТправляемая строка
Rez->AddStrLn("var ChaCha='' ;");// Отправка сообщения
Rez->AddStrLn("var AcaAca='' ;");// Личные данные
Rez->AddStrLn("var RegReg='' ;");// Форма регистрации
Rez->AddStrLn("var EntEnt='' ;");// Форма входа
Rez->AddStrLn("var NomLog='' ;");// Форма входа
JS_convertFromHex(Rez);
JS_convertToHex(Rez);
JS_AddMesInChat(Rez);
JS_GetData(Rez);
JS_add_script(Rez);
JS_InitEvent(Rez);
Rez->AddStrLn("setTimeout('add_script()',2000);");
Rez->AddStrLn("</script>");
}
void SiteVerh(TStr*Rez,TPer*Per){ // Верх сайта
Rez->AddStrLn("<html><head></head><body><center>");
// Основной DIV блок сайта background-color: #136F74;​
Rez->AddStrLn("<div style='width:80%;height:75%;background-color: Yellow;'>");
}
void SiteNizz(TStr*Rez,TPer*Per){ // Низ сайта
Rez->AddStrLn("</div>");// Конец Основного DIV блока
SiteJava(Rez,Per);
Rez->AddStrLn("</center></body></html>");
}
void SiteMenu(TStr*R,TPer*Per){ // Меню сайта color: #fff;
R->A("<hr>");
if (Per->NLO==0) R->A("<a href='enter.html' style='text-decoration:none;' id='AEnt' >Вход</a> ");
if (Per->NLO==0) R->A("<a href='registration.html' style='text-decoration:none;' id='AReg'>Регистрация</a> ");
R->A("<a href='index.html' style='text-decoration:none;'>Настройки</a> ");
R->A("<a href='chat.html' style='text-decoration:none;'>Чат</a>");
R->A("<hr>");
}
void SiteMain(TStr*Rez,TPer*Per){ //Описывает главную страницу сайта
SiteVerh(Rez,Per);// Верх сайта
SiteMenu(Rez,Per);// Меню сайта
Rez->AddStrLn("<div style='width:100%;height:100%;background-color: red;'>");
Rez->AddStrLn("<center><br>");
Rez->AddStrLn("Отображаемое Имя<br>");
Rez->AddStrLn("<input type='text' id='nam' value='' ><br>");
Rez->AddStrLn("Логин<br>");
Rez->AddStrLn("<input type='text' id=='log' value='' ><br>");
Rez->AddStrLn("Пароль<br>");
Rez->AddStrLn("<input type='password' id=='pas' value='' ><br>");
Rez->AddStrLn("</center>");
Rez->AddStrLn("</div>");
SiteNizz(Rez,Per);// Низ сайта
};
void SiteEntr(TStr*Rez,TPer*Per){ //Описывает страницу входа на сайт
SiteVerh(Rez,Per);// Верх сайта
SiteMenu(Rez,Per);// Меню сайта
Rez->AddStrLn("<div style='width:100%;height:100%;background-color: red;'>");
Rez->AddStrLn("<div id='DivEnt'>");
if (Per->NLO==0) {
Rez->AddStrLn("<center><br>");
Rez->AddStrLn("Логин<br>");
Rez->AddStrLn("<input type='text' id='log' value='' ><br>");
Rez->AddStrLn("Пароль<br>");
Rez->AddStrLn("<input type='password' id='pas' value='' ><br><br>");
Rez->AddStrLn("<input type='button' id='ent' value='Вход.' ><br>");
Rez->AddStrLn("</center>");
} else {
Rez->AddStrLn("<br><br><br>Добро пожаловать !");
}
Rez->AddStrLn("</div>");
Rez->AddStrLn("</div>");
SiteNizz(Rez,Per);// Низ сайта
};
void SiteRegi(TStr*Rez,TPer*Per){ //Описывает страницу регистрации
SiteVerh(Rez,Per);// Верх сайта
SiteMenu(Rez,Per);// Меню сайта
Rez->AddStrLn("<div style='width:100%;height:100%;background-color: red;'>");
Rez->AddStrLn("<div id ='DivReg'>");
if (Per->NLO==0) {
Rez->AddStrLn("Логин<br>");
Rez->AddStrLn("<input type='text' id='log' name= 'log' value='' ><br>");
Rez->AddStrLn("Пароль<br>");
Rez->AddStrLn("<input type='password' id='pas' name= 'pas' value='' ><br>");
Rez->AddStrLn("Повторите Пароль<br>");
Rez->AddStrLn("<input type='password' id='pas2' value='' ><br><br>");
Rez->AddStrLn("<img src='captcha.bmp'><br><br>");
Rez->AddStrLn("ПРоверочный код<br>");
Rez->AddStrLn("<input type='text' id='cap' name='cap' value='' ><br><br>");
Rez->AddStrLn("<input type='button' id='reg' name='reg' value='Зарегестрироватся.' ><br><br>");
} else
{
Rez->AddStrLn("<br><br><br>Вы зарегестрированы !");
}
Rez->AddStrLn("</div>");
Rez->AddStrLn("</div>");
SiteNizz(Rez,Per);// Низ сайта
};
void SiteChat(TStr*Rez,TPer*Per){ //Описывает страницу с чатом
SiteVerh(Rez,Per);// Верх сайта
SiteMenu(Rez,Per);// Меню сайта
Rez->AddStrLn("<div style='width:100%;height:100%;outline: 1px solid orange;background-color: silver;'> ");
Rez->AddStrLn("<div style='width:100%;height:100%;overflow: scroll;' id='cha' align=left ></div>");
Rez->AddStrLn("<div style='width:100%;'>");
Rez->AddStrLn("<input style='display:block;float:left;width:70%;' type='text' name='ChaMes' id='ChaMes'>");
Rez->AddStrLn("<input style='display:block;width:30%;' type='submit' name='sub' id='sub'>");
Rez->AddStrLn("</div>");
Rez->AddStrLn("</div>");
Rez->AddStrLn("</div>");
SiteNizz(Rez,Per);// Низ сайта
};
void OtvetJav(TStr*Rez,TPer*iPer,int iNomZap){ // Ответ сервера скрипт
TStr *ChaCha = new TStr();// чат
TStr *AcaAca = new TStr();// настройки
TStr *RegReg = new TStr();// регистрация
TStr *EntEnt = new TStr();// вход
iPer->GetZna(ChaCha ,"ChaCha");// Странийа чата
iPer->GetZna(EntEnt ,"EntEnt");// Страница входа
iPer->GetZna(RegReg ,"RegReg");// Страница регистрации
iPer->GetZna(AcaAca ,"AcaAca");// Страница настроек
if (ChaCha->Len!=0) { //=============================================
TStr*SSS=new TStr() ;
TMes*Mes=new TMes() ;// Создаю макет сообщения
Mes->Cre() ;// Создаю все нужные поля
TPer*Per=new TPer() ;// Читаю данные с ChaCha
Per->PST(ChaCha) ;
Mes->Data=time(NULL) ;// указываю время события
Cop(Mes->Log1,iPer->LOG) ;// Указываю свой логин
Cop(Mes->Log2,"") ;// Указываю ЛОгин получателя сообщения
Per->GetZna(SSS,"Mes");
SSS->HexToBin() ;
Cop(Mes->Text,SSS) ;// Указываю текст события
Cha->Add(Mes,iNomZap) ;// Добавляю событие
iPer->SetZna("ChaCha","");
delete Mes ;
TCha *Otv ;
Otv=Cha->Get(iPer,3) ; // достаю последни 3 сообещния в чате
PrintCha(Otv) ; //
for (int f=1;f<=Otv->Kol;f++)
AddMesInChat(Rez,Otv->Mess[f]->Id,Otv->Mess[f]->Text);
delete Otv ;
delete Per ;
delete SSS ;
} //====================================================
if (RegReg->Len!=0) { //=============================================
TPer*Per=new TPer() ; // Читаю данные с RegReg
TStr*PAS=new TStr() ; // СОздаю временую строку
TStr*LOG=new TStr() ; // СОздаю временую строку
RegReg->HexToBin() ;
Per->PST(RegReg) ;
Per->HexToStr() ;
Per->GetZna(LOG,"log") ;
Per->GetZna(PAS,"pas") ;
int n=Logs.Fin(LOG) ;
if (n==0) { // Если такого логина не существует
n=Logs.Add(LOG,PAS,iNomZap);
iPer->NLO=n ;
Rez->A(" document.getElementById('DivReg').innerHTML='<br><br><br>Вы зарегестрированы !'; ");
Rez->A(" document.getElementById('AEnt').remove(); ");
Rez->A(" document.getElementById('AReg').remove(); ");
}
iPer->SetZna("RegReg","");
delete Per ;
delete LOG ;
delete PAS ;
}//===================================================================
if (EntEnt->Len!=0) { //=============================================
TPer*Per=new TPer() ; // Читаю данные с RegReg
TStr*PAS=new TStr() ; // СОздаю временую строку
TStr*LOG=new TStr() ; // СОздаю временую строку
EntEnt->HexToBin() ;
Per->PST(EntEnt) ;
Per->HexToStr() ;
Per->GetZna(LOG,"log") ;
Per->GetZna(PAS,"pas") ;
int n=Logs.Fin(LOG) ;
if (n!=0) { // Если такого логина не существует
iPer->NLO=n ;
Rez->A(" document.getElementById('DivEnt').innerHTML='<br><br><br>Добро пожаловать !'; ");
Rez->A(" document.getElementById('AEnt').remove(); ");
Rez->A(" document.getElementById('AReg').remove(); ");
}
iPer->SetZna("EntEnt","");
delete Per ;
delete LOG ;
delete PAS ;
}//===================================================================
Rez->AddStrLn("if (document.getElementById('nam')!=null)");
Rez->AddStr("document.getElementById('nam').value='");
TStr*Nam=new TStr();
iPer->GetZna(Nam,"nam");
Nam->HexToBin();
Rez->AddStr(Nam);
delete Nam;
Rez->AddStrLn("';");
Rez->AddStrLn("if (document.getElementById('cha')!=null){");
Rez->AddStrLn("cha.scrollTop = 9999;}");
Rez->AddStrLn("setTimeout('add_script()',3000);");
delete ChaCha;
delete EntEnt;
delete RegReg;
delete AcaAca;
};
void OtvetCap(TStr*Rez,TPer*Per){
TTe*TTT = new TTe("test.bmp",100,25);
TCOL COL;COL.SetCol(0,0,0,0,0);
TCOO COO;COO.SetCoo(3,3);
TStr*Cap = new TStr();
Cap->Gen(5);
Per->SetZna("Cap",Cap);
TTT->Text("TIMUR",COO,(float)0.15,COL);
TStr*T;
T=TTT->BmpAsStr();
Rez->AddStr(T);
delete Cap;
delete T;
delete TTT;
}
#pragma endregion
#pragma region ----- Структура описывающая Запрос .
class TZapros {
public:
bool Rab = false;// Состояние запроса
HANDLE Han ; // указатель на запрос
SOCKET Soc = INVALID_SOCKET;// Чёкит запроса
int Run(int iNomZap) {
TPer *Per= new TPer();// Переменные
TStr *Zap= new TStr();// Строка запроса
TStr *Otv= new TStr();// СТрока ответа
TStr *Htm= new TStr();// содержимое ответа
// Читаем входные данные ======================
Zap->Len = recv(Soc,Zap->Byte,MaxLenStr,0);
Zap->Byte[Zap->Len]=0;
//============================================= PAR
Per->PZA(Zap);
//============================================= SES
int n=Sess.Con(Per,iNomZap);Per->NSE=n;
if (n!=0){ // если удалось соз или найти сесию
if (Rav(Per->PUT,"captcha.bmp" )) OtvetCap(Htm,&Sess.Ses[n]);else // Выводит Кпчу
if (Rav(Per->PUT,"script.js" )) OtvetJav(Htm,&Sess.Ses[n],iNomZap);else // Возвр скрипт исполняемый в браузкрк
if (Rav(Per->PUT,"enter.html" )) SiteEntr(Htm,&Sess.Ses[n]);else // Возвр скрипт исполняемый в браузкрк
if (Rav(Per->PUT,"registration.html")) SiteRegi(Htm,&Sess.Ses[n]);else // Возвр скрипт исполняемый в браузкрк
if (Rav(Per->PUT,"chat.html" )) SiteChat(Htm,&Sess.Ses[n]);else // Возвращаем страницу чата
if (Rav(Per->PUT,"index.html" )) SiteMain(Htm,&Sess.Ses[n]);else // Главная страница пользователя
SiteMain(Htm,&Sess.Ses[n]); // Главная страница пользователя
} else Htm->SetZna("<html>The server is temporarily unavailable</html>");
//=============================================
if (Rav(Per->RAS,"html")) {
Otv->AddStrLn("HTTP/1.1 200 OK");
// Язык ответа сервера русский
Otv->AddStrLn("Content-Language: ru");
// Формат ответа HTML
Otv->AddStrLn("Content-Type: text/html");
// Если сесия не назанчена то устанавливает
if (Per->SES->Len!=0){Otv->AddStr("Set-Cookie: SES=");Otv->AddStrLn(Per->SES);}
// Длина контента
Otv->AddStr("Content-Length: ");
Otv->AddNom(Htm->Len + 4);Otv->AddLn();
// Конец заголовка
Otv->AddStr("Connection: close");
Otv->AddLn();Otv->AddLn();
Otv->AddStr(Htm);
Otv->AddLn();Otv->AddLn();
}
if (Rav(Per->RAS,"js" )) {
Otv->AddStrLn("HTTP/1.1 200 OK");
// Язык ответа сервера русский
Otv->AddStrLn("Content-Language: ru");
// Формат ответа HTML
Otv->AddStrLn("Content-Type: text/html");
// Если сесия не назанчена то устанавливает
if (Per->SES->Len!=0) {Otv->AddStr("Set-Cookie: SES=");Otv->AddStrLn(Per->SES);}
// Длина контента
Otv->AddStr("Content-Length: ");
Otv->AddNom(Htm->Len + 4);Otv->AddLn();
// Конец заголовка
Otv->AddStr("Connection: close");
Otv->AddLn();Otv->AddLn();
Otv->AddStr(Htm);
Otv->AddLn();Otv->AddLn();
}
if (Rav(Per->RAS,"bmp" )) {
Otv->AddStrLn("HTTP/1.1 200 OK");
Otv->AddStrLn("Content-type: image/bmp");
Otv->AddLn();
Otv->AddStr(Htm);
}
// Отдаем данные =======================
int Otp = send(Soc,Otv->Byte,MaxLenStr,0);
delete Per;
delete Zap;
delete Otv;
delete Htm;
closesocket(Soc);// Закрываю соеденение
printf("%d\n\r",KolStr);
Rab = false;// Указыват что может принимать новый запрос
return 0;
}
};
#pragma endregion
#pragma region ----- Структура описывающая Запросы .
DWORD WINAPI RunZapros(LPVOID lpParam);
const int MaxKolZap=16;
class TZapross{
public:
TZapros Zapross[MaxKolZap];// Список запросов
void StartZapros(SOCKET ClientSocket){
int f = 1;
while (( f < MaxKolZap) && ( Zapross[f].Rab)) f++;
if (( f < MaxKolZap) && (!Zapross[f].Rab)) {
Zapross[f].Rab=true;
Zapross[f].Soc = ClientSocket;
Zapross[f].Han = CreateThread(
NULL, // Атрибуты безопасности по умолчанию
0, // Размер стека используется по умолчанию
RunZapros, // Функция потока
(LPVOID)f, // Аргумент функции потока
0, // Флажки создания используются по умолчанию
NULL); // Возвращает идентификатор потока
SetThreadPriority(Zapross[f].Han, THREAD_PRIORITY_LOWEST);
}
}
};
TZapross Zapross;// Структура хранящая все запросы
DWORD WINAPI RunZapros(LPVOID lpParam)
{ // Запускзапроса на обработку
Zapross.Zapross[(int)lpParam].Run((int)lpParam);
return 0;
}
#pragma endregion
DWORD WINAPI RunDispath(LPVOID lpParam)
{ // Межпоточный обмен данными
while (true) { Sleep(100);
for(int NZ=1;NZ<MaxKolZap;NZ++){
if (NewSes[NZ]==-1) {
int Rez=0;int f=1; // ищим место
for (f=1;((f<MaxKolSes)&&(Sess.Ses[f].SES->Len!=0));f++);
if ((f>0) && (f<MaxKolSes)) Rez=f; else Rez=0;// Если места нет 0
NewSes[NZ]=Rez;
}
if (NewMes[NZ]==-1){
int f=1;int RDA=(int)time(0);int Rez=0;
while ((f<MaxKolMes)&&(Cha->Mess[f]->Data!=0)){ // Ищим самое древнее сообщение что бы его перезаписать
if (Cha->Mess[f]->Data<RDA){ // если дата сообщения более ранняя
RDA=(int)Cha->Mess[f]->Data;
Rez=f;}
f++;}
if (Rez>=MaxKolMes) Rez=0;
NewMes[NZ]=Rez;
}
if (NewLog[NZ]==-1){
int Rez=0;int f=1; // ищим место
for (f=1;((f<MaxKolLog)&&(Logs.Logs[f].LOG->Len!=0));f++);
if ((f>0) && (f<MaxKolLog)) Rez=f; else Rez=0;// Если места нет 0
NewLog[NZ]=Rez;
}
}}
return 0;
}
DWORD WINAPI RunServer(LPVOID lpParam)
{ /* Работа сервера */
WSADATA wsaData;
int iResult;
SOCKET ListenSocket = INVALID_SOCKET;
SOCKET ClientSocket = INVALID_SOCKET;
struct addrinfo *result = NULL;
struct addrinfo hints;
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0) { printf("WSAStartup failed with error: %d\n", iResult); return 1; }
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_flags = AI_PASSIVE;
// Resolve the server address and port
iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
if (iResult != 0) { printf("getaddrinfo failed with error: %d\n", iResult); WSACleanup(); return 1; }
// Create a SOCKET for connecting to server
ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
if (ListenSocket == INVALID_SOCKET) {
printf("socket failed with error: %ld\n", WSAGetLastError());
freeaddrinfo(result); WSACleanup(); return 1;
}
// Setup the TCP listening socket
iResult = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen);
if (iResult == SOCKET_ERROR) {
printf("bind failed with error: %d\n", WSAGetLastError());
freeaddrinfo(result);
closesocket(ListenSocket);
WSACleanup();
return 1;
}
freeaddrinfo(result);
iResult = listen(ListenSocket, SOMAXCONN);
if (iResult == SOCKET_ERROR) {
printf("listen failed with error: %d\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
}
for (int f = 1; f < MaxKolZap; f++)
Zapross.Zapross[f].Rab = false;
do {
Sleep(100);
// Accept a client socket
ClientSocket = accept(ListenSocket, NULL, NULL);
if (ClientSocket == INVALID_SOCKET) closesocket(ClientSocket);
else Zapross.StartZapros(ClientSocket);
//for (int f = 1; f < MaxKolZapross; f++)
//if (!Zapross->Zapross[f].Rab) StartZapros(f, ClientSocket);
} while (true);
closesocket(ClientSocket);
WSACleanup();
return 0;
}
int StartServer()
{ // Процедура запуска сервера
HANDLE Dispath;// указатель на сервер
Dispath = CreateThread(
NULL, // атрибуты безопасности по умолчанию
0, // размер стека используется по умолчанию
RunDispath, // функция потока
NULL, // аргумент функции потока
0, // флажки создания используются по умолчанию
NULL); // возвращает идентификатор потока
SetThreadPriority(Dispath, THREAD_PRIORITY_LOWEST);
HANDLE Server;// указатель на сервер
Server = CreateThread(
NULL, // атрибуты безопасности по умолчанию
0, // размер стека используется по умолчанию
RunServer, // функция потока
NULL, // аргумент функции потока
0, // флажки создания используются по умолчанию
NULL); // возвращает идентификатор потока
SetThreadPriority(Server, THREAD_PRIORITY_LOWEST);
return 0;
}
int main()
{
printf("Start Server \n");
StartServer();
_getch();// тут типа ожидания нажатия любой кнопки
printf("Stop Server \n");
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment