]> git.cworth.org Git - apitrace/blobdiff - gui/traceloader.cpp
Make thumbnailing an non-automatic action.
[apitrace] / gui / traceloader.cpp
index d970c16fe311d99511875a52f452a7064497da00..0e6ed47351260a8d35e1998cc9728423cff7102f 100644 (file)
@@ -7,7 +7,7 @@
 #define FRAMES_TO_CACHE 100
 
 static ApiTraceCall *
-apiCallFromTraceCall(const Trace::Call *call,
+apiCallFromTraceCall(const trace::Call *call,
                      const QHash<QString, QUrl> &helpHash,
                      ApiTraceFrame *frame,
                      TraceLoader *loader)
@@ -38,21 +38,29 @@ void TraceLoader::loadTrace(const QString &filename)
         loadHelpFile();
     }
 
+    if (!m_frameBookmarks.isEmpty()) {
+        qDeleteAll(m_signatures);
+        qDeleteAll(m_enumSignatures);
+        m_signatures.clear();
+        m_enumSignatures.clear();
+        m_frameBookmarks.clear();
+        m_createdFrames.clear();
+        m_parser.close();
+    }
+
     if (!m_parser.open(filename.toLatin1())) {
         qDebug() << "error: failed to open " << filename;
         return;
     }
-    qDebug()<<"load trace with "<<filename;
+
     emit startedParsing();
 
-    qDebug() <<"\t support offsets = "<<m_parser.supportsOffsets();
     if (m_parser.supportsOffsets()) {
         scanTrace();
     } else {
         //Load the entire file into memory
         parseTrace();
     }
-
     emit finishedParsing();
 }
 
@@ -66,7 +74,7 @@ void TraceLoader::setFrameMarker(ApiTrace::FrameMarker marker)
     m_frameMarker = marker;
 }
 
-bool TraceLoader::isCallAFrameMarker(const Trace::Call *call) const
+bool TraceLoader::isCallAFrameMarker(const trace::Call *call) const
 {
     std::string name = call->name();
 
@@ -96,7 +104,7 @@ int TraceLoader::numberOfFrames() const
 
 int TraceLoader::numberOfCallsInFrame(int frameIdx) const
 {
-    if (frameIdx > m_frameBookmarks.size()) {
+    if (frameIdx >= m_frameBookmarks.size()) {
         return 0;
     }
     FrameBookmarks::const_iterator itr =
@@ -128,8 +136,8 @@ void TraceLoader::scanTrace()
     QList<ApiTraceFrame*> frames;
     ApiTraceFrame *currentFrame = 0;
 
-    Trace::Call *call;
-    Trace::ParseBookmark startBookmark;
+    trace::Call *call;
+    trace::ParseBookmark startBookmark;
     int numOfFrames = 0;
     int numOfCalls = 0;
     int lastPercentReport = 0;
@@ -164,7 +172,7 @@ void TraceLoader::scanTrace()
     }
 
     if (numOfCalls) {
-        //Trace::File::Bookmark endBookmark = m_parser.currentBookmark();
+        //trace::File::Bookmark endBookmark = m_parser.currentBookmark();
         FrameBookmark frameBookmark(startBookmark);
         frameBookmark.numberOfCalls = numOfCalls;
 
@@ -193,7 +201,7 @@ void TraceLoader::parseTrace()
 
     int lastPercentReport = 0;
 
-    Trace::Call *call = m_parser.parse_call();
+    trace::Call *call = m_parser.parse_call();
     while (call) {
         //std::cout << *call;
         if (!currentFrame) {
@@ -275,25 +283,25 @@ void TraceLoader::addEnumSignature(unsigned id, ApiTraceEnumSignature *signature
     m_enumSignatures[id] = signature;
 }
 
-void TraceLoader::searchNext(int startFrame,
-                             const QString &str,
-                             Qt::CaseSensitivity sensitivity)
+void TraceLoader::searchNext(const ApiTrace::SearchRequest &request)
 {
     Q_ASSERT(m_parser.supportsOffsets());
     if (m_parser.supportsOffsets()) {
+        int startFrame = m_createdFrames.indexOf(request.frame);
         const FrameBookmark &frameBookmark = m_frameBookmarks[startFrame];
         m_parser.setBookmark(frameBookmark.start);
-        Trace::Call *call = 0;
+        trace::Call *call = 0;
         while ((call = m_parser.parse_call())) {
 
-            if (callContains(call, str, sensitivity)) {
+            if (callContains(call, request.text, request.cs)) {
                 unsigned frameIdx = callInFrame(call->no);
                 ApiTraceFrame *frame = m_createdFrames[frameIdx];
                 const QVector<ApiTraceCall*> calls =
                         fetchFrameContents(frame);
                 for (int i = 0; i < calls.count(); ++i) {
                     if (calls[i]->index() == call->no) {
-                        emit searchResult(ApiTrace::SearchResult_Found, calls[i]);
+                        emit searchResult(request, ApiTrace::SearchResult_Found,
+                                          calls[i]);
                         break;
                     }
                 }
@@ -304,17 +312,16 @@ void TraceLoader::searchNext(int startFrame,
             delete call;
         }
     }
-    emit searchResult(ApiTrace::SearchResult_NotFound, 0);
+    emit searchResult(request, ApiTrace::SearchResult_NotFound, 0);
 }
 
-void TraceLoader::searchPrev(int startFrame,
-                             const QString &str,
-                             Qt::CaseSensitivity sensitivity)
+void TraceLoader::searchPrev(const ApiTrace::SearchRequest &request)
 {
     Q_ASSERT(m_parser.supportsOffsets());
     if (m_parser.supportsOffsets()) {
-        Trace::Call *call = 0;
-        QList<Trace::Call*> frameCalls;
+        int startFrame = m_createdFrames.indexOf(request.frame);
+        trace::Call *call = 0;
+        QList<trace::Call*> frameCalls;
         int frameIdx = startFrame;
 
         const FrameBookmark &frameBookmark = m_frameBookmarks[frameIdx];
@@ -329,7 +336,7 @@ void TraceLoader::searchPrev(int startFrame,
             if (numCallsToParse == 0) {
                 bool foundCall = searchCallsBackwards(frameCalls,
                                                       frameIdx,
-                                                      str, sensitivity);
+                                                      request);
 
                 qDeleteAll(frameCalls);
                 frameCalls.clear();
@@ -348,23 +355,24 @@ void TraceLoader::searchPrev(int startFrame,
             }
         }
     }
-    emit searchResult(ApiTrace::SearchResult_NotFound, 0);
+    emit searchResult(request, ApiTrace::SearchResult_NotFound, 0);
 }
 
-bool TraceLoader::searchCallsBackwards(const QList<Trace::Call*> &calls,
+bool TraceLoader::searchCallsBackwards(const QList<trace::Call*> &calls,
                                        int frameIdx,
-                                       const QString &str,
-                                       Qt::CaseSensitivity sensitivity)
+                                       const ApiTrace::SearchRequest &request)
 {
     for (int i = calls.count() - 1; i >= 0; --i) {
-        Trace::Call *call = calls[i];
-        if (callContains(call, str, sensitivity)) {
+        trace::Call *call = calls[i];
+        if (callContains(call, request.text, request.cs)) {
             ApiTraceFrame *frame = m_createdFrames[frameIdx];
             const QVector<ApiTraceCall*> apiCalls =
                     fetchFrameContents(frame);
             for (int i = 0; i < apiCalls.count(); ++i) {
                 if (apiCalls[i]->index() == call->no) {
-                    emit searchResult(ApiTrace::SearchResult_Found, apiCalls[i]);
+                    emit searchResult(request,
+                                      ApiTrace::SearchResult_Found,
+                                      apiCalls[i]);
                     break;
                 }
             }
@@ -378,7 +386,7 @@ int TraceLoader::callInFrame(int callIdx) const
 {
     unsigned numCalls = 0;
 
-    for (int frameIdx = 0; frameIdx <= m_frameBookmarks.size(); ++frameIdx) {
+    for (int frameIdx = 0; frameIdx < m_frameBookmarks.size(); ++frameIdx) {
         const FrameBookmark &frameBookmark = m_frameBookmarks[frameIdx];
         unsigned firstCall = numCalls;
         unsigned endCall = numCalls + frameBookmark.numberOfCalls;
@@ -391,12 +399,12 @@ int TraceLoader::callInFrame(int callIdx) const
     return 0;
 }
 
-bool TraceLoader::callContains(Trace::Call *call,
+bool TraceLoader::callContains(trace::Call *call,
                                const QString &str,
                                Qt::CaseSensitivity sensitivity)
 {
     /*
-     * FIXME: do string comparison directly on Trace::Call
+     * FIXME: do string comparison directly on trace::Call
      */
     ApiTraceCall *apiCall = apiCallFromTraceCall(call, m_helpHash,
                                                  0, this);
@@ -425,7 +433,7 @@ TraceLoader::fetchFrameContents(ApiTraceFrame *currentFrame)
 
             m_parser.setBookmark(frameBookmark.start);
 
-            Trace::Call *call;
+            trace::Call *call;
             int parsedCalls = 0;
             while ((call = m_parser.parse_call())) {
                 ApiTraceCall *apiCall =
@@ -494,4 +502,13 @@ void TraceLoader::findCallIndex(int index)
     emit foundCallIndex(call);
 }
 
+void TraceLoader::search(const ApiTrace::SearchRequest &request)
+{
+    if (request.direction == ApiTrace::SearchRequest::Next) {
+        searchNext(request);
+    } else {
+        searchPrev(request);
+    }
+}
+
 #include "traceloader.moc"