• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "migrate_avsession_server.h"
17 
18 #include <chrono>
19 #include <thread>
20 
21 #include "audio_device_manager.h"
22 #include "avsession_errors.h"
23 #include "avsession_item.h"
24 #include "avsession_log.h"
25 #include "avsession_service.h"
26 #include "softbus/softbus_session_utils.h"
27 #include "migrate_avsession_constant.h"
28 #include "base64_utils.h"
29 #include "avsession_pixel_map_adapter.h"
30 #include "pixel_map.h"
31 #include "image_packer.h"
32 #include "avsession_event_handler.h"
33 
34 namespace OHOS::AVSession {
MigrateAVSessionServer(int32_t migrateMode,std::string deviceId)35 MigrateAVSessionServer::MigrateAVSessionServer(int32_t migrateMode, std::string deviceId)
36 {
37     SLOGI("MigrateAVSessionServer start with mode:%{public}d|deviceId:%{public}s.", migrateMode,
38         SoftbusSessionUtils::AnonymizeDeviceId(deviceId).c_str());
39     migrateMode_ = migrateMode;
40     deviceId_ = deviceId;
41 }
42 
~MigrateAVSessionServer()43 MigrateAVSessionServer::~MigrateAVSessionServer()
44 {
45     {
46         std::lock_guard lockGuard(migrateControllerLock_);
47         for (auto& pair : playerIdToControllerCallbackMap_) {
48             std::shared_ptr<AVControllerObserver> controllerObserver = pair.second;
49             CHECK_AND_CONTINUE(controllerObserver != nullptr);
50             controllerObserver->Release();
51         }
52     }
53     {
54         std::lock_guard lockGuard(cacheJsonLock_);
55         metaDataCache_.Reset();
56         playbackStateCache_.SetState(0);
57         playbackStateCache_.SetFavorite(0);
58     }
59     SLOGI("MigrateAVSessionServer quit with mode:%{public}d|deviceId:%{public}s.", migrateMode_,
60         SoftbusSessionUtils::AnonymizeDeviceId(deviceId_).c_str());
61 }
62 
OnConnectProxy(const std::string & deviceId)63 void MigrateAVSessionServer::OnConnectProxy(const std::string &deviceId)
64 {
65     SLOGI("OnConnectProxy: %{public}d|%{public}s.",
66         migrateMode_, SoftbusSessionUtils::AnonymizeDeviceId(deviceId).c_str());
67     if (deviceId_ != deviceId && !deviceId_.empty()) {
68         SLOGI("onConnect but already:%{public}s.", SoftbusSessionUtils::AnonymizeDeviceId(deviceId_).c_str());
69         return;
70     }
71     isSoftbusConnecting_ = true;
72     deviceId_ = deviceId;
73     if (migrateMode_ == MIGRATE_MODE_NEXT) {
74         SLOGI("connect process as next behavior");
75         LocalFrontSessionArrive(lastSessionId_);
76         RegisterAudioCallbackAndTrigger();
77         return;
78     }
79     ObserveControllerChanged(deviceId);
80     SendSpecialKeepaliveData();
81     SendRemoteHistorySessionList(deviceId);
82     SendRemoteControllerList(deviceId);
83 }
84 
OnDisconnectProxy(const std::string & deviceId)85 void MigrateAVSessionServer::OnDisconnectProxy(const std::string &deviceId)
86 {
87     SLOGI("OnDisConnectProxy: %{public}d|%{public}s",
88         migrateMode_, SoftbusSessionUtils::AnonymizeDeviceId(deviceId).c_str());
89     if (deviceId_ != deviceId && !deviceId_.empty()) {
90         SLOGI("onDisconnect but already:%{public}s", SoftbusSessionUtils::AnonymizeDeviceId(deviceId_).c_str());
91         return;
92     }
93     UnregisterAudioCallback();
94     isSoftbusConnecting_ = false;
95     if (servicePtr_ == nullptr) {
96         SLOGE("do NotifyMigrateStop without servicePtr, return");
97         return;
98     }
99     if (migrateMode_ == MIGRATE_MODE_NEXT) {
100         SLOGI("migrate next should not bother migrate cross");
101         return;
102     }
103     servicePtr_->NotifyMigrateStop(deviceId);
104 }
105 
RegisterAudioCallbackAndTrigger()106 void MigrateAVSessionServer::RegisterAudioCallbackAndTrigger()
107 {
108     AudioAdapter::GetInstance().RegisterVolumeKeyEventCallback(volumeKeyEventCallbackFunc_);
109     volumeKeyEventCallbackFunc_(AudioAdapter::GetInstance().GetVolume());
110 
111     AudioAdapter::GetInstance().SetAvailableDeviceChangeCallback(availableDeviceChangeCallbackFunc_);
112     availableDeviceChangeCallbackFunc_(AudioAdapter::GetInstance().GetAvailableDevices());
113 
114     AudioAdapter::GetInstance().SetPreferredOutputDeviceChangeCallback(preferredDeviceChangeCallbackFunc_);
115     preferredDeviceChangeCallbackFunc_(AudioAdapter::GetInstance().GetPreferredOutputDeviceForRendererInfo());
116 }
117 
TriggerAudioCallback()118 void MigrateAVSessionServer::TriggerAudioCallback()
119 {
120     CHECK_AND_RETURN_LOG(volumeKeyEventCallbackFunc_ != nullptr, "VolumeKeyEventCallback nullptr");
121     CHECK_AND_RETURN_LOG(availableDeviceChangeCallbackFunc_ != nullptr, "AvailableDeviceChangeCallback nullptr");
122     CHECK_AND_RETURN_LOG(preferredDeviceChangeCallbackFunc_ != nullptr, "PreferredOutputDeviceChangeCallback nullptr");
123     volumeKeyEventCallbackFunc_(AudioAdapter::GetInstance().GetVolume());
124     availableDeviceChangeCallbackFunc_(AudioAdapter::GetInstance().GetAvailableDevices());
125     preferredDeviceChangeCallbackFunc_(AudioAdapter::GetInstance().GetPreferredOutputDeviceForRendererInfo());
126 }
127 
UnregisterAudioCallback()128 void MigrateAVSessionServer::UnregisterAudioCallback()
129 {
130     if (migrateMode_ == MIGRATE_MODE_NEXT) {
131         AudioAdapter::GetInstance().UnregisterVolumeKeyEventCallback();
132         AudioAdapter::GetInstance().UnsetAvailableDeviceChangeCallback();
133         AudioAdapter::GetInstance().UnsetPreferredOutputDeviceChangeCallback();
134     }
135 }
136 
GetCharacteristic()137 int32_t MigrateAVSessionServer::GetCharacteristic()
138 {
139     if (migrateMode_ == MIGRATE_MODE_NEXT) {
140         return MSG_HEAD_MODE_FOR_NEXT;
141     }
142     return MSG_HEAD_MODE;
143 }
144 
ObserveControllerChanged(const std::string & deviceId)145 void MigrateAVSessionServer::ObserveControllerChanged(const std::string &deviceId)
146 {
147     std::vector<AVSessionDescriptor> descriptors;
148     auto res = servicePtr_->GetAllSessionDescriptors(descriptors);
149     if (res != AVSESSION_SUCCESS) {
150         SLOGW("GetAllSessionDescriptors fail");
151         return;
152     }
153 
154     for (auto &item : descriptors) {
155         if (item.sessionType_ != AVSession::SESSION_TYPE_AUDIO ||
156             item.elementName_.GetBundleName().empty() ||
157             item.elementName_.GetBundleName() == ANCO_AUDIO_BUNDLE_NAME) {
158             continue;
159         }
160         if (item.isTopSession_) {
161             std::lock_guard lockGuard(topSessionLock_);
162             topSessionId_ = item.sessionId_;
163         }
164         CreateController(item.sessionId_);
165     }
166 }
167 
CreateController(const std::string & sessionId)168 void MigrateAVSessionServer::CreateController(const std::string &sessionId)
169 {
170     {
171         std::lock_guard lockGuard(migrateControllerLock_);
172         auto it = playerIdToControllerCallbackMap_.find(sessionId);
173         if (it != playerIdToControllerCallbackMap_.end()) {
174             SLOGW("CreateControlller has registered");
175             return;
176         }
177     }
178     sptr<IRemoteObject> proxyObject;
179     CHECK_AND_RETURN_LOG(servicePtr_ != nullptr, "createController without servicePtr");
180     int32_t ret = servicePtr_->CreateControllerInner(sessionId, proxyObject, migrateMode_);
181     if (ret != AVSESSION_SUCCESS && !(ret == ERR_CONTROLLER_IS_EXIST && proxyObject != nullptr)) {
182         SLOGW("CreateControllerInner fail");
183         return;
184     }
185     sptr<AVControllerItem> controller = iface_cast<AVControllerItem>(proxyObject);
186     if (controller == nullptr) {
187         SLOGW("controller is null");
188         return;
189     }
190     std::shared_ptr<AVControllerObserver> callback = std::make_shared<AVControllerObserver>(sessionId);
191     std::weak_ptr<MigrateAVSessionServer> migrageServerWeak(shared_from_this());
192     callback->Init(migrageServerWeak, migrateMode_);
193     ret = controller->RegisterAVControllerCallback(callback);
194     if (ret != AVSESSION_SUCCESS) {
195         SLOGW("RegisteAVControllerCallback fail");
196         return;
197     }
198     AVMetaData::MetaMaskType metaDataFilter(METADATA_MASK_ALL);
199     AVPlaybackState::PlaybackStateMaskType playFilter(PLAYBACK_MASK_ALL);
200     controller->SetMetaFilter(metaDataFilter);
201     controller->SetPlaybackFilter(playFilter);
202     UpdateCache(sessionId, controller, callback, true);
203 }
204 
ClearCacheBySessionId(const std::string & sessionId)205 void MigrateAVSessionServer::ClearCacheBySessionId(const std::string &sessionId)
206 {
207     std::lock_guard lockGuard(migrateControllerLock_);
208     auto it = playerIdToControllerMap_.find(sessionId);
209     if (it != playerIdToControllerMap_.end()) {
210         if (std::count(sortControllerList_.begin(), sortControllerList_.end(), it->second) > 0) {
211             SLOGI("ClearCacheBySessionId in and remove controller in sortList");
212             sortControllerList_.remove(it->second);
213         }
214         playerIdToControllerMap_.erase(it);
215     }
216 
217     auto item = playerIdToControllerCallbackMap_.find(sessionId);
218     if (item != playerIdToControllerCallbackMap_.end()) {
219         playerIdToControllerCallbackMap_.erase(item);
220     }
221 }
222 
223 // LCOV_EXCL_START
UpdateCache(const std::string & sessionId,sptr<AVControllerItem> avcontroller,std::shared_ptr<AVControllerObserver> callback,bool isAdd)224 void MigrateAVSessionServer::UpdateCache(const std::string &sessionId, sptr<AVControllerItem> avcontroller,
225     std::shared_ptr<AVControllerObserver> callback, bool isAdd)
226 {
227     if (isAdd) {
228         if (avcontroller == nullptr) {
229             return;
230         }
231         std::lock_guard lockGuard(migrateControllerLock_);
232         playerIdToControllerMap_.insert({sessionId, avcontroller});
233         playerIdToControllerCallbackMap_.insert({sessionId, callback});
234         sortControllerList_.push_back(avcontroller);
235     } else {
236         ClearCacheBySessionId(sessionId);
237     }
238 }
239 // LCOV_EXCL_STOP
240 
StopObserveControllerChanged(const std::string & deviceId)241 void MigrateAVSessionServer::StopObserveControllerChanged(const std::string &deviceId)
242 {
243     SLOGI("StopObserveControllerChanged with id %{public}s", SoftbusSessionUtils::AnonymizeDeviceId(deviceId).c_str());
244     std::lock_guard lockGuard(migrateControllerLock_);
245     for (auto it = sortControllerList_.begin(); it != sortControllerList_.end(); it++) {
246         (*it)->Destroy();
247         SLOGI("Controller destroy");
248     }
249     deviceId_ = "";
250     playerIdToControllerMap_.clear();
251     sortControllerList_.clear();
252     playerIdToControllerCallbackMap_.clear();
253 }
254 
255 // LCOV_EXCL_START
OnBytesReceived(const std::string & deviceId,const std::string & data)256 void MigrateAVSessionServer::OnBytesReceived(const std::string &deviceId, const std::string &data)
257 {
258     SLOGD("OnBytesReceived:%{public}d", static_cast<int>(data.size()));
259     if (data.length() < MSG_HEAD_LENGTH) {
260         SLOGW("OnBytesReceived: invalid data");
261         return;
262     }
263     if (migrateMode_ == MIGRATE_MODE_NEXT) {
264         ProcFromNext(deviceId, data);
265         return;
266     }
267     if (data[1] == SYNC_COMMAND) {
268         ProcControlCommand(data);
269     } else if (data[1] == COLD_START) {
270         StartConfigHistorySession(data);
271     }
272 }
273 // LCOV_EXCL_STOP
274 
ProcControlCommand(const std::string & data)275 void MigrateAVSessionServer::ProcControlCommand(const std::string &data)
276 {
277     std::string jsonStr = data.substr(MSG_HEAD_LENGTH);
278     SLOGI("ProcControlCommand: %{public}s", jsonStr.c_str());
279     cJSON* root = nullptr;
280     if (!SoftbusSessionUtils::TransferStrToJson(jsonStr, root)) {
281         SLOGE("json parse fail");
282         return;
283     }
284     if (!cJSON_HasObjectItem(root, PLAYER_ID) || !cJSON_HasObjectItem(root, MEDIA_COMMAND) ||
285         !cJSON_HasObjectItem(root, COMMAND)) {
286         SLOGE("json parse with error member");
287         cJSON_Delete(root);
288         return;
289     }
290     std::string playerId = SoftbusSessionUtils::GetStringFromJson(root, PLAYER_ID);
291     playerId = playerId.empty() ? "ERROR_PLAYER_ID" : playerId;
292     sptr<AVControllerItem> avcontroller{nullptr};
293     auto res = GetControllerById(playerId, avcontroller);
294     if (res != AVSESSION_SUCCESS || avcontroller == nullptr) {
295         SLOGW("GetControllerById fail");
296         cJSON_Delete(root);
297         return;
298     }
299     int mediaCommand = SoftbusSessionUtils::GetIntFromJson(root, MEDIA_COMMAND);
300     std::string command = SoftbusSessionUtils::GetStringFromJson(root, COMMAND);
301     command = command.empty() ? "ERROR_COMMAND" : command;
302     SLOGI("ProcContolCommand mediaCommand: %{public}d", mediaCommand);
303     std::string extras = SoftbusSessionUtils::GetStringFromJson(root, EXTRAS);
304     if (extras.empty()) {
305         extras = "ERROR_EXTRAS";
306     }
307     switch (mediaCommand) {
308         case SYNC_MEDIASESSION_CALLBACK_ON_COMMAND:
309             SendCommandProc(command, avcontroller);
310             break;
311         case SYNC_MEDIASESSION_CALLBACK_ON_MEDIABUTTON_EVENT:
312             MediaButtonEventProc(command, avcontroller);
313             break;
314         case SYNC_MEDIASESSION_CALLBACK_ON_PLAY_FROM_SEARCH:
315         case SYNC_MEDIASESSION_CALLBACK_ON_PLAY_FROM_MEDIAID:
316         case SYNC_MEDIASESSION_CALLBACK_ON_CUSTOMACTION:
317             CommandWithExtrasProc(mediaCommand, command, extras, avcontroller);
318             break;
319         default:
320             PlaybackCommandDataProc(mediaCommand, command, avcontroller);
321             break;
322     }
323     cJSON_Delete(root);
324 }
325 
StartConfigHistorySession(const std::string & data)326 void MigrateAVSessionServer::StartConfigHistorySession(const std::string &data)
327 {
328     std::string jsonStr = data.substr(MSG_HEAD_LENGTH);
329     SLOGI("StartConfigHistorySession: %{public}s", jsonStr.c_str());
330     cJSON* jsonData = nullptr;
331     if (!SoftbusSessionUtils::TransferStrToJson(jsonStr, jsonData)) {
332         SLOGE("jStartConfigHistorySession: parse json failed");
333         return;
334     }
335 
336     if (!cJSON_HasObjectItem(jsonData, PLAYER_ID)) {
337         SLOGE("StartConfigHistorySession: json parse with error member");
338         cJSON_Delete(jsonData);
339         return;
340     }
341     std::string playerId = SoftbusSessionUtils::GetStringFromJson(jsonData, PLAYER_ID);
342     if (playerId.empty()) {
343         playerId = "ERROR_PLAYER_ID";
344     }
345 
346     int32_t ret = servicePtr_->StartAVPlayback(playerId, "");
347     SLOGI("StartConfigHistorySession StartAVPlayback %{public}s, ret=%{public}d",
348         SoftbusSessionUtils::AnonymizeDeviceId(playerId).c_str(), ret);
349     cJSON_Delete(jsonData);
350 }
351 
352 // LCOV_EXCL_START
GetControllerById(const std::string & sessionId,sptr<AVControllerItem> & controller)353 int32_t MigrateAVSessionServer::GetControllerById(const std::string &sessionId, sptr<AVControllerItem> &controller)
354 {
355     if (sessionId.empty()) {
356         SLOGW("empty sessionId");
357         return AVSESSION_ERROR;
358     }
359 
360     std::lock_guard lockGuard(migrateControllerLock_);
361     for (auto it = playerIdToControllerMap_.begin(); it != playerIdToControllerMap_.end(); it++) {
362         std::string foundId = it->first;
363         if (it->first == sessionId) {
364             controller = it->second;
365             return AVSESSION_SUCCESS;
366         }
367     }
368     SLOGW("controller not found");
369     return AVSESSION_ERROR;
370 }
371 
GetAllControllers(std::vector<sptr<AVControllerItem>> & controller)372 int32_t MigrateAVSessionServer::GetAllControllers(std::vector<sptr<AVControllerItem>> &controller)
373 {
374     std::vector<AVSessionDescriptor> descriptors;
375     auto res = servicePtr_->GetAllSessionDescriptors(descriptors);
376     if (res != AVSESSION_SUCCESS) {
377         SLOGW("GetAllSessionDescriptors failed");
378         return AVSESSION_ERROR;
379     }
380     std::lock_guard lockGuard(migrateControllerLock_);
381     for (auto iter = descriptors.begin(); iter != descriptors.end(); iter++) {
382         if (iter->sessionType_ != AVSession::SESSION_TYPE_AUDIO ||
383             iter->elementName_.GetBundleName().empty() ||
384             iter->elementName_.GetBundleName() == ANCO_AUDIO_BUNDLE_NAME ||
385             releaseSessionId_.compare(iter->sessionId_) == 0) {
386             continue;
387         }
388         auto it = playerIdToControllerMap_.find(iter->sessionId_);
389         if (it != playerIdToControllerMap_.end()) {
390             controller.push_back(it->second);
391         }
392     }
393     return AVSESSION_SUCCESS;
394 }
395 // LCOV_EXCL_STOP
396 
Init(AVSessionService * ptr)397 void MigrateAVSessionServer::Init(AVSessionService *ptr)
398 {
399     servicePtr_ = ptr;
400     supportCrossMediaPlay_ = false;
401 }
402 
ResetSupportCrossMediaPlay(const std::string & extraInfo)403 void MigrateAVSessionServer::ResetSupportCrossMediaPlay(const std::string &extraInfo)
404 {
405     cJSON* jsonData = nullptr;
406     if (!SoftbusSessionUtils::TransferStrToJson(extraInfo, jsonData)) {
407         SLOGE("json parse fail");
408         return;
409     }
410     bool isSupportSingleFrameMediaPlay = SoftbusSessionUtils::GetBoolFromJson(jsonData,
411         IS_SUPPORT_SINGLE_FRAME_MEDIA_PLAY);
412 
413     SLOGI("SuperLauncher: isSupportSingleFrameMediaPlay=%{public}d", isSupportSingleFrameMediaPlay);
414     supportCrossMediaPlay_ = isSupportSingleFrameMediaPlay;
415     cJSON_Delete(jsonData);
416 }
417 
418 // LCOV_EXCL_START
OnSessionCreate(const AVSessionDescriptor & descriptor)419 void MigrateAVSessionServer::OnSessionCreate(const AVSessionDescriptor &descriptor)
420 {
421     if (migrateMode_ == MIGRATE_MODE_NEXT) {
422         return;
423     }
424     SLOGI("OnSessionCreate");
425     std::string sessionId = descriptor.sessionId_;
426     if (sessionId.empty()) {
427         SLOGW("no valid avsession");
428         return;
429     }
430     if (descriptor.sessionType_ != AVSession::SESSION_TYPE_AUDIO ||
431         descriptor.elementName_.GetBundleName().empty() ||
432         descriptor.elementName_.GetBundleName() == ANCO_AUDIO_BUNDLE_NAME) {
433         SLOGI("not audio avsession or anco audio");
434         return;
435     }
436     std::string identity = IPCSkeleton::ResetCallingIdentity();
437     CreateController(sessionId);
438     IPCSkeleton::SetCallingIdentity(identity);
439 }
440 
OnSessionRelease(const AVSessionDescriptor & descriptor)441 void MigrateAVSessionServer::OnSessionRelease(const AVSessionDescriptor &descriptor)
442 {
443     if (migrateMode_ == MIGRATE_MODE_NEXT) {
444         return;
445     }
446     std::string sessionId = descriptor.sessionId_;
447     if (sessionId.empty()) {
448         SLOGW("no valid avsession");
449         return;
450     }
451     SLOGI("OnSessionRelease : %{public}s", SoftbusSessionUtils::AnonymizeDeviceId(sessionId).c_str());
452     ClearCacheBySessionId(sessionId);
453     releaseSessionId_ = sessionId;
454     releaseSessionBundleName_ = descriptor.elementName_.GetBundleName();
455     SendRemoteHistorySessionList(deviceId_);
456     SendRemoteControllerList(deviceId_);
457     releaseSessionId_ = "";
458     releaseSessionBundleName_ = "";
459 }
460 
OnTopSessionChange(const AVSessionDescriptor & descriptor)461 void MigrateAVSessionServer::OnTopSessionChange(const AVSessionDescriptor &descriptor)
462 {
463     if (migrateMode_ == MIGRATE_MODE_NEXT) {
464         return;
465     }
466     SLOGI("OnTopSessionChange sessionId_: %{public}s***",
467         descriptor.sessionId_.substr(0, UNMASK_CHAR_NUM).c_str());
468     {
469         std::lock_guard lockGuard(topSessionLock_);
470         if (descriptor.sessionType_ != AVSession::SESSION_TYPE_AUDIO ||
471             descriptor.elementName_.GetBundleName().empty() ||
472             descriptor.elementName_.GetBundleName() == ANCO_AUDIO_BUNDLE_NAME) {
473             SLOGI("not audio avsession or anco audio");
474             return;
475         }
476         if (topSessionId_ == descriptor.sessionId_) {
477             return;
478         }
479         lastSessionId_ = topSessionId_;
480         topSessionId_ = descriptor.sessionId_;
481         auto it = playerIdToControllerMap_.find(descriptor.sessionId_);
482         if (it == playerIdToControllerMap_.end()) {
483             CreateController(descriptor.sessionId_);
484         }
485     }
486     SendRemoteHistorySessionList(deviceId_);
487     SendRemoteControllerList(deviceId_);
488 }
489 
SortControllers(std::list<sptr<AVControllerItem>> controllers)490 void MigrateAVSessionServer::SortControllers(std::list<sptr<AVControllerItem>> controllers)
491 {
492     SLOGI("SortControllers");
493     std::lock_guard topSessionLockGuard(topSessionLock_);
494     if (topSessionId_.empty()) {
495         SLOGE("SortControllers topSessionId is null");
496         return;
497     }
498     std::lock_guard lockGuard(migrateControllerLock_);
499     for (auto iter = controllers.begin(); iter != controllers.end(); iter++) {
500         if ((*iter)->GetSessionId() == topSessionId_) {
501             controllers.splice(controllers.begin(), controllers, iter);
502             break;
503         }
504     }
505 }
506 
SendRemoteControllerList(const std::string & deviceId)507 void MigrateAVSessionServer::SendRemoteControllerList(const std::string &deviceId)
508 {
509     SLOGI("SendRemoteControllerList");
510     std::vector<sptr<AVControllerItem>> avcontroller;
511     auto res = GetAllControllers(avcontroller);
512     SortControllers(sortControllerList_);
513     if (res != AVSESSION_SUCCESS) {
514         SLOGE("SendRemoteControllerList no top session");
515         return;
516     }
517     if (avcontroller.empty()) {
518         SLOGE("SendRemoteControllerList avcontroller is null");
519         ClearRemoteControllerList(deviceId);
520         return;
521     }
522     std::string msg = ConvertControllersToStr(avcontroller);
523 
524     if (!deviceId.empty()) {
525         SendByte(deviceId, msg);
526     } else {
527         SendByteToAll(msg);
528     }
529     AVSessionEventHandler::GetInstance().AVSessionPostTask([this]() {
530         DelaySendMetaData();
531         }, "DelaySendMetaData", DELAY_TIME);
532 }
533 
SendRemoteHistorySessionList(const std::string & deviceId)534 void MigrateAVSessionServer::SendRemoteHistorySessionList(const std::string &deviceId)
535 {
536     if (!supportCrossMediaPlay_) {
537         SLOGI("SendRemoteHistorySessionList, Remote does not support cross media play");
538         return;
539     }
540 
541     std::vector<AVSessionDescriptor> descriptors;
542     auto res = servicePtr_->GetAllSessionDescriptors(descriptors);
543     if (res != AVSESSION_SUCCESS) {
544         SLOGW("GetAllSessionDescriptors fail");
545         return;
546     }
547 
548     std::vector<AVSessionDescriptor> hisDescriptors;
549     auto hisRes = servicePtr_->GetHistoricalSessionDescriptors(MAX_HISTORY_SESSION_NUMS, hisDescriptors);
550     if (hisRes != AVSESSION_SUCCESS) {
551         SLOGW("GetHistoricalSessionDescriptors fail");
552         return;
553     }
554 
555     std::string msg = ConvertHistorySessionListToStr(descriptors, hisDescriptors);
556     if (!deviceId.empty()) {
557         SendByte(deviceId, msg);
558     } else {
559         SendByteToAll(msg);
560     }
561 }
562 
ConvertSessionDescriptorsToCJSON(cJSON * jsonArray,int32_t & descriptorNums)563 bool MigrateAVSessionServer::ConvertSessionDescriptorsToCJSON(cJSON* jsonArray, int32_t& descriptorNums)
564 {
565     cJSON* releaseData = SoftbusSessionUtils::GetNewCJSONObject();
566     if (releaseData == nullptr) {
567         SLOGE("get releaseData json with nullptr");
568         return false;
569     }
570 
571     std::string supportModule;
572     std::string profile;
573     if (BundleStatusAdapter::GetInstance().IsSupportPlayIntent(releaseSessionBundleName_, supportModule, profile)) {
574         if (!SoftbusSessionUtils::AddStringToJson(releaseData, PLAYER_ID, releaseSessionId_)) {
575             SLOGE("AddStringToJson with key:%{public}s|value:%{public}s fail",
576                 PLAYER_ID, releaseSessionId_.c_str());
577             cJSON_Delete(releaseData);
578             return false;
579         }
580         if (!SoftbusSessionUtils::AddStringToJson(releaseData, PACKAGE_NAME, releaseSessionBundleName_)) {
581             SLOGE("AddStringToJson with key:%{public}s|value:%{public}s fail",
582                 PACKAGE_NAME, releaseSessionBundleName_.c_str());
583             cJSON_Delete(releaseData);
584             return false;
585         }
586         if (!SoftbusSessionUtils::AddJsonToJsonArray(jsonArray, descriptorNums, releaseData)) {
587             SLOGE("AddJsonToJsonArray with index:%{public}d fail", descriptorNums);
588             return false;
589         }
590         descriptorNums++;
591     }
592     return true;
593 }
594 
ConvertReleaseSessionToCJSON(cJSON * jsonArray,std::vector<AVSessionDescriptor> & sessionDescriptors,int32_t & descriptorNums)595 bool MigrateAVSessionServer::ConvertReleaseSessionToCJSON(cJSON* jsonArray,
596     std::vector<AVSessionDescriptor>& sessionDescriptors, int32_t& descriptorNums)
597 {
598     for (auto iter = sessionDescriptors.begin(); iter != sessionDescriptors.end(); iter++) {
599         if (iter->sessionType_ != AVSession::SESSION_TYPE_AUDIO ||
600             iter->elementName_.GetBundleName().empty() ||
601             iter->elementName_.GetBundleName() == ANCO_AUDIO_BUNDLE_NAME ||
602             releaseSessionId_.compare(iter->sessionId_) == 0) {
603             continue;
604         }
605 
606         cJSON* jsonData = SoftbusSessionUtils::GetNewCJSONObject();
607         if (jsonData == nullptr) {
608             SLOGE("get jsonData json with nullptr");
609             return false;
610         }
611         if (!SoftbusSessionUtils::AddStringToJson(jsonData, PLAYER_ID, iter->sessionId_)) {
612             SLOGE("AddStringToJson with key:%{public}s|value:%{public}s fail",
613                 PLAYER_ID, iter->sessionId_.c_str());
614             cJSON_Delete(jsonData);
615             return false;
616         }
617         if (!SoftbusSessionUtils::AddStringToJson(jsonData, PACKAGE_NAME, iter->elementName_.GetBundleName())) {
618             SLOGE("AddStringToJson with key:%{public}s|value:%{public}s fail",
619                 PACKAGE_NAME, iter->elementName_.GetBundleName().c_str());
620             cJSON_Delete(jsonData);
621             return false;
622         }
623         if (!SoftbusSessionUtils::AddJsonToJsonArray(jsonArray, descriptorNums, jsonData)) {
624             SLOGE("AddJsonToJsonArray with index:%{public}d fail", descriptorNums);
625             return false;
626         }
627         descriptorNums++;
628     }
629     return true;
630 }
631 
ConvertHisSessionDescriptorsToCJSON(cJSON * jsonArray,std::vector<AVSessionDescriptor> & hisSessionDescriptors,int32_t & descriptorNums)632 bool MigrateAVSessionServer::ConvertHisSessionDescriptorsToCJSON(cJSON* jsonArray,
633     std::vector<AVSessionDescriptor>& hisSessionDescriptors, int32_t& descriptorNums)
634 {
635     for (auto iter = hisSessionDescriptors.begin(); iter != hisSessionDescriptors.end(); iter++) {
636         if (iter->sessionType_ != AVSession::SESSION_TYPE_AUDIO ||
637             iter->elementName_.GetBundleName().empty() ||
638             iter->elementName_.GetBundleName() == ANCO_AUDIO_BUNDLE_NAME ||
639             releaseSessionId_.compare(iter->sessionId_) == 0) {
640             continue;
641         }
642 
643         cJSON* jsonData = SoftbusSessionUtils::GetNewCJSONObject();
644         if (jsonData == nullptr) {
645             SLOGE("get jsonData json with nullptr");
646             return false;
647         }
648         if (!SoftbusSessionUtils::AddStringToJson(jsonData, PLAYER_ID, iter->sessionId_)) {
649             SLOGE("AddStringToJson with key:%{public}s|value:%{public}s fail",
650                 PLAYER_ID, iter->sessionId_.c_str());
651             cJSON_Delete(jsonData);
652             return false;
653         }
654         if (!SoftbusSessionUtils::AddStringToJson(jsonData, PACKAGE_NAME, iter->elementName_.GetBundleName())) {
655             SLOGE("AddStringToJson with key:%{public}s|value:%{public}s fail",
656                 PACKAGE_NAME, iter->elementName_.GetBundleName().c_str());
657             cJSON_Delete(jsonData);
658             return false;
659         }
660         if (!SoftbusSessionUtils::AddJsonToJsonArray(jsonArray, descriptorNums, jsonData)) {
661             SLOGE("AddJsonToJsonArray with index:%{public}d fail", descriptorNums);
662             return false;
663         }
664         descriptorNums++;
665     }
666     return true;
667 }
668 
ConvertHistorySessionListToStr(std::vector<AVSessionDescriptor> sessionDescriptors,std::vector<AVSessionDescriptor> hisSessionDescriptors)669 std::string MigrateAVSessionServer::ConvertHistorySessionListToStr(std::vector<AVSessionDescriptor> sessionDescriptors,
670     std::vector<AVSessionDescriptor> hisSessionDescriptors)
671 {
672     cJSON* jsonArray = SoftbusSessionUtils::GetNewCJSONArray();
673     CHECK_AND_RETURN_RET_LOG(jsonArray != nullptr, "", "get jsonArray with nullptr");
674     int32_t descriptorNums = 0;
675     if (!releaseSessionId_.empty()) {
676         if (!ConvertSessionDescriptorsToCJSON(jsonArray, descriptorNums)) {
677             SLOGE("ConvertSessionDescriptorsToCJSON fail");
678         }
679     }
680     if (!ConvertReleaseSessionToCJSON(jsonArray, sessionDescriptors, descriptorNums)) {
681         SLOGE("ConvertReleaseSessionToCJSON fail");
682     }
683     if (!ConvertHisSessionDescriptorsToCJSON(jsonArray, hisSessionDescriptors, descriptorNums)) {
684         SLOGE("ConvertHisSessionDescriptorsToCJSON fail");
685     }
686     cJSON* jsonData = SoftbusSessionUtils::GetNewCJSONObject();
687     if (jsonData == nullptr) {
688         SLOGE("get jsonData json with nullptr");
689         cJSON_Delete(jsonArray);
690         return "";
691     }
692     if (!SoftbusSessionUtils::AddJsonArrayToJson(jsonData, HISTORY_MEDIA_PLAYER_INFO, jsonArray)) {
693         SLOGE("add jsonArray into jsonData fail");
694         cJSON_Delete(jsonData);
695         return "";
696     }
697     std::string jsonStr;
698     SoftbusSessionUtils::TransferJsonToStr(jsonData, jsonStr);
699     char header[] = {MSG_HEAD_MODE, GET_HISTORY_MEDIA_INFO, '\0'};
700     std::string msg = std::string(header) + jsonStr;
701     cJSON_Delete(jsonData);
702     return msg;
703 }
704 
DelaySendMetaData()705 void MigrateAVSessionServer::DelaySendMetaData()
706 {
707     sptr<AVControllerItem> avcontroller{nullptr};
708     GetControllerById(topSessionId_, avcontroller);
709     if (avcontroller != nullptr) {
710         AVMetaData resultMetaData;
711         resultMetaData.Reset();
712         avcontroller->GetAVMetaData(resultMetaData);
713         AVMetaData metaDataInfo = resultMetaData;
714         std::shared_ptr<AVSessionPixelMap> pixelImage = resultMetaData.GetMediaImage();
715         std::shared_ptr<AVSessionPixelMap> mediaImage = std::make_shared<AVSessionPixelMap>();
716         if (pixelImage != nullptr) {
717             SLOGI("ready to copy image");
718             mediaImage->SetInnerImgBuffer(pixelImage->GetInnerImgBuffer());
719             metaDataInfo.SetMediaImage(mediaImage);
720         }
721         std::string metaDataStr = ConvertMetadataInfoToStr(topSessionId_,
722             SYNC_CONTROLLER_CALLBACK_ON_METADATA_CHANNGED, metaDataInfo);
723         SendByte(deviceId_, metaDataStr);
724         if (mediaImage != nullptr) {
725             mediaImage->Clear();
726         }
727     }
728 }
729 
GenerateClearAVSessionMsg()730 std::string MigrateAVSessionServer::GenerateClearAVSessionMsg()
731 {
732     cJSON* jsonArray = SoftbusSessionUtils::GetNewCJSONArray();
733     CHECK_AND_RETURN_RET_LOG(jsonArray != nullptr, "", "get jsonArray with nullptr");
734     cJSON* jsonData = SoftbusSessionUtils::GetNewCJSONObject();
735     if (jsonData == nullptr) {
736         SLOGE("get jsonData json with nullptr");
737         cJSON_Delete(jsonArray);
738         return "";
739     }
740     if (!SoftbusSessionUtils::AddJsonArrayToJson(jsonData, MEDIA_CONTROLLER_LIST, jsonArray)) {
741         SLOGE("add jsonArray into jsonData fail");
742         cJSON_Delete(jsonData);
743         return "";
744     }
745     std::string jsonStr;
746     SoftbusSessionUtils::TransferJsonToStr(jsonData, jsonStr);
747 
748     char header[] = {MSG_HEAD_MODE, SYNC_CONTROLLER_LIST, '\0'};
749     std::string msg = std::string(header) + jsonStr;
750     cJSON_Delete(jsonData);
751     return msg;
752 }
753 
GenerateClearHistorySessionMsg()754 std::string MigrateAVSessionServer::GenerateClearHistorySessionMsg()
755 {
756     SLOGI("GenerateClearHistorySessionMsg");
757     cJSON* jsonArray = SoftbusSessionUtils::GetNewCJSONArray();
758     CHECK_AND_RETURN_RET_LOG(jsonArray != nullptr, "", "get jsonArray with nullptr");
759     cJSON* jsonData = SoftbusSessionUtils::GetNewCJSONObject();
760     if (jsonData == nullptr) {
761         SLOGE("get jsonData json with nullptr");
762         cJSON_Delete(jsonArray);
763         return "";
764     }
765     if (!SoftbusSessionUtils::AddJsonArrayToJson(jsonData, HISTORY_MEDIA_PLAYER_INFO, jsonArray)) {
766         SLOGE("add jsonArray into jsonData fail");
767         cJSON_Delete(jsonData);
768         return "";
769     }
770     std::string jsonStr;
771     SoftbusSessionUtils::TransferJsonToStr(jsonData, jsonStr);
772 
773     char header[] = {MSG_HEAD_MODE, GET_HISTORY_MEDIA_INFO, '\0'};
774     std::string msg = std::string(header) + jsonStr;
775     cJSON_Delete(jsonData);
776     return msg;
777 }
778 
ClearRemoteControllerList(const std::string & deviceId)779 void MigrateAVSessionServer::ClearRemoteControllerList(const std::string &deviceId)
780 {
781     std::lock_guard lockGuard(migrateControllerLock_);
782     std::string msg = GenerateClearAVSessionMsg();
783     if (!deviceId.empty()) {
784         SendByte(deviceId, msg);
785     }
786 }
787 
ClearRemoteHistorySessionList(const std::string & deviceId)788 void MigrateAVSessionServer::ClearRemoteHistorySessionList(const std::string &deviceId)
789 {
790     if (!supportCrossMediaPlay_) {
791         SLOGI("ClearRemoteHistorySessionList, Remote does not support cross media play");
792         return;
793     }
794     std::lock_guard lockGuard(historySessionLock_);
795     std::string msg = GenerateClearHistorySessionMsg();
796     if (!deviceId.empty()) {
797         SendByte(deviceId, msg);
798     }
799 }
800 
ConvertControllersToStr(std::vector<sptr<AVControllerItem>> avcontrollers)801 std::string MigrateAVSessionServer::ConvertControllersToStr(
802     std::vector<sptr<AVControllerItem>> avcontrollers)
803 {
804     SLOGI("ConvertControllersToStr");
805     cJSON* jsonArray = SoftbusSessionUtils::GetNewCJSONArray();
806     CHECK_AND_RETURN_RET_LOG(jsonArray != nullptr, "", "get jsonArray with nullptr");
807     int32_t sessionNums = 0;
808     for (auto& controller : avcontrollers) {
809         if (sessionNums >= MAX_SESSION_NUMS) {
810             break;
811         }
812         if (controller == nullptr) {
813             continue;
814         }
815         std::string playerId = controller->GetSessionId();
816         cJSON* jsonObject = ConvertControllerToJson(controller);
817         CHECK_AND_CONTINUE(jsonObject != nullptr);
818         if (cJSON_IsInvalid(jsonObject) || cJSON_IsNull(jsonObject)) {
819             SLOGE("get jsonObject from ConvertControllerToJson invalid");
820             cJSON_Delete(jsonObject);
821             continue;
822         }
823         if (!SoftbusSessionUtils::AddStringToJson(jsonObject, PLAYER_ID, playerId)) {
824             SLOGE("AddStringToJson with key:%{public}s|value:%{public}s fail",
825                 PLAYER_ID, SoftbusSessionUtils::AnonymizeDeviceId(playerId).c_str());
826             cJSON_Delete(jsonObject);
827             continue;
828         }
829         if (!SoftbusSessionUtils::AddJsonToJsonArray(jsonArray, sessionNums, jsonObject)) {
830             SLOGE("AddJsonToJsonArray with index:%{public}d fail", sessionNums);
831             continue;
832         }
833         sessionNums++;
834     }
835     if (cJSON_IsInvalid(jsonArray) || cJSON_IsNull(jsonArray)) {
836         SLOGE("get jsonArray aft add object invalid");
837     }
838     cJSON* jsonData = SoftbusSessionUtils::GetNewCJSONObject();
839     if (jsonData == nullptr) {
840         SLOGE("get jsonData json with nullptr");
841     }
842     if (!SoftbusSessionUtils::AddJsonArrayToJson(jsonData, MEDIA_CONTROLLER_LIST, jsonArray)) {
843         SLOGE("add jsonArray into jsonData fail");
844     }
845     std::string jsonStr;
846     SoftbusSessionUtils::TransferJsonToStr(jsonData, jsonStr);
847 
848     char header[] = {MSG_HEAD_MODE, SYNC_CONTROLLER_LIST, '\0'};
849     std::string msg = std::string(header) + jsonStr;
850     cJSON_Delete(jsonData);
851     return msg;
852 }
853 // LCOV_EXCL_STOP
854 
ConvertControllerToJson(sptr<AVControllerItem> avcontroller)855 cJSON* MigrateAVSessionServer::ConvertControllerToJson(sptr<AVControllerItem> avcontroller)
856 {
857     SLOGI("ConvertControllerToJson");
858     cJSON* metadata = nullptr;
859     AVMetaData data;
860     data.Reset();
861     avcontroller->GetAVMetaData(data);
862     metadata = ConvertMetadataToJson(data);
863     CHECK_AND_RETURN_RET_LOG(metadata != nullptr, metadata, "get metadata json with null");
864     if (cJSON_IsInvalid(metadata) || cJSON_IsNull(metadata)) {
865         SLOGE("get metadata json with invalid");
866         cJSON_Delete(metadata);
867         return nullptr;
868     }
869 
870     AVPlaybackState state;
871     if (AVSESSION_SUCCESS == avcontroller->GetAVPlaybackState(state)) {
872         if (!SoftbusSessionUtils::AddStringToJson(metadata, PLAYBACK_STATE, RebuildPlayState(state))) {
873             SLOGE("AddStringToJson with key:%{public}s|value:%{public}s fail",
874                 PLAYBACK_STATE, RebuildPlayState(state).c_str());
875             cJSON_Delete(metadata);
876             return nullptr;
877         }
878     }
879     if (!SoftbusSessionUtils::AddStringToJson(metadata, SESSION_INFO,
880         "OAAAAEJOREwBAAAAEwAAAEMAbwBuAHQAcgBvAGwAbABlAHIAVwBoAGkAdABlAEwAaQBzAHQAAAAU\nAAAAAQAAAA==\n")) {
881         SLOGE("AddStringToJson with key:%{public}s fail", SESSION_INFO);
882         cJSON_Delete(metadata);
883         return nullptr;
884     }
885     if (!SoftbusSessionUtils::AddIntToJson(metadata, VOLUME_INFO, VOLUMN_INFO)) {
886         SLOGE("AddStringToJson with key:%{public}s|value:%{public}d fail",
887             VOLUME_INFO, VOLUMN_INFO);
888         cJSON_Delete(metadata);
889         return nullptr;
890     }
891     if (!SoftbusSessionUtils::AddStringToJson(metadata, PACKAGE_NAME, GetBundleName(avcontroller->GetSessionId()))) {
892         SLOGE("AddStringToJson with key:%{public}s|value:%{public}s fail",
893             PACKAGE_NAME, GetBundleName(avcontroller->GetSessionId()).c_str());
894         cJSON_Delete(metadata);
895         return nullptr;
896     }
897 
898     return metadata;
899 }
900 
901 // LCOV_EXCL_START
GetBundleName(std::string sessionId)902 std::string MigrateAVSessionServer::GetBundleName(std::string sessionId)
903 {
904     std::vector<AVSessionDescriptor> descriptors;
905 
906     auto res = servicePtr_->GetAllSessionDescriptors(descriptors);
907     if (res != AVSESSION_SUCCESS) {
908         SLOGW("GetAllSessionDescriptors fail");
909         return "";
910     }
911     for (auto iter = descriptors.begin(); iter != descriptors.end(); iter++) {
912         if (iter->sessionId_ == sessionId) {
913             std::string bundleName = iter->elementName_.GetBundleName();
914             std::string abilityName = iter->elementName_.GetAbilityName();
915             SLOGI("bundleName: %{public}s abilityName: %{public}s", bundleName.c_str(), abilityName.c_str());
916             return bundleName;
917         }
918     }
919     SLOGW("GetBundleName fail");
920     return "";
921 }
922 
ConvertStateFromSingleToDouble(int32_t state)923 int32_t MigrateAVSessionServer::ConvertStateFromSingleToDouble(int32_t state)
924 {
925     switch (state) {
926         case AVPlaybackState::PLAYBACK_STATE_PLAY:
927             return MEDIA_SESSION_PLAYBACK_STATE_PLAY;
928         case AVPlaybackState::PLAYBACK_STATE_PAUSE:
929             return MEDIA_SESSION_PLAYBACK_STATE_PAUSE;
930         case AVPlaybackState::PLAYBACK_STATE_STOP:
931             return MEDIA_SESSION_PLAYBACK_STATE_STOP;
932         case AVPlaybackState::PLAYBACK_STATE_ERROR:
933             return MEDIA_SESSION_PLAYBACK_STATE_ERROR;
934         default:
935             SLOGW("unknowState: %{public}d", state);
936             break;
937     }
938     return state;
939 }
940 
RebuildPlayState(const AVPlaybackState & playbackState)941 std::string MigrateAVSessionServer::RebuildPlayState(const AVPlaybackState &playbackState)
942 {
943     int64_t actions = 1911;
944     Parcel parcel;
945     parcel.WriteInt32(ConvertStateFromSingleToDouble(playbackState.GetState()))
946         && parcel.WriteInt64(playbackState.GetPosition().elapsedTime_)
947         && parcel.WriteFloat(playbackState.GetSpeed())
948         && parcel.WriteInt64(playbackState.GetPosition().updateTime_)
949         && parcel.WriteInt64(playbackState.GetBufferedTime())
950         && parcel.WriteInt64(actions)
951         && parcel.WriteInt32(-1)
952         && parcel.WriteInt64(playbackState.GetActiveItemId())
953         && parcel.WriteInt32(1)
954         && parcel.WriteCString("")
955         && parcel.WriteInt32(-1);
956 
957     uint8_t* pointer = reinterpret_cast<uint8_t*>(parcel.GetData());
958     size_t len = parcel.GetDataSize();
959     std::vector<uint8_t> vec(len);
960     for (size_t i = 0; i < len; ++i) {
961         vec[i] = pointer[i];
962     }
963     std::string str = Base64Utils::Base64Encode(vec);
964     return str;
965 }
966 
ConvertMetadataToJson(const AVMetaData & metadata)967 cJSON* MigrateAVSessionServer::ConvertMetadataToJson(const AVMetaData &metadata)
968 {
969     return ConvertMetadataToJson(metadata, true);
970 }
971 
ConvertMetadataToJson(const AVMetaData & metadata,bool includeImage)972 cJSON* MigrateAVSessionServer::ConvertMetadataToJson(const AVMetaData &metadata, bool includeImage)
973 {
974     cJSON* result = SoftbusSessionUtils::GetNewCJSONObject();
975     CHECK_AND_RETURN_RET_LOG(result != nullptr, result, "get result json with null");
976     if (cJSON_IsInvalid(result) || cJSON_IsNull(result)) {
977         SLOGE("get result json with invalid");
978         cJSON_Delete(result);
979         return nullptr;
980     }
981 
982     if (metadata.IsValid()) {
983         SLOGI("ConvertMetadataToJson without img");
984         if (!SoftbusSessionUtils::AddStringToJson(result, METADATA_TITLE, metadata.GetTitle())) {
985             SLOGE("AddStringToJson with key:%{public}s|value:%{public}s fail",
986                 METADATA_TITLE, metadata.GetTitle().c_str());
987             cJSON_Delete(result);
988             return nullptr;
989         }
990         if (!SoftbusSessionUtils::AddStringToJson(result, METADATA_ARTIST, metadata.GetArtist())) {
991             SLOGE("AddStringToJson with key:%{public}s|value:%{public}s fail",
992                 METADATA_ARTIST, metadata.GetArtist().c_str());
993             cJSON_Delete(result);
994             return nullptr;
995         }
996         if (includeImage) {
997             std::string mediaImage = "";
998             std::vector<uint8_t> outputData(BUFFER_MAX_SIZE);
999             bool ret = CompressToJPEG(metadata, outputData);
1000             mediaImage = ((ret == true) && (!outputData.empty())) ? Base64Utils::Base64Encode(outputData) : "";
1001             if (!SoftbusSessionUtils::AddStringToJson(result, METADATA_IMAGE, mediaImage)) {
1002                 SLOGE("AddStringToJson with key:%{public}s|value:%{public}s fail",
1003                     METADATA_IMAGE, mediaImage.c_str());
1004                 cJSON_Delete(result);
1005                 return nullptr;
1006             }
1007         }
1008     } else {
1009         if (!SoftbusSessionUtils::AddStringToJson(result, METADATA_TITLE, "") ||
1010             !SoftbusSessionUtils::AddStringToJson(result, METADATA_ARTIST, "") ||
1011             !SoftbusSessionUtils::AddStringToJson(result, METADATA_IMAGE, "")) {
1012             cJSON_Delete(result);
1013             return nullptr;
1014         }
1015     }
1016     return result;
1017 }
1018 
CompressToJPEG(const AVMetaData & metadata,std::vector<uint8_t> & outputData)1019 bool MigrateAVSessionServer::CompressToJPEG(const AVMetaData &metadata, std::vector<uint8_t> &outputData)
1020 {
1021     std::shared_ptr<AVSessionPixelMap> innerPixelMap = metadata.GetMediaImage();
1022     std::shared_ptr<Media::PixelMap> pixelMap;
1023     if (innerPixelMap == nullptr) {
1024         return false;
1025     } else {
1026         pixelMap = AVSessionPixelMapAdapter::ConvertFromInner(innerPixelMap);
1027     }
1028 
1029     Media::ImagePacker imagePacker;
1030     Media::PackOption option;
1031     option.format = "image/jpeg";
1032     option.quality = DEFAULT_QUALITY;
1033     uint32_t maxSize = outputData.size();
1034     uint32_t ret = imagePacker.StartPacking(outputData.data(), maxSize, option);
1035     if (ret != 0) {
1036         SLOGI("Failed to start packing");
1037         return false;
1038     }
1039     if (pixelMap == nullptr) {
1040         SLOGE("CompressToJPEG with pixel get null");
1041         return false;
1042     }
1043     ret = imagePacker.AddImage(*pixelMap);
1044     if (ret != 0) {
1045         SLOGI("Failed to add image");
1046         return false;
1047     }
1048     int64_t packedSize = 0;
1049     ret = imagePacker.FinalizePacking(packedSize);
1050     if (ret != 0) {
1051         SLOGI("Failed to finalize packing");
1052         return false;
1053     }
1054 
1055     outputData.resize(packedSize);
1056     return true;
1057 }
1058 
ConvertMetadataInfoToStr(const std::string playerId,int32_t controlCommand,const AVMetaData & metadata)1059 std::string MigrateAVSessionServer::ConvertMetadataInfoToStr(
1060     const std::string playerId, int32_t controlCommand, const AVMetaData &metadata)
1061 {
1062     SLOGI("ConvertMetadataInfoToStr");
1063     cJSON* metaDataJson = ConvertMetadataToJson(metadata);
1064     CHECK_AND_RETURN_RET_LOG(metaDataJson != nullptr, "", "get metaDataJson from ConvertMetadataToJson nullptr");
1065     if (cJSON_IsInvalid(metaDataJson) || cJSON_IsNull(metaDataJson)) {
1066         SLOGE("get metaDataJson from ConvertMetadataToJson invalid");
1067         cJSON_Delete(metaDataJson);
1068         return "";
1069     }
1070     if (!SoftbusSessionUtils::AddStringToJson(metaDataJson, PLAYER_ID, playerId)) {
1071         SLOGE("AddStringToJson with key:%{public}s|value:%{public}s fail",
1072             PLAYER_ID, SoftbusSessionUtils::AnonymizeDeviceId(playerId).c_str());
1073         cJSON_Delete(metaDataJson);
1074         return "";
1075     }
1076     if (!SoftbusSessionUtils::AddIntToJson(metaDataJson, MEDIA_INFO, controlCommand)) {
1077         SLOGE("AddIntToJson with key:%{public}s|value:%{public}d fail",
1078             MEDIA_INFO, controlCommand);
1079         cJSON_Delete(metaDataJson);
1080         return "";
1081     }
1082 
1083     std::string msg;
1084     SoftbusSessionUtils::TransferJsonToStr(metaDataJson, msg);
1085     cJSON_Delete(metaDataJson);
1086     char header[] = {MSG_HEAD_MODE, SYNC_CONTROLLER, '\0'};
1087     return std::string(header) + msg;
1088 }
1089 
SendSpecialKeepaliveData()1090 void MigrateAVSessionServer::SendSpecialKeepaliveData()
1091 {
1092     std::thread([this]() {
1093         std::this_thread::sleep_for(std::chrono::milliseconds(HEART_BEAT_TIME));
1094         if (this->isSoftbusConnecting_) {
1095             char header[] = {MSG_HEAD_MODE, SYNC_HEARTBEAT, '\0'};
1096             std::string data = std::string(header);
1097             SendByteToAll(data);
1098             SendSpecialKeepaliveData();
1099             SLOGI("send special mediamession data to proxy connection");
1100         } else {
1101             SLOGI("send special mediamession data to proxy exit");
1102         }
1103     }).detach();
1104 }
1105 
SendCommandProc(const std::string & command,sptr<AVControllerItem> controller)1106 void MigrateAVSessionServer::SendCommandProc(const std::string &command, sptr<AVControllerItem> controller)
1107 {
1108     if (command == EVENT_COMMAND_UNLOCK_LYRIC || command == EVENT_COMMAND_SHOW_LYRIC ||
1109        command == EVENT_COMMAND_HIDE_LYRIC) {
1110     } else {
1111         SLOGW("command is not support: %{public}s", command.c_str());
1112     }
1113 }
1114 
MediaButtonEventProc(const std::string & command,sptr<AVControllerItem> controller)1115 void MigrateAVSessionServer::MediaButtonEventProc(const std::string &command, sptr<AVControllerItem> controller)
1116 {
1117     std::shared_ptr<MMI::KeyEvent> keyEvent = MMI::KeyEvent::Create();
1118     if (keyEvent == nullptr) {
1119         SLOGE("MediaButtonEventProc with key event null");
1120         return;
1121     }
1122     keyEvent->SetKeyCode(atoi(command.c_str()));
1123     controller->SendAVKeyEvent(*keyEvent.get());
1124 }
1125 
CommandWithExtrasProc(int mediaCommand,const std::string & extrasCommand,const std::string & extras,sptr<AVControllerItem> controller)1126 void MigrateAVSessionServer::CommandWithExtrasProc(int mediaCommand, const std::string &extrasCommand,
1127     const std::string &extras, sptr<AVControllerItem> controller)
1128 {
1129     SLOGI("CommandWithExtrasProc mediaCommand is: %{public}d", mediaCommand);
1130     switch (mediaCommand) {
1131         case SYNC_MEDIASESSION_CALLBACK_ON_PLAY_FROM_SEARCH:
1132             break;
1133         case SYNC_MEDIASESSION_CALLBACK_ON_PLAY_FROM_MEDIAID:
1134             break;
1135         case SYNC_MEDIASESSION_CALLBACK_ON_CUSTOMACTION:
1136             break;
1137         default:
1138             SLOGW("mediaCommand is not support: %{public}d", mediaCommand);
1139             break;
1140     }
1141 }
1142 
PlaybackCommandDataProc(int mediaCommand,const std::string & command,sptr<AVControllerItem> controller)1143 void MigrateAVSessionServer::PlaybackCommandDataProc(int mediaCommand, const std::string &command,
1144     sptr<AVControllerItem> controller)
1145 {
1146     SLOGI("PlaybackComandDataProc Command is: %{public}d", mediaCommand);
1147     AVControlCommand cmd;
1148     switch (mediaCommand) {
1149         case SYNC_MEDIASESSION_CALLBACK_ON_PLAY:
1150             AVSessionEventHandler::GetInstance().AVSessionPostTask([=]() {
1151                 AVControlCommand cmd;
1152                 cmd.SetCommand(AVControlCommand::SESSION_CMD_PLAY);
1153                 controller->SendControlCommand(cmd);
1154                 }, "DelaySendPlayCom", DELAY_PLAY_COM_TIME);
1155             break;
1156         case SYNC_MEDIASESSION_CALLBACK_ON_PAUSE:
1157             cmd.SetCommand(AVControlCommand::SESSION_CMD_PAUSE);
1158             controller->SendControlCommand(cmd);
1159             break;
1160         case SYNC_MEDIASESSION_CALLBACK_ON_STOP:
1161             cmd.SetCommand(AVControlCommand::SESSION_CMD_STOP);
1162             controller->SendControlCommand(cmd);
1163             break;
1164         case SYNC_MEDIASESSION_CALLBACK_ON_SKIP_TO_PREVIOUS:
1165             cmd.SetCommand(AVControlCommand::SESSION_CMD_PLAY_PREVIOUS);
1166             controller->SendControlCommand(cmd);
1167             break;
1168         case SYNC_MEDIASESSION_CALLBACK_ON_SKIP_TO_NEXT:
1169             cmd.SetCommand(AVControlCommand::SESSION_CMD_PLAY_NEXT);
1170             controller->SendControlCommand(cmd);
1171             break;
1172         case SYNC_MEDIASESSION_CALLBACK_ON_SET_RATING:
1173             break;
1174         case SYNC_CONTROLLER_CALLBACK_ON_AUDIOINFO_CHANGED:
1175             break;
1176         default:
1177             SLOGI("mediaCommand is not support: %{public}s", command.c_str());
1178             break;
1179     }
1180 }
1181 
OnHistoricalRecordChange()1182 void MigrateAVSessionServer::OnHistoricalRecordChange()
1183 {
1184     SendRemoteHistorySessionList(deviceId_);
1185 }
1186 
OnMetaDataChange(const std::string & playerId,const AVMetaData & data)1187 void MigrateAVSessionServer::OnMetaDataChange(const std::string & playerId, const AVMetaData &data)
1188 {
1189     SLOGI("MigrateAVSessionServer OnMetaDataChange: %{public}s",
1190         SoftbusSessionUtils::AnonymizeDeviceId(playerId).c_str());
1191     AVSessionEventHandler::GetInstance().AVSessionPostTask([this]() {
1192         DelaySendMetaData();
1193         }, "DelaySendMetaData", DELAY_METADATA_TIME);
1194 }
1195 // LCOV_EXCL_STOP
1196 
OnPlaybackStateChanged(const std::string & playerId,const AVPlaybackState & state)1197 void MigrateAVSessionServer::OnPlaybackStateChanged(const std::string &playerId, const AVPlaybackState &state)
1198 {
1199     cJSON* value = SoftbusSessionUtils::GetNewCJSONObject();
1200     CHECK_AND_RETURN_LOG(value != nullptr, "get value nullptr");
1201     if (cJSON_IsInvalid(value) || cJSON_IsNull(value)) {
1202         SLOGE("get value invalid");
1203         cJSON_Delete(value);
1204         return;
1205     }
1206     if (!SoftbusSessionUtils::AddStringToJson(value, PLAYER_ID, playerId)) {
1207         SLOGE("AddStringToJson with key:%{public}s|value:%{public}s fail",
1208             PLAYER_ID, SoftbusSessionUtils::AnonymizeDeviceId(playerId).c_str());
1209         cJSON_Delete(value);
1210         return;
1211     }
1212     if (!SoftbusSessionUtils::AddIntToJson(value, MEDIA_INFO,
1213         SYNC_CONTROLLER_CALLBACK_ON_PLAYBACKSTATE_CHANGED)) {
1214         SLOGE("AddIntToJson with key:%{public}s|value:%{public}d fail",
1215             MEDIA_INFO, SYNC_CONTROLLER_CALLBACK_ON_PLAYBACKSTATE_CHANGED);
1216         cJSON_Delete(value);
1217         return;
1218     }
1219     if (!SoftbusSessionUtils::AddStringToJson(value, CALLBACK_INFO, RebuildPlayState(state))) {
1220         SLOGE("AddStringToJson with key:%{public}s|value:%{public}s fail",
1221             CALLBACK_INFO, RebuildPlayState(state).c_str());
1222         cJSON_Delete(value);
1223         return;
1224     }
1225 
1226     char header[] = {MSG_HEAD_MODE, SYNC_CONTROLLER, '\0'};
1227     std::string msg;
1228     SoftbusSessionUtils::TransferJsonToStr(value, msg);
1229     cJSON_Delete(value);
1230     std::string result = std::string(header) + msg;
1231     SendByte(deviceId_, result);
1232 }
1233 
1234 // LCOV_EXCL_START
OnSessionDestroy()1235 void AVControllerObserver::OnSessionDestroy()
1236 {
1237     SLOGI("OnSessionDestroy");
1238 }
1239 
OnPlaybackStateChange(const AVPlaybackState & state)1240 void AVControllerObserver::OnPlaybackStateChange(const AVPlaybackState &state)
1241 {
1242     std::shared_ptr<MigrateAVSessionServer> server = migrateServer_.lock();
1243     if (server != nullptr && migrateMode_ == MIGRATE_MODE_NEXT) {
1244         server->HandleFocusPlaybackStateChange(playerId_, state);
1245         return;
1246     }
1247     if (server != nullptr && state.GetState() != AVPlaybackState::PLAYBACK_STATE_INITIAL) {
1248         server->OnPlaybackStateChanged(playerId_, state);
1249     }
1250 }
1251 
OnMetaDataChange(const AVMetaData & data)1252 void AVControllerObserver::OnMetaDataChange(const AVMetaData &data)
1253 {
1254     SLOGI("OnMetaDataChange check migrateMode:%{public}d", migrateMode_);
1255     std::shared_ptr<MigrateAVSessionServer> server = migrateServer_.lock();
1256     if (server != nullptr && migrateMode_ == MIGRATE_MODE_NEXT) {
1257         server->HandleFocusMetaDataChange(playerId_, data);
1258         return;
1259     }
1260     if (server != nullptr) {
1261         server->OnMetaDataChange(playerId_, data);
1262     }
1263 }
1264 
OnValidCommandChange(const std::vector<int32_t> & cmds)1265 void AVControllerObserver::OnValidCommandChange(const std::vector<int32_t> &cmds)
1266 {
1267     std::shared_ptr<MigrateAVSessionServer> server = migrateServer_.lock();
1268     if (server != nullptr && migrateMode_ == MIGRATE_MODE_NEXT) {
1269         server->HandleFocusValidCommandChange(playerId_, cmds);
1270         return;
1271     }
1272 }
1273 
Init(std::weak_ptr<MigrateAVSessionServer> migrateServer,int32_t migrateMode)1274 void AVControllerObserver::Init(std::weak_ptr<MigrateAVSessionServer> migrateServer, int32_t migrateMode)
1275 {
1276     migrateServer_ = migrateServer;
1277     migrateMode_ = migrateMode;
1278 }
1279 
Release()1280 void AVControllerObserver::Release()
1281 {
1282     migrateServer_.reset();
1283     migrateMode_ = 0;
1284 }
1285 // LCOV_EXCL_STOP
1286 } // namespace OHOS::AVSession