Shaka Player Embedded
storage.cc
Go to the documentation of this file.
1 // Copyright 2019 Google LLC
2 //
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 // https://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 #include "shaka/storage.h"
16 
18 #include "src/js/offline_externs.h"
19 #include "src/mapping/any.h"
20 #include "src/mapping/names.h"
22 
23 namespace shaka {
24 
25 template <>
26 struct TypeName<StoredContent, void> {
27  static std::string name() {
28  return "StoredContent";
29  }
30 };
31 
32 
33 // \cond Doxygen_Skip
35 Storage::Client::~Client() {}
36 // \endcond Doxygen_Skip
37 
39  double /* progress */) {}
40 
41 
43  public:
44  Impl(JsManager* engine, const Global<JsObject>* player) : player_(player) {
45  CHECK(engine) << "Must pass a JsManager instance";
46  }
47 
49  // This function can be called immediately after the JsManager
50  // constructor. Since the Environment might not be setup yet, run this in
51  // an internal task so we know it is ready.
52  DCHECK(!JsManagerImpl::Instance()->MainThread()->BelongsToCurrentThread());
53  const auto callback = [=]() -> Converter<void>::variant_type {
54  LocalVar<JsValue> ctor =
55  GetDescendant(JsEngine::Instance()->global_handle(),
56  {"shaka", "offline", "Storage"});
58  LOG(ERROR) << "Cannot get 'shaka.offline.Storage' object; is "
59  "shaka-player.compiled.js corrupted?";
60  return Error("The constructor 'shaka.offline.Storage' is not found.");
61  }
62  LocalVar<JsFunction> ctor_func = UnsafeJsCast<JsFunction>(ctor);
63 
64  LocalVar<JsValue> result_or_except;
65  std::vector<LocalVar<JsValue>> args;
66  if (player_) {
67  LocalVar<JsObject> player(*player_);
68  args.emplace_back(RawToJsValue(player));
69  }
70  if (!InvokeConstructor(ctor_func, args.size(), args.data(),
71  &result_or_except)) {
72  return ConvertError(result_or_except);
73  }
74 
75  Init(UnsafeJsCast<JsObject>(result_or_except));
76 
77  if (client) {
78  std::function<void(StoredContent, double)> cb =
79  std::bind(&Client::OnProgress, client, std::placeholders::_1,
80  std::placeholders::_2);
81  LocalVar<JsValue> args[] = {
82  ToJsValue(std::string{"offline.progressCallback"}),
83  CreateStaticFunction("Storage.Client", "OnProgress", cb),
84  };
85  LocalVar<JsValue> ignored;
86  auto except =
87  CallMemberFunction(object_, "configure", 2, args, &ignored);
88  if (holds_alternative<Error>(except))
89  return except;
90  }
91 
92  return monostate();
93  };
95  ->MainThread()
96  ->AddInternalTask(TaskPriority::Internal, "Storage ctor",
97  std::move(callback))
98  ->future();
99  }
100 
101  private:
102  const Global<JsObject>* player_;
103 };
104 
106  : impl_(new Impl(engine, reinterpret_cast<const Global<JsObject>*>(
107  player ? player->GetRawJsValue() : nullptr))) {
108 }
109 Storage::Storage(Storage&&) = default;
111 
112 Storage& Storage::operator=(Storage&&) = default;
113 
115  DCHECK(engine);
116  return Impl::CallGlobalMethod<bool>(
117  {"shaka", "offline", "Storage", "support"});
118 }
119 
121  DCHECK(engine);
122  return Impl::CallGlobalMethod<void>(
123  {"shaka", "offline", "Storage", "deleteAll"});
124 }
125 
127  return impl_->Initialize(client);
128 }
129 
131  return impl_->CallMethod<void>("destroy");
132 }
133 
135  return impl_->CallMethod<bool>("getStoreInProgress");
136 }
137 
138 AsyncResults<bool> Storage::Configure(const std::string& name_path,
140  return impl_->CallMethod<bool>("configure", name_path, Any()); // undefined
141 }
142 
143 AsyncResults<bool> Storage::Configure(const std::string& name_path,
144  bool value) {
145  return impl_->CallMethod<bool>("configure", name_path, value);
146 }
147 
148 AsyncResults<bool> Storage::Configure(const std::string& name_path,
149  double value) {
150  return impl_->CallMethod<bool>("configure", name_path, value);
151 }
152 
153 AsyncResults<bool> Storage::Configure(const std::string& name_path,
154  const std::string& value) {
155  return impl_->CallMethod<bool>("configure", name_path, value);
156 }
157 
159  return impl_->CallMethod<std::vector<StoredContent>>("list");
160 }
161 
162 AsyncResults<void> Storage::Remove(const std::string& content_uri) {
163  return impl_->CallMethod<void>("remove", content_uri);
164 }
165 
167  return impl_->CallMethod<bool>("removeEmeSessions");
168 }
169 
171  return impl_->CallMethod<StoredContent>("store", uri);
172 }
173 
175  const std::string& uri,
176  const std::unordered_map<std::string, std::string>& app_metadata) {
177  return impl_->CallMethod<StoredContent>("store", uri, app_metadata);
178 }
179 
180 } // namespace shaka
static AsyncResults< bool > Support(JsManager *engine)
Definition: storage.cc:114
ReturnVal< JsFunction > CreateStaticFunction(const std::string &target, const std::string &name, Func &&callback)
Definition: any.h:31
ReturnVal< JsValue > GetDescendant(Handle< JsObject > root, const std::vector< std::string > &names)
Definition: js_utils.cc:52
virtual void OnProgress(StoredContent content, double progress)
Definition: storage.cc:38
AsyncResults< void > Remove(const std::string &content_uri)
Definition: storage.cc:162
ReturnVal< JsValue > ToJsValue(T &&source)
Definition: convert_js.h:381
AsyncResults< bool > RemoveEmeSessions()
Definition: storage.cc:166
Storage & operator=(Storage &&)
static AsyncResults< void > DeleteAll(JsManager *engine)
Definition: storage.cc:120
ReturnVal< JsValue > RawToJsValue(Handle< T > source)
Definition: js_wrappers.h:405
AsyncResults< void > Destroy()
Definition: storage.cc:130
Converter< void >::future_type Initialize(Client *client)
Definition: storage.cc:48
AsyncResults< void > Initialize(Client *client=nullptr)
Definition: storage.cc:126
Storage(JsManager *engine, Player *player=nullptr)
Definition: storage.cc:105
proto::ValueType GetValueType(Handle< JsValue > value)
Definition: js_wrappers.cc:329
std::shared_ptr< ThreadEvent< impl::RetOf< Func > > > AddInternalTask(TaskPriority priority, const std::string &name, Func &&callback)
Definition: task_runner.h:219
AsyncResults< bool > GetStoreInProgress()
Definition: storage.cc:134
AsyncResults< StoredContent > Store(const std::string &uri)
Definition: storage.cc:170
Impl(JsManager *engine, const Global< JsObject > *player)
Definition: storage.cc:44
bool InvokeConstructor(Handle< JsFunction > ctor, int argc, LocalVar< JsValue > *argv, LocalVar< JsValue > *result_or_except)
Definition: js_wrappers.cc:165
AsyncResults< std::vector< StoredContent > > List()
Definition: storage.cc:158
AsyncResults< bool > Configure(const std::string &name_path, DefaultValueType)
Definition: storage.cc:138
TaskRunner * MainThread()