File: procutils.h

package info (click to toggle)
codelite 17.0.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 136,204 kB
  • sloc: cpp: 491,547; ansic: 280,393; php: 10,259; sh: 8,930; lisp: 7,664; vhdl: 6,518; python: 6,020; lex: 4,920; yacc: 3,123; perl: 2,385; javascript: 1,715; cs: 1,193; xml: 1,110; makefile: 804; cobol: 741; sql: 709; ruby: 620; f90: 566; ada: 534; asm: 464; fortran: 350; objc: 289; tcl: 258; java: 157; erlang: 61; pascal: 51; ml: 49; awk: 44; haskell: 36
file content (143 lines) | stat: -rw-r--r-- 5,185 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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//
// copyright            : (C) 2008 by Eran Ifrah
// file name            : procutils.h
//
// -------------------------------------------------------------------------
// A
//              _____           _      _     _ _
//             /  __ \         | |    | |   (_) |
//             | /  \/ ___   __| | ___| |    _| |_ ___
//             | |    / _ \ / _  |/ _ \ |   | | __/ _ )
//             | \__/\ (_) | (_| |  __/ |___| | ||  __/
//              \____/\___/ \__,_|\___\_____/_|\__\___|
//
//                                                  F i l e
//
//    This program is free software; you can redistribute it and/or modify
//    it under the terms of the GNU General Public License as published by
//    the Free Software Foundation; either version 2 of the License, or
//    (at your option) any later version.
//
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
#ifndef PROCUTILS_H
#define PROCUTILS_H

#include "codelite_exports.h"
#include "wx/defs.h"

#include <map>
#include <vector>
#include <wx/arrstr.h>
#include <wx/process.h>
#include <wx/string.h>
#ifdef __WINDOWS__          // __WINDOWS__ defined by wx/defs.h
#include "wx/msw/wrapwin.h" // includes windows.h
// #include <devpropdef.h>
#include <Psapi.h>
#include <SetupAPI.h>
#include <tlhelp32.h>
#endif

#include "cl_command_event.h"
#include "codelite_events.h"

struct ProcessEntry {
    wxString name;
    long pid;
};

typedef std::vector<ProcessEntry> PidVec_t;

/// Event class used by ProcUtils::ShellExecAsync method
class WXDLLIMPEXP_CL clShellProcessEvent : public clCommandEvent
{
    wxString m_output;
    int m_pid = wxNOT_FOUND;
    int m_exitCode = wxNOT_FOUND;

public:
    clShellProcessEvent(wxEventType commandType = wxEVT_NULL, int winid = 0);
    clShellProcessEvent(const clShellProcessEvent& event);
    clShellProcessEvent& operator=(const clShellProcessEvent& src);
    virtual ~clShellProcessEvent();
    virtual wxEvent* Clone() const { return new clShellProcessEvent(*this); }

    void SetOutput(const wxString& output) { this->m_output = output; }
    const wxString& GetOutput() const { return m_output; }

    void SetPid(int pid) { this->m_pid = pid; }
    void SetExitCode(int exitCode) { this->m_exitCode = exitCode; }

    int GetPid() const { return m_pid; }
    int GetExitCode() const { return m_exitCode; }
};

typedef void (wxEvtHandler::*clShellProcessEventFunction)(clShellProcessEvent&);
#define clShellProcessEventHandler(func) wxEVENT_HANDLER_CAST(clShellProcessEventFunction, func)

wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CL, wxEVT_SHELL_ASYNC_PROCESS_TERMINATED, clShellProcessEvent);

class WXDLLIMPEXP_CL ProcUtils
{
public:
    ProcUtils();
    ~ProcUtils();

    static wxString& WrapInShell(wxString& cmd);

    static void GetProcTree(std::map<unsigned long, bool>& parentsMap, long pid);
    static void ExecuteCommand(const wxString& command, wxArrayString& output,
                               long flags = wxEXEC_NODISABLE | wxEXEC_SYNC);
    static void ExecuteInteractiveCommand(const wxString& command);
    static wxString GetProcessNameByPid(long pid);
    static void GetProcessList(std::vector<ProcessEntry>& proclist);
    static void GetChildren(long pid, std::vector<long>& children);
    static bool Shell(const wxString& programConsoleCommand);
    static bool Locate(const wxString& name, wxString& where);

    /**
     * @brief the equivalent of 'ps ax|grep <name>'
     */
    static PidVec_t PS(const wxString& name);

    /**
     * \brief a safe function that executes 'command' and returns its output. This function
     * is safed to be called from secondary thread (hence, SafeExecuteCommand)
     * \param command
     * \param output
     */
    static void SafeExecuteCommand(const wxString& command, wxArrayString& output);

    /**
     * @brief execute a command and return its output as plain string
     */
    static wxString SafeExecuteCommand(const wxString& command);

    /**
     * @brief execute command and search the output for the first occurance of `find_what`
     */
    static wxString GrepCommandOutput(const std::vector<wxString>& cmd, const wxString& find_what);

    /**
     * @brief executes a command under the proper shell async
     * @param command the command the execute, e.g. `ls -l`
     * @param pid storage pointer for the executed process
     * @param sink handler class for the process events
     * @returns true on success, otherwise (i.e. failed to launch the process) return false
     */
    static bool ShellExecAsync(const wxString& command, long* pid, wxEvtHandler* sink);

    /**
     * @brief executes a command under the proper shell sync
     * @param command the command the execute, e.g. `ls -l`
     * @param std_out [output]
     * @param std_err [output]
     * @return process exit code
     */
    static int ShellExecSync(const wxString& command, wxString* output);
};

#endif // PROCUTILS_H