5 // Created by Terrin Eager on 9/14/12.
9 #include "CaptureFile.h"
12 #include <sys/types.h>
14 #define BJ_MAX_PACKET (1024*20)
20 __uint32_t captureLen;
26 CCaptureFile::CCaptureFile()
30 m_pFrameHeader = NULL;
33 m_nFirstFrameTime = 0;
38 CCaptureFile::~CCaptureFile()
43 bool CCaptureFile::Init()
45 m_pFileHeader = new BJ_UINT8[sizeof(pcap_file_header)];
46 m_pFrameHeader = new BJ_UINT8[sizeof(packetheader)];
47 m_pFrameData = new BJ_UINT8[BJ_MAX_PACKET];
49 return (m_pFrameHeader && m_pFrameData && m_pFileHeader);
52 bool CCaptureFile::Clear()
54 delete m_pFileHeader; m_pFileHeader = NULL;
55 delete m_pFrameData; m_pFrameData = NULL;
56 delete m_pFrameHeader; m_pFrameHeader = NULL;
58 fclose(m_hFile); m_hFile = NULL;
62 bool CCaptureFile::Open(const char* pFileName)
64 m_hFile = fopen(pFileName, "r");
68 printf("Failed to open %s\n",pFileName);
73 fread(m_pFileHeader, sizeof(pcap_file_header), 1,m_hFile);
75 // pcap_file_header* pHeader = (pcap_file_header*)m_pFileHeader;
76 // int magic = pHeader->magic;
77 // int nType = pHeader->linktype;
79 pcap_file_header* pHeader = (pcap_file_header*)m_pFileHeader;
80 m_datalinkType = (Frame::BJ_DATALINKTYPE) pHeader->linktype;
81 m_CurrentFrame.SetDatalinkType(m_datalinkType);
85 bool CCaptureFile::NextFrame()
87 packetheader* pFrameHeader = NULL;
92 if (fread(m_pFrameHeader,1,sizeof(packetheader),m_hFile)< sizeof(packetheader))
95 pFrameHeader = (packetheader*) m_pFrameHeader;
97 m_nWireLen = pFrameHeader->origLen;
98 m_TimeSec = pFrameHeader->sec;
99 if (m_nFirstFrameTime == 0)
100 m_nFirstFrameTime = m_TimeSec;
101 m_nCaptureLen = pFrameHeader->captureLen; // to do handle frames bigger than buffer
104 if (m_nCaptureLen > BJ_MAX_PACKET)
105 { // force truncate the packet ...
106 nSkip = m_nCaptureLen - BJ_MAX_PACKET;
107 m_nCaptureLen = BJ_MAX_PACKET;
110 if (fread(m_pFrameData,1,m_nCaptureLen,m_hFile) < m_nCaptureLen)
114 fseek(m_hFile, nSkip, SEEK_CUR);
116 m_CurrentFrame.Set(m_pFrameData, m_nCaptureLen,pFrameHeader->sec*1000000ll + pFrameHeader->usec);
122 bool CCaptureFile::Close()
128 __uint32_t CCaptureFile::GetDeltaTime()
130 return m_TimeSec-m_nFirstFrameTime;
133 __uint32_t CCaptureFile::GetBufferLen(BJ_UINT8* pStart)
135 return m_nCaptureLen - (__uint32_t) (pStart - m_pFrameData);