// Copyright 2016 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_BASE_USER_LOG_H_
#define COBALT_BASE_USER_LOG_H_

#include "base/basictypes.h"

namespace base {

class UserLog {
 public:
  static const int kEventStackMaxDepth = 10;
  enum Index {
    kUserAgentStringIndex = 0,
    kSystemLanguageStringIndex,
    kAvailableMemoryIndex,
    kAppLifetimeIndex,
    kAppStatusIndex,
    kAppSuspendCountIndex,
    kAppResumeCountIndex,
    kAppPauseCountIndex,
    kAppUnpauseCountIndex,
    kNetworkStatusIndex,
    kNetworkConnectCountIndex,
    kNetworkDisconnectCountIndex,
    kWebMediaPlayerState,
    kNodeCountIndex,
    kElementCountIndex,
    kHtmlElementCountIndex,
    kHTMLMediaElementCountIndex,
    kEventStackLevelCountIndex,
    kEventStackMinLevelIndex,
    kEventStackMaxLevelIndex =
        kEventStackMinLevelIndex + kEventStackMaxDepth - 1,
    // Valid indices are from [0, 127].
    kMaxIndex = 128,
  };

  static bool IsRegistrationSupported();

  // Thread-safe registration of a user log index, associating it with the
  // specified label and memory address. This is used by some platforms to
  // provide additional context with crashes.
  //
  // Returns true if the registration is successful.
  //
  // NOTE: The max size of the label is 15 ASCII characters, plus a NULL
  // character.
  static bool Register(Index index, const char* label, const void* address,
                       size_t size);

  // Deregister the given Index so that it is not included in the crash report.
  static bool Deregister(Index index);
};

}  // namespace base

#endif  // COBALT_BASE_USER_LOG_H_
