14d6c458bSopenharmony_ci/*
24d6c458bSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
34d6c458bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
44d6c458bSopenharmony_ci * you may not use this file except in compliance with the License.
54d6c458bSopenharmony_ci * You may obtain a copy of the License at
64d6c458bSopenharmony_ci *
74d6c458bSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
84d6c458bSopenharmony_ci *
94d6c458bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
104d6c458bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
114d6c458bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
124d6c458bSopenharmony_ci * See the License for the specific language governing permissions and
134d6c458bSopenharmony_ci * limitations under the License.
144d6c458bSopenharmony_ci */
154d6c458bSopenharmony_ci
164d6c458bSopenharmony_ci#ifndef PROCESS_JS_CHILDPROCESS_H
174d6c458bSopenharmony_ci#define PROCESS_JS_CHILDPROCESS_H
184d6c458bSopenharmony_ci
194d6c458bSopenharmony_ci#include <string>
204d6c458bSopenharmony_ci#include <sys/types.h>
214d6c458bSopenharmony_ci
224d6c458bSopenharmony_ci#include "napi/native_api.h"
234d6c458bSopenharmony_ci#include "napi/native_node_api.h"
244d6c458bSopenharmony_cinamespace OHOS::JsSysModule::Process {
254d6c458bSopenharmony_ci    struct WaitInfo {
264d6c458bSopenharmony_ci        napi_async_work worker {nullptr};
274d6c458bSopenharmony_ci        napi_deferred deferred {nullptr};
284d6c458bSopenharmony_ci        int status {0};
294d6c458bSopenharmony_ci    };
304d6c458bSopenharmony_ci
314d6c458bSopenharmony_ci    struct StdInfo {
324d6c458bSopenharmony_ci        napi_async_work worker {nullptr};
334d6c458bSopenharmony_ci        napi_deferred deferred {nullptr};
344d6c458bSopenharmony_ci        napi_value promise {nullptr};
354d6c458bSopenharmony_ci        std::string stdData {};
364d6c458bSopenharmony_ci        bool *isNeedRun {nullptr};
374d6c458bSopenharmony_ci        int64_t maxBuffSize {};
384d6c458bSopenharmony_ci        int fd {};
394d6c458bSopenharmony_ci        int pid {};
404d6c458bSopenharmony_ci    };
414d6c458bSopenharmony_ci
424d6c458bSopenharmony_ci    struct OptionsInfo {
434d6c458bSopenharmony_ci        napi_async_work worker {nullptr};
444d6c458bSopenharmony_ci        bool *isNeedRun {nullptr};
454d6c458bSopenharmony_ci        int32_t timeout {};
464d6c458bSopenharmony_ci        int32_t killSignal {};
474d6c458bSopenharmony_ci        int64_t maxBuffer {};
484d6c458bSopenharmony_ci        pid_t pid {};
494d6c458bSopenharmony_ci    };
504d6c458bSopenharmony_ci
514d6c458bSopenharmony_ci    class ChildProcess {
524d6c458bSopenharmony_ci    public:
534d6c458bSopenharmony_ci        /**
544d6c458bSopenharmony_ci         * Create child process object.
554d6c458bSopenharmony_ci         */
564d6c458bSopenharmony_ci        explicit ChildProcess() {}
574d6c458bSopenharmony_ci
584d6c458bSopenharmony_ci        /**
594d6c458bSopenharmony_ci         * Close the target process.
604d6c458bSopenharmony_ci         */
614d6c458bSopenharmony_ci        void Close();
624d6c458bSopenharmony_ci
634d6c458bSopenharmony_ci        /**
644d6c458bSopenharmony_ci         * Send a signal to process.
654d6c458bSopenharmony_ci         *
664d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
674d6c458bSopenharmony_ci         * @param signal Number or string represents the signal sent.
684d6c458bSopenharmony_ci         */
694d6c458bSopenharmony_ci        void Kill(napi_env env, const napi_value signo);
704d6c458bSopenharmony_ci
714d6c458bSopenharmony_ci        /**
724d6c458bSopenharmony_ci         * Wait for the child process to finish running, and return a promise object
734d6c458bSopenharmony_ci         * whose value is the exit code of the child process.
744d6c458bSopenharmony_ci         *
754d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
764d6c458bSopenharmony_ci         */
774d6c458bSopenharmony_ci        napi_value Wait(napi_env env);
784d6c458bSopenharmony_ci
794d6c458bSopenharmony_ci        /**
804d6c458bSopenharmony_ci         * Get the standard output of the child process.
814d6c458bSopenharmony_ci         *
824d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
834d6c458bSopenharmony_ci         */
844d6c458bSopenharmony_ci        napi_value GetOutput(napi_env env) const;
854d6c458bSopenharmony_ci
864d6c458bSopenharmony_ci        /**
874d6c458bSopenharmony_ci         * Get the standard error output of the child process.
884d6c458bSopenharmony_ci         *
894d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
904d6c458bSopenharmony_ci         */
914d6c458bSopenharmony_ci        napi_value GetErrorOutput(napi_env env) const;
924d6c458bSopenharmony_ci
934d6c458bSopenharmony_ci        /**
944d6c458bSopenharmony_ci         * Get kill status.
954d6c458bSopenharmony_ci         *
964d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
974d6c458bSopenharmony_ci         */
984d6c458bSopenharmony_ci        napi_value GetKilled(napi_env env) const;
994d6c458bSopenharmony_ci
1004d6c458bSopenharmony_ci        /**
1014d6c458bSopenharmony_ci         * Get the specific pid value.
1024d6c458bSopenharmony_ci         *
1034d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
1044d6c458bSopenharmony_ci         */
1054d6c458bSopenharmony_ci        napi_value Getpid(napi_env env) const;
1064d6c458bSopenharmony_ci
1074d6c458bSopenharmony_ci        /**
1084d6c458bSopenharmony_ci         * Get the parent process ID.
1094d6c458bSopenharmony_ci         *
1104d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
1114d6c458bSopenharmony_ci         */
1124d6c458bSopenharmony_ci        napi_value Getppid(napi_env env) const;
1134d6c458bSopenharmony_ci
1144d6c458bSopenharmony_ci        /**
1154d6c458bSopenharmony_ci         * Get exit status.
1164d6c458bSopenharmony_ci         *
1174d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
1184d6c458bSopenharmony_ci         */
1194d6c458bSopenharmony_ci        napi_value GetExitCode(napi_env env) const;
1204d6c458bSopenharmony_ci
1214d6c458bSopenharmony_ci        /**
1224d6c458bSopenharmony_ci         * Initialization option information.
1234d6c458bSopenharmony_ci         *
1244d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
1254d6c458bSopenharmony_ci         * @param options Option parameter.
1264d6c458bSopenharmony_ci         */
1274d6c458bSopenharmony_ci        void InitOptionsInfo(napi_env env, napi_value options);
1284d6c458bSopenharmony_ci
1294d6c458bSopenharmony_ci        /**
1304d6c458bSopenharmony_ci         * Start a subprocess to execute shell commands.
1314d6c458bSopenharmony_ci         *
1324d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
1334d6c458bSopenharmony_ci         * @param command Command parameters.
1344d6c458bSopenharmony_ci         */
1354d6c458bSopenharmony_ci        void Spawn(napi_env env, napi_value command);
1364d6c458bSopenharmony_ci
1374d6c458bSopenharmony_ci        /**
1384d6c458bSopenharmony_ci         * ChildProcess destructor.
1394d6c458bSopenharmony_ci         */
1404d6c458bSopenharmony_ci        virtual ~ChildProcess();
1414d6c458bSopenharmony_ci
1424d6c458bSopenharmony_ci    private:
1434d6c458bSopenharmony_ci        static void ReadStdOut(napi_env env, void* data);
1444d6c458bSopenharmony_ci        static void EndStdOut(napi_env env, napi_status status, void* buffer);
1454d6c458bSopenharmony_ci        static void ReadStdErr(napi_env env, void* data);
1464d6c458bSopenharmony_ci        static void EndStdErr(napi_env env, napi_status status, void* buffer);
1474d6c458bSopenharmony_ci        static void TimeoutListener(napi_env env, void* data);
1484d6c458bSopenharmony_ci        std::string RequireStrValue(napi_env env, const napi_value strValue);
1494d6c458bSopenharmony_ci        int GetValidSignal(napi_env env, const napi_value signo);
1504d6c458bSopenharmony_ci        void CreateWorker(napi_env env);
1514d6c458bSopenharmony_ci
1524d6c458bSopenharmony_ci        OptionsInfo* optionsInfo_ {nullptr};
1534d6c458bSopenharmony_ci        StdInfo* stdOutInfo_ {nullptr};
1544d6c458bSopenharmony_ci        StdInfo* stdErrInfo_ {nullptr};
1554d6c458bSopenharmony_ci
1564d6c458bSopenharmony_ci        int exitCode_ {};
1574d6c458bSopenharmony_ci        int stdOutFd_[2] {};
1584d6c458bSopenharmony_ci        int stdErrFd_[2] {};
1594d6c458bSopenharmony_ci        int ppid_ {};
1604d6c458bSopenharmony_ci
1614d6c458bSopenharmony_ci        bool isNeedRun_ {true};
1624d6c458bSopenharmony_ci        bool killed_ {};
1634d6c458bSopenharmony_ci        bool isWait_ {true};
1644d6c458bSopenharmony_ci    };
1654d6c458bSopenharmony_ci} // namespace OHOS::JsSysModule::Process
1664d6c458bSopenharmony_ci#endif // PROCESS_JS_CHILDPROCESS_H
167