Handle restart request
[platform/core/appfw/launchpad.git] / src / launchpad-process-pool / launchpad.hh
1 /*
2  * Copyright (c) 2023 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #ifndef LAUNCHPAD_PROCESS_POOL_LAUNCHPAD_HH_
18 #define LAUNCHPAD_PROCESS_POOL_LAUNCHPAD_HH_
19
20 #include <glib.h>
21
22 #include <functional>
23 #include <memory>
24 #include <string>
25 #include <unordered_map>
26 #include <vector>
27
28 #include <language_config.hh>
29 #include <io_channel.hh>
30 #include <region_format_config.hh>
31 #include <server_socket.hh>
32
33 #include "launchpad-process-pool/app_executor.hh"
34 #include "launchpad-process-pool/config.hh"
35 #include "launchpad-process-pool/loader_manager.hh"
36 #include "launchpad-process-pool/request.hh"
37 #include "launchpad-process-pool/signal_manager.hh"
38
39 namespace launchpad {
40
41 class Launchpad : public IOChannel::IEvent,
42                   public SignalManager::IEvent,
43                   public LoaderManager::IEvent {
44  public:
45   enum class LaunchResult : int {
46     Fail = -1,
47     Success = 0,
48     Pending = 1,
49     Continue = 2,
50   };
51
52   Launchpad(int argc, char** argv);
53   ~Launchpad();
54
55   Launchpad(const Launchpad&) = delete;
56   Launchpad& operator = (const Launchpad&) = delete;
57   Launchpad(Launchpad&&) = delete;
58   Launchpad& operator = (Launchpad&&) = delete;
59
60   int Run();
61   void Quit();
62
63  private:
64   using RequestHandler = std::function<void(std::shared_ptr<Request>)>;
65
66   bool OnCreate();
67   void OnTerminate();
68
69   void HandleVisibilityRequest(std::shared_ptr<Request> request);
70   void HandleAddLoaderRequest(std::shared_ptr<Request> request);
71   void HandleRemoveLoaderRequest(std::shared_ptr<Request> request);
72   void HandleMakeDefaultSlotsRequest(std::shared_ptr<Request> request);
73   void HandlePrepareAppDefinedLoaderRequest(std::shared_ptr<Request> request);
74   void HandleDemandRequest(std::shared_ptr<Request> request);
75   void HandlePingRequest(std::shared_ptr<Request> request);
76   void HandleUpdateAppTypeRequest(std::shared_ptr<Request> request);
77   void HandleConnectRequest(std::shared_ptr<Request> request);
78   void HandleLaunchRequest(std::shared_ptr<Request> request);
79   void HandleKillLoaderRequest(std::shared_ptr<Request> request);
80   void HandleRestartLoaderRequest(std::shared_ptr<Request> request);
81
82   bool CanUseLoaderContext(const std::shared_ptr<LoaderContext>& context);
83   LaunchResult ForkProcessing(std::shared_ptr<Request> request);
84   LaunchResult LaunchRequestPrepare(std::shared_ptr<Request> request);
85   LaunchResult LaunchRequestDo(std::shared_ptr<Request> request);
86   LaunchResult LaunchRequestPend(std::shared_ptr<Request> request);
87   void LaunchRequestComplete(std::shared_ptr<Request> request);
88
89   void OnIOEventReceived(int fd, int condition) override;
90   void OnSigchldReceived(pid_t pid) override;
91   void OnLoaderPrepared(LoaderContext* loader_context) override;
92   void OnLoaderLaunched(LoaderContext* loader_context) override;
93
94  private:
95   int argc_;
96   char** argv_;
97   GMainLoop* loop_ = nullptr;
98   std::unordered_map<int, RequestHandler> handlers_;
99   std::unique_ptr<AppExecutor> app_executor_;
100   std::unique_ptr<ServerSocket> socket_;
101   std::unique_ptr<IOChannel> channel_;
102   std::unique_ptr<ClientSocket> client_socket_;
103   std::unordered_map<pid_t, std::string> pid_map_;
104   std::unique_ptr<LanguageConfig> lang_config_;
105   std::unique_ptr<RegionFormatConfig> region_format_config_;
106   std::unique_ptr<Worker> cleaner_;
107   std::vector<std::shared_ptr<Request>> pending_requests_;
108   Config::LaunchMode::Mode mode_;
109 };
110
111 }  // namespace launchpad
112
113 #endif  // LAUNCHPAD_PROCESS_POOL_LAUNCHPAD_HH_