233 lines
5.3 KiB
C++
233 lines
5.3 KiB
C++
#include "StdAfx.h"
|
|
#include "FileTransferManager.h"
|
|
#include "DataTransfer.h"
|
|
|
|
#include "_log.h"
|
|
#include "proceso_cliente.h"
|
|
#include "sock_sv.h"
|
|
#include "dir_manager.h"
|
|
#include "StrArray.h"
|
|
|
|
#define MODULO "ProcClient"
|
|
//*****************************************************************************
|
|
FileTransferManager::FileTransferManager(void)
|
|
{
|
|
pirate = false;
|
|
dirRaid[0]=0;
|
|
}
|
|
//*****************************************************************************
|
|
FileTransferManager::~FileTransferManager(void)
|
|
{
|
|
}
|
|
//*****************************************************************************
|
|
bool FileTransferManager::envia(int id)
|
|
{
|
|
return soc->envia_package((BYTE*)&id, sizeof(id)) == TRUE;
|
|
}
|
|
//*****************************************************************************
|
|
bool FileTransferManager::envia(void *buf, int siz)
|
|
{
|
|
return soc->envia_package((BYTE*)buf, siz) == TRUE;
|
|
}
|
|
//*****************************************************************************
|
|
void FileTransferManager::run()
|
|
{
|
|
DataTransfer dt;
|
|
Cb_file f;
|
|
char str[512];
|
|
int nr=0;
|
|
int nraid=0;
|
|
void *buf;
|
|
StrArray files,dirs;
|
|
C_log::log(MODULO, "Iniciada Conexion");
|
|
if(!dt.setData(soc,&f) || !dt.setMode(DataTransfer::MODE_SEND))
|
|
{
|
|
C_log::log(MODULO, "error al iniciar buffers de transmision");
|
|
pirate =true;
|
|
}
|
|
while(!pirate && !*soc->pirate)
|
|
{
|
|
if(exSal && *exSal)
|
|
{
|
|
C_log::log(MODULO, "Sale por desconexion del socket");
|
|
pirate =true;
|
|
continue;
|
|
}
|
|
if(!soc->recibe_package(0))
|
|
{
|
|
nr++;
|
|
if(nr>1000)
|
|
{
|
|
pirate = true;
|
|
C_log::log(MODULO, "Sobrepasado tiempo de espera.");
|
|
}
|
|
else
|
|
Sleep(1);
|
|
continue;
|
|
}
|
|
nr =0;
|
|
//recive package-------------
|
|
if(soc->nb<sizeof(int))
|
|
{
|
|
C_log::log(MODULO, "Datos erroneos");
|
|
pirate = true;
|
|
continue;
|
|
}
|
|
int idp = *(int*)soc->buf;
|
|
int nb =soc->nb-(sizeof(int));
|
|
buf = &((int*)soc->buf)[1];
|
|
switch(idp)
|
|
{
|
|
|
|
case(PETICION_GENERAL_PRESENTA):
|
|
//pilla usuario, pilla key
|
|
if(nb!= sizeof(usu))
|
|
{
|
|
C_log::log(MODULO, "Paquete de presentacion defectuoso");
|
|
pirate = true;
|
|
break;
|
|
}
|
|
memcpy(&usu, buf,sizeof(usu));
|
|
usu.nombre[31] = 0;
|
|
usu.clave[31] = 0;
|
|
char claveUser[32];
|
|
memcpy(claveUser, usu.clave,32);
|
|
nraid = 0;
|
|
dirRaid[0]=0;
|
|
if(duProv)
|
|
{
|
|
if(!duProv->fill(&usu, dirRaid))
|
|
{
|
|
envia(PETICION_GENERAL_NO);
|
|
C_log::log(MODULO, "Error al pillar datos de usuario: %s",usu.nombre);
|
|
pirate = true;
|
|
}
|
|
}
|
|
nraid = strlen(dirRaid);
|
|
if(strcmp(usu.clave, claveUser))
|
|
{
|
|
envia(PETICION_GENERAL_NO);
|
|
C_log::log(MODULO, "Error clave de usuario incorrecta usuario: %s key: %s",usu.nombre, claveUser);
|
|
pirate = true;
|
|
}
|
|
C_log::log(MODULO, "Presentado usuario %s",usu.nombre);
|
|
if(!envia(PETICION_GENERAL_OK))
|
|
{
|
|
C_log::log(MODULO, "Error al enviar ok en presentacion");
|
|
pirate = true;
|
|
}
|
|
break;
|
|
case(PETICION_GENERAL_OK)://envia descargar archivo
|
|
//pilla path
|
|
if(nb!= 256)
|
|
{
|
|
C_log::log(MODULO, "Paquete ok defectuoso");
|
|
pirate = true;
|
|
break;
|
|
}
|
|
memcpy(str,dirRaid,nraid);
|
|
memcpy(&str[nraid], buf, 256);
|
|
str[255]=0;
|
|
C_log::log(MODULO, "Peticion de descarga de archivo %s", str);
|
|
if(!f.abre(str,1,FALSE,TRUE))
|
|
{
|
|
if(!envia(PETICION_GENERAL_NO))
|
|
{
|
|
C_log::log(MODULO, "Error al enviar no en descarga");
|
|
pirate = true;
|
|
}
|
|
break;
|
|
}
|
|
if(!envia(PETICION_GENERAL_OK))
|
|
{
|
|
C_log::log(MODULO, "Error al enviar no en descarga");
|
|
pirate = true;
|
|
break;
|
|
}
|
|
if(!dt.start())
|
|
{
|
|
C_log::log(MODULO, "Error al iniciar descarga");
|
|
pirate = true;
|
|
break;
|
|
}
|
|
while(dt.currando())
|
|
Sleep(10);
|
|
if(dt.isCanceled())
|
|
{
|
|
C_log::log(MODULO, "Error al descargar archivo");
|
|
pirate = true;
|
|
break;
|
|
}
|
|
C_log::log(MODULO, "Descarga archivo Exitosa");
|
|
break;
|
|
case(PETICION_GENERAL_NO):
|
|
if(!envia(PETICION_GENERAL_OK))
|
|
{
|
|
C_log::log(MODULO, "Error al enviar no");
|
|
pirate = true;
|
|
}
|
|
break;
|
|
case(PETICION_GENERAL_FIN):
|
|
C_log::log(MODULO, "Recibida desconexion");
|
|
pirate = true;
|
|
break;
|
|
case(FILE_TRANSMISION_GET_FILES):
|
|
C_log::log(MODULO, "Recibida peticion de getFiles");
|
|
//pilla path
|
|
if(nb!= 256)
|
|
{
|
|
C_log::log(MODULO, "Paquete ok defectuoso");
|
|
pirate = true;
|
|
break;
|
|
}
|
|
memcpy(str,dirRaid,nraid);
|
|
memcpy(&str[nraid], buf, 256);
|
|
str[255]=0;
|
|
if(!Cdir_manager::listar_elementos(str, &files, &dirs))
|
|
{
|
|
if(!envia(PETICION_GENERAL_NO))
|
|
{
|
|
C_log::log(MODULO, "Error al enviar no");
|
|
pirate = true;
|
|
}
|
|
break;
|
|
|
|
}
|
|
if(!envia(PETICION_GENERAL_OK))
|
|
{
|
|
C_log::log(MODULO, "Error al enviar ok");
|
|
pirate = true;
|
|
}
|
|
if(!envia(files.n_i))
|
|
{
|
|
C_log::log(MODULO, "Error al enviar strArray");
|
|
pirate = true;
|
|
}
|
|
if(!envia(files.str, files.n_str))
|
|
{
|
|
C_log::log(MODULO, "Error al enviar strArray");
|
|
pirate = true;
|
|
}
|
|
if(!envia(dirs.n_i))
|
|
{
|
|
C_log::log(MODULO, "Error al enviar strArray");
|
|
pirate = true;
|
|
}
|
|
if(!envia(dirs.str, dirs.n_str))
|
|
{
|
|
C_log::log(MODULO, "Error al enviar strArray");
|
|
pirate = true;
|
|
}
|
|
|
|
break;
|
|
default:
|
|
C_log::log(MODULO, "Id cab no reconocido");
|
|
pirate = true;
|
|
break;
|
|
}
|
|
|
|
}
|
|
C_log::log(MODULO, "Se desconecta proceso");
|
|
}
|
|
|
|
//*****************************************************************************
|