Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / ppapi / cpp / private / content_decryptor_private.cc
index 7cad0a3..65f822c 100644 (file)
@@ -15,6 +15,7 @@
 #include "ppapi/cpp/module.h"
 #include "ppapi/cpp/module_impl.h"
 #include "ppapi/cpp/var.h"
+#include "ppapi/cpp/var_array.h"
 
 namespace pp {
 
@@ -38,17 +39,35 @@ void Initialize(PP_Instance instance,
       key_system_var.AsString());
 }
 
+void SetServerCertificate(PP_Instance instance,
+                          uint32_t promise_id,
+                          PP_Var server_certificate_arg) {
+  void* object =
+      Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
+  if (!object)
+    return;
+
+  pp::Var server_certificate_var(server_certificate_arg);
+  if (!server_certificate_var.is_array_buffer())
+    return;
+  pp::VarArrayBuffer server_certificate(server_certificate_var);
+
+  static_cast<ContentDecryptor_Private*>(object)
+      ->SetServerCertificate(promise_id, server_certificate);
+}
+
 void CreateSession(PP_Instance instance,
-                   uint32_t session_id,
-                   PP_Var type_arg,
-                   PP_Var init_data_arg) {
+                   uint32_t promise_id,
+                   PP_Var init_data_type_arg,
+                   PP_Var init_data_arg,
+                   PP_SessionType session_type) {
   void* object =
       Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
   if (!object)
     return;
 
-  pp::Var type_var(pp::PASS_REF, type_arg);
-  if (!type_var.is_string())
+  pp::Var init_data_type_var(pp::PASS_REF, init_data_type_arg);
+  if (!init_data_type_var.is_string())
     return;
 
   pp::Var init_data_var(pp::PASS_REF, init_data_arg);
@@ -57,51 +76,97 @@ void CreateSession(PP_Instance instance,
   pp::VarArrayBuffer init_data_array_buffer(init_data_var);
 
   static_cast<ContentDecryptor_Private*>(object)
-      ->CreateSession(session_id, type_var.AsString(), init_data_array_buffer);
+      ->CreateSession(promise_id,
+                      init_data_type_var.AsString(),
+                      init_data_array_buffer,
+                      session_type);
 }
 
 void LoadSession(PP_Instance instance,
-                 uint32_t session_id,
+                 uint32_t promise_id,
                  PP_Var web_session_id_arg) {
   void* object =
       Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
   if (!object)
     return;
 
-  pp::Var web_session_id_var(pp::PASS_REF, web_session_id_arg);
+  pp::Var web_session_id_var(web_session_id_arg);
   if (!web_session_id_var.is_string())
     return;
 
   static_cast<ContentDecryptor_Private*>(object)
-      ->LoadSession(session_id, web_session_id_var.AsString());
+      ->LoadSession(promise_id, web_session_id_var.AsString());
 }
 
 void UpdateSession(PP_Instance instance,
-                   uint32_t session_id,
+                   uint32_t promise_id,
+                   PP_Var web_session_id_arg,
                    PP_Var response_arg) {
   void* object =
       Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
   if (!object)
     return;
 
-  pp::Var response_var(pp::PASS_REF, response_arg);
+  pp::Var web_session_id_var(web_session_id_arg);
+  if (!web_session_id_var.is_string())
+    return;
+
+  pp::Var response_var(response_arg);
   if (!response_var.is_array_buffer())
     return;
   pp::VarArrayBuffer response(response_var);
 
   static_cast<ContentDecryptor_Private*>(object)
-      ->UpdateSession(session_id, response);
+      ->UpdateSession(promise_id, web_session_id_var.AsString(), response);
+}
+
+void CloseSession(PP_Instance instance,
+                  uint32_t promise_id,
+                  PP_Var web_session_id_arg) {
+  void* object =
+      Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
+  if (!object)
+    return;
+
+  pp::Var web_session_id_var(web_session_id_arg);
+  if (!web_session_id_var.is_string())
+    return;
+
+  static_cast<ContentDecryptor_Private*>(object)
+      ->CloseSession(promise_id, web_session_id_var.AsString());
 }
 
-void ReleaseSession(PP_Instance instance, uint32_t session_id) {
+void RemoveSession(PP_Instance instance,
+                   uint32_t promise_id,
+                   PP_Var web_session_id_arg) {
   void* object =
       Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
   if (!object)
     return;
 
-  static_cast<ContentDecryptor_Private*>(object)->ReleaseSession(session_id);
+  pp::Var web_session_id_var(web_session_id_arg);
+  if (!web_session_id_var.is_string())
+    return;
+
+  static_cast<ContentDecryptor_Private*>(object)
+      ->RemoveSession(promise_id, web_session_id_var.AsString());
 }
 
+void GetUsableKeyIds(PP_Instance instance,
+                     uint32_t promise_id,
+                     PP_Var web_session_id_arg) {
+  void* object =
+      Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
+  if (!object)
+    return;
+
+  pp::Var web_session_id_var(web_session_id_arg);
+  if (!web_session_id_var.is_string())
+    return;
+
+  static_cast<ContentDecryptor_Private*>(object)
+      ->GetUsableKeyIds(promise_id, web_session_id_var.AsString());
+}
 
 void Decrypt(PP_Instance instance,
              PP_Resource encrypted_resource,
@@ -191,18 +256,20 @@ void DecryptAndDecode(PP_Instance instance,
 }
 
 const PPP_ContentDecryptor_Private ppp_content_decryptor = {
-  &Initialize,
-  &CreateSession,
-  &LoadSession,
-  &UpdateSession,
-  &ReleaseSession,
-  &Decrypt,
-  &InitializeAudioDecoder,
-  &InitializeVideoDecoder,
-  &DeinitializeDecoder,
-  &ResetDecoder,
-  &DecryptAndDecode
-};
+    &Initialize,
+    &SetServerCertificate,
+    &CreateSession,
+    &LoadSession,
+    &UpdateSession,
+    &CloseSession,
+    &RemoveSession,
+    &GetUsableKeyIds,
+    &Decrypt,
+    &InitializeAudioDecoder,
+    &InitializeVideoDecoder,
+    &DeinitializeDecoder,
+    &ResetDecoder,
+    &DecryptAndDecode};
 
 template <> const char* interface_name<PPB_ContentDecryptor_Private>() {
   return PPB_CONTENTDECRYPTOR_PRIVATE_INTERFACE;
@@ -223,54 +290,128 @@ ContentDecryptor_Private::~ContentDecryptor_Private() {
                                     this);
 }
 
-void ContentDecryptor_Private::SessionCreated(
-    uint32_t session_id,
+void ContentDecryptor_Private::PromiseResolved(uint32_t promise_id) {
+  if (has_interface<PPB_ContentDecryptor_Private>()) {
+    get_interface<PPB_ContentDecryptor_Private>()->PromiseResolved(
+        associated_instance_.pp_instance(), promise_id);
+  }
+}
+
+void ContentDecryptor_Private::PromiseResolvedWithSession(
+    uint32_t promise_id,
     const std::string& web_session_id) {
   if (has_interface<PPB_ContentDecryptor_Private>()) {
     pp::Var web_session_id_var(web_session_id);
-    get_interface<PPB_ContentDecryptor_Private>()->SessionCreated(
+    get_interface<PPB_ContentDecryptor_Private>()->PromiseResolvedWithSession(
         associated_instance_.pp_instance(),
-        session_id,
+        promise_id,
         web_session_id_var.pp_var());
   }
 }
 
-void ContentDecryptor_Private::SessionMessage(uint32_t session_id,
-                                              pp::VarArrayBuffer message,
-                                              const std::string& default_url) {
+void ContentDecryptor_Private::PromiseResolvedWithKeyIds(
+    uint32_t promise_id,
+    const std::vector<std::vector<uint8_t> >& key_ids) {
+  if (has_interface<PPB_ContentDecryptor_Private>()) {
+    pp::VarArray key_ids_array = pp::VarArray();
+    key_ids_array.SetLength(key_ids.size());
+    for (size_t i = 0; i < key_ids.size(); ++i) {
+      const std::vector<uint8_t>& entry = key_ids[i];
+      pp::VarArrayBuffer array_buffer(entry.size());
+      memcpy(array_buffer.Map(), &entry[0], entry.size());
+      key_ids_array.Set(i, array_buffer);
+    }
+    get_interface<PPB_ContentDecryptor_Private>()->PromiseResolvedWithKeyIds(
+        associated_instance_.pp_instance(), promise_id, key_ids_array.pp_var());
+  }
+}
+
+void ContentDecryptor_Private::PromiseRejected(
+    uint32_t promise_id,
+    PP_CdmExceptionCode exception_code,
+    uint32_t system_code,
+    const std::string& error_description) {
+  if (has_interface<PPB_ContentDecryptor_Private>()) {
+    pp::Var error_description_var(error_description);
+    get_interface<PPB_ContentDecryptor_Private>()->PromiseRejected(
+        associated_instance_.pp_instance(),
+        promise_id,
+        exception_code,
+        system_code,
+        error_description_var.pp_var());
+  }
+}
+
+void ContentDecryptor_Private::SessionMessage(
+    const std::string& web_session_id,
+    pp::VarArrayBuffer message,
+    const std::string& destination_url) {
   if (has_interface<PPB_ContentDecryptor_Private>()) {
-    pp::Var default_url_var(default_url);
+    pp::Var web_session_id_var(web_session_id);
+    pp::Var destination_url_var(destination_url);
     get_interface<PPB_ContentDecryptor_Private>()->SessionMessage(
         associated_instance_.pp_instance(),
-        session_id,
+        web_session_id_var.pp_var(),
         message.pp_var(),
-        default_url_var.pp_var());
+        destination_url_var.pp_var());
   }
 }
 
-void ContentDecryptor_Private::SessionReady(uint32_t session_id) {
+void ContentDecryptor_Private::SessionKeysChange(
+    const std::string& web_session_id,
+    bool has_additional_usable_key) {
   if (has_interface<PPB_ContentDecryptor_Private>()) {
+    pp::Var web_session_id_var(web_session_id);
+    get_interface<PPB_ContentDecryptor_Private>()->SessionKeysChange(
+        associated_instance_.pp_instance(),
+        web_session_id_var.pp_var(),
+        PP_FromBool(has_additional_usable_key));
+  }
+}
+
+void ContentDecryptor_Private::SessionExpirationChange(
+    const std::string& web_session_id,
+    PP_Time new_expiry_time) {
+  if (has_interface<PPB_ContentDecryptor_Private>()) {
+    pp::Var web_session_id_var(web_session_id);
+    get_interface<PPB_ContentDecryptor_Private>()->SessionExpirationChange(
+        associated_instance_.pp_instance(),
+        web_session_id_var.pp_var(),
+        new_expiry_time);
+  }
+}
+
+void ContentDecryptor_Private::SessionReady(const std::string& web_session_id) {
+  if (has_interface<PPB_ContentDecryptor_Private>()) {
+    pp::Var web_session_id_var(web_session_id);
     get_interface<PPB_ContentDecryptor_Private>()->SessionReady(
-        associated_instance_.pp_instance(), session_id);
+        associated_instance_.pp_instance(), web_session_id_var.pp_var());
   }
 }
 
-void ContentDecryptor_Private::SessionClosed(uint32_t session_id) {
+void ContentDecryptor_Private::SessionClosed(
+    const std::string& web_session_id) {
   if (has_interface<PPB_ContentDecryptor_Private>()) {
+    pp::Var web_session_id_var(web_session_id);
     get_interface<PPB_ContentDecryptor_Private>()->SessionClosed(
-        associated_instance_.pp_instance(), session_id);
+        associated_instance_.pp_instance(), web_session_id_var.pp_var());
   }
 }
 
-void ContentDecryptor_Private::SessionError(uint32_t session_id,
-                                            int32_t media_error,
-                                            int32_t system_code) {
+void ContentDecryptor_Private::SessionError(
+    const std::string& web_session_id,
+    PP_CdmExceptionCode exception_code,
+    uint32_t system_code,
+    const std::string& error_description) {
   if (has_interface<PPB_ContentDecryptor_Private>()) {
+    pp::Var web_session_id_var(web_session_id);
+    pp::Var error_description_var(error_description);
     get_interface<PPB_ContentDecryptor_Private>()->SessionError(
         associated_instance_.pp_instance(),
-        session_id,
-        media_error,
-        system_code);
+        web_session_id_var.pp_var(),
+        exception_code,
+        system_code,
+        error_description_var.pp_var());
   }
 }