1 /*
2  * Copyright (c) 2023 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 DATASHARESERVICE_DATA_SERVICE_IMPL_H
17 #define DATASHARESERVICE_DATA_SERVICE_IMPL_H
18 
19 #include <cstdint>
20 #include <functional>
21 #include <string>
22 
23 #include "bundle_mgr_proxy.h"
24 #include "common_event_subscribe_info.h"
25 #include "common_event_subscriber.h"
26 #include "changeevent/remote_change_event.h"
27 #include "data_proxy_observer.h"
28 #include "data_provider_config.h"
29 #include "data_share_db_config.h"
30 #include "data_share_service_stub.h"
31 #include "data_share_silent_config.h"
32 #include "datashare_template.h"
33 #include "db_delegate.h"
34 #include "eventcenter/event.h"
35 #include "feature/static_acts.h"
36 #include "get_data_strategy.h"
37 #include "publish_strategy.h"
38 #include "rdb_notify_strategy.h"
39 #include "subscribe_strategy.h"
40 #include "template_strategy.h"
41 #include "uri_utils.h"
42 #include "visibility.h"
43 
44 namespace OHOS::DataShare {
45 class DataShareServiceImpl : public DataShareServiceStub {
46 public:
47     using Handler = std::function<void(int, std::map<std::string, std::vector<std::string>> &)>;
48     using ExecuteCallback = std::function<int32_t(DataProviderConfig::ProviderInfo &,
49         DistributedData::StoreMetaData &, std::shared_ptr<DBDelegate>)>;
50     using ExecuteCallbackEx = std::function<std::pair<int32_t, int32_t>(DataProviderConfig::ProviderInfo &,
51         DistributedData::StoreMetaData &, std::shared_ptr<DBDelegate>)>;
52     DataShareServiceImpl() = default;
53     virtual ~DataShareServiceImpl();
54     int32_t Insert(const std::string &uri, const DataShareValuesBucket &valuesBucket) override;
55     int32_t Update(const std::string &uri, const DataSharePredicates &predicate,
56         const DataShareValuesBucket &valuesBucket) override;
57     int32_t Delete(const std::string &uri, const DataSharePredicates &predicate) override;
58     std::pair<int32_t, int32_t> InsertEx(const std::string &uri, const std::string &extUri,
59         const DataShareValuesBucket &valuesBucket) override;
60     std::pair<int32_t, int32_t> UpdateEx(const std::string &uri, const std::string &extUri,
61         const DataSharePredicates &predicate, const DataShareValuesBucket &valuesBucket) override;
62     std::pair<int32_t, int32_t> DeleteEx(const std::string &uri, const std::string &extUri,
63         const DataSharePredicates &predicate) override;
64     std::shared_ptr<DataShareResultSet> Query(const std::string &uri, const std::string &extUri,
65         const DataSharePredicates &predicates, const std::vector<std::string> &columns, int &errCode) override;
66     int32_t AddTemplate(const std::string &uri, const int64_t subscriberId, const Template &tplt) override;
67     int32_t DelTemplate(const std::string &uri, const int64_t subscriberId) override;
68     std::vector<OperationResult> Publish(const Data &data, const std::string &bundleNameOfProvider) override;
69     Data GetData(const std::string &bundleNameOfProvider, int &errorCode) override;
70     std::vector<OperationResult> SubscribeRdbData(const std::vector<std::string> &uris,
71         const TemplateId &id, const sptr<IDataProxyRdbObserver> observer) override;
72     std::vector<OperationResult> UnsubscribeRdbData(
73         const std::vector<std::string> &uris, const TemplateId &id) override;
74     std::vector<OperationResult> EnableRdbSubs(
75         const std::vector<std::string> &uris, const TemplateId &id) override;
76     std::vector<OperationResult> DisableRdbSubs(
77         const std::vector<std::string> &uris, const TemplateId &id) override;
78     std::vector<OperationResult> SubscribePublishedData(const std::vector<std::string> &uris,
79         const int64_t subscriberId, const sptr<IDataProxyPublishedDataObserver> observer) override;
80     std::vector<OperationResult> UnsubscribePublishedData(const std::vector<std::string> &uris,
81         const int64_t subscriberId) override;
82     std::vector<OperationResult> EnablePubSubs(const std::vector<std::string> &uris,
83         const int64_t subscriberId) override;
84     std::vector<OperationResult> DisablePubSubs(const std::vector<std::string> &uris,
85         const int64_t subscriberId) override;
86     void OnConnectDone() override;
87     int32_t OnBind(const BindInfo &binderInfo) override;
88     int32_t OnAppExit(pid_t uid, pid_t pid, uint32_t tokenId, const std::string &bundleName) override;
89     int32_t OnAppUninstall(const std::string &bundleName, int32_t user, int32_t index) override;
90     int32_t OnAppUpdate(const std::string &bundleName, int32_t user, int32_t index) override;
91     void NotifyObserver(const std::string &uri) override;
92     void DumpDataShareServiceInfo(int fd, std::map<std::string, std::vector<std::string>> &params);
93     int32_t OnInitialize() override;
94     int32_t EnableSilentProxy(const std::string &uri, bool enable) override;
95     int32_t GetSilentProxyStatus(const std::string &uri, bool isCreateHelper) override;
96     int32_t RegisterObserver(const std::string &uri, const sptr<OHOS::IRemoteObject> &remoteObj) override;
97     int32_t UnregisterObserver(const std::string &uri, const sptr<OHOS::IRemoteObject> &remoteObj) override;
98 private:
99     class SystemAbilityStatusChangeListener;
100     using StaticActs = DistributedData::StaticActs;
101     class DataShareStatic : public StaticActs {
102     public:
~DataShareStatic()103         ~DataShareStatic() override {};
104         int32_t OnAppUninstall(const std::string &bundleName, int32_t user, int32_t index) override;
105         int32_t OnAppUpdate(const std::string &bundleName, int32_t user, int32_t index) override;
106         int32_t OnClearAppStorage(const std::string &bundleName, int32_t user, int32_t index, int32_t tokenId) override;
107     };
108     class Factory {
109     public:
110         Factory();
111         ~Factory();
112     private:
113         std::shared_ptr<DataShareStatic> staticActs_;
114     };
115     class TimerReceiver : public EventFwk::CommonEventSubscriber {
116     public:
117         TimerReceiver() = default;
118         explicit TimerReceiver(const EventFwk::CommonEventSubscribeInfo &subscriberInfo);
119         virtual ~TimerReceiver() = default;
120         void OnReceiveEvent(const EventFwk::CommonEventData &eventData) override;
121     };
122     void RegisterDataShareServiceInfo();
123     void RegisterHandler();
124     bool SubscribeTimeChanged();
125     bool NotifyChange(const std::string &uri);
126     bool GetCallerBundleName(std::string &bundleName);
127     int32_t Execute(const std::string &uri, const std::string &extUri, const int32_t tokenId,
128         bool isRead, ExecuteCallback callback);
129     std::pair<int32_t, int32_t> ExecuteEx(const std::string &uri, const std::string &extUri, const int32_t tokenId,
130         bool isRead, ExecuteCallbackEx callback);
131     int32_t GetBMSAndMetaDataStatus(const std::string &uri, const int32_t tokenId);
132     void SubscribeCommonEvent();
133     static void InitSubEvent();
134     void AutoLaunch(const DistributedData::Event &event);
135     void SubscribeChange();
136     bool AllowCleanDataLaunchApp(const DistributedData::Event &event, bool launchForCleanData);
137     static void SaveLaunchInfo(const std::string &bundleName, const std::string &userId,
138         const std::string &deviceId);
139     static DistributedData::StoreMetaData MakeMetaData(const std::string &bundleName, const std::string &userId,
140         const std::string &deviceId, const std::string storeId = "");
141     void ReportExcuteFault(uint32_t callingTokenId, DataProviderConfig::ProviderInfo &providerInfo,
142         int32_t errCode, std::string &func);
143     static Factory factory_;
144     static constexpr int32_t ERROR = -1;
145     static constexpr int32_t ERROR_PERMISSION_DENIED = -2;
146     static constexpr const char *PROXY_URI_SCHEMA = "datashareproxy";
147     static constexpr const char *EXT_URI_SCHEMA = "datashare://";
148     PublishStrategy publishStrategy_;
149     GetDataStrategy getDataStrategy_;
150     SubscribeStrategy subscribeStrategy_;
151     TemplateStrategy templateStrategy_;
152     RdbNotifyStrategy rdbNotifyStrategy_;
153     BindInfo binderInfo_;
154     std::shared_ptr<TimerReceiver> timerReceiver_ = nullptr;
155     DataShareSilentConfig dataShareSilentConfig_;
156 };
157 } // namespace OHOS::DataShare
158 #endif // DATASHARESERVICE_DATA_SERVICE_IMPL_H
159