📄 net_bk.cpp
字号:
#include "stdafx.h"
#include "net_bk.h"
#include "../NetDef.h"
#include "net_opt.h"
#include "../notif/notif_bk.h"
#include "io.h"
//////////////////////////////////////////////////////////////////////////
//
// class "net_bk", 备份网络线程
//
//////////////////////////////////////////////////////////////////////////
//##ModelId=3F9A1D240146
net_bk::net_bk():
bklength(0), bkfile(NULL), bkcb(NULL),
exiting(true), finished(true), total_bytes(0),backup_is_start(false)
{
}
//##ModelId=3F9A1D240147
net_bk::~net_bk()
{
}
//##ModelId=3F9A1D240164
bool net_bk::create(net_addr& na,int type)
{
exiting = false;
finished = false;
total_bytes = 0;
bkbuf.Clear();
return net_tcp::create(na,type);
}
//##ModelId=3F9A1D24015A
void net_bk::destroy()
{
backup_is_start = false;
exiting = true;
finished = true;
Sleep(10);
net_tcp::destroy();
bkbuf.Clear();
bklength = 0;
bkfile = NULL;
total_bytes = 0;
bkcb = NULL;
}
//##ModelId=3F9A1D240129
void net_bk::on_recv(byte* buf, int length)
{
if( exiting )
return;
if(finished)
return;
total_bytes += length;
//TRACE("total_bytes: %d\n", total_bytes);
/*
* 收到备份数据 ( 来自net_tcp::got_something() @ thread#net_tcp::thread_base )
*/
write_backup_data(buf, length) ;
//Sleep(1);
}
//##ModelId=3F9A1D240151
void net_bk::set_path(LPCTSTR p)
{
path = p;
}
//##ModelId=3F9A1D240100
void net_bk::write_backup_data(byte* buf, int length)
{
//TRACE("[backup] received %d bytes\n", length);
if( bkcb )
{
POST_NOTIFY(bkcb, NTM_BK_PROGRESS, GetIpAddr(), total_bytes) ;
}
bkbuf.PutBackupData(buf, length);
for ( int i=0;; i++)
{
if( exiting )
break;
if( finished)
break;
if (bkbuf.nFrameLen)
{ //
if (!RcvBackupFrameData())
break ;
}
else
{ //new frame
if (!RcvBackupNewFrameData())
break ;
}
}
}
//##ModelId=3F9A1D240114
BOOL net_bk::RcvBackupFrameData()
{
int len, rest ;
len = bkbuf.GetBackupBufLen() ;
if (len >= bkbuf.nFrameLen) { //save a frame data
rest = BACKUP_BUF_LEN - bkbuf.nRr ;
if (rest >= bkbuf.nFrameLen) {
if (bkfile)
{
fwrite(bkbuf.buf + bkbuf.nRr, bkbuf.nFrameLen, 1, bkfile) ;
bklength += bkbuf.nFrameLen;
}
bkbuf.nRr += bkbuf.nFrameLen ;
if (bkbuf.nRr >= BACKUP_BUF_LEN)
bkbuf.nRr = 0 ;
}
else {
if (bkfile)
{
fwrite(bkbuf.buf + bkbuf.nRr, rest, 1, bkfile) ;
fwrite(bkbuf.buf, bkbuf.nFrameLen - rest, 1, bkfile) ;
bklength += rest;
bklength += bkbuf.nFrameLen - rest;
}
bkbuf.nRr = bkbuf.nFrameLen - rest ;
}
bkbuf.nFrameLen = 0 ;
bkbuf.nFrameType = END_FRAMEFLAG ;
return TRUE ;
}
else
return FALSE ;
}
//##ModelId=3F9A1D240115
BOOL net_bk::RcvBackupNewFrameData()
{
int len ;
unsigned long size ;
len = bkbuf.GetBackupBufLen() ;
if (len < 14)
return FALSE ;
switch (bkbuf.buf[bkbuf.nRr]) {
case 'T' : //file head
if (++bkbuf.nRr >= BACKUP_BUF_LEN)
bkbuf.nRr = 0 ;
if (is_backup_header(bkbuf.nRr)) {
bkbuf.nRr += 13 ;
if (bkbuf.nRr >= BACKUP_BUF_LEN)
bkbuf.nRr -= BACKUP_BUF_LEN ;
}
break ;
case VIDEO_KEYFRAME :
//main->SendMessage(WM_NET_BACKUP_FILE, 0, 0) ;
if( bkcb )
{
POST_NOTIFY(bkcb, NTM_BK_PROGRESS, GetIpAddr(), 0);
}
case VIDEO_FRAME :
case AUDIO_FRAME :
bkbuf.nFrameType = bkbuf.buf[bkbuf.nRr] ;
if (++bkbuf.nRr >= BACKUP_BUF_LEN)
bkbuf.nRr = 0 ;
bkbuf.nFrameLen = bkbuf.buf[bkbuf.nRr] ;
if (++bkbuf.nRr >= BACKUP_BUF_LEN)
bkbuf.nRr = 0 ;
bkbuf.nFrameLen += ((bkbuf.buf[bkbuf.nRr])<<8) ;
if (++bkbuf.nRr >= BACKUP_BUF_LEN)
bkbuf.nRr = 0 ;
bkbuf.nFrameLen += ((bkbuf.buf[bkbuf.nRr])<<16) ;
if (++bkbuf.nRr >= BACKUP_BUF_LEN)
bkbuf.nRr = 0 ;
if (bkfile) {
size = ftell(bkfile) ;
if (bkbuf.nFrameType == AUDIO_FRAME)
size |= 0x40000000 ;
if (bkbuf.nFrameType == VIDEO_FRAME)
size |= 0x80000000 ;
if (bkbuf.nFrameType == VIDEO_KEYFRAME)
size |= 0xc0000000 ;
fseek(bkfile, bkbuf.nFrameNum*4, SEEK_SET) ;
fwrite((byte*)(&size), 4, 1, bkfile) ;
fseek(bkfile, 0, SEEK_END) ;
bkbuf.nFrameNum ++ ;
}
break ;
default :
if (++bkbuf.nRr >= BACKUP_BUF_LEN)
bkbuf.nRr = 0 ;
break ;
}
return TRUE ;
}
//##ModelId=3F9A1D24011E
BOOL net_bk::is_backup_header(int pos)
{
int i ;
unsigned char Buf[10], pFileBuf[32768] ;
CString str ;
if (bkbuf.buf[pos] != 'M')
return FALSE ;
if (++pos >= BACKUP_BUF_LEN)
pos = 0 ;
if (bkbuf.buf[pos] != 'V')
return FALSE ;
if (++pos >= BACKUP_BUF_LEN)
pos = 0 ;
if (bkbuf.buf[pos] != 'D')
return FALSE ;
if (++pos >= BACKUP_BUF_LEN)
pos = 0 ;
if (bkbuf.buf[pos] != NETCOM_BACKUP_FILEHEAD) {
if (bkbuf.buf[pos] == NETCOM_BACKUP_END) { //backup end
if( bkcb )
{
if( bkfile )
{
POST_NOTIFY(bkcb, NTM_BK_FINISHED, GetIpAddr(), 0);
}
else
{
POST_NOTIFY(bkcb, NTM_BK_EMPTY, GetIpAddr(), 0);
}
}
if (bkfile) {
fclose(bkfile) ;
bkfile = NULL ;
}
//EndBackupSocket() ;
destroy();
//main->SendMessage(WM_NET_BACKUP_END, 0, 0) ;
return TRUE ;
}
return FALSE ;
}
for (i=0;i<9;i++) {
if (++pos >= BACKUP_BUF_LEN)
pos = 0 ;
Buf[i] = bkbuf.buf[pos] ;
}
if (bkfile) {
fclose(bkfile) ;
bkfile = NULL ;
}
//new file
bkbuf.nFrameNum = 0 ;
str.Format(_T("%s\\%02d%02d%02d%c%c.MOV"), path, Buf[4], Buf[5], Buf[6], Buf[7], Buf[8]) ;
bkfile = fopen(str, _T("wb")) ;
if( !bkfile )
{
POST_NOTIFY(bkcb, NTM_BK_FAILED, GetIpAddr(), 0);
destroy();
return FALSE;
}
TRACE("backup: create file %s\n", str);
memset(pFileBuf, 0, 32768) ;
fwrite(pFileBuf, 32768, 1, bkfile) ;
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -