1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of Qt Creator.
7 **
8 ** Commercial License Usage
9 ** Licensees holding valid commercial Qt licenses may use this file in
10 ** accordance with the commercial license agreement provided with the
11 ** Software or, alternatively, in accordance with the terms contained in
12 ** a written agreement between you and The Qt Company. For licensing terms
13 ** and conditions see https://www.qt.io/terms-conditions. For further
14 ** information use the contact form at https://www.qt.io/contact-us.
15 **
16 ** GNU General Public License Usage
17 ** Alternatively, this file may be used under the terms of the GNU
18 ** General Public License version 3 as published by the Free Software
19 ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
20 ** included in the packaging of this file. Please review the following
21 ** information to ensure the GNU General Public License requirements will
22 ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
23 **
24 ****************************************************************************/
25 
26 #pragma once
27 
28 #include <ssh/sshremoteprocess.h>
29 #include <ssh/sshconnection.h>
30 
31 #include <projectexplorer/runcontrol.h>
32 
33 #include <QProcess>
34 
35 namespace Valgrind {
36 namespace Callgrind {
37 
38 class CallgrindController : public QObject
39 {
40     Q_OBJECT
41 public:
42     enum Option {
43         Unknown,
44         Dump,
45         ResetEventCounters,
46         Pause,
47         UnPause
48     };
49     Q_ENUM(Option)
50 
51     CallgrindController();
52     ~CallgrindController() override;
53 
54     void run(Option option);
55 
56     /**
57      * Make data file available locally, triggers @c localParseDataAvailable.
58      *
59      * If the valgrind process was run remotely, this transparently
60      * downloads the data file first and returns a local path.
61      */
62     void getLocalDataFile();
63     void setValgrindPid(qint64 pid);
64     void setValgrindRunnable(const ProjectExplorer::Runnable &runnable);
65 
66 signals:
67     void finished(Valgrind::Callgrind::CallgrindController::Option option);
68     void localParseDataAvailable(const QString &file);
69     void statusMessage(const QString &msg);
70 
71 private:
72     void handleControllerProcessError(QProcess::ProcessError);
73 
74     void foundRemoteFile();
75     void sftpInitialized();
76     void sftpJobFinished(QSsh::SftpJobId job, const QString &error);
77     void cleanupTempFile();
78 
79     void controllerProcessFinished(int, QProcess::ExitStatus);
80     void controllerProcessError(QProcess::ProcessError);
81     void controllerProcessClosed(bool success);
82 
83     ProjectExplorer::ApplicationLauncher *m_controllerProcess = nullptr;
84     ProjectExplorer::Runnable m_valgrindRunnable;
85     qint64 m_pid = 0;
86 
87     Option m_lastOption = Unknown;
88 
89     // remote callgrind support
90     QSsh::SshConnection *m_ssh = nullptr;
91     QString m_tempDataFile;
92     QSsh::SshRemoteProcessPtr m_findRemoteFile;
93     QSsh::SftpSessionPtr m_sftp;
94     QSsh::SftpJobId m_downloadJob = 0;
95     QByteArray m_remoteFile;
96 };
97 
98 } // namespace Callgrind
99 } // namespace Valgrind
100