#include "stdafx.h"
|
#include "SaveFile.h"
|
#include <iostream>
|
#include <vector>
|
#include "SaveSQL.h"
|
|
SaveFile::SaveFile()
|
{
|
buf = new char[BUF_MAX_SIZE]; // 8kÊý¾Ýλ
|
memset(buf, 0, BUF_MAX_SIZE);
|
flag = 0;
|
}
|
|
|
SaveFile::~SaveFile()
|
{
|
if (fileName)
|
{
|
delete fileName;
|
}
|
if (buf) {
|
delete[] buf;
|
}
|
}
|
|
int SaveFile::fileop(char* str, int len)
|
{
|
if (!str || len <= 0) {
|
return -1;
|
}
|
Head *head = (Head*)str;
|
if (head->type != UPLOAD_REQ)
|
{
|
return -1;
|
}
|
int type = *(int *)(str + sizeof(Head));
|
if (type == HEAD_UPLOAD_REQ) {
|
return fileHead(str, len);
|
}
|
else if (type == DATA_UPLOAD_REQ) {
|
return fileData(str, len);
|
}
|
else if (type == UP_LOAD_FIN) {
|
return fileFin(str, len);
|
}
|
else {
|
return -1;
|
}
|
}
|
|
int SaveFile::fileHead(char* str, int len)
|
{
|
if (!str || len <= 0) {
|
return -1;
|
}
|
/*struct UpLoadPkgHead {
|
Head head;
|
int upLoadType;
|
int fileNameLen;
|
char fileName[0];
|
};*/
|
// µÃµ½ÎļþÃûµÄ³¤¶È
|
int fileNameLen = *(int *)(str + sizeof(Head) + sizeof(int));
|
if (fileNameLen <= 0) {
|
return -1;
|
}
|
char *fileNameStr = (str + sizeof(Head) + sizeof(int) * 2);
|
fileName = new std::string(fileNameStr);
|
std::cout << fileName->data() << std::endl;
|
return 0;
|
}
|
|
int SaveFile::fileData(char* str, int len)
|
{
|
if (!str || len <= 0) {
|
return -1;
|
}
|
/*struct UpLoadPkgData {
|
Head head;
|
int upLoadType;
|
int fileNameLen;
|
int dataLen;
|
int flag;
|
char data[0];
|
};*/
|
int fileNameLen = *(int *)(str + sizeof(Head) + sizeof(int));
|
if (fileNameLen <= 0) {
|
return -1;
|
}
|
|
int recvflg = *(int *)(str + sizeof(Head) + sizeof(int)*3);
|
if (recvflg - 1 != flag) { // Êý¾ÝÍêÕûÐÔУÑé¡£
|
flag = 0;
|
return -1;
|
}
|
flag = recvflg;
|
char* name = (str + sizeof(Head) + sizeof(int) * 4);
|
std::string *recvfilename = new std::string(name);
|
if (*fileName != *recvfilename) {
|
flag = 0;
|
delete recvfilename;
|
return -1;
|
}
|
delete recvfilename;
|
int datalen = *(int *)(str + sizeof(Head) + sizeof(int) * 2);
|
char* recvdata = str + sizeof(Head) + sizeof(int) * 4 + fileNameLen + 1;
|
strcpy_s(buf, BUF_MAX_SIZE, recvdata);
|
std::ofstream fp(std::string(FILE_PATH) + fileName->data(),std::ios::app | std::ios::binary);
|
if (!fp.is_open()) {
|
return -1;
|
}
|
fp << buf;
|
if (fp.fail()) {
|
fp.close();
|
return -1;
|
}
|
fp.close();
|
memset(buf, 0, BUF_MAX_SIZE);
|
return 0;
|
}
|
|
int SaveFile::fileFin(char* str, int len)
|
{
|
if (!str || len <= 0) {
|
return -1;
|
}
|
/*struct UpLoadPkgFin {
|
Head head;
|
int upLoadType;
|
int fileNameLen;
|
int verSionLen; // ÎļþÐÅÏ¢£¬ÐèÒª½âÎö³öÀ´´æÊý¾Ý¿â
|
int cnt;
|
char fileName[0];
|
};*/
|
int cnt = *(int *)(str + sizeof(Head) + sizeof(int) * 3);
|
if (flag != cnt) {
|
flag = 0;
|
return -1;
|
}
|
char* filename = str + sizeof(Head) + sizeof(int) * 4;
|
std::string *recvfilename = new std::string(filename);
|
if (*fileName != *recvfilename) {
|
flag = 0;
|
delete recvfilename;
|
return -1;
|
}
|
int fileNameLen = *(int *)(str + sizeof(Head) + sizeof(int) * 1);
|
char *pVersionInfo = str + sizeof(Head) + sizeof(int) * 4 + fileNameLen;
|
std::string stVersion(pVersionInfo);
|
std::vector<std::string> versionInfo = split(stVersion, '#');
|
|
instFiles.filename = std::string(FILE_PATH) + fileName->data();
|
instFiles.current_ver = versionInfo[1];
|
instFiles.created_tm = curTime();
|
instFiles.updated_tm = curTime();
|
|
instVersions.created_tm = curTime();
|
instVersions.depends_on = DEPENDS_OFF;
|
instVersions.desc = versionInfo[4];
|
SaveSQL sql;
|
instVersions.file_id = sql.get_file_ID(instFiles.filename);
|
sql.create_InsFiles(instFiles);
|
sql.create_InsVersions(instVersions);
|
|
delete recvfilename;
|
return 0;
|
}
|
|
std::vector<std::string> SaveFile::split(const std::string &s, char delimiter)
|
{
|
std::vector<std::string> tokens;
|
size_t start = 0;
|
size_t end = s.find(delimiter);
|
|
while (end != std::string::npos) {
|
tokens.push_back(s.substr(start, end - start));
|
start = end + 1;
|
end = s.find(delimiter, start);
|
}
|
|
tokens.push_back(s.substr(start));
|
return tokens;
|
}
|
|
std::string SaveFile::curTime()
|
{
|
time_t now = time(nullptr);
|
tm localtm;
|
localtime_s(&localtm,&now);
|
|
std::ostringstream os;
|
os << std::put_time(&localtm, "%Y-%m-%d %H:%M:%S");
|
return std::string(os.str());
|
}
|