1 /*
2  * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 #ifndef EXECUTOR_H
27 #define EXECUTOR_H
28 
29 #include "tstrings.h"
30 #include "UniqueHandle.h"
31 
32 
33 class Executor {
34 public:
35     explicit Executor(const std::wstring& appPath=std::wstring()) {
36         app(appPath).visible(false);
37     }
38 
39     /**
40      * Returns command line configured with arg() calls so far.
41      */
42     std::wstring args() const;
43 
44     /**
45      * Set path to application to execute.
46      */
app(const std::wstring & v)47     Executor& app(const std::wstring& v) {
48         appPath = v;
49         return *this;
50     }
51 
52     /**
53      * Adds another command line argument.
54      */
arg(const std::wstring & v)55     Executor& arg(const std::wstring& v) {
56         argsArray.push_back(v);
57         return *this;
58     }
59 
60     /**
61      * Controls if application window should be visible.
62      */
visible(bool v)63     Executor& visible(bool v) {
64         theVisible = v;
65         return *this;
66     }
67 
68     /**
69      * Starts application process and blocks waiting when the started
70      * process terminates.
71      * Returns process exit code.
72      * Throws exception if process start failed.
73      */
74     int execAndWaitForExit() const;
75 
76 private:
77     UniqueHandle startProcess() const;
78 
79     bool theVisible;
80     tstring_array argsArray;
81     std::wstring appPath;
82 };
83 
84 #endif // #ifndef EXECUTOR_H
85