Imported Upstream version 878.70.2
[platform/upstream/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