/*
 *  Copyright 2022 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef MODULES_PORTAL_XDG_DESKTOP_PORTAL_UTILS_H_
#define MODULES_PORTAL_XDG_DESKTOP_PORTAL_UTILS_H_

#include <gio/gio.h>

#include <cstdint>
#include <string>

#include "absl/strings/string_view.h"
#include "api/scoped_refptr.h"
#include "modules/portal/portal_guard.h"
#include "modules/portal/portal_request_response.h"
#include "rtc_base/system/rtc_export.h"

namespace webrtc {
namespace xdg_portal {

constexpr char kDesktopBusName[] = "org.freedesktop.portal.Desktop";
constexpr char kDesktopObjectPath[] = "/org/freedesktop/portal/desktop";
constexpr char kDesktopRequestObjectPath[] =
    "/org/freedesktop/portal/desktop/request";
constexpr char kSessionInterfaceName[] = "org.freedesktop.portal.Session";
constexpr char kRequestInterfaceName[] = "org.freedesktop.portal.Request";
constexpr char kScreenCastInterfaceName[] = "org.freedesktop.portal.ScreenCast";

using ProxyRequestCallback = void (*)(GObject*, GAsyncResult*, gpointer);
using SessionRequestCallback = void (*)(GDBusProxy*, GAsyncResult*, gpointer);
using SessionRequestResponseSignalHandler = void (*)(GDBusConnection*,
                                                     const char*,
                                                     const char*,
                                                     const char*,
                                                     const char*,
                                                     GVariant*,
                                                     gpointer);
using StartRequestResponseSignalHandler = void (*)(GDBusConnection*,
                                                   const char*,
                                                   const char*,
                                                   const char*,
                                                   const char*,
                                                   GVariant*,
                                                   gpointer);
using SessionStartRequestedHandler = void (*)(GDBusProxy*,
                                              GAsyncResult*,
                                              gpointer);

RTC_EXPORT std::string RequestResponseToString(RequestResponse request);

RequestResponse RequestResponseFromPortalResponse(uint32_t portal_response);

// Returns a string path for signal handle based on the provided connection and
// token.
RTC_EXPORT std::string PrepareSignalHandle(absl::string_view token,
                                           GDBusConnection* connection);

// Unsubscribes a signal subscription and zeros its ID.
// Returns true if the subscription was active, false if the ID was already 0.
RTC_EXPORT bool UnsubscribeSignalHandler(GDBusConnection* connection,
                                         guint& signal_id);

// Sets up the callback to execute when a response signal is received for the
// given object. Adds a ref to the guard for the signal subscription.
RTC_EXPORT uint32_t
SetupRequestResponseSignal(absl::string_view object_path,
                           const GDBusSignalCallback callback,
                           scoped_refptr<PortalGuard> guard,
                           GDBusConnection* connection);

// Requests a D-Bus proxy. Adds a ref to the guard for the async callback.
RTC_EXPORT void RequestSessionProxy(
    absl::string_view interface_name,
    const ProxyRequestCallback proxy_request_callback,
    GCancellable* cancellable,
    scoped_refptr<PortalGuard> guard);

// Sets up signal subscription and async call for session creation.
// Adds refs to the guard for both.
RTC_EXPORT void SetupSessionRequestHandlers(
    absl::string_view portal_prefix,
    const SessionRequestCallback session_request_callback,
    const SessionRequestResponseSignalHandler request_response_signale_handler,
    GDBusConnection* connection,
    GDBusProxy* proxy,
    GCancellable* cancellable,
    std::string& portal_handle,
    guint& session_request_signal_id,
    scoped_refptr<PortalGuard> guard);

// Starts a portal session. Adds refs to the guard for both signal
// subscription and async call.
RTC_EXPORT void StartSessionRequest(
    absl::string_view prefix,
    absl::string_view session_handle,
    const StartRequestResponseSignalHandler signal_handler,
    const SessionStartRequestedHandler session_started_handler,
    GDBusProxy* proxy,
    GDBusConnection* connection,
    GCancellable* cancellable,
    guint& start_request_signal_id,
    std::string& start_handle,
    scoped_refptr<PortalGuard> guard);

// Tears down the portal session and cleans up related objects.
RTC_EXPORT void TearDownSession(absl::string_view session_handle,
                                GDBusProxy* proxy,
                                GCancellable* cancellable,
                                GDBusConnection* connection);

}  // namespace xdg_portal
}  // namespace webrtc

#endif  // MODULES_PORTAL_XDG_DESKTOP_PORTAL_UTILS_H_
