]> git.saurik.com Git - apple/mdnsresponder.git/blob - mDNSMacOSX/BonjourTop/source/CaptureFile.cpp
mDNSResponder-1310.60.4.tar.gz
[apple/mdnsresponder.git] / mDNSMacOSX / BonjourTop / source / CaptureFile.cpp
1 //
2 // CaptureFile.cpp
3 // TestTB
4 //
5 // Created by Terrin Eager on 9/14/12.
6 //
7 //
8
9 #include "CaptureFile.h"
10 #include <stdio.h>
11 #include <pcap.h>
12 #include <sys/types.h>
13
14 #define BJ_MAX_PACKET (1024*20)
15
16 struct packetheader
17 {
18 __uint32_t sec;
19 __uint32_t usec;
20 __uint32_t captureLen;
21 __uint32_t origLen;
22
23 };
24
25
26 CCaptureFile::CCaptureFile()
27 {
28 m_pFileHeader = NULL;
29 m_pFrameData = NULL;
30 m_pFrameHeader = NULL;
31 m_hFile = NULL;
32
33 m_nFirstFrameTime = 0;
34
35 if (!Init())
36 Clear();
37 }
38 CCaptureFile::~CCaptureFile()
39 {
40 Clear();
41 }
42
43 bool CCaptureFile::Init()
44 {
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];
48
49 return (m_pFrameHeader && m_pFrameData && m_pFileHeader);
50 }
51
52 bool CCaptureFile::Clear()
53 {
54 delete m_pFileHeader; m_pFileHeader = NULL;
55 delete m_pFrameData; m_pFrameData = NULL;
56 delete m_pFrameHeader; m_pFrameHeader = NULL;
57
58 fclose(m_hFile); m_hFile = NULL;
59 return true;
60 }
61
62 bool CCaptureFile::Open(const char* pFileName)
63 {
64 m_hFile = fopen(pFileName, "r");
65
66 if (!m_hFile)
67 {
68 printf("Failed to open %s\n",pFileName);
69 return false;
70 }
71
72
73 fread(m_pFileHeader, sizeof(pcap_file_header), 1,m_hFile);
74
75 // pcap_file_header* pHeader = (pcap_file_header*)m_pFileHeader;
76 // int magic = pHeader->magic;
77 // int nType = pHeader->linktype;
78
79 pcap_file_header* pHeader = (pcap_file_header*)m_pFileHeader;
80 m_datalinkType = (Frame::BJ_DATALINKTYPE) pHeader->linktype;
81 m_CurrentFrame.SetDatalinkType(m_datalinkType);
82 return true;
83 }
84
85 bool CCaptureFile::NextFrame()
86 {
87 packetheader* pFrameHeader = NULL;
88
89 if(!m_hFile)
90 return false;
91
92 if (fread(m_pFrameHeader,1,sizeof(packetheader),m_hFile)< sizeof(packetheader))
93 return false;
94
95 pFrameHeader = (packetheader*) m_pFrameHeader;
96
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
102
103 long nSkip = 0;
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;
108 }
109
110 if (fread(m_pFrameData,1,m_nCaptureLen,m_hFile) < m_nCaptureLen)
111 return false;
112
113 if (nSkip)
114 fseek(m_hFile, nSkip, SEEK_CUR);
115
116 m_CurrentFrame.Set(m_pFrameData, m_nCaptureLen,pFrameHeader->sec*1000000ll + pFrameHeader->usec);
117
118
119 return true;
120 }
121
122 bool CCaptureFile::Close()
123 {
124
125 return true;
126 }
127
128 __uint32_t CCaptureFile::GetDeltaTime()
129 {
130 return m_TimeSec-m_nFirstFrameTime;
131 }
132
133 __uint32_t CCaptureFile::GetBufferLen(BJ_UINT8* pStart)
134 {
135 return m_nCaptureLen - (__uint32_t) (pStart - m_pFrameData);
136 }
137
138
139
140
141