summaryrefslogtreecommitdiff
path: root/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/extensions/system_capability_app_extension.cc
blob: 311ba5d4aad3d739996ca248be2ef4d53419bc97 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include "sdl_rpc_plugin/extensions/system_capability_app_extension.h"
#include "application_manager/smart_object_keys.h"

namespace sdl_rpc_plugin {
SDL_CREATE_LOG_VARIABLE("GetSystemCapabilitiesAppExtension")

namespace app_mngr_ = application_manager;
namespace strings = app_mngr::strings;

const app_mngr_::AppExtensionUID
    SystemCapabilityAppExtension::SystemCapabilityAppExtensionUID = 200;

SystemCapabilityAppExtension::SystemCapabilityAppExtension(
    sdl_rpc_plugin::SDLRPCPlugin& plugin, app_mngr_::Application& app)
    : app_mngr_::AppExtension(
          SystemCapabilityAppExtension::SystemCapabilityAppExtensionUID)
    , plugin_(plugin)
    , app_(app) {}

SystemCapabilityAppExtension::~SystemCapabilityAppExtension() {}

bool SystemCapabilityAppExtension::SubscribeTo(
    const SystemCapabilityType system_capability_type) {
  SDL_LOG_INFO("Subscribing to System Capability " << system_capability_type);
  return subscribed_data_.insert(system_capability_type).second;
}

bool SystemCapabilityAppExtension::UnsubscribeFrom(
    const SystemCapabilityType system_capability_type) {
  SDL_LOG_INFO("Unsubscribing from System Capability "
               << system_capability_type);
  auto it = subscribed_data_.find(system_capability_type);
  if (it != subscribed_data_.end()) {
    subscribed_data_.erase(it);
    return true;
  }
  return false;
}

void SystemCapabilityAppExtension::UnsubscribeFromAll() {
  SDL_LOG_INFO("Unsubscribing from ALL System Capabilities");
  subscribed_data_.clear();
}

bool SystemCapabilityAppExtension::IsSubscribedTo(
    const SystemCapabilityType system_capability_type) const {
  SDL_LOG_DEBUG(system_capability_type);
  return subscribed_data_.find(system_capability_type) !=
         subscribed_data_.end();
}

SystemCapabilitySubscriptions SystemCapabilityAppExtension::Subscriptions() {
  return subscribed_data_;
}

void SystemCapabilityAppExtension::SaveResumptionData(
    smart_objects::SmartObject& resumption_data) {
  SDL_LOG_AUTO_TRACE();

  resumption_data[strings::system_capability] =
      smart_objects::SmartObject(smart_objects::SmartType_Array);

  int i = 0;
  for (const auto& subscription : subscribed_data_) {
    resumption_data[strings::system_capability][i] = subscription;
    i++;
  }
}

void SystemCapabilityAppExtension::ProcessResumption(
    const smart_objects::SmartObject& saved_app) {
  SDL_LOG_AUTO_TRACE();

  const smart_objects::SmartObject& subscriptions =
      saved_app[strings::application_subscriptions];

  if (saved_app.keyExists(strings::system_capability)) {
    const auto& system_capability_subscriptions =
        subscriptions[strings::system_capability];
    for (size_t i = 0; i < system_capability_subscriptions.length(); ++i) {
      SystemCapabilityType capability_type = static_cast<SystemCapabilityType>(
          (system_capability_subscriptions[i]).asInt());
      SubscribeTo(capability_type);
    }
  }
}

void SystemCapabilityAppExtension::RevertResumption(
    const smart_objects::SmartObject& subscriptions) {
  SDL_LOG_AUTO_TRACE();

  // No need to revert subscriptions here when an app gets RESUME_FAILED
  // System capability subscriptions should still be active
  UNUSED(subscriptions);
}

SystemCapabilityAppExtension& SystemCapabilityAppExtension::ExtractExtension(
    app_mngr_::Application& app) {
  SDL_LOG_AUTO_TRACE();
  auto ext_ptr = app.QueryInterface(
      SystemCapabilityAppExtension::SystemCapabilityAppExtensionUID);
  DCHECK(ext_ptr);
  DCHECK(dynamic_cast<SystemCapabilityAppExtension*>(ext_ptr.get()));
  auto app_extension =
      std::static_pointer_cast<SystemCapabilityAppExtension>(ext_ptr);
  DCHECK(app_extension);
  return *app_extension;
}
}  // namespace sdl_rpc_plugin