1 /*
2  * \file       snapshot_reader.cpp
3  * \brief      OpenCSD :
4  *
5  * \copyright  Copyright (c) 2015, ARM Limited. All Rights Reserved.
6  */
7 
8 /*
9  * Redistribution and use in source and binary forms, with or without modification,
10  * are permitted provided that the following conditions are met:
11  *
12  * 1. Redistributions of source code must retain the above copyright notice,
13  * this list of conditions and the following disclaimer.
14  *
15  * 2. Redistributions in binary form must reproduce the above copyright notice,
16  * this list of conditions and the following disclaimer in the documentation
17  * and/or other materials provided with the distribution.
18  *
19  * 3. Neither the name of the copyright holder nor the names of its contributors
20  * may be used to endorse or promote products derived from this software without
21  * specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26  * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
30  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33  */
34 
35 #include "snapshot_reader.h"
36 #include "snapshot_parser.h"
37 #include "device_parser.h"
38 
39 #include "opencsd.h"
40 
41 #include <fstream>
42 #include <iterator>
43 #include <ios>
44 #include <iostream>
45 
46 #ifdef WIN32
47 #define DIR_CHAR '\\'
48 #else
49 #define DIR_CHAR '/'
50 #endif
51 
52 using namespace Parser;
53 
SnapShotReader()54 SnapShotReader::SnapShotReader() :
55     m_snapshotPath(""),
56     m_snapshot_found(false),
57     m_i_err_log(0),
58     m_errlog_handle(0),
59     m_verbose(true),
60     m_read_ok(false)
61 {
62     checkPath();    // see if default will work.
63 }
64 
~SnapShotReader()65 SnapShotReader::~SnapShotReader()
66 {
67 }
68 
setSnapshotDir(const std::string & dir)69 void SnapShotReader::setSnapshotDir(const std::string &dir)
70 {
71     m_snapshotPath = dir;
72     if(dir.size() > 0)
73     {
74         if(dir.at(dir.size()-1) != DIR_CHAR)
75             m_snapshotPath += DIR_CHAR;
76     }
77     m_read_ok = false;
78     checkPath();
79 }
80 
readSnapShot()81 const bool SnapShotReader::readSnapShot()
82 {
83     bool bRead = true;
84 
85     std::string iniFile = m_snapshotPath + SnapshotINIFilename;
86     std::ifstream in(iniFile.c_str());
87     std::ostringstream oss;
88 
89     if(in.is_open())
90     {
91         Parser::SetVerboseLogging(m_verbose);
92         ModernSnapshotParser parser(in);
93         in.close();
94 
95         if(m_verbose)
96         {
97             oss.str("");
98             oss << "Parsed snapshot.ini." << std::endl;
99             oss << "Found " << parser.getDeviceCount() << " devices." << std::endl;
100             LogInfo(oss.str());
101         }
102 
103         std::vector<int> device_list;
104         parser.getDeviceList(device_list);
105 
106         ModernSnapshotParser::DevPtr device;
107 
108         for(size_t i = 0; i < device_list.size(); i++)
109         {
110             device = parser.getDevice(device_list[i]);
111             if(m_verbose)
112             {
113                 oss.str("");
114                 oss << "Device " << device.get()->getID() << ": Ini file = " << device.get()->getIniFile() << "; Name = " << device.get()->getName() << std::endl;
115                 LogInfo(oss.str());
116             }
117             iniFile = m_snapshotPath + device.get()->getIniFile();
118             in.open(iniFile.c_str());
119             if(in.is_open())
120             {
121                 Parser::Parsed pdev = Parser::ParseSingleDevice(in);
122                 m_parsed_device_list[pdev.deviceName] = pdev;   // map devices by name
123                 in.close();
124 
125             }
126             else
127             {
128                 oss.str("");
129                 oss << "Failed to open device file : " << iniFile << std::endl;
130                 LogError(oss.str());
131             }
132         }
133 
134         if(parser.getTraceMetadataFile().length() > 0)
135         {
136             if(m_verbose)
137             {
138                 oss.str("");
139                 oss << "Trace Metadata ini file found : " << parser.getTraceMetadataFile() << std::endl;
140                 LogInfo(oss.str());
141             }
142 
143             iniFile = m_snapshotPath + parser.getTraceMetadataFile();
144             in.open(iniFile.c_str());
145             if(in.is_open())
146             {
147                 m_parsed_trace = Parser::ParseTraceMetaData(in);
148                 in.close();
149                 if(m_parsed_trace.trace_buffers.size()) // found one or more buffers
150                 {
151                     std::vector<std::string> bufferNames = GetBufferNameList(m_parsed_trace);
152                     std::vector<std::string>::iterator bnit = bufferNames.begin();
153                     while(bnit != bufferNames.end())
154                     {
155                         Parser::TraceBufferSourceTree tbst;
156                         if(Parser::ExtractSourceTree(*bnit,m_parsed_trace,tbst))
157                             m_source_trees[*bnit] = tbst;
158                         bnit++;
159                     }
160                 }
161 
162             }
163             else
164             {
165                 oss.str("");
166                 oss << "Failed to trace ini file : " << iniFile << std::endl;
167                 LogError(oss.str());
168             }
169         }
170         else
171         {
172             oss.str("");
173             oss << "Trace Metadata ini file not found." << std::endl;
174             LogError(oss.str());
175         }
176 
177         if(m_verbose)
178         {
179             oss.str("");
180             oss << "Done." << std::endl;
181             LogInfo(oss.str());
182         }
183     }
184     else
185     {
186         oss.str("");
187         oss << "Read Error : Failed to open " << iniFile << "." << std::endl;
188         LogError(oss.str());
189         bRead = false;
190     }
191     m_read_ok = bRead;
192     return bRead;
193 }
194 
checkPath()195 void SnapShotReader::checkPath()
196 {
197     std::string iniFile = m_snapshotPath + SnapshotINIFilename;
198     std::ifstream in(iniFile.c_str());
199     m_snapshot_found = false;
200 
201     if(in.is_open())
202     {
203         in.close();
204         m_snapshot_found = true;
205     }
206 }
207 
setErrorLogger(ITraceErrorLog * err_log)208 void SnapShotReader::setErrorLogger(ITraceErrorLog *err_log)
209 {
210     if(err_log)
211     {
212         m_i_err_log = err_log;
213         m_errlog_handle = m_i_err_log->RegisterErrorSource("snapshot_reader");
214         Parser::SetIErrorLogger(m_i_err_log);
215     }
216 }
217 
LogInfo(const std::string & msg)218 void SnapShotReader::LogInfo(const std::string &msg)
219 {
220     if(m_i_err_log)
221         m_i_err_log->LogMessage(m_errlog_handle, OCSD_ERR_SEV_INFO, msg);
222 }
223 
LogError(const std::string & msg)224 void SnapShotReader::LogError(const std::string &msg)
225 {
226     if(m_i_err_log)
227     {
228         ocsdError err(OCSD_ERR_SEV_ERROR,OCSD_ERR_TEST_SNAPSHOT_READ,msg);
229         m_i_err_log->LogError(m_errlog_handle,&err);
230     }
231 }
232 
getSourceBufferNameList(std::vector<std::string> & nameList)233 bool SnapShotReader::getSourceBufferNameList(std::vector<std::string> &nameList)
234 {
235     nameList.clear();
236     if(snapshotFound())
237     {
238         nameList = GetBufferNameList(m_parsed_trace);
239     }
240     return (bool)(nameList.size() > 0);
241 }
242 
getTraceBufferSourceTree(const std::string & traceBufferName,Parser::TraceBufferSourceTree & sourceTree)243 bool SnapShotReader::getTraceBufferSourceTree(const std::string &traceBufferName, Parser::TraceBufferSourceTree &sourceTree)
244 {
245     bool found = false;
246     std::map<std::string, Parser::TraceBufferSourceTree>::iterator it;
247     it = m_source_trees.find(traceBufferName);
248     if(it != m_source_trees.end())
249     {
250         sourceTree = it->second;
251         found = true;
252     }
253     return found;
254 }
255 
getDeviceData(const std::string & deviceName,Parser::Parsed ** devData)256 bool SnapShotReader::getDeviceData(const std::string &deviceName, Parser::Parsed **devData)
257 {
258     std::map<std::string, Parser::Parsed>::iterator it;
259 
260     *devData = 0;
261     it = m_parsed_device_list.find(deviceName);
262     if(it != m_parsed_device_list.end())
263     {
264         *devData = &(it->second);
265     }
266     return (*devData != 0);
267 }
268 
269 
270 /* End of File snapshot_reader.cpp */
271