File: traceloader.h

package info (click to toggle)
apitrace 7.1%2Bgit20170623.d38a69d6%2Brepack-3
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 15,992 kB
  • sloc: cpp: 179,347; ansic: 62,439; python: 33,058; java: 377; makefile: 105; sh: 26; xml: 26
file content (119 lines) | stat: -rw-r--r-- 3,519 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#pragma once


#include "apitrace.h"
#include "trace_file.hpp"
#include "trace_parser.hpp"

#include <QObject>
#include <QList>
#include <QMap>
#include <QStack>

class TraceLoader : public QObject
{
    Q_OBJECT
public:
    TraceLoader(QObject *parent=0);
    ~TraceLoader();


    ApiTraceCallSignature *signature(unsigned id);
    void addSignature(unsigned id, ApiTraceCallSignature *signature);

    trace::EnumSig *enumSignature(unsigned id);

private:
    class FrameContents
    {
    public:
        FrameContents(int numOfCalls=0);

        bool load(TraceLoader *loader, ApiTraceFrame* frame,
                  QHash<QString, QUrl> helpHash, trace::Parser &parser);
        void reset();
        int  topLevelCount()      const;
        int  allCallsCount()      const;
        QVector<ApiTraceCall*> topLevelCalls() const;
        QVector<ApiTraceCall*> allCalls()      const;
        quint64 binaryDataSize()  const;
        bool isEmpty();

    private:
        QStack <ApiTraceCall*> m_groups;
        QVector<ApiTraceCall*> m_topLevelItems;
        QVector<ApiTraceCall*> m_allCalls;
        quint64 m_binaryDataSize;
        int     m_parsedCalls;
    };

public slots:
    void loadTrace(const QString &filename);
    void loadFrame(ApiTraceFrame *frame);
    void findFrameStart(ApiTraceFrame *frame);
    void findFrameEnd(ApiTraceFrame *frame);
    void findCallIndex(int index);
    void search(const ApiTrace::SearchRequest &request);

signals:
    void parseProblem(const QString &message);
    void startedParsing();
    void parsed(int percent);
    void guessedApi(int api);
    void finishedParsing();

    void framesLoaded(const QList<ApiTraceFrame*> &frames);
    void frameContentsLoaded(ApiTraceFrame *frame,
                             const QVector<ApiTraceCall*> &topLevelItems,
                             const QVector<ApiTraceCall*> &calls,
                             quint64 binaryDataSize);

    void searchResult(const ApiTrace::SearchRequest &request,
                      ApiTrace::SearchResult result,
                      ApiTraceCall *call);
    void foundFrameStart(ApiTraceFrame *frame);
    void foundFrameEnd(ApiTraceFrame *frame);
    void foundCallIndex(ApiTraceCall *call);
private:
    struct FrameBookmark {
        FrameBookmark()
            : numberOfCalls(0)
        {}
        FrameBookmark(const trace::ParseBookmark &s)
            : start(s),
              numberOfCalls(0)
        {}

        trace::ParseBookmark start;
        int numberOfCalls;
    };
    int numberOfFrames() const;
    int numberOfCallsInFrame(int frameIdx) const;

    void loadHelpFile();
    void guessApi(const trace::Call *call);
    void scanTrace();

    void searchNext(const ApiTrace::SearchRequest &request);
    void searchPrev(const ApiTrace::SearchRequest &request);

    int callInFrame(int callIdx) const;
    bool callContains(trace::Call *call,
                      const QString &str,
                      Qt::CaseSensitivity sensitivity);
     QVector<ApiTraceCall*> fetchFrameContents(ApiTraceFrame *frame);
     bool searchCallsBackwards(const QList<trace::Call*> &calls,
                               int frameIdx,
                               const ApiTrace::SearchRequest &request);

private:
    trace::Parser m_parser;

    typedef QMap<int, FrameBookmark> FrameBookmarks;
    FrameBookmarks m_frameBookmarks;
    QList<ApiTraceFrame*> m_createdFrames;

    QHash<QString, QUrl> m_helpHash;

    QVector<ApiTraceCallSignature*> m_signatures;
};