TransferSrv_2017/FileTransfer/FileTransferManager.cpp

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");
}
//*****************************************************************************