1 /*
2  * Copyright (c) 2020 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 #include "bundle_self_callback.h"
17 
18 #include "adapter.h"
19 #include "bundle_callback_utils.h"
20 #include "bundle_manager.h"
21 #include "iproxy_client.h"
22 #include "bundle_log.h"
23 #include "samgr_lite.h"
24 #include "rpc_errno.h"
25 
26 namespace OHOS {
~BundleSelfCallback()27 BundleSelfCallback::~BundleSelfCallback()
28 {
29     if (svcIdentity_ != nullptr) {
30         AdapterFree(svcIdentity_);
31     }
32 }
33 
InnerCallback(const char * resultMessage,uint8_t resultCode,const InstallerCallback & installerCallback)34 int32_t InnerCallback(const char *resultMessage, uint8_t resultCode, const InstallerCallback& installerCallback)
35 {
36     if ((resultMessage == nullptr) || (installerCallback == nullptr)) {
37         return ERR_APPEXECFWK_OBJECT_NULL;
38     }
39     if (resultCode == ERR_OK) {
40         installerCallback(resultCode, resultMessage);
41     } else {
42         installerCallback(resultCode, ObtainErrorMessage(resultCode).c_str());
43     }
44     return ERR_OK;
45 }
46 
Callback(uint32_t code,IpcIo * data,IpcIo * reply,MessageOption option)47 int32_t BundleSelfCallback::Callback(uint32_t code, IpcIo* data, IpcIo* reply, MessageOption option)
48 {
49     if (data == nullptr) {
50         HILOG_ERROR(HILOG_MODULE_APP, "BundleSelfCallback data is nullptr");
51         return ERR_APPEXECFWK_OBJECT_NULL;
52     }
53     InstallerCallback installerCallback = GetInstance().GetCallback();
54     if (installerCallback == nullptr) {
55         return ERR_APPEXECFWK_OBJECT_NULL;
56     }
57     int32_t readCode;
58     ReadInt32(data, &readCode);
59     auto resultCode = static_cast<uint8_t>(readCode);
60     if (code == INSTALL_CALLBACK) {
61         return InnerCallback(INSTALL_SUCCESS, resultCode, installerCallback);
62     }
63     if (code == UNINSTALL_CALLBACK) {
64         return InnerCallback(UNINSTALL_SUCCESS, resultCode, installerCallback);
65     }
66     HILOG_ERROR(HILOG_MODULE_APP, "BundleSelfCallback get error install type");
67     return ERR_APPEXECFWK_CALLBACK_GET_ERROR_INSTALLTYPE;
68 }
69 
GenerateLocalServiceId()70 int32 BundleSelfCallback::GenerateLocalServiceId()
71 {
72     svcIdentity_ = reinterpret_cast<SvcIdentity *>(AdapterMalloc(sizeof(SvcIdentity)));
73     if (svcIdentity_ == nullptr) {
74         return ERR_APPEXECFWK_CALLBACK_GENERATE_LOCAL_SERVICEID_FAILED;
75     }
76 
77     objectStub_.func = BundleSelfCallback::Callback;
78     objectStub_.args = nullptr;
79     objectStub_.isRemote = false;
80 
81     svcIdentity_->handle = IPC_INVALID_HANDLE;
82     svcIdentity_->token = SERVICE_TYPE_ANONYMOUS;
83     svcIdentity_->cookie = (uintptr_t)&objectStub_;
84     return ERR_OK;
85 }
86 
RegisterBundleSelfCallback(InstallerCallback & installerCallback)87 const SvcIdentity *BundleSelfCallback::RegisterBundleSelfCallback(InstallerCallback &installerCallback)
88 {
89     if (installerCallback == nullptr) {
90         return nullptr;
91     }
92     if (svcIdentity_ == nullptr) {
93         int32 ret = GenerateLocalServiceId();
94         if (ret != ERR_OK) {
95             return nullptr;
96         }
97     }
98     installerCallback_ = installerCallback;
99     return svcIdentity_;
100 }
101 
GetCallback()102 const InstallerCallback BundleSelfCallback::GetCallback()
103 {
104     return installerCallback_;
105 }
106 } // namespace
107