1  /*
2   * Copyright (c) 2021 Huawei Device Co., Ltd.
3   * Licensed under the Apache License, Version 2.0 (the "License");
4   * you may not use this file except in compliance with the License.
5   * You may obtain a copy of the License at
6   *
7   *     http://www.apache.org/licenses/LICENSE-2.0
8   *
9   * Unless required by applicable law or agreed to in writing, software
10   * distributed under the License is distributed on an "AS IS" BASIS,
11   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12   * See the License for the specific language governing permissions and
13   * limitations under the License.
14   */
15  
16  #ifndef CLIENT_FACTORY_H
17  #define CLIENT_FACTORY_H
18  
19  #include <atomic>
20  #include <map>
21  #include <mutex>
22  
23  #include "client_executor/include/i_client_cb.h"
24  #include "protocol/retcode_inner/aie_retcode_inner.h"
25  #include "protocol/struct_definition/aie_info_define.h"
26  #include "utils/constants/constants.h"
27  
28  namespace OHOS {
29  namespace AI {
30  const int AIE_SESSION_ID_BEGIN = 0;
31  
32  class ClientFactory {
33  public:
34      ClientFactory();
35      virtual ~ClientFactory();
36  
37      /**
38       * Connect the server to get the client ID and initialize the client.
39       *
40       * @param [in] configInfo Engine configuration information.
41       * @param [out] clientInfo Client information.
42       * @param [in] algorithmInfo Algorithm information.
43       * @param [in] cb Service dead callback, Called when the service is dead.
44       * @return Returns 0 if the operation is successful, returns a non-zero value otherwise.
45       */
46      int ClientInit(const ConfigInfo &configInfo, ClientInfo &clientInfo,
47          const AlgorithmInfo &algorithmInfo, IServiceDeadCb *cb);
48  
49      /**
50       * Load algorithm plugin and model based on algorithm information and client information.
51       *
52       * @param [in] clientInfo Client information.
53       * @param [in] algorithmInfo Algorithm information.
54       * @param [in] inputInfo Data information needed to load algorithm plugin.
55       * @param [out] outputInfo The returned data information after loading the algorithm plugin.
56       * @param [in] cb Callback function, asynchronous inference needs to be passed in,
57       *                synchronous inference is not required.
58       * @return Returns 0 if the operation is successful, returns a non-zero value otherwise.
59       */
60      int ClientPrepare(const ClientInfo &clientInfo, const AlgorithmInfo &algorithmInfo,
61          const DataInfo &inputInfo, DataInfo &outputInfo, IClientCb *cb);
62  
63      /**
64       * Set the configuration parameters of the engine or plugin.
65       *
66       * @param [in] clientInfo Client information.
67       * @param [in] optionType The type of setting option.
68       * @param [in] inputInfo Configuration parameter needed to set up the engine or plugin.
69       * @return Returns 0 if the operation is successful, returns a non-zero value otherwise.
70       */
71      int ClientSetOption(const ClientInfo &clientInfo, int optionType, const DataInfo &inputInfo);
72  
73      /**
74       * Get the configuration parameters of the engine or plugin.
75       *
76       * @param [in] clientInfo Client information.
77       * @param [in] optionType The type of getting option.
78       * @param [in] inputInfo Parameter information for getting options.
79       * @param [out] outputInfo The configuration parameter information.
80       * @return Returns 0 if the operation is successful, returns a non-zero value otherwise.
81       */
82      int ClientGetOption(const ClientInfo &clientInfo, int optionType, const DataInfo &inputInfo,
83          DataInfo &outputInfo);
84  
85      /**
86       * Disconnect the client from the server, release and destroy the client's resources.
87       *
88       * @param [in] clientInfo Client information.
89       * @return Returns 0 if the operation is successful, returns a non-zero value otherwise.
90       */
91      int ClientDestroy(ClientInfo &clientInfo);
92  
93      /**
94       * Algorithmic inference interface for asynchronous tasks.
95       *
96       * The inference result is notified to the client through callback function passed in by
97       * {@link ClientPrepare(ClientInfo, AlgorithmInfo,DataInfo, DataInfo, IClientCb)}.
98       *
99       * @param [in] clientInfo Client information.
100       * @param [in] algorithmInfo Algorithm information.
101       * @param [in] inputInfo Data information needed to asynchronous execution algorithm.
102       * @return Returns 0 if the operation is successful, returns a non-zero value otherwise.
103       */
104      int ClientAsyncProcess(const ClientInfo &clientInfo, const AlgorithmInfo &algorithmInfo,
105          const DataInfo &inputInfo);
106  
107      /**
108       * Algorithmic inference interface for synchronous tasks.
109       *
110       * @param [in] clientInfo Client information.
111       * @param [in] AlgorithmInfo Algorithm information.
112       * @param [in] inputInfo Data information needed to synchronous execution algorithm.
113       * @param [out] outputInfo Algorithm inference results.
114       * @return Returns 0 if the operation is successful, returns a non-zero value otherwise.
115       */
116      int ClientSyncProcess(const ClientInfo &clientInfo, const AlgorithmInfo &algorithmInfo,
117          const DataInfo &inputInfo, DataInfo &outputInfo);
118  
119      /**
120       * Unload model and plugin.
121       *
122       * After the algorithm is executed successfully, the method needs to be called when exiting.
123       *
124       * @param [in] clientInfo Client information.
125       * @param [in] algorithmInfo Algorithm information.
126       * @param [in] inputInfo Data information needed to unload the plugin.
127       * @return Returns 0 if the operation is successful, returns a non-zero value otherwise.
128       */
129      int ClientRelease(const ClientInfo &clientInfo, const AlgorithmInfo &algorithmInfo,
130          const DataInfo &inputInfo);
131  
132      void SetClientId(int clientId);
133      int GetClientId() const;
134      void SetServerUid(const uid_t clientId);
135      uid_t GetServerUid() const;
136      int GetSessionInfo(int sessionId, int &algorithmType);
137      void ResetClient();
138  
139  private:
140      int GenerateSessionId();
141      bool AddSessionInfo(const ClientInfo &clientInfo, const AlgorithmInfo &algorithmInfo);
142      int EraseSessionInfo(int sessionId);
143      int RegisterCb(int sessionId, IClientCb *cb);
144      int UnRegisterCb(const int sessionId);
145      int RegisterDeadCb(int sessionId, IServiceDeadCb *cb);
146      int UnRegisterDeadCb(const int sessionId);
147      int WaitConnection();
148  
149      virtual int InitAiServer(const ConfigInfo &configInfo, ClientInfo &clientInfo,
150          const AlgorithmInfo &algorithmInfo) = 0;
151      virtual int CloseAiServer() = 0;
152      virtual int LoadAlgorithm(const ClientInfo &clientInfo, const AlgorithmInfo &algorithmInfo,
153          const DataInfo &inputInfo, DataInfo &outputInfo) = 0;
154      virtual int AsyncExecute(const ClientInfo &clientInfo, const AlgorithmInfo &algorithmInfo,
155          const DataInfo &inputInfo) = 0;
156      virtual int SyncExecute(const ClientInfo &clientInfo, const AlgorithmInfo &algorithmInfo,
157          const DataInfo &inputInfo, DataInfo &outputInfo) = 0;
158      virtual int SetOption(const ClientInfo &clientInfo, int optionType, const DataInfo &inputInfo) = 0;
159      virtual int GetOption(const ClientInfo &clientInfo, int optionType, const DataInfo &inputInfo,
160          DataInfo &outputInfo) = 0;
161      virtual int UnLoadAlgorithm(const ClientInfo &clientInfo, const AlgorithmInfo &algorithmInfo,
162          const DataInfo &inputInfo) = 0;
163  
164  private:
165      static std::mutex sessionIdMutex_;
166  
167      int clientId_ {INVALID_CLIENT_ID};
168      uid_t serverUid_ {INVALID_UID};
169      std::atomic<int> sessionId_ {AIE_SESSION_ID_BEGIN};
170  
171      // map <sessionId, algorithmType>
172      using SessionInfos = std::map<int, int>;
173      SessionInfos sessionInfos_;
174  };
175  
176  ClientFactory *GetClient();
177  } // namespace AI
178  } // namespace OHOS
179  
180  #endif // CLIENT_FACTORY_H
181