// Copyright (c) 2026 Marshall A. Greenblatt. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//    * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//    * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//    * Neither the name of Google Inc. nor the name Chromium Embedded
// Framework nor the names of its contributors may be used to endorse
// or promote products derived from this software without specific prior
// written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// ---------------------------------------------------------------------------
//
// This file was generated by the CEF translator tool and should not edited
// by hand. See the translator.README.txt file in the tools directory for
// more information.
//
// $hash=fce68ff58bbf0780751ebc160585749fed61bb4b$
//

#ifndef CEF_INCLUDE_CAPI_CEF_COMPONENT_UPDATER_CAPI_H_
#define CEF_INCLUDE_CAPI_CEF_COMPONENT_UPDATER_CAPI_H_
#pragma once

#if defined(BUILDING_CEF_SHARED)
#error This file cannot be included DLL-side
#endif

#include "include/capi/cef_base_capi.h"
#include "include/cef_api_hash.h"
#include "include/internal/cef_types_component.h"

#ifdef __cplusplus
extern "C" {
#endif

#if CEF_API_ADDED(14600)

///
/// Callback structure for component update results.
///
/// NOTE: This struct is allocated client-side.
///
typedef struct _cef_component_update_callback_t {
  ///
  /// Base structure.
  ///
  cef_base_ref_counted_t base;

  ///
  /// Called when the component update operation completes. |component_id| is
  /// the ID of the component that was updated. |error| contains the result of
  /// the operation.
  ///
  void(CEF_CALLBACK *on_complete)(struct _cef_component_update_callback_t *self,
                                  const cef_string_t *component_id,
                                  cef_component_update_error_t error);
} cef_component_update_callback_t;

#endif // CEF_API_ADDED(14600)

#if CEF_API_ADDED(14600)

///
/// Structure representing a snapshot of a component's state at the time of
/// retrieval. To get updated information, retrieve a new cef_component_t object
/// via cef_component_updater_t::GetComponentByID or GetComponents. The
/// functions of this structure may be called on any thread.
///
/// NOTE: This struct is allocated DLL-side.
///
typedef struct _cef_component_t {
  ///
  /// Base structure.
  ///
  cef_base_ref_counted_t base;

  ///
  /// Returns the unique identifier for this component.
  ///
  // The resulting string must be freed by calling cef_string_userfree_free().
  cef_string_userfree_t(CEF_CALLBACK *get_id)(struct _cef_component_t *self);

  ///
  /// Returns the human-readable name of this component. Returns an NULL string
  /// if the component is not installed.
  ///
  // The resulting string must be freed by calling cef_string_userfree_free().
  cef_string_userfree_t(CEF_CALLBACK *get_name)(struct _cef_component_t *self);

  ///
  /// Returns the version of this component as a string (e.g., "1.2.3.4").
  /// Returns an NULL string if the component is not installed.
  ///
  // The resulting string must be freed by calling cef_string_userfree_free().
  cef_string_userfree_t(CEF_CALLBACK *get_version)(
      struct _cef_component_t *self);

  ///
  /// Returns the state of this component at the time this object was created. A
  /// component is considered installed when its state is one of:
  /// CEF_COMPONENT_STATE_UPDATED, CEF_COMPONENT_STATE_UP_TO_DATE, or
  /// CEF_COMPONENT_STATE_RUN.
  ///
  cef_component_state_t(CEF_CALLBACK *get_state)(struct _cef_component_t *self);
} cef_component_t;

#endif // CEF_API_ADDED(14600)

#if CEF_API_ADDED(14600)

///
/// This structure provides access to Chromium's component updater service,
/// allowing clients to discover registered components and trigger on-demand
/// updates. The functions of this structure may only be called on the browser
/// process UI thread. If the CEF context is not initialized or the component
/// updater service is not available, functions will return safe defaults (0,
/// nullptr, or NULL).
///
/// NOTE: This struct is allocated DLL-side.
///
typedef struct _cef_component_updater_t {
  ///
  /// Base structure.
  ///
  cef_base_ref_counted_t base;

  ///
  /// Returns the number of registered components, or 0 if the service is not
  /// available.
  ///
  size_t(CEF_CALLBACK *get_component_count)(
      struct _cef_component_updater_t *self);

  ///
  /// Populates |components| with all registered components. Any existing
  /// contents will be cleared first.
  ///
  void(CEF_CALLBACK *get_components)(struct _cef_component_updater_t *self,
                                     size_t *componentsCount,
                                     struct _cef_component_t **components);

  ///
  /// Returns the component with the specified |component_id|, or nullptr if not
  /// found or the service is not available.
  ///
  struct _cef_component_t *(CEF_CALLBACK *get_component_by_id)(
      struct _cef_component_updater_t *self, const cef_string_t *component_id);

  ///
  /// Triggers an on-demand update for the component with the specified
  /// |component_id|. |priority| specifies whether the update should be
  /// processed in the background or foreground. Use
  /// CEF_COMPONENT_UPDATE_PRIORITY_FOREGROUND for user-initiated updates.
  ///
  /// |callback| will be called asynchronously on the UI thread when the update
  /// operation completes. The callback is always executed, including when the
  /// component is already up-to-date (returns CEF_COMPONENT_UPDATE_ERROR_NONE),
  /// when the requested component doesn't exist, or when the service is
  /// unavailable (returns CEF_COMPONENT_UPDATE_ERROR_SERVICE_ERROR). The
  /// callback may be nullptr if no notification is needed.
  ///
  void(CEF_CALLBACK *update)(struct _cef_component_updater_t *self,
                             const cef_string_t *component_id,
                             cef_component_update_priority_t priority,
                             struct _cef_component_update_callback_t *callback);
} cef_component_updater_t;

///
/// Returns the global cef_component_updater_t singleton. Returns nullptr if
/// called from the incorrect thread.
///
CEF_EXPORT cef_component_updater_t *cef_component_updater_get(void);

#endif // CEF_API_ADDED(14600)

#ifdef __cplusplus
}
#endif

#endif // CEF_INCLUDE_CAPI_CEF_COMPONENT_UPDATER_CAPI_H_
