CtrlMstr/CtrlPPal.cpp
2021-09-12 22:02:01 +02:00

910 lines
31 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//---------------------------------------------------------------------------
#include <io.h>
#include <vcl.h>
#pragma hdrstop
#include <registry.hpp>
#include <ShellAPI.hpp>
#include <SysUtils.hpp>
#include <stdlib.h>
#include <math.h>
#include "CtrlPPal.h"
#include "TStatus.h"
#include "CtrlSocket.h"
#include "CtrlCfg.h"
#include "CtrlElemento.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CoolForm"
#pragma resource "*.dfm"
TCtrlPPal *CtrlPPal;
////////////////////////////////////////////////////////////////////////////////
#define MsgDEMO "No olvide que esto es solo una demostración.\nPara adquirir la aplicación completa:\nPongase en contacto con JD soft.\n\te-mail: jd@infdj.com\n\tTlf: 95561-58-54 Fax: 95561-49-13"
#define DEMOSTRACION
#ifdef DEMOSTRACION
#define CnElementosMAX 3
#else
#define CnElementosMAX 11 // Num. máximo de elementos permitidos
#endif
////////////////////////////////////////////////////////////////////////////////
#define opLOG "Historic.log"
//---------------------------------------------------------------------------
__fastcall TCtrlPPal::TCtrlPPal(TComponent* Owner)
: TForm(Owner)
{
// Remote Control
ClientHook = false;
ServerHook = false;
RemoteStart -> Visible = true;
remoteBack->Visible = false;
remoteLog->Visible = false;
remoteClose->Visible = false;
// Remote Control
siMinimizar = new TStringList(); // Listado de Aplicaciones Especiales
noMinimizar = new TStringList(); // Listado de Aplicaciones Especiales
snMinimizar = new TStringList(); // Listado de Aplicaciones Especiales
noAbrir = new TStringList(); // Listado de Aplicaciones Especiales
LoadProtectedList(); // Carga los listados de Aplicaicones protegidas
nElementosMAX = CnElementosMAX; // Número maximos de elementos
Elementos = new TList(); // Lista de Elementos en funcionamiento
AnySocketActive = 0; // Nº de socket REALMENTE activos
pCache = new TThreadList; // Lista de Hilos de comunicación
ChangePositionEnabled = false; // Permiso para mover la posición de los elementos
CheckAppIntegrity(); // El directorio de instalacion no puede moverse
StartEventRecorder(); // Comenzamos la grabación de eventos
TbElementosCFG->Active = true; // Abrimos la tabla de elementos para hacerlos visibles
TbPersonas->Active = true;
}
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::LoadProtectedList(void)
{
//LoadProtectedList();
}
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::StartEventRecorder(void)
{
TbHistorial->Active = true; // Tabla de eventos del sistema
try {
// Cargamos todos los eventos anteriores
Memo1->Lines->LoadFromFile( opLOG );
// Si hay demasiados registros
if ( Memo1->Lines->Count > 700 )
{
for ( int i=0; i<100; i++ ) // Eliminamos las 100 últimas entradas
Memo1->Lines->Delete( 3 );
}
} catch(...) {
Memo1->Lines->Clear(); // En caso de error, las eliminamos todas
}
//Fecha y hora del inicio de sesión
Memo1->Lines->Insert( 0, (Now()).DateTimeString() + " :: Inicio de la sesión" );
}
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::iCloseDblClick(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::iMinClick(TObject *Sender)
{
Application->Minimize();
}
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::iPosVClick(TObject *Sender)
{
#ifdef DEMOSTRACION
ShowMessage( MsgDEMO );
#endif
if ( ChangePositionEnabled || ( !ChangePositionEnabled && InputBox( "Programa BETA!!!", "Modificar:", "¿Que Modificar?") == "Esto es una beta" ) )
{
Graphics::TBitmap *Picture;
ChangePositionEnabled = !ChangePositionEnabled;
Picture = iPosV->GlyphNormal;
iPosV->GlyphNormal = iPosV->GlyphPress;
iPosV->GlyphPress = Picture;
}
}
//---------------------------------------------------------------------------
/**
Comprueba que el directorio de la aplicación es siempre el mismo
(De este modo, la aplicación no correra en ningún directorio distinto, del
que se eligió para instalar)
**/
void __fastcall TCtrlPPal::CheckAppIntegrity(void)
{
TRegistry *Registro;
Registro = new TRegistry;
Registro -> OpenKey( "\\Software\\JDsoft\\CtrlMstr", true );
AnsiString AppPath;
if ( ! Registro->ValueExists( "AppPath" ) )
{
Registro -> WriteString( "AppPath", Application->ExeName );
} else {
AppPath = Registro -> ReadString( "AppPath" );
if ( AppPath != Application->ExeName )
{
ShowMessage( "Copia corrupta o ilegal del programa.\nVuelva a reinstalar el producto." );
nElementosMAX = 0;
}
}
AnsiString DiskSerial;
char VolumeLabel[255], FileSystem[255];
DWord SerialNumber, DW, SysFlags;
GetVolumeInformation( "C:\\", VolumeLabel, 250, &SerialNumber, &DW, &SysFlags, FileSystem, 250);
DiskSerial = AnsiString( ltoa(SerialNumber, FileSystem,10) );
if ( ! Registro->ValueExists( "SerialNum" ) )
{
AnsiString Serial;
Serial = InputBox( "Registrando el Programa:", "Número de Serie:", DiskSerial );
if ( ! Manipula2( DiskSerial, Serial ) )
{
Registro -> WriteString( "SerialNum", Serial );
}
}
if ( Manipula( DiskSerial, Registro -> ReadString( "SerialNum" ) ) )
{
ShowMessage( "Copia corrupta o ilegal del programa.\nVuelva a reinstalar el producto." );
nElementosMAX = 0;
Registro -> DeleteValue( "SerialNum" );
Registro -> DeleteKey( "\\Software\\JDsoft\\CtrlMstr\\SerialNum" );
}
}
//-----------------
bool __fastcall TCtrlPPal::Manipula2(AnsiString Serial, AnsiString Image)
{
char buffer[80];
AnsiString Sol;
double ser = Serial.ToDouble();
if ( ser < 0 ) ser = -1*ser;
Sol = ltoa(sqrtl(ser), buffer, 10);
#ifndef DEMOSTRACION
if ( Image == Sol )
#endif
return false;
return true;
}
//-----------------
bool __fastcall TCtrlPPal::Manipula(AnsiString Serial, AnsiString Image)
{
char buffer[80];
AnsiString Sol;
double ser = Serial.ToDouble();
if ( ser < 0 ) ser = -1*ser;
Sol = ltoa(sqrtl(ser), buffer, 10);
#ifndef DEMOSTRACION
if ( Image == Sol )
#endif
return false;
return true;
}
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::FormDestroy(TObject *Sender)
{
delete siMinimizar;
delete noMinimizar;
delete snMinimizar;
delete noAbrir;
for( int i=0; i < Elementos->Count; i++ )
delete (TElemento *)Elementos->Items[i];
delete Elementos;
}
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::NewElementAt(int X, int Y, int NumEl, AnsiString IP, AnsiString Name )
{
TElemento *Elemento; // Elemento a ser insertado
Elemento = new TElemento(this); // Pedimos memoria para él
Elemento->Left = X; //
Elemento->Top = Y; // FIJAMOS SUS PROPIEDADES
Elemento->AutoSize = true; //
Elemento->Transparent = true; //
Elemento->PopupMenu = mElementoCFG; // Menú contextual
Elemento->OnDblClick = ElementoDblClick; //
Elementos->Add( Elemento ); // Añadimos el elemento a la lista
// Lo hacemos visible
Pizarra->InsertControl( Elemento );
Elemento->SetElemento( NumEl, IP, Name ); // Y comenzamos la comunicación
}
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::PizarraDblClick(TObject *Sender)
{
POINT MousePos;
int X, Y;
// Si lo que quiere es reubicar un nuevo elemento
if ( ChangePositionEnabled )
{
#ifndef DEMOSTRACION
// Anexamos un nuevo elemento a la lista (Si no hemos llegado al límite)
if ( Elementos->Count < nElementosMAX )
{
GetCursorPos(&MousePos);
X = MousePos.x - Left - Pizarra->Left - iElementoV->Picture->Width / 2;
Y = MousePos.y - Top - Pizarra->Top - iElementoV->Picture->Height / 2 ;
try {
// Lo damos de Alta en la tabla
/*
TbElementosCFG -> InsertRecord( ARRAYOFCONST(
( Null, // Numero de Elemento
X, // Posición X
Y, // Posición Y
false, "0.0.0.0", "new"+AnsiString(Elementos->Count)
) ) );
*/
AnsiString NameOfElement = "new"+AnsiString(TbElementosCFG->FieldByName("NumElement")->AsInteger);
TbElementosCFG -> Insert();
TbElementosCFG -> Edit();
TbElementosCFG -> FieldByName( "PosX" )-> AsInteger = X;
TbElementosCFG -> FieldByName( "PosY" )-> AsInteger = Y;
TbElementosCFG -> FieldByName( "Activo" )-> AsBoolean = false;
TbElementosCFG -> FieldByName( "IP" )-> AsString = "0.0.0.0";
TbElementosCFG -> FieldByName( "Name" )-> AsString = NameOfElement;
TbElementosCFG -> Post();
NewElementAt( X, Y, TbElementosCFG->FieldByName("NumElement")->AsInteger, "0.0.0.0", NameOfElement );
Memo1->Lines->Insert( 0, (Now()).DateTimeString() + " :: Inserción de nuevos elementos" );
} catch (...) {
ShowMessage( "¿¿¿ SIN MEMORIA ???\nTu Güindows está petando" );
}
} else
ShowMessage( "Ha superado el máximo número de elementos\n¡¡¡ IMPOSIBLE AÑADIR MAS !!!" );
#else
ShowMessage( MsgDEMO );
#endif
}
}
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::EliminarElemento(TObject *Sender)
{
if ( ServerHook ) return;
int TraceMeHacker;
TraceMeHacker = Elementos->Count;
#ifndef DEMOSTRACION
if ( ChangePositionEnabled )
{
TElemento *Elemento = (TElemento *)(mElementoCFG->PopupComponent);
// Eliminamos el objeto de la tabla
if ( TbElementosCFG -> Locate( "NumElement", Elemento->NumElemento, TLocateOptions() << loCaseInsensitive ) )
{
TbElementosCFG -> Delete(); // Eliminamos el elemento de la TABLA
Memo1->Lines->Insert( 0, (Now()).DateTimeString() + " :: Elemento nº " + AnsiString( Elemento->NumElemento ) + ", eliminado." );
Pizarra->RemoveControl( Elemento ); // Eliminamos el elemento de la PIZARRA
Elementos->Remove( Elemento ); // Eliminamos el elemento de la MEMORIA
Elementos->Pack();
}
}
#else
ShowMessage( MsgDEMO );
#endif
if ( TraceMeHacker == Elementos->Count )
ShowMessage( "Lo siento pero carece de permisos para modificar los terminales.\n¡¡Su intento ha quedado registrado!!" );
}
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::TbElementosCFGBeforeOpen(TDataSet *DataSet)
{
// Si la tabla no existe, la creamos
if ( access( (TbElementosCFG -> TableName).c_str(), 0 ) != 0 )
{
// Usamos la propiedad FielDefs para definir
// las columnas que contendrá la tabla
TbElementosCFG -> FieldDefs -> Clear();
TbElementosCFG -> FieldDefs -> Add("NumElement", ftAutoInc, 0, false );
TbElementosCFG -> FieldDefs -> Add("PosX", ftInteger, 0, false );
TbElementosCFG -> FieldDefs -> Add("PosY", ftInteger, 0, false );
TbElementosCFG -> FieldDefs -> Add("Activo", ftBoolean, 0, false );
TbElementosCFG -> FieldDefs -> Add("IP", ftString, 15, false );
TbElementosCFG -> FieldDefs -> Add("Name", ftString, 8, false );
TbElementosCFG -> FieldDefs -> Add("Comienzo", ftDateTime, 0, false );
TbElementosCFG -> FieldDefs -> Add("Tiempo", ftDateTime, 0, false );
TbElementosCFG -> IndexDefs-> Clear();
TbElementosCFG->IndexDefs->Add("Primary", "NumElement", TIndexOptions() << ixPrimary << ixUnique );
// Creamos la base...
TbElementosCFG -> CreateTable();
Memo1->Lines->Insert( 0, (Now()).DateTimeString() + " :: Iniciando sistema por primera vez..." );
}
}
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::TbElementosCFGAfterOpen(TDataSet *DataSet)
{
int i; HoraActual = TDateTime::CurrentTime();
// Cargamos todos los elementos
TbElementosCFG -> First(); i = 0;
while ( ! TbElementosCFG->Eof && i < nElementosMAX )
{
/*
if ( TbElementosCFG->FieldByName( "Activo" )->AsBoolean )
{
if ( MessageBox( NULL, AnsiString("El equipo arriba indicado se encuentra \"ocupado\"\n¿ Desea dejar libre este equipo ?").c_str(), AnsiString("Equipo " + TbElementosCFG->FieldByName( "NumElement" )->AsString + " ¿Activo?").c_str(), MB_YESNO ) != IDNO )
{
TbElementosCFG->Edit();
TbElementosCFG->FieldByName( "Activo" )->AsBoolean = false;
TbElementosCFG->Post();
Memo1->Lines->Insert( 0, (Now()).DateTimeString() + " :: Elemento nº" + TbElementosCFG->FieldByName( "NumElement" )->AsString + ", estaba activo" );
} else {
Memo1->Lines->Insert( 0, (Now()).DateTimeString() + " :: Elemento nº" + TbElementosCFG->FieldByName( "NumElement" )->AsString + ", SIGUE activo" );
}
}
*/
NewElementAt( TbElementosCFG->FieldByName( "PosX" )->AsInteger,
TbElementosCFG->FieldByName( "PosY" )->AsInteger,
TbElementosCFG->FieldByName( "NumElement" )->AsInteger,
TbElementosCFG->FieldByName( "IP" )->AsString,
TbElementosCFG->FieldByName( "Name" )->AsString
);
TbElementosCFG -> Next(); i++;
}
}
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::Estado1Click(TObject *Sender)
{
if ( !ServerHook )
ElementoDblClick(mElementoCFG->PopupComponent);
}
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::ElementoDblClick(TObject *Sender)
{
// Abrimos el cuadro de dialogo de Status...
if ( ((TElemento *)Sender)->StatusCode != -1 )
{
TStatus *Status;
Status = new TStatus(this);
Status->SetElement( (TElemento *)Sender );
Status -> ShowModal();
delete Status;
}
}
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::FormClose(TObject *Sender, TCloseAction &Action)
{
#ifdef DEMOSTRACION
ShowMessage( MsgDEMO );
#endif
clientHook->Close();
Memo1->Lines->Insert( 0, (Now()).DateTimeString() + " :: Fin de la sesión" );
Memo1->Lines->SaveToFile( opLOG );
}
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::FormDeactivate(TObject *Sender)
{
FreeThreads();
}
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::Propiedades1Click(TObject *Sender)
{
if ( ServerHook ) return;
if ( ChangePositionEnabled )
{
TElementosCFG *ElementosCFG;
ElementosCFG = new TElementosCFG(this);
ElementosCFG -> ShowModal();
delete ElementosCFG;
Memo1->Lines->Insert( 0, (Now()).DateTimeString() + " :: Se han modificado las direcciones IP" );
LoadProtectedList();
}
}
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::CerrarWindows1Click(TObject *Sender)
{
TElemento *Elemento = (TElemento *)(mElementoCFG->PopupComponent);
if ( MessageBox( NULL, "¿ Realmente quiere cerrar el equipo ?", AnsiString("Equipo n: -- " + AnsiString( Elemento->NumElemento ) + " --" +" Nombre: \""+Elemento->GiveMyName()+"\"" ).c_str(), MB_OKCANCEL ) == IDOK )
{
if ( ServerHook )
{
ServerHookCode = 5660; ServerHookElement = Elemento->NumElemento;
serverHook->Active = true;
} else
Elemento->CerrarWindows();
}
}
//---------------------------------------------------------------------------
TThread * TCtrlPPal::GetThread(void)
{
TList *pList = pCache->LockList();
TThread *NewThread;
if (pList->Count) // cache is not empty
{
NewThread = (TThread *)pList->Items[0];
pList->Delete(0); // remove from cache
}
else
NewThread = (TThread *)new ThreadSocket(true); // create but dont run
pCache->UnlockList();
return NewThread;
};
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::FreeThreads(void)
{
TList *pList = pCache->LockList();
for (int i = pList->Count - 1; i >= 0; i--)
{
delete pList->Items[i];
pList->Delete(i);
}
pCache->UnlockList();
};
//---------------------------------------------------------------------------
//###########################################################################
//###########################################################################
void __fastcall TCtrlPPal::FormCloseQuery(TObject *Sender, bool &CanClose)
{
// Esperamos a que se cierren los Sockets...
if ( AnySocketActive > 0 )
{
if ( Application->MessageBox("La aplicación sigue intentando comunicarse\ncon algún terminal.\nPor favor, espere...\n(Cancelar el proceso dejará la aplicación\nen un estado Altamente INESTABLE)", AnsiString("¡¡¡ " + AnsiString( AnySocketActive ) + " Alerta(s) !!!").c_str(), MB_OKCANCEL + MB_DEFBUTTON1) != ID_CANCEL )
{
CanClose = false;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::ActualizarEstado1Click(TObject *Sender)
{
if ( ServerHook )
{
ServerHookCode = 5661; ServerHookElement = ( (TElemento *)(mElementoCFG->PopupComponent) )->NumElemento;
serverHook -> Active = true;
} else {
( (TElemento *)(mElementoCFG->PopupComponent) ) -> RefreshElement();
}
}
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::SinTIEMPO1Click(TObject *Sender)
{
TElemento *Elemento = (TElemento *)(mElementoCFG->PopupComponent);
if ( MessageBox( NULL, "¿ Realmente quiere QUITAR EL TIEMPO al equipo ?", AnsiString("Equipo n: -- " + AnsiString( Elemento->NumElemento ) + " --"+" Nombre: \""+Elemento->GiveMyName()+"\"").c_str() , MB_OKCANCEL ) == IDOK )
{
// Actualizamos el historial
TbHistorial -> InsertRecord( ARRAYOFCONST(( Elemento->NumElemento,
(Variant)TDateTime::CurrentDateTime(),
(Variant)Elemento->TiempoRestante(), 0, 998, 0 )) );
TbHistorial -> FlushBuffers();
if ( ServerHook )
{
ServerHookCode = 5668; ServerHookElement = Elemento->NumElemento;
serverHook -> Active = true;
} else
Elemento -> ForcedTimeOut();
}
}
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::TbHistorialBeforeOpen(TDataSet *DataSet)
{
// Si la tabla no existe, la creamos
if ( access( (TbHistorial -> TableName).c_str(), 0 ) != 0 )
{
// Usamos la propiedad FielDefs para definir
// las columnas que contendrá la tabla
TbHistorial -> FieldDefs -> Clear();
TbHistorial -> FieldDefs -> Add("NumElement", ftInteger, 0, false );
TbHistorial -> FieldDefs -> Add("FComienzo", ftDateTime, 0, false );
TbHistorial -> FieldDefs -> Add("Tiempo", ftTime, 0, false );
TbHistorial -> FieldDefs -> Add("idc", ftInteger, 0, false );
TbHistorial -> FieldDefs -> Add("idtc", ftInteger, 0, false );
TbHistorial -> FieldDefs -> Add("precio", ftCurrency, 0, false );
TbHistorial -> IndexDefs -> Clear();
TbHistorial -> IndexDefs -> Add("Primary", "NumElement;FComienzo", TIndexOptions() << ixPrimary << ixUnique );
// Creamos la base...
TbHistorial -> CreateTable();
}
}
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::AsignarHora1Click(TObject *Sender)
{
/*
iAnclada = GetNumElement( Sender );
if ( iAnclada != -1 )
{
Elementos[ iAnclada ]-> EnviarListasAppl();
}
*/
}
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::RemoteStartClick(TObject *Sender)
{
// Remote Start...
if ( AnySocketActive > 0 )
{
ShowMessage( "Imposible enganche remoto,\nhasta que todos los terminales\nacaben su comunicación" );
return;
}
if ( ClientHook )
{
ShowMessage( "Alguien nos tiene enganchados.\nImposible realizar enganche remoto.\n(Pruebe en otro orden)" );
return;
}
RemoteStart -> Visible = false;
ServerHook = true;
remoteBack->Visible = true;
remoteLog->Visible = true;
remoteClose->Visible = true;
remoteLog->Caption= "Inicializando sistema remoto...";
serverHook->Address = InputBox("Conexión Control Remoto", "IP Destino:", "0.0.0.0");
remoteLog->Caption= "Eliminando terminales actuales" ;
Elementos->Pack();
for( int i=0; i < Elementos->Count; i++ )
{
Pizarra->RemoveControl( (TElemento *)Elementos->Items[i] );
delete (TElemento *)Elementos->Items[i];
}
Elementos->Clear();
remoteLog->Caption= "Accediendo a los terminales remotos" ;
ServerHookCode = 5650; ServerHookElement = 5650;
serverHook->Active = true;
}
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::remoteCloseDblClick(TObject *Sender)
{
if ( ClientHook )
{
ShowMessage( "Alguien nos tiene enganchados.\nImposible des-enganche remoto.\nRiesgo de incomunicación parcial" );
return;
}
remoteLog->Caption= "Eliminando terminales actuales" ;
Elementos->Pack();
for( int i=0; i < Elementos->Count; i++ )
{
Pizarra->RemoveControl( (TElemento *)Elementos->Items[i] );
delete (TElemento *)Elementos->Items[i];
}
Elementos->Clear();
ServerHook = false;
remoteLog->Caption= "Cargando Terminales Locales" ;
TbElementosCFGAfterOpen(0);
RemoteStart -> Visible = true;
remoteBack->Visible = false;
remoteLog->Visible = false;
remoteClose->Visible = false;
}
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::clientHookClientConnect(TObject *Sender,
TCustomWinSocket *Socket)
{
Memo1->Lines->Insert( 0, (Now()).DateTimeString() + " :: Nos han enganchado :: " + Socket->LocalAddress );
ClientHook = true;
}
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::clientHookClientDisconnect(TObject *Sender,
TCustomWinSocket *Socket)
{
Memo1->Lines->Insert( 0, (Now()).DateTimeString() + " :: Desenganche " );
ClientHook = false;
}
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::clientHookClientError(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
Memo1->Lines->Insert( 0, (Now()).DateTimeString() + " :: Cliente ¡ ERROR ! " + AnsiString( ErrorCode ) + "::" + Socket->LocalAddress );
}
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::SetActiveTimeElement( TElemento *Elemento, TDateTime Tiempo, int L_idc, int L_idtc, Currency L_Precio )
{
if ( ServerHook )
{
ServerHookCode = 5669; ServerHookElement = Elemento->NumElemento;
ServerTiempo = Tiempo; ServerL_idc = L_idc; ServerL_idtc = L_idtc; ServerL_Precio = (double)L_Precio;
serverHook -> Active = true;
} else
Elemento->SetActiveTime( Tiempo, L_idc, L_idtc, L_Precio );
}
//---------------------------------------------------------------------------
TElemento * __fastcall TCtrlPPal::SearchElement( int NumEl )
{
for (int i = Elementos->Count - 1; i >= 0; i--)
{
if ( ((TElemento *)(Elementos->Items[i]))->NumElemento == NumEl )
return (TElemento *)(Elementos->Items[i]);
}
return NULL;
}
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::clientHookAccept(TObject *Sender,
TCustomWinSocket *Socket)
{
int CodOp, dev;
double Tiempo;
TElemento *Elemento;
TWinSocketStream *pStream;
Memo1->Lines->Insert( 0, "Conexión aceptada de " + Socket->RemoteAddress );
try {
pStream = new TWinSocketStream( Socket, 60000 );
try{
// Socket->ReceiveBuf( &CodOp, sizeof(int) );
pStream->WaitForData(30000); pStream->Read( &CodOp, sizeof(int) );
if ( CodOp != 5650 )
{
dev = ( Elemento = SearchElement( CodOp ) ) == NULL ? 1 : 0;
// Socket->SendBuf( &dev, sizeof(int) );
pStream->Write( &dev, sizeof(int) );
if ( dev ) return;
}
ClientHook = true;
// Socket->ReceiveBuf( &CodOp, sizeof(int) );
pStream->WaitForData(30000); pStream->Read( &CodOp, sizeof(int) );
switch( CodOp )
{
// On
case 5669:
int L_idc, L_idtc;
float L_Precio;
/*
Socket->ReceiveBuf( &Tiempo, sizeof(double) );
Socket->ReceiveBuf( &L_idc, sizeof(int) );
Socket->ReceiveBuf( &L_idtc, sizeof(int) );
Socket->ReceiveBuf( &L_Precio, sizeof(float) );
*/
pStream->WaitForData(30000); pStream->Read( &Tiempo, sizeof(double) );
pStream->WaitForData(30000); pStream->Read( &L_idc, sizeof(int) );
pStream->WaitForData(30000); pStream->Read( &L_idtc, sizeof(int) );
pStream->WaitForData(30000); pStream->Read( &L_Precio, sizeof(float) );
SetActiveTimeElement( Elemento, Tiempo, L_idc, L_idtc, (Currency)L_Precio );
break;
// Off
case 5668:
Elemento -> ForcedTimeOut();
break;
// CERRAR WINDOWS
case 5660:
Elemento->CerrarWindows();
break;
// Query TIME (Refresh)
case 5661:
Elemento -> RefreshElement();
Tiempo = Elemento->iTiempoPedido();
// Socket->SendBuf( &Tiempo, sizeof(double) );
pStream->WaitForData(30000); pStream->Read( &Tiempo, sizeof(double) );
Tiempo = Elemento->RTiempoRestante;
// Socket->SendBuf( &Tiempo, sizeof(double) );
pStream->WaitForData(30000); pStream->Read( &Tiempo, sizeof(double) );
break;
// Lista de elementos...
case 5650:
dev = Elementos->Count;
// Socket->SendBuf( &dev, sizeof(int) );
pStream->Write( &dev, sizeof(int) );
for (int i = Elementos->Count - 1; i >= 0; i--)
{
Elemento = (TElemento *)(Elementos->Items[i]);
//void __fastcall TCtrlPPal::NewElementAt(int X, int Y, int NumEl, AnsiString IP, AnsiString Name )
/*
Socket->SendBuf( &(Elemento->Left), sizeof(int) );
Socket->SendBuf( &(Elemento->Top), sizeof(int) );
Socket->SendBuf( &(Elemento->NumElemento), sizeof(int) );
Socket->SendBuf( Elemento->GiveMyIP().c_str(), 70 );
Socket->SendBuf( Elemento->GiveMyName().c_str(), 70 );
Tiempo = Elemento->iTiempoPedido(); Socket->SendBuf( &Tiempo, sizeof(double) );
Tiempo = Elemento->RTiempoRestante; Socket->SendBuf( &Tiempo, sizeof(double) );
*/
pStream->Write( &(Elemento->Left), sizeof(int) );
pStream->Write( &(Elemento->Top), sizeof(int) );
pStream->Write( &(Elemento->NumElemento), sizeof(int) );
pStream->Write( Elemento->GiveMyIP().c_str(), 70 );
pStream->Write( Elemento->GiveMyName().c_str(), 70 );
Tiempo = Elemento->iTiempoPedido(); pStream->Write( &Tiempo, sizeof(double) );
Tiempo = Elemento->RTiempoRestante; pStream->Write( &Tiempo, sizeof(double) );
Elemento -> RefreshElement();
}
break;
default:
Memo1->Lines->Insert( 0, "Mensaje desconocido ::" + Socket->RemoteAddress );
}
}
catch (Exception &E)
{
if (!E.ClassNameIs("EAbort"))
{
Memo1->Lines->Insert( 0, "ERROR en la comunicación ::" + Socket->RemoteAddress );
}
}
}
__finally
{
delete pStream;
Socket->Close();
}
Memo1->Lines->Insert( 0, "Tramites Finalizados ::" + Socket->RemoteAddress );
}
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::serverHookConnect(TObject *Sender,
TCustomWinSocket *Socket)
{
double TiempoPedido, TiempoRestante;
TWinSocketStream *pStream;
int Data;
// create a TWinSocketStream for reading and writing
try {
pStream = new TWinSocketStream( Socket, 60000 );
try
{
pStream->Write( &ServerHookElement, sizeof(int) );
if ( ServerHookCode != 5650 )
{
pStream->WaitForData(30000);
pStream->Read( &Data, sizeof(int) );
if ( Data == 1 )
{
Socket->Close();
return;
}
}
pStream->Write( &ServerHookCode, sizeof(int) );
// Comunicamos según código en ServerHookCode
switch ( ServerHookCode )
{
// On
case 5669:
pStream->Write( &ServerTiempo, sizeof(double) );
pStream->Write( &ServerL_idc, sizeof(int) );
pStream->Write( &ServerL_idtc, sizeof(int) );
pStream->Write( &ServerL_Precio, sizeof(float) );
break;
// Off
case 5668:
// Nada mas
break;
// CERRAR WINDOWS
case 5660:
// Nada mas
break;
// Lista de elementos...
case 5650:
pStream->WaitForData(30000); // Inicio
pStream->Read( &Data, sizeof(int) );
int X,Y, NumEl; char IP[80], Name[80];
for (int i = Data - 1; i >= 0; i--)
{
pStream->WaitForData(30000); pStream->Read( &X, sizeof(int) );
pStream->WaitForData(30000); pStream->Read( &Y, sizeof(int) );
pStream->WaitForData(30000); pStream->Read( &NumEl, sizeof(int) );
pStream->WaitForData(30000); pStream->Read( &IP, 70 );
pStream->WaitForData(30000); pStream->Read( &Name, 70 );
NewElementAt( X, Y, NumEl, IP, Name );
pStream->WaitForData(30000); pStream->Read( &TiempoPedido, sizeof(double) );
pStream->WaitForData(30000); pStream->Read( &TiempoRestante, sizeof(double) );
SearchElement( NumEl ) -> ClientTimeIs( TiempoPedido, TiempoRestante );
}
break;
// Query TIME (Refresh)
case 5661:
pStream->WaitForData(30000); // Inicio
pStream->Read( &TiempoPedido, sizeof(double) );
pStream->WaitForData(30000); // Restante
pStream->Read( &TiempoRestante, sizeof(double) );
SearchElement( ServerHookElement ) -> ClientTimeIs( TiempoPedido, TiempoRestante );
break;
default:
Memo1->Lines->Insert( 0, "Mensaje desconocido ::" + Socket->RemoteAddress );
}
}
catch (Exception &E)
{
if (!E.ClassNameIs("EAbort"))
{
Memo1->Lines->Insert( 0, "ERROR en la comunicación ::" + Socket->RemoteAddress );
}
}
}
__finally
{
delete pStream;
Socket->Close();
}
}
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::ActiveImage3Click(TObject *Sender)
{
clientHook -> Active = !clientHook -> Active;
}
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::Image1Click(TObject *Sender)
{
char zFileName[80], zParams[80], zDir[80];
ShellExecute(Application->MainForm->Handle, 0, StrPCopy(zFileName, "http:\\\\www.infdj.com"),
StrPCopy(zParams, ""), StrPCopy(zDir, ""), SW_SHOWNOACTIVATE > 32);
}
//---------------------------------------------------------------------------
void __fastcall TCtrlPPal::TbPersonasNewRecord(TDataSet *DataSet)
{
TbPersonas->FieldByName( "FAlta" )->AsDateTime = TDateTime::CurrentDateTime();
TbPersonas->FieldByName( "FModif" )->AsDateTime = TDateTime::CurrentDateTime();
}
//---------------------------------------------------------------------------