<!--
This is a light weighted demo page used to verify ClientLogInfo CobaltService.
Put this file in a local directory,then start a http server by running this python3 command:
python3 -m http.server 8000
Then you should be able to visit http://[IP]:8000/client_log_info_demo.html from a chrome browser.
Run this command to let CoAT visit the page.
adb shell am start --esa args "--url=http://[IP]:8000/client_log_info_demo.html,--debug_console=on" dev.cobalt.coat
-->
<!DOCTYPE html>
<meta charset="utf-8">
<body>
  <script>
    // utility functions for string <-> ArrayBuffer conversions.
    function ab2str(buf) {
      return String.fromCharCode.apply(null, new Uint8Array(buf));
    }

    function str2ab(str) {
      return Uint8Array.from(stringToUtf8ByteArray(str)).buffer;
    }

    function stringToUtf8ByteArray(str) {
      'use strict';
      var out = [], p = 0;
      for (var i = 0; i < str.length; i++) {
        var c = str.charCodeAt(i);
        if (c < 128) {
          out[p++] = c;
        } else if (c < 2048) {
          out[p++] = (c >> 6) | 192;
          out[p++] = (c & 63) | 128;
        } else if (
            ((c & 0xFC00) == 0xD800) && (i + 1) < str.length &&
            ((str.charCodeAt(i + 1) & 0xFC00) == 0xDC00)) {
          // Surrogate Pair
          c = 0x10000 + ((c & 0x03FF) << 10) + (str.charCodeAt(++i) & 0x03FF);
          out[p++] = (c >> 18) | 240;
          out[p++] = ((c >> 12) & 63) | 128;
          out[p++] = ((c >> 6) & 63) | 128;
          out[p++] = (c & 63) | 128;
        } else {
          out[p++] = (c >> 12) | 224;
          out[p++] = ((c >> 6) & 63) | 128;
          out[p++] = (c & 63) | 128;
        }
      }
      return out;
    };

    // The package name is hard-coded also in Kimono java code.
    const SERVICE_NAME = "dev.cobalt.coat.clientloginfo";
    if (window.H5vccPlatformService &&
        window.H5vccPlatformService.has(SERVICE_NAME)) {
      clientloginfo = window.H5vccPlatformService.open(SERVICE_NAME, (() => { }));

      if (clientloginfo) {
        response = clientloginfo.send(str2ab(""));
        console.log("clientloginfo platform service response: " + ab2str(response));
      }
    }

  </script>
</body>
