mirror of
https://github.com/kunkundi/crossdesk.git
synced 2026-11-12 03:28:20 +08:00
[feat] add remote host version checks and update prompts
This commit is contained in:
1 parent
f347fc2387
commit
51d392ef48
25 files changed
+891
-392
No files matched your search
+3
-3
@@ -1,6 +1,6 @@
|
|||||||
# CrossDesk Privacy Policy
|
# CrossDesk Privacy Policy
|
||||||
|
|
||||||
Last updated: September 27, 2026
|
Last updated: September 28, 2026
|
||||||
|
|
||||||
[中文](#中文) | [English](#english)
|
[中文](#中文) | [English](#english)
|
||||||
|
|
||||||
@@ -15,7 +15,7 @@ Last updated: September 27, 2026
|
|||||||
CrossDesk 是远程桌面软件,需要通过网络完成设备发现、连接协商及远程会话。客户端可能进行以下网络通信:
|
CrossDesk 是远程桌面软件,需要通过网络完成设备发现、连接协商及远程会话。客户端可能进行以下网络通信:
|
||||||
|
|
||||||
- **默认服务:** 未启用自托管时,客户端会连接预配置的 CrossDesk 服务(`api.crossdesk.cn`),用于设备注册、信令、网络地址转换(NAT)穿透,并在无法建立直接连接时提供中继。
|
- **默认服务:** 未启用自托管时,客户端会连接预配置的 CrossDesk 服务(`api.crossdesk.cn`),用于设备注册、信令、网络地址转换(NAT)穿透,并在无法建立直接连接时提供中继。
|
||||||
- **版本检查:** 桌面客户端启动时会从 CrossDesk 版本服务(`version.crossdesk.cn`)获取最新版本信息。桌面端当前即使启用自托管,版本检查仍会访问 CrossDesk 版本服务。iOS 客户端不执行这项版本检查。
|
- **版本检查:** 桌面客户端启动时会从 CrossDesk 版本服务(`version.crossdesk.cn`)获取最新版本信息,也会用这些信息提示升级旧版被控端。iOS 客户端在连接成功且收到被控端版本号后,会从同一服务获取最新桌面版本信息,以提示升级被控端。这些请求不携带设备 ID 或被控端版本号,启用自托管时仍会访问 CrossDesk 版本服务。
|
||||||
- **远程会话:** 用户主动发起或接受远程连接后,CrossDesk 会根据使用的功能在设备之间传输屏幕画面、音频、键盘和鼠标输入、剪贴板文本以及用户选择传输的文件。剪贴板文本可能在远程会话期间自动同步。这些数据可能通过直接连接传输,也可能在必要时通过配置的中继服务器转发。
|
- **远程会话:** 用户主动发起或接受远程连接后,CrossDesk 会根据使用的功能在设备之间传输屏幕画面、音频、键盘和鼠标输入、剪贴板文本以及用户选择传输的文件。剪贴板文本可能在远程会话期间自动同步。这些数据可能通过直接连接传输,也可能在必要时通过配置的中继服务器转发。
|
||||||
- **自托管:** 用户可以在设置中指定自己的信令及中继服务器。自托管服务器的日志、数据保存和访问规则由其运营者决定。
|
- **自托管:** 用户可以在设置中指定自己的信令及中继服务器。自托管服务器的日志、数据保存和访问规则由其运营者决定。
|
||||||
|
|
||||||
@@ -72,7 +72,7 @@ This Privacy Policy applies to the CrossDesk desktop and iOS clients and the def
|
|||||||
CrossDesk is remote desktop software and requires network communications for device discovery, connection negotiation, and remote sessions. The client may perform the following communications:
|
CrossDesk is remote desktop software and requires network communications for device discovery, connection negotiation, and remote sessions. The client may perform the following communications:
|
||||||
|
|
||||||
- **Default services:** Unless self-hosting is enabled, the client connects to preconfigured CrossDesk services (`api.crossdesk.cn`) for device registration, signaling, network address translation (NAT) traversal, and relay when a direct connection cannot be established.
|
- **Default services:** Unless self-hosting is enabled, the client connects to preconfigured CrossDesk services (`api.crossdesk.cn`) for device registration, signaling, network address translation (NAT) traversal, and relay when a direct connection cannot be established.
|
||||||
- **Update checks:** On startup, the desktop client retrieves current release information from the CrossDesk version service (`version.crossdesk.cn`). Desktop update checks currently continue to use the CrossDesk version service even when self-hosting is enabled. The iOS client does not perform this update check.
|
- **Update checks:** On startup, the desktop client retrieves current release information from the CrossDesk version service (`version.crossdesk.cn`) and also uses it to suggest updating older remote hosts. After connecting and receiving a remote host's version, the iOS client retrieves the latest desktop release information from the same service to suggest updating that host. These requests do not include device IDs or the remote host's version. Both clients continue to use the CrossDesk version service when self-hosting is enabled.
|
||||||
- **Remote sessions:** After a user initiates or accepts a remote connection, CrossDesk transmits the data required by enabled features between devices. This may include screen content, audio, keyboard and mouse input, clipboard text, and files selected by the user. Clipboard text may be synchronized automatically during a remote session. Data may travel over a direct connection or through the configured relay server when necessary.
|
- **Remote sessions:** After a user initiates or accepts a remote connection, CrossDesk transmits the data required by enabled features between devices. This may include screen content, audio, keyboard and mouse input, clipboard text, and files selected by the user. Clipboard text may be synchronized automatically during a remote session. Data may travel over a direct connection or through the configured relay server when necessary.
|
||||||
- **Self-hosting:** Users may configure their own signaling and relay servers. Logging, retention, and access policies for a self-hosted server are determined by its operator.
|
- **Self-hosting:** Users may configure their own signaling and relay servers. Logging, retention, and access policies for a self-hosted server are determined by its operator.
|
||||||
|
|
||||||
|
|||||||
@@ -1481,6 +1481,12 @@ void GuiApplication::BindStreamCallbacks() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
auto& stream = *ui_->stream;
|
auto& stream = *ui_->stream;
|
||||||
|
stream->on_dismiss_remote_update([this] {
|
||||||
|
if (auto props = SelectedSession()) {
|
||||||
|
std::lock_guard lock(props->remote_version_mutex_);
|
||||||
|
props->remote_update_dismissed_ = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
auto close_stream_sessions = [this] {
|
auto close_stream_sessions = [this] {
|
||||||
std::vector<std::string> ids;
|
std::vector<std::string> ids;
|
||||||
{
|
{
|
||||||
@@ -2525,6 +2531,11 @@ void GuiApplication::SyncXWaylandWindowActivation() {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
void GuiApplication::SetStreamKeyboardFocus(bool focused) {
|
void GuiApplication::SetStreamKeyboardFocus(bool focused) {
|
||||||
|
// The local upgrade dialog owns input even while the native window is active.
|
||||||
|
if (focused && ui_ && ui_->stream &&
|
||||||
|
(*ui_->stream)->get_remote_update_visible()) {
|
||||||
|
focused = false;
|
||||||
|
}
|
||||||
if (focus_on_stream_window_ == focused) {
|
if (focus_on_stream_window_ == focused) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -2702,6 +2713,21 @@ void GuiApplication::SyncStreamWindow() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const ConnectionStatus status = props->connection_status_.load();
|
const ConnectionStatus status = props->connection_status_.load();
|
||||||
|
bool remote_update_available = false;
|
||||||
|
if (status == ConnectionStatus::Connected) {
|
||||||
|
std::lock_guard lock(props->remote_version_mutex_);
|
||||||
|
// Wait for host_info: a version still in transit is not a legacy peer.
|
||||||
|
if (props->remote_host_info_received_ && !props->remote_update_dismissed_) {
|
||||||
|
remote_update_available = props->remote_app_version_.empty() ||
|
||||||
|
(update_checker_->latest() &&
|
||||||
|
AvailableAppUpdate(props->remote_app_version_,
|
||||||
|
*update_checker_->latest()).has_value());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
(*ui_->stream)->set_remote_update_visible(remote_update_available);
|
||||||
|
if (remote_update_available) {
|
||||||
|
SetStreamKeyboardFocus(false);
|
||||||
|
}
|
||||||
const bool waiting_for_frame =
|
const bool waiting_for_frame =
|
||||||
status == ConnectionStatus::Connected &&
|
status == ConnectionStatus::Connected &&
|
||||||
!(*ui_->stream)->get_has_frame();
|
!(*ui_->stream)->get_has_frame();
|
||||||
|
|||||||
@@ -191,6 +191,9 @@ struct TranslationRow {
|
|||||||
u8"Способ захвата:") \
|
u8"Способ захвата:") \
|
||||||
X(screen_capture_method_auto, u8"自动", "Auto", u8"Авто") \
|
X(screen_capture_method_auto, u8"自动", "Auto", u8"Авто") \
|
||||||
X(video_settings, u8"画面设置", "Video settings", u8"Настройки видео") \
|
X(video_settings, u8"画面设置", "Video settings", u8"Настройки видео") \
|
||||||
|
X(remote_update_title, u8"被控端版本过低", "Remote device needs an update", u8"Версия на удалённом устройстве устарела") \
|
||||||
|
X(remote_update, u8"请升级到最新版本。", "Please update to the latest version.", u8"Обновите её до последней версии.") \
|
||||||
|
X(remote_update_dismiss, u8"知道了", "Got it", u8"Понятно") \
|
||||||
X(video_settings_pending, u8"正在应用…", "Applying…", u8"Применение…") \
|
X(video_settings_pending, u8"正在应用…", "Applying…", u8"Применение…") \
|
||||||
X(video_settings_failed, u8"调整失败,请重试。", "Could not apply settings. Try again.", u8"Не удалось применить настройки. Повторите попытку.") \
|
X(video_settings_failed, u8"调整失败,请重试。", "Could not apply settings. Try again.", u8"Не удалось применить настройки. Повторите попытку.") \
|
||||||
X(video_settings_unavailable, u8"连接建立后可调整,需被控端支持。", "Available when connected to a supported remote device.", u8"Доступно при подключении к поддерживаемому устройству.") \
|
X(video_settings_unavailable, u8"连接建立后可调整,需被控端支持。", "Available when connected to a supported remote device.", u8"Доступно при подключении к поддерживаемому устройству.") \
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include "runtime/peer_event_handler.h"
|
#include "runtime/peer_event_handler.h"
|
||||||
|
|
||||||
|
#include <app_version.h>
|
||||||
#include <remote_action.h>
|
#include <remote_action.h>
|
||||||
#include <nlohmann/json.hpp>
|
#include <nlohmann/json.hpp>
|
||||||
|
|
||||||
@@ -318,6 +319,12 @@ void PeerEventHandler::OnReceiveDataBuffer(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (is_client_mode) {
|
if (is_client_mode) {
|
||||||
|
if (props && source_id == props->control_data_label_) {
|
||||||
|
std::lock_guard lock(props->remote_version_mutex_);
|
||||||
|
props->remote_host_info_received_ = true;
|
||||||
|
props->remote_app_version_ = IsValidAppVersion(remote_action.i.app_version)
|
||||||
|
? remote_action.i.app_version : "";
|
||||||
|
}
|
||||||
// Negotiate live settings only on the reliable control stream. Old
|
// Negotiate live settings only on the reliable control stream. Old
|
||||||
// hosts omit this capability and retain their existing video behavior.
|
// hosts omit this capability and retain their existing video behavior.
|
||||||
if (props && source_id == props->control_data_label_) {
|
if (props && source_id == props->control_data_label_) {
|
||||||
|
|||||||
@@ -270,7 +270,7 @@ void PeerEventHandler::OnConnectionStatus(ConnectionStatus status,
|
|||||||
{
|
{
|
||||||
RemoteAction remote_action = MakeHostInformation(
|
RemoteAction remote_action = MakeHostInformation(
|
||||||
GetHostName(), runtime->devices_.host_display_list(),
|
GetHostName(), runtime->devices_.host_display_list(),
|
||||||
/*supports_privacy_screen=*/true);
|
/*supports_privacy_screen=*/true, CROSSDESK_VERSION);
|
||||||
remote_action.i.supports_video_settings = true;
|
remote_action.i.supports_video_settings = true;
|
||||||
for (std::size_t i = 0; i < remote_action.i.display_num; i++) {
|
for (std::size_t i = 0; i < remote_action.i.display_num; i++) {
|
||||||
LOG_INFO("Local display [{}:{}]", i + 1,
|
LOG_INFO("Local display [{}:{}]", i + 1,
|
||||||
@@ -300,6 +300,12 @@ void PeerEventHandler::OnConnectionStatus(ConnectionStatus status,
|
|||||||
runtime->keyboard_.ReleaseRemotePressedKeys(remote_id,
|
runtime->keyboard_.ReleaseRemotePressedKeys(remote_id,
|
||||||
"connection_closed");
|
"connection_closed");
|
||||||
props->connection_established_ = false;
|
props->connection_established_ = false;
|
||||||
|
{
|
||||||
|
std::lock_guard lock(props->remote_version_mutex_);
|
||||||
|
props->remote_host_info_received_ = false;
|
||||||
|
props->remote_app_version_.clear();
|
||||||
|
props->remote_update_dismissed_ = false;
|
||||||
|
}
|
||||||
props->net_traffic_stats_.Reset();
|
props->net_traffic_stats_.Reset();
|
||||||
props->enable_mouse_control_ = false;
|
props->enable_mouse_control_ = false;
|
||||||
runtime->ResetRemoteServiceStatus(*props);
|
runtime->ResetRemoteServiceStatus(*props);
|
||||||
@@ -395,7 +401,7 @@ void PeerEventHandler::OnConnectionStatus(ConnectionStatus status,
|
|||||||
{
|
{
|
||||||
RemoteAction remote_action = MakeHostInformation(
|
RemoteAction remote_action = MakeHostInformation(
|
||||||
GetHostName(), runtime->devices_.host_display_list(),
|
GetHostName(), runtime->devices_.host_display_list(),
|
||||||
/*supports_privacy_screen=*/true);
|
/*supports_privacy_screen=*/true, CROSSDESK_VERSION);
|
||||||
remote_action.i.supports_video_settings = true;
|
remote_action.i.supports_video_settings = true;
|
||||||
for (std::size_t i = 0; i < remote_action.i.display_num; i++) {
|
for (std::size_t i = 0; i < remote_action.i.display_num; i++) {
|
||||||
LOG_INFO("Local display [{}:{}]", i + 1,
|
LOG_INFO("Local display [{}:{}]", i + 1,
|
||||||
|
|||||||
@@ -124,6 +124,11 @@ struct RemoteSession {
|
|||||||
bool tab_selected_ = false;
|
bool tab_selected_ = false;
|
||||||
bool tab_opened_ = true;
|
bool tab_opened_ = true;
|
||||||
std::string remote_host_name_;
|
std::string remote_host_name_;
|
||||||
|
// Received version and dismissal state belong to this connection.
|
||||||
|
std::mutex remote_version_mutex_;
|
||||||
|
bool remote_host_info_received_ = false;
|
||||||
|
std::string remote_app_version_;
|
||||||
|
bool remote_update_dismissed_ = false;
|
||||||
bool remote_service_status_received_ = false;
|
bool remote_service_status_received_ = false;
|
||||||
std::mutex video_settings_mutex_;
|
std::mutex video_settings_mutex_;
|
||||||
// Requested and confirmed settings for this remote session only.
|
// Requested and confirmed settings for this remote session only.
|
||||||
|
|||||||
@@ -365,6 +365,7 @@ export component CompactButton inherits Rectangle {
|
|||||||
|
|
||||||
export component PrimaryButton inherits Rectangle {
|
export component PrimaryButton inherits Rectangle {
|
||||||
in property <string> text;
|
in property <string> text;
|
||||||
|
in property <length> text-size: ImGuiFontStyle.body;
|
||||||
in property <bool> enabled: true;
|
in property <bool> enabled: true;
|
||||||
callback clicked;
|
callback clicked;
|
||||||
|
|
||||||
@@ -379,7 +380,7 @@ export component PrimaryButton inherits Rectangle {
|
|||||||
Text {
|
Text {
|
||||||
text: root.text;
|
text: root.text;
|
||||||
color: white;
|
color: white;
|
||||||
font-size: ImGuiFontStyle.body;
|
font-size: root.text-size;
|
||||||
horizontal-alignment: center;
|
horizontal-alignment: center;
|
||||||
vertical-alignment: center;
|
vertical-alignment: center;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { ComboBox, ScrollView } from "std-widgets.slint";
|
import { ComboBox, ScrollView } from "std-widgets.slint";
|
||||||
import { FontAwesomeIcons, IconButton, PrimaryButton, ImGuiLineStyle, ImGuiFontStyle } from "common.slint";
|
import { FontAwesomeIcons, IconButton, PrimaryButton, DialogSurface, ImGuiLineStyle, ImGuiFontStyle } from "common.slint";
|
||||||
|
|
||||||
export struct StreamTab {
|
export struct StreamTab {
|
||||||
remote-id: string,
|
remote-id: string,
|
||||||
@@ -23,6 +23,9 @@ export struct NetworkStatsRow {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export global StreamStrings {
|
export global StreamStrings {
|
||||||
|
in-out property <string> remote-update-title: "Remote device needs an update";
|
||||||
|
in-out property <string> remote-update: "Please update to the latest version.";
|
||||||
|
in-out property <string> remote-update-dismiss: "Got it";
|
||||||
in-out property <string> video-settings: "Video settings";
|
in-out property <string> video-settings: "Video settings";
|
||||||
in-out property <string> video-settings-unavailable: "The remote device does not support live video settings";
|
in-out property <string> video-settings-unavailable: "The remote device does not support live video settings";
|
||||||
in-out property <string> video-quality: "Video quality";
|
in-out property <string> video-quality: "Video quality";
|
||||||
@@ -196,6 +199,8 @@ export component StreamWindow inherits Window {
|
|||||||
in property <bool> has-frame: false;
|
in property <bool> has-frame: false;
|
||||||
in property <string> status-text: "";
|
in property <string> status-text: "";
|
||||||
in property <string> receiving-text: "";
|
in property <string> receiving-text: "";
|
||||||
|
in property <bool> remote-update-visible: false;
|
||||||
|
callback dismiss-remote-update;
|
||||||
in property <[string]> displays;
|
in property <[string]> displays;
|
||||||
in-out property <int> selected-display: 0;
|
in-out property <int> selected-display: 0;
|
||||||
in property <bool> mouse-control-enabled: true;
|
in property <bool> mouse-control-enabled: true;
|
||||||
@@ -271,6 +276,15 @@ export component StreamWindow inherits Window {
|
|||||||
changed selected-tab => { root.video-menu-open = false; }
|
changed selected-tab => { root.video-menu-open = false; }
|
||||||
changed control-expanded => { if !root.control-expanded { root.video-menu-open = false; } }
|
changed control-expanded => { if !root.control-expanded { root.video-menu-open = false; } }
|
||||||
changed window-active => { if !root.window-active { root.video-menu-open = false; } }
|
changed window-active => { if !root.window-active { root.video-menu-open = false; } }
|
||||||
|
changed remote-update-visible => {
|
||||||
|
if root.remote-update-visible {
|
||||||
|
root.video-menu-open = false;
|
||||||
|
root.display-menu-open = false;
|
||||||
|
root.shortcut-menu-open = false;
|
||||||
|
}
|
||||||
|
input-focus.focus();
|
||||||
|
root.keyboard-focus-changed(!root.remote-update-visible);
|
||||||
|
}
|
||||||
private property <bool> control-tooltip-visible: false;
|
private property <bool> control-tooltip-visible: false;
|
||||||
private property <ControlBarTooltip> hovered-control: {
|
private property <ControlBarTooltip> hovered-control: {
|
||||||
if root.window-active && !root.control-dragging
|
if root.window-active && !root.control-dragging
|
||||||
@@ -345,6 +359,7 @@ export component StreamWindow inherits Window {
|
|||||||
}
|
}
|
||||||
|
|
||||||
is-local-control-area(pointer-x, pointer-y) => {
|
is-local-control-area(pointer-x, pointer-y) => {
|
||||||
|
if root.remote-update-visible { return true; }
|
||||||
let over-control = pointer-x >= control.x
|
let over-control = pointer-x >= control.x
|
||||||
&& pointer-x <= control.x + control.width
|
&& pointer-x <= control.x + control.width
|
||||||
&& pointer-y >= control.y
|
&& pointer-y >= control.y
|
||||||
@@ -655,9 +670,11 @@ export component StreamWindow inherits Window {
|
|||||||
|
|
||||||
drop-zone := DropArea {
|
drop-zone := DropArea {
|
||||||
can-drop(event) => {
|
can-drop(event) => {
|
||||||
return root.can-drop-file(event.data) ? DragAction.copy : DragAction.none;
|
return !root.remote-update-visible && root.can-drop-file(event.data)
|
||||||
|
? DragAction.copy : DragAction.none;
|
||||||
}
|
}
|
||||||
dropped(event) => {
|
dropped(event) => {
|
||||||
|
if root.remote-update-visible { return DragAction.none; }
|
||||||
root.file-dropped(event.data);
|
root.file-dropped(event.data);
|
||||||
return DragAction.copy;
|
return DragAction.copy;
|
||||||
}
|
}
|
||||||
@@ -668,11 +685,20 @@ export component StreamWindow inherits Window {
|
|||||||
focus-gained => { root.keyboard-focus-changed(true); }
|
focus-gained => { root.keyboard-focus-changed(true); }
|
||||||
focus-lost => { root.keyboard-focus-changed(false); }
|
focus-lost => { root.keyboard-focus-changed(false); }
|
||||||
key-pressed(event) => {
|
key-pressed(event) => {
|
||||||
root.key-input(event.text, true, event.modifiers.control, event.modifiers.alt, event.modifiers.shift, event.modifiers.meta);
|
if !root.remote-update-visible {
|
||||||
|
root.key-input(event.text, true, event.modifiers.control, event.modifiers.alt, event.modifiers.shift, event.modifiers.meta);
|
||||||
|
}
|
||||||
accept
|
accept
|
||||||
}
|
}
|
||||||
key-released(event) => {
|
key-released(event) => {
|
||||||
root.key-input(event.text, false, event.modifiers.control, event.modifiers.alt, event.modifiers.shift, event.modifiers.meta);
|
if root.remote-update-visible {
|
||||||
|
// Dismiss on release so the same key cannot reach the peer.
|
||||||
|
if event.text == Key.Escape || event.text == Key.Return {
|
||||||
|
root.dismiss-remote-update();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
root.key-input(event.text, false, event.modifiers.control, event.modifiers.alt, event.modifiers.shift, event.modifiers.meta);
|
||||||
|
}
|
||||||
accept
|
accept
|
||||||
}
|
}
|
||||||
pointer := TouchArea {
|
pointer := TouchArea {
|
||||||
@@ -723,7 +749,12 @@ export component StreamWindow inherits Window {
|
|||||||
root.suppress-next-remote-pointer-release = false;
|
root.suppress-next-remote-pointer-release = false;
|
||||||
input-focus.focus();
|
input-focus.focus();
|
||||||
}
|
}
|
||||||
if event.kind == PointerEventKind.down
|
// A gesture started before the modal appeared keeps
|
||||||
|
// pointer capture. Let its release reach the peer.
|
||||||
|
if root.remote-update-visible && !root.control-dragging
|
||||||
|
&& event.kind == PointerEventKind.up {
|
||||||
|
root.pointer-input(event.button, event.kind, self.mouse-x, self.mouse-y);
|
||||||
|
} else if event.kind == PointerEventKind.down
|
||||||
&& event.button == PointerEventButton.left
|
&& event.button == PointerEventButton.left
|
||||||
&& over-control {
|
&& over-control {
|
||||||
root.begin-control-drag(self.mouse-x, self.mouse-y);
|
root.begin-control-drag(self.mouse-x, self.mouse-y);
|
||||||
@@ -1272,6 +1303,80 @@ export component StreamWindow inherits Window {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if root.remote-update-visible: Rectangle {
|
||||||
|
width: parent.width; height: parent.height;
|
||||||
|
background: #0c162c52;
|
||||||
|
z: 13;
|
||||||
|
TouchArea {
|
||||||
|
mouse-cursor: default;
|
||||||
|
scroll-event(event) => { accept }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
remote-update-banner := DialogSurface {
|
||||||
|
visible: root.remote-update-visible;
|
||||||
|
x: (parent.width - self.width) / 2;
|
||||||
|
y: min(max(64px, parent.height * 0.18), max(16px, parent.height - self.height - 16px));
|
||||||
|
width: min(520px, parent.width - 48px);
|
||||||
|
height: max(208px, remote-update-message.y + remote-update-message.height + 92px);
|
||||||
|
border-color: #e5e9f0;
|
||||||
|
border-radius: 14px;
|
||||||
|
drop-shadow-color: #07142b30;
|
||||||
|
drop-shadow-blur: 32px;
|
||||||
|
drop-shadow-offset-y: 12px;
|
||||||
|
z: 14;
|
||||||
|
TouchArea {
|
||||||
|
mouse-cursor: default;
|
||||||
|
pointer-event(event) => {
|
||||||
|
if event.kind == PointerEventKind.down {
|
||||||
|
root.suppress-next-remote-pointer-release = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
scroll-event(event) => { accept }
|
||||||
|
}
|
||||||
|
Rectangle {
|
||||||
|
x: 32px; y: 32px; width: 48px; height: 48px;
|
||||||
|
background: #edf4ff; border-radius: 12px;
|
||||||
|
Path {
|
||||||
|
x: 12px; y: 12px; width: 24px; height: 24px;
|
||||||
|
viewbox-width: 24; viewbox-height: 24;
|
||||||
|
commands: "M 12 16 L 12 3 M 6.5 8.5 L 12 3 L 17.5 8.5 M 4 15 L 4 20 Q 4 21 5 21 L 19 21 Q 20 21 20 20 L 20 15";
|
||||||
|
fill: transparent;
|
||||||
|
stroke: #2463c7; stroke-width: 1.8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
remote-update-title := Text {
|
||||||
|
x: 100px; y: 34px; width: parent.width - 144px;
|
||||||
|
height: max(28px, self.preferred-height);
|
||||||
|
text: StreamStrings.remote-update-title;
|
||||||
|
color: #1b2433; font-size: 20px; font-weight: 600;
|
||||||
|
wrap: word-wrap;
|
||||||
|
}
|
||||||
|
remote-update-message := Text {
|
||||||
|
x: remote-update-title.x;
|
||||||
|
y: remote-update-title.y + remote-update-title.height + 8px;
|
||||||
|
width: remote-update-title.width;
|
||||||
|
height: max(22px, self.preferred-height);
|
||||||
|
text: StreamStrings.remote-update;
|
||||||
|
color: #667085; font-size: 15px;
|
||||||
|
wrap: word-wrap;
|
||||||
|
}
|
||||||
|
IconButton {
|
||||||
|
x: parent.width - 44px; y: 12px; width: 32px; height: 32px;
|
||||||
|
icon: FontAwesomeIcons.xmark; icon-size: 14px;
|
||||||
|
icon-color: #8a93a3;
|
||||||
|
hover-background: #f2f4f7;
|
||||||
|
clicked => { root.dismiss-remote-update(); }
|
||||||
|
}
|
||||||
|
PrimaryButton {
|
||||||
|
x: parent.width - 136px; y: parent.height - 68px;
|
||||||
|
width: 104px; height: 36px;
|
||||||
|
border-radius: 7px;
|
||||||
|
text: StreamStrings.remote-update-dismiss;
|
||||||
|
text-size: 14px;
|
||||||
|
clicked => { root.dismiss-remote-update(); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Transfer progress overlay at bottom-left.
|
// Transfer progress overlay at bottom-left.
|
||||||
if root.file-transfer-visible: Rectangle {
|
if root.file-transfer-visible: Rectangle {
|
||||||
x: 18px; y: parent.height - min(210px, parent.height * 0.35); width: min(430px, parent.width * 0.6); height: min(190px, parent.height * 0.32);
|
x: 18px; y: parent.height - min(210px, parent.height * 0.35); width: min(430px, parent.width * 0.6); height: min(190px, parent.height * 0.32);
|
||||||
|
|||||||
@@ -133,6 +133,9 @@ inline int ApplyStreamWindowStrings(
|
|||||||
const int language =
|
const int language =
|
||||||
localization::detail::ClampLanguageIndex(language_index);
|
localization::detail::ClampLanguageIndex(language_index);
|
||||||
auto& strings = window->template global<ui::StreamStrings>();
|
auto& strings = window->template global<ui::StreamStrings>();
|
||||||
|
strings.set_remote_update_title(Text(localization::remote_update_title[language]));
|
||||||
|
strings.set_remote_update(Text(localization::remote_update[language]));
|
||||||
|
strings.set_remote_update_dismiss(Text(localization::remote_update_dismiss[language]));
|
||||||
strings.set_select_display(Text(localization::select_display[language]));
|
strings.set_select_display(Text(localization::select_display[language]));
|
||||||
strings.set_send_shortcut(Text(localization::send_shortcut[language]));
|
strings.set_send_shortcut(Text(localization::send_shortcut[language]));
|
||||||
strings.set_privacy_enable(Text(localization::privacy_enable[language]));
|
strings.set_privacy_enable(Text(localization::privacy_enable[language]));
|
||||||
|
|||||||
@@ -11,224 +11,15 @@
|
|||||||
|
|
||||||
#include "rd_log.h"
|
#include "rd_log.h"
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
#include <array>
|
|
||||||
#include <cctype>
|
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <iostream>
|
|
||||||
#include <limits>
|
|
||||||
#include <sstream>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace crossdesk {
|
namespace crossdesk {
|
||||||
|
|
||||||
std::vector<int> SplitVersion(const std::string& ver);
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
constexpr size_t kMaxInlinePatchDigits = 4;
|
|
||||||
|
|
||||||
struct ParsedVersion {
|
|
||||||
std::vector<int> numbers;
|
|
||||||
std::string date;
|
|
||||||
bool has_patch = false;
|
|
||||||
int patch = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
bool IsDigit(char c) {
|
|
||||||
return std::isdigit(static_cast<unsigned char>(c)) != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsAlphaNumeric(char c) {
|
|
||||||
return std::isalnum(static_cast<unsigned char>(c)) != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsAllDigits(const std::string& value) {
|
|
||||||
if (value.empty()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (char c : value) {
|
|
||||||
if (!IsDigit(c)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool TryParseNonNegativeInt(const std::string& value, int* result) {
|
|
||||||
if (!IsAllDigits(value)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
const long long parsed = std::stoll(value);
|
|
||||||
if (parsed > std::numeric_limits<int>::max()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
*result = static_cast<int>(parsed);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool TryParseInlinePatch(const std::string& value, int* result) {
|
|
||||||
if (value.size() > kMaxInlinePatchDigits) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TryParseNonNegativeInt(value, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t FindNumericStart(const std::string& version) {
|
|
||||||
size_t start = 0;
|
|
||||||
while (start < version.size() && !IsDigit(version[start])) {
|
|
||||||
start++;
|
|
||||||
}
|
|
||||||
return start;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t FindNumericEnd(const std::string& version, size_t start) {
|
|
||||||
size_t end = start;
|
|
||||||
while (end < version.size() &&
|
|
||||||
(IsDigit(version[end]) || version[end] == '.')) {
|
|
||||||
end++;
|
|
||||||
}
|
|
||||||
return end;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool HasDigitBoundary(const std::string& value, size_t pos, size_t len) {
|
|
||||||
const bool before_ok = pos == 0 || !IsDigit(value[pos - 1]);
|
|
||||||
const size_t end = pos + len;
|
|
||||||
const bool after_ok = end >= value.size() || !IsDigit(value[end]);
|
|
||||||
return before_ok && after_ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsCompactDateAt(const std::string& value, size_t pos) {
|
|
||||||
if (pos + 8 > value.size() || !HasDigitBoundary(value, pos, 8)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (size_t i = 0; i < 8; ++i) {
|
|
||||||
if (!IsDigit(value[pos + i])) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string CompactDateToIso(const std::string& compact_date) {
|
|
||||||
return compact_date.substr(0, 4) + "-" + compact_date.substr(4, 2) + "-" +
|
|
||||||
compact_date.substr(6, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ExtractDateFromText(const std::string& value,
|
|
||||||
std::string* date,
|
|
||||||
size_t* date_end) {
|
|
||||||
for (size_t i = 0; i < value.size(); ++i) {
|
|
||||||
if (IsCompactDateAt(value, i)) {
|
|
||||||
*date = CompactDateToIso(value.substr(i, 8));
|
|
||||||
*date_end = i + 8;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
ParsedVersion ParseVersion(const std::string& version) {
|
|
||||||
const size_t numeric_start = FindNumericStart(version);
|
|
||||||
const size_t numeric_end = FindNumericEnd(version, numeric_start);
|
|
||||||
|
|
||||||
ParsedVersion parsed;
|
|
||||||
parsed.numbers = SplitVersion(version.substr(numeric_start,
|
|
||||||
numeric_end - numeric_start));
|
|
||||||
|
|
||||||
const std::string suffix = version.substr(numeric_end);
|
|
||||||
size_t pos = 0;
|
|
||||||
while (pos < suffix.size()) {
|
|
||||||
while (pos < suffix.size() && !IsAlphaNumeric(suffix[pos])) {
|
|
||||||
pos++;
|
|
||||||
}
|
|
||||||
|
|
||||||
const size_t token_start = pos;
|
|
||||||
while (pos < suffix.size() && IsAlphaNumeric(suffix[pos])) {
|
|
||||||
pos++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (token_start == pos) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
const std::string token = suffix.substr(token_start, pos - token_start);
|
|
||||||
if (parsed.date.empty() && IsCompactDateAt(token, 0)) {
|
|
||||||
parsed.date = CompactDateToIso(token);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
int patch = 0;
|
|
||||||
if (!parsed.has_patch && TryParseInlinePatch(token, &patch)) {
|
|
||||||
parsed.has_patch = true;
|
|
||||||
parsed.patch = patch;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return parsed;
|
|
||||||
}
|
|
||||||
|
|
||||||
int CompareNumericVersion(const std::vector<int>& current,
|
|
||||||
const std::vector<int>& latest) {
|
|
||||||
std::vector<int> current_parts = current;
|
|
||||||
std::vector<int> latest_parts = latest;
|
|
||||||
const size_t len = std::max(current_parts.size(), latest_parts.size());
|
|
||||||
current_parts.resize(len, 0);
|
|
||||||
latest_parts.resize(len, 0);
|
|
||||||
|
|
||||||
for (size_t i = 0; i < len; ++i) {
|
|
||||||
if (latest_parts[i] > current_parts[i]) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if (latest_parts[i] < current_parts[i]) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ReadPatchField(const nlohmann::json& json, int* patch) {
|
|
||||||
if (!json.contains("patch")) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto& patch_value = json["patch"];
|
|
||||||
if (patch_value.is_number_unsigned()) {
|
|
||||||
const auto parsed = patch_value.get<unsigned long long>();
|
|
||||||
if (parsed > static_cast<unsigned long long>(std::numeric_limits<int>::max())) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
*patch = static_cast<int>(parsed);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (patch_value.is_number_integer()) {
|
|
||||||
const long long parsed = patch_value.get<long long>();
|
|
||||||
if (parsed < 0 || parsed > std::numeric_limits<int>::max()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
*patch = static_cast<int>(parsed);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (patch_value.is_string()) {
|
|
||||||
return TryParseNonNegativeInt(patch_value.get<std::string>(), patch);
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LogHttpError(const httplib::Result& result) {
|
void LogHttpError(const httplib::Result& result) {
|
||||||
LOG_WARN("Failed to fetch version.json: error={}, message={}",
|
LOG_WARN("Failed to fetch version.json: error={}, message={}",
|
||||||
static_cast<int>(result.error()), httplib::to_string(result.error()));
|
static_cast<int>(result.error()), httplib::to_string(result.error()));
|
||||||
@@ -310,125 +101,6 @@ void ConfigureLinuxCaCerts(httplib::Client* cli) {
|
|||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
std::string ExtractNumericPart(const std::string& ver) {
|
|
||||||
const size_t start = FindNumericStart(ver);
|
|
||||||
const size_t end = FindNumericEnd(ver, start);
|
|
||||||
return ver.substr(start, end - start);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<int> SplitVersion(const std::string& ver) {
|
|
||||||
std::vector<int> nums;
|
|
||||||
std::istringstream ss(ver);
|
|
||||||
std::string token;
|
|
||||||
while (std::getline(ss, token, '.')) {
|
|
||||||
try {
|
|
||||||
nums.push_back(std::stoi(token));
|
|
||||||
} catch (...) {
|
|
||||||
nums.push_back(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nums;
|
|
||||||
}
|
|
||||||
|
|
||||||
// extract date from version string (format: v1.2.3-20251113-abc
|
|
||||||
// or 1.2.3-20251113-abc)
|
|
||||||
std::string ExtractDateFromVersion(const std::string& version) {
|
|
||||||
const size_t numeric_start = FindNumericStart(version);
|
|
||||||
const size_t numeric_end = FindNumericEnd(version, numeric_start);
|
|
||||||
const std::string suffix = version.substr(numeric_end);
|
|
||||||
std::string date;
|
|
||||||
size_t date_end = 0;
|
|
||||||
if (ExtractDateFromText(suffix, &date, &date_end)) {
|
|
||||||
return date;
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
// compare two dates in YYYY-MM-DD format
|
|
||||||
bool IsNewerDate(const std::string& date1, const std::string& date2) {
|
|
||||||
if (date1.empty() || date2.empty()) return false;
|
|
||||||
// simple string comparison works for ISO date format (YYYY-MM-DD)
|
|
||||||
return date2 > date1;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsNewerVersion(const std::string& current, const std::string& latest) {
|
|
||||||
return IsNewerVersionWithMetadata(current, latest, "", -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsNewerVersionWithMetadata(const std::string& current,
|
|
||||||
const std::string& latest,
|
|
||||||
const std::string& latest_date,
|
|
||||||
int latest_patch) {
|
|
||||||
(void)latest_date;
|
|
||||||
|
|
||||||
const ParsedVersion current_version = ParseVersion(current);
|
|
||||||
const ParsedVersion latest_version = ParseVersion(latest);
|
|
||||||
|
|
||||||
const int numeric_compare =
|
|
||||||
CompareNumericVersion(current_version.numbers, latest_version.numbers);
|
|
||||||
if (numeric_compare > 0) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (numeric_compare < 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const bool metadata_has_patch = latest_patch >= 0;
|
|
||||||
const bool latest_has_patch = metadata_has_patch || latest_version.has_patch;
|
|
||||||
if (latest_has_patch || current_version.has_patch) {
|
|
||||||
const int resolved_latest_patch =
|
|
||||||
metadata_has_patch ? latest_patch
|
|
||||||
: (latest_version.has_patch ? latest_version.patch
|
|
||||||
: 0);
|
|
||||||
const int resolved_current_patch =
|
|
||||||
current_version.has_patch ? current_version.patch : 0;
|
|
||||||
return resolved_latest_patch > resolved_current_patch;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::optional<VersionInfo> ParseVersionInfo(const nlohmann::json& json) {
|
|
||||||
if (!json.is_object()) {
|
|
||||||
return std::nullopt;
|
|
||||||
}
|
|
||||||
const auto read_string = [&](const char* key) -> std::string {
|
|
||||||
const auto it = json.find(key);
|
|
||||||
return it != json.end() && it->is_string() ? it->get<std::string>()
|
|
||||||
: std::string{};
|
|
||||||
};
|
|
||||||
VersionInfo info;
|
|
||||||
info.version = read_string("latest_version");
|
|
||||||
if (info.version.empty()) {
|
|
||||||
info.version = read_string("version");
|
|
||||||
}
|
|
||||||
if (!info.version.empty() &&
|
|
||||||
(info.version.front() == 'v' || info.version.front() == 'V')) {
|
|
||||||
info.version.erase(0, 1);
|
|
||||||
}
|
|
||||||
// Invalid/missing version data is a failed check, never "up to date".
|
|
||||||
const auto numeric_end = FindNumericEnd(info.version, 0);
|
|
||||||
if (numeric_end == 0 || info.version[numeric_end - 1] == '.' ||
|
|
||||||
(numeric_end < info.version.size() &&
|
|
||||||
(numeric_end + 1 == info.version.size() ||
|
|
||||||
(info.version[numeric_end] != '-' && info.version[numeric_end] != '+')))) {
|
|
||||||
return std::nullopt;
|
|
||||||
}
|
|
||||||
std::istringstream parts(info.version.substr(0, numeric_end));
|
|
||||||
std::string part;
|
|
||||||
int number = 0;
|
|
||||||
while (std::getline(parts, part, '.')) {
|
|
||||||
if (!TryParseNonNegativeInt(part, &number)) {
|
|
||||||
return std::nullopt;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
info.release_name = read_string("releaseName");
|
|
||||||
info.release_notes = read_string("releaseNotes");
|
|
||||||
info.release_date = read_string("releaseDate");
|
|
||||||
ReadPatchField(json, &info.patch);
|
|
||||||
return info;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::optional<VersionInfo> CheckUpdate() {
|
std::optional<VersionInfo> CheckUpdate() {
|
||||||
httplib::Client cli("https://version.crossdesk.cn");
|
httplib::Client cli("https://version.crossdesk.cn");
|
||||||
|
|
||||||
|
|||||||
@@ -8,30 +8,13 @@
|
|||||||
#define _VERSION_CHECKER_H_
|
#define _VERSION_CHECKER_H_
|
||||||
|
|
||||||
#include <nlohmann/json_fwd.hpp>
|
#include <nlohmann/json_fwd.hpp>
|
||||||
#include <optional>
|
#include <app_version.h>
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace crossdesk {
|
namespace crossdesk {
|
||||||
|
|
||||||
struct VersionInfo {
|
|
||||||
std::string version;
|
|
||||||
std::string release_name;
|
|
||||||
std::string release_notes;
|
|
||||||
std::string release_date;
|
|
||||||
int patch = -1;
|
|
||||||
};
|
|
||||||
|
|
||||||
std::optional<VersionInfo> ParseVersionInfo(const nlohmann::json& json);
|
std::optional<VersionInfo> ParseVersionInfo(const nlohmann::json& json);
|
||||||
std::optional<VersionInfo> CheckUpdate();
|
std::optional<VersionInfo> CheckUpdate();
|
||||||
|
|
||||||
bool IsNewerVersion(const std::string& current, const std::string& latest);
|
|
||||||
|
|
||||||
// Pass latest_patch < 0 when patch metadata is unavailable.
|
|
||||||
bool IsNewerVersionWithMetadata(const std::string& current,
|
|
||||||
const std::string& latest,
|
|
||||||
const std::string& latest_date,
|
|
||||||
int latest_patch);
|
|
||||||
|
|
||||||
} // namespace crossdesk
|
} // namespace crossdesk
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
#include "fa_solid_900.h"
|
#include "fa_solid_900.h"
|
||||||
#include "ui/ui_localization.h"
|
#include "ui/ui_localization.h"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <charconv>
|
#include <charconv>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
@@ -381,7 +382,8 @@ int RunCaptureMode(
|
|||||||
|
|
||||||
slint::Window *capture_window = &window->window();
|
slint::Window *capture_window = &window->window();
|
||||||
const bool capture_stream =
|
const bool capture_stream =
|
||||||
options.page == "stream" || options.page == "stream-video-settings";
|
options.page == "stream" || options.page == "stream-video-settings" ||
|
||||||
|
options.page == "stream-update" || options.page == "stream-update-legacy";
|
||||||
if (capture_stream) {
|
if (capture_stream) {
|
||||||
ConfigureStreamCapturePage(stream, options.language);
|
ConfigureStreamCapturePage(stream, options.language);
|
||||||
if (!options.demo_assets_path.empty()) {
|
if (!options.demo_assets_path.empty()) {
|
||||||
@@ -408,6 +410,11 @@ int RunCaptureMode(
|
|||||||
stream->set_video_settings_enabled(true);
|
stream->set_video_settings_enabled(true);
|
||||||
stream->set_video_menu_open(true);
|
stream->set_video_menu_open(true);
|
||||||
}
|
}
|
||||||
|
if (options.page == "stream-update" || options.page == "stream-update-legacy") {
|
||||||
|
stream->set_remote_update_visible(true);
|
||||||
|
stream->on_dismiss_remote_update(
|
||||||
|
[stream] { stream->set_remote_update_visible(false); });
|
||||||
|
}
|
||||||
window->hide();
|
window->hide();
|
||||||
stream->show();
|
stream->show();
|
||||||
capture_window = &stream->window();
|
capture_window = &stream->window();
|
||||||
@@ -638,6 +645,92 @@ int main() {
|
|||||||
assert(keyboard_focus_changed);
|
assert(keyboard_focus_changed);
|
||||||
assert(keyboard_input_received);
|
assert(keyboard_input_received);
|
||||||
|
|
||||||
|
stream->window().dispatch_key_release_event("a");
|
||||||
|
|
||||||
|
// The modal owns keyboard and pointer input. Complete a gesture that was
|
||||||
|
// already sent to the peer before showing it, then block new gestures.
|
||||||
|
int remote_key_events = 0;
|
||||||
|
int remote_pointer_presses = 0;
|
||||||
|
int remote_pointer_releases = 0;
|
||||||
|
int notice_dismissals = 0;
|
||||||
|
stream->on_key_input(
|
||||||
|
[&](slint::SharedString, bool, bool, bool, bool, bool) {
|
||||||
|
++remote_key_events;
|
||||||
|
});
|
||||||
|
stream->on_pointer_input(
|
||||||
|
[&](slint::PointerEventButton, slint::PointerEventKind kind, float, float) {
|
||||||
|
if (kind == slint::PointerEventKind::Down) ++remote_pointer_presses;
|
||||||
|
if (kind == slint::PointerEventKind::Up) ++remote_pointer_releases;
|
||||||
|
});
|
||||||
|
stream->on_dismiss_remote_update([&] {
|
||||||
|
++notice_dismissals;
|
||||||
|
stream->set_remote_update_visible(false);
|
||||||
|
});
|
||||||
|
const auto outside_notice =
|
||||||
|
slint::LogicalPosition(slint::Point<float>{640.0f, 500.0f});
|
||||||
|
stream->window().dispatch_pointer_press_event(
|
||||||
|
outside_notice, slint::PointerEventButton::Left);
|
||||||
|
stream->set_remote_update_visible(true);
|
||||||
|
stream->window().dispatch_pointer_release_event(
|
||||||
|
outside_notice, slint::PointerEventButton::Left);
|
||||||
|
if (remote_pointer_presses != 1 || remote_pointer_releases != 1) {
|
||||||
|
std::cerr << "Showing the upgrade dialog must finish an active remote gesture\n";
|
||||||
|
return 9;
|
||||||
|
}
|
||||||
|
const float notice_y =
|
||||||
|
std::max(64.0f, stream->get_video_area_height() * 0.18f) + 24.0f;
|
||||||
|
if (!stream->invoke_is_local_control_area(640.0f, notice_y) ||
|
||||||
|
!stream->invoke_is_local_control_area(640.0f, 500.0f)) {
|
||||||
|
std::cerr << "Remote upgrade dialog and backdrop must consume local input\n";
|
||||||
|
return 9;
|
||||||
|
}
|
||||||
|
stream->window().dispatch_pointer_press_event(
|
||||||
|
outside_notice, slint::PointerEventButton::Left);
|
||||||
|
stream->window().dispatch_pointer_release_event(
|
||||||
|
outside_notice, slint::PointerEventButton::Left);
|
||||||
|
stream->window().dispatch_key_press_event("a");
|
||||||
|
stream->window().dispatch_key_release_event("a");
|
||||||
|
if (remote_pointer_presses != 1 || remote_pointer_releases != 1 ||
|
||||||
|
remote_key_events != 0 || notice_dismissals != 0) {
|
||||||
|
std::cerr << "Upgrade dialog input must stay local\n";
|
||||||
|
return 9;
|
||||||
|
}
|
||||||
|
stream->window().dispatch_key_press_event("\x1b");
|
||||||
|
stream->window().dispatch_key_release_event("\x1b");
|
||||||
|
if (stream->get_remote_update_visible() || notice_dismissals != 1 ||
|
||||||
|
remote_key_events != 0) {
|
||||||
|
std::cerr << "Escape must dismiss the dialog without forwarding the key\n";
|
||||||
|
return 9;
|
||||||
|
}
|
||||||
|
if (stream->invoke_is_local_control_area(640.0f, notice_y)) {
|
||||||
|
std::cerr << "Dismissed upgrade notice must release its input area\n";
|
||||||
|
return 9;
|
||||||
|
}
|
||||||
|
stream->window().dispatch_key_press_event("a");
|
||||||
|
stream->window().dispatch_key_release_event("a");
|
||||||
|
stream->window().dispatch_pointer_press_event(
|
||||||
|
outside_notice, slint::PointerEventButton::Left);
|
||||||
|
stream->window().dispatch_pointer_release_event(
|
||||||
|
outside_notice, slint::PointerEventButton::Left);
|
||||||
|
if (remote_key_events != 2 || remote_pointer_presses != 2 ||
|
||||||
|
remote_pointer_releases != 2) {
|
||||||
|
std::cerr << "Dismissing the upgrade dialog must restore remote input\n";
|
||||||
|
return 9;
|
||||||
|
}
|
||||||
|
|
||||||
|
stream->set_remote_update_visible(true);
|
||||||
|
const auto notice_button = slint::LogicalPosition(slint::Point<float>{
|
||||||
|
816.0f, stream->get_video_area_top() + notice_y - 24.0f + 158.0f});
|
||||||
|
stream->window().dispatch_pointer_press_event(
|
||||||
|
notice_button, slint::PointerEventButton::Left);
|
||||||
|
stream->window().dispatch_pointer_release_event(
|
||||||
|
notice_button, slint::PointerEventButton::Left);
|
||||||
|
if (stream->get_remote_update_visible() || notice_dismissals != 2 ||
|
||||||
|
remote_pointer_presses != 2 || remote_pointer_releases != 2) {
|
||||||
|
std::cerr << "Upgrade confirmation click must not reach the peer\n";
|
||||||
|
return 9;
|
||||||
|
}
|
||||||
|
|
||||||
crossdesk::ui::FileTransferEntry transfer;
|
crossdesk::ui::FileTransferEntry transfer;
|
||||||
transfer.name = "archive.zip";
|
transfer.name = "archive.zip";
|
||||||
transfer.status = "Sending";
|
transfer.status = "Sending";
|
||||||
|
|||||||
@@ -97,5 +97,37 @@ int main() {
|
|||||||
ok &= ExpectEqual("plain comparison has no hidden metadata from prior checks",
|
ok &= ExpectEqual("plain comparison has no hidden metadata from prior checks",
|
||||||
crossdesk::IsNewerVersion("1.3.5", "1.3.5"), false);
|
crossdesk::IsNewerVersion("1.3.5", "1.3.5"), false);
|
||||||
|
|
||||||
|
const auto release = crossdesk::ParseVersionInfoJSON(
|
||||||
|
R"({"latest_version":"v1.5.3-20260928","patch":2})");
|
||||||
|
ok &= ExpectEqual("shared release JSON parser",
|
||||||
|
release.has_value(), true);
|
||||||
|
if (release) {
|
||||||
|
for (const auto& version : {"1.5.3-2-20260927", "1.5.3-3-20260928", "1.6.0"}) {
|
||||||
|
ok &= ExpectEqual(std::string("no remote update for ") + version,
|
||||||
|
crossdesk::AvailableAppUpdate(version, *release).has_value(),
|
||||||
|
false);
|
||||||
|
}
|
||||||
|
for (const auto& version : {"", " ", "unknown", "ios-native", "1..5", "1.5-"}) {
|
||||||
|
ok &= ExpectEqual(std::string("unavailable peer version is legacy: ") + version,
|
||||||
|
!crossdesk::IsValidAppVersion(version) &&
|
||||||
|
crossdesk::AvailableAppUpdate(version, *release) == "1.5.3-2",
|
||||||
|
true);
|
||||||
|
}
|
||||||
|
for (const auto& version : {"1.5.2", "v1.5.3-20260928", "1.5.3-1-20260929",
|
||||||
|
"1.5.3-20260928-1"}) {
|
||||||
|
ok &= ExpectEqual(std::string("remote update includes metadata patch for ") + version,
|
||||||
|
crossdesk::AvailableAppUpdate(version, *release) == "1.5.3-2",
|
||||||
|
true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ok &= ExpectEqual("legacy peer cannot supply a missing latest release label",
|
||||||
|
crossdesk::AvailableAppUpdate("", crossdesk::VersionInfo{}).has_value(),
|
||||||
|
false);
|
||||||
|
for (const auto& response : {"", "not JSON", "{}", "[]",
|
||||||
|
R"({"version":null})", R"({"version":"unknown"})"}) {
|
||||||
|
ok &= ExpectEqual("invalid release response gives no update",
|
||||||
|
crossdesk::ParseVersionInfoJSON(response).has_value(), false);
|
||||||
|
}
|
||||||
|
|
||||||
return ok ? 0 : 1;
|
return ok ? 0 : 1;
|
||||||
}
|
}
|
||||||
@@ -228,7 +228,7 @@ function setup_targets()
|
|||||||
set_kind("binary")
|
set_kind("binary")
|
||||||
set_default(false)
|
set_default(false)
|
||||||
add_packages("cpp-httplib", "nlohmann_json")
|
add_packages("cpp-httplib", "nlohmann_json")
|
||||||
add_deps("rd_log")
|
add_deps("rd_log", "crossdesk_wire")
|
||||||
add_includedirs("apps/desktop/src/version_checker")
|
add_includedirs("apps/desktop/src/version_checker")
|
||||||
add_files("apps/desktop/tests/version_checker_test.cpp",
|
add_files("apps/desktop/tests/version_checker_test.cpp",
|
||||||
"apps/desktop/src/version_checker/version_checker.cpp")
|
"apps/desktop/src/version_checker/version_checker.cpp")
|
||||||
@@ -421,7 +421,7 @@ function setup_targets()
|
|||||||
set_kind("object")
|
set_kind("object")
|
||||||
add_packages("cpp-httplib")
|
add_packages("cpp-httplib")
|
||||||
add_packages("nlohmann_json", {public = true})
|
add_packages("nlohmann_json", {public = true})
|
||||||
add_deps("rd_log")
|
add_deps("rd_log", "crossdesk_wire")
|
||||||
add_files("apps/desktop/src/version_checker/*.cpp")
|
add_files("apps/desktop/src/version_checker/*.cpp")
|
||||||
add_includedirs("apps/desktop/src/version_checker", {public = true})
|
add_includedirs("apps/desktop/src/version_checker", {public = true})
|
||||||
if is_os("macosx") then
|
if is_os("macosx") then
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ typedef NS_ENUM(NSInteger, CrossDeskVideoAdaptationPolicy) {
|
|||||||
height:(NSInteger)height;
|
height:(NSInteger)height;
|
||||||
- (void)rtcBridge:(CrossDeskRTCBridge *)bridge
|
- (void)rtcBridge:(CrossDeskRTCBridge *)bridge
|
||||||
didReceiveHostName:(NSString *)hostName
|
didReceiveHostName:(NSString *)hostName
|
||||||
|
appVersion:(NSString *)appVersion
|
||||||
displayNames:(NSArray<NSString *> *)displayNames
|
displayNames:(NSArray<NSString *> *)displayNames
|
||||||
displaySizes:(NSArray<NSValue *> *)displaySizes;
|
displaySizes:(NSArray<NSValue *> *)displaySizes;
|
||||||
- (void)rtcBridge:(CrossDeskRTCBridge *)bridge
|
- (void)rtcBridge:(CrossDeskRTCBridge *)bridge
|
||||||
@@ -101,6 +102,11 @@ typedef NS_ENUM(NSInteger, CrossDeskVideoAdaptationPolicy) {
|
|||||||
|
|
||||||
@property(nonatomic, weak, nullable) id<CrossDeskRTCBridgeDelegate> delegate;
|
@property(nonatomic, weak, nullable) id<CrossDeskRTCBridgeDelegate> delegate;
|
||||||
|
|
||||||
|
// Uses the same release/patch ordering as the desktop controller.
|
||||||
|
+ (nullable NSString *)availableUpdateForAppVersion:(NSString *)appVersion
|
||||||
|
releaseJSON:(NSData *)releaseJSON
|
||||||
|
NS_SWIFT_NAME(availableUpdate(appVersion:releaseJSON:));
|
||||||
|
|
||||||
- (void)configureWithSignalHost:(NSString *)host
|
- (void)configureWithSignalHost:(NSString *)host
|
||||||
signalPort:(NSInteger)signalPort;
|
signalPort:(NSInteger)signalPort;
|
||||||
- (void)setVideoAdaptationPolicy:(CrossDeskVideoAdaptationPolicy)policy;
|
- (void)setVideoAdaptationPolicy:(CrossDeskVideoAdaptationPolicy)policy;
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <display_stream_id.h>
|
#include <display_stream_id.h>
|
||||||
|
#include <app_version.h>
|
||||||
#include <file_transfer_format.h>
|
#include <file_transfer_format.h>
|
||||||
#include <remote_action.h>
|
#include <remote_action.h>
|
||||||
#include <stream_names.h>
|
#include <stream_names.h>
|
||||||
@@ -330,7 +331,8 @@ void DispatchMain(dispatch_block_t block) {
|
|||||||
- (void)handleData:(const char *)data
|
- (void)handleData:(const char *)data
|
||||||
size:(size_t)size
|
size:(size_t)size
|
||||||
sourceID:(const char *)sourceID
|
sourceID:(const char *)sourceID
|
||||||
sourceIDSize:(size_t)sourceIDSize;
|
sourceIDSize:(size_t)sourceIDSize
|
||||||
|
generation:(uint64_t)generation;
|
||||||
- (void)handleStats:(const MiniRtcNetTrafficStats *)stats mode:(TraversalMode)mode;
|
- (void)handleStats:(const MiniRtcNetTrafficStats *)stats mode:(TraversalMode)mode;
|
||||||
- (void)sendMessage:(const std::string &)message
|
- (void)sendMessage:(const std::string &)message
|
||||||
reliable:(BOOL)reliable
|
reliable:(BOOL)reliable
|
||||||
@@ -377,7 +379,8 @@ void OnDataBuffer(const char *data, size_t size, const char *, size_t,
|
|||||||
[owner handleData:data
|
[owner handleData:data
|
||||||
size:size
|
size:size
|
||||||
sourceID:source_id
|
sourceID:source_id
|
||||||
sourceIDSize:source_id_size];
|
sourceIDSize:source_id_size
|
||||||
|
generation:context->generation];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -488,6 +491,16 @@ Params MakeParams(const RTCState &state, const std::string &user_id,
|
|||||||
std::atomic<uint64_t> _presenceGeneration;
|
std::atomic<uint64_t> _presenceGeneration;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
+ (nullable NSString *)availableUpdateForAppVersion:(NSString *)appVersion
|
||||||
|
releaseJSON:(NSData *)releaseJSON {
|
||||||
|
const auto latest = crossdesk::ParseVersionInfoJSON(std::string_view(
|
||||||
|
static_cast<const char *>(releaseJSON.bytes), releaseJSON.length));
|
||||||
|
if (!latest) return nil;
|
||||||
|
const auto update = crossdesk::AvailableAppUpdate(appVersion.UTF8String ?: "",
|
||||||
|
*latest);
|
||||||
|
return update ? [NSString stringWithUTF8String:update->c_str()] : nil;
|
||||||
|
}
|
||||||
|
|
||||||
- (instancetype)init {
|
- (instancetype)init {
|
||||||
self = [super init];
|
self = [super init];
|
||||||
if (self) {
|
if (self) {
|
||||||
@@ -1264,6 +1277,10 @@ Params MakeParams(const RTCState &state, const std::string &user_id,
|
|||||||
CopyCString(action.i.host_name, sizeof(action.i.host_name),
|
CopyCString(action.i.host_name, sizeof(action.i.host_name),
|
||||||
controller_name);
|
controller_name);
|
||||||
action.i.host_name_size = std::strlen(action.i.host_name);
|
action.i.host_name_size = std::strlen(action.i.host_name);
|
||||||
|
NSString *appVersion = [[NSBundle mainBundle]
|
||||||
|
objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
|
||||||
|
CopyCString(action.i.app_version, sizeof(action.i.app_version),
|
||||||
|
appVersion.UTF8String ?: "");
|
||||||
action.i.display_list = nullptr;
|
action.i.display_list = nullptr;
|
||||||
action.i.display_num = 0;
|
action.i.display_num = 0;
|
||||||
action.i.left = nullptr;
|
action.i.left = nullptr;
|
||||||
@@ -1515,7 +1532,8 @@ Params MakeParams(const RTCState &state, const std::string &user_id,
|
|||||||
- (void)handleData:(const char *)data
|
- (void)handleData:(const char *)data
|
||||||
size:(size_t)size
|
size:(size_t)size
|
||||||
sourceID:(const char *)sourceID
|
sourceID:(const char *)sourceID
|
||||||
sourceIDSize:(size_t)sourceIDSize {
|
sourceIDSize:(size_t)sourceIDSize
|
||||||
|
generation:(uint64_t)generation {
|
||||||
if (!data || size == 0 || !sourceID) return;
|
if (!data || size == 0 || !sourceID) return;
|
||||||
const std::string source(sourceID, sourceIDSize);
|
const std::string source(sourceID, sourceIDSize);
|
||||||
if (source == kControlStream) {
|
if (source == kControlStream) {
|
||||||
@@ -1528,6 +1546,8 @@ Params MakeParams(const RTCState &state, const std::string &user_id,
|
|||||||
initWithBytes:action.i.host_name
|
initWithBytes:action.i.host_name
|
||||||
length:action.i.host_name_size
|
length:action.i.host_name_size
|
||||||
encoding:NSUTF8StringEncoding];
|
encoding:NSUTF8StringEncoding];
|
||||||
|
NSString *app_version = crossdesk::IsValidAppVersion(action.i.app_version)
|
||||||
|
? [NSString stringWithUTF8String:action.i.app_version] : nil;
|
||||||
NSMutableArray<NSString *> *display_names =
|
NSMutableArray<NSString *> *display_names =
|
||||||
[NSMutableArray arrayWithCapacity:action.i.display_num];
|
[NSMutableArray arrayWithCapacity:action.i.display_num];
|
||||||
NSMutableArray<NSValue *> *display_sizes =
|
NSMutableArray<NSValue *> *display_sizes =
|
||||||
@@ -1548,12 +1568,14 @@ Params MakeParams(const RTCState &state, const std::string &user_id,
|
|||||||
}
|
}
|
||||||
crossdesk::FreeRemoteAction(action);
|
crossdesk::FreeRemoteAction(action);
|
||||||
DispatchMain(^{
|
DispatchMain(^{
|
||||||
|
if (![self isControllerGenerationActive:generation]) return;
|
||||||
id<CrossDeskRTCBridgeDelegate> delegate = self.delegate;
|
id<CrossDeskRTCBridgeDelegate> delegate = self.delegate;
|
||||||
if ([delegate respondsToSelector:
|
if ([delegate respondsToSelector:
|
||||||
@selector(rtcBridge:didReceiveHostName:displayNames:
|
@selector(rtcBridge:didReceiveHostName:appVersion:displayNames:
|
||||||
displaySizes:)]) {
|
displaySizes:)]) {
|
||||||
[delegate rtcBridge:self
|
[delegate rtcBridge:self
|
||||||
didReceiveHostName:host_name ?: @""
|
didReceiveHostName:host_name ?: @""
|
||||||
|
appVersion:app_version ?: @""
|
||||||
displayNames:display_names
|
displayNames:display_names
|
||||||
displaySizes:display_sizes];
|
displaySizes:display_sizes];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -359,10 +359,17 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
|
|||||||
@Published private(set) var recentConnectionPresence: [String: Bool] = [:]
|
@Published private(set) var recentConnectionPresence: [String: Bool] = [:]
|
||||||
@Published private(set) var deviceOfflineAlertVisible = false
|
@Published private(set) var deviceOfflineAlertVisible = false
|
||||||
@Published private(set) var connectionFailureMessage: String?
|
@Published private(set) var connectionFailureMessage: String?
|
||||||
|
@Published private(set) var remoteUpdateMessage: String?
|
||||||
|
|
||||||
let bridge = CrossDeskRTCBridge()
|
let bridge = CrossDeskRTCBridge()
|
||||||
private let audioPlayer = RemoteAudioPlayer()
|
private let audioPlayer = RemoteAudioPlayer()
|
||||||
private var activeRemoteID = ""
|
private var activeRemoteID = ""
|
||||||
|
private var remoteAppVersion = ""
|
||||||
|
private var remoteHostInfoReceived = false
|
||||||
|
private var remoteVersionCheckAttempted = false
|
||||||
|
private var remoteVersionCheckGeneration = UUID()
|
||||||
|
private var remoteVersionCheckTask: URLSessionDataTask?
|
||||||
|
private static let remoteUpdateNotice = "被控端版本过低,请升级到最新版本。"
|
||||||
private var pendingRememberPassword = false
|
private var pendingRememberPassword = false
|
||||||
private var connectionRecorded = false
|
private var connectionRecorded = false
|
||||||
private var shouldCaptureThumbnail = false
|
private var shouldCaptureThumbnail = false
|
||||||
@@ -406,6 +413,7 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
|
|||||||
|
|
||||||
deinit {
|
deinit {
|
||||||
presenceTimer?.invalidate()
|
presenceTimer?.invalidate()
|
||||||
|
remoteVersionCheckTask?.cancel()
|
||||||
}
|
}
|
||||||
|
|
||||||
@discardableResult
|
@discardableResult
|
||||||
@@ -460,6 +468,7 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func beginRemoteConnection(_ identifier: String) {
|
private func beginRemoteConnection(_ identifier: String) {
|
||||||
|
resetRemoteVersionCheck()
|
||||||
cancelVideoRecovery()
|
cancelVideoRecovery()
|
||||||
cancelPresenceProbe()
|
cancelPresenceProbe()
|
||||||
activeRemoteID = identifier
|
activeRemoteID = identifier
|
||||||
@@ -552,6 +561,7 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func resetConnection() {
|
private func resetConnection() {
|
||||||
|
resetRemoteVersionCheck()
|
||||||
connectionFailureMessage = nil
|
connectionFailureMessage = nil
|
||||||
cancelVideoRecovery()
|
cancelVideoRecovery()
|
||||||
let wasCheckingPresence = pendingPresenceRemoteID != nil
|
let wasCheckingPresence = pendingPresenceRemoteID != nil
|
||||||
@@ -576,11 +586,62 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
|
|||||||
}
|
}
|
||||||
|
|
||||||
func retry() {
|
func retry() {
|
||||||
|
resetRemoteVersionCheck()
|
||||||
cancelVideoRecovery()
|
cancelVideoRecovery()
|
||||||
bridge.disconnect()
|
bridge.disconnect()
|
||||||
connect()
|
connect()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func dismissRemoteUpdate() {
|
||||||
|
remoteUpdateMessage = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
private func resetRemoteVersionCheck() {
|
||||||
|
remoteVersionCheckTask?.cancel()
|
||||||
|
remoteVersionCheckTask = nil
|
||||||
|
remoteVersionCheckGeneration = UUID()
|
||||||
|
remoteVersionCheckAttempted = false
|
||||||
|
remoteAppVersion = ""
|
||||||
|
remoteHostInfoReceived = false
|
||||||
|
remoteUpdateMessage = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
private func checkRemoteVersionIfNeeded() {
|
||||||
|
guard isConnected, remoteHostInfoReceived,
|
||||||
|
!remoteVersionCheckAttempted else { return }
|
||||||
|
remoteVersionCheckAttempted = true
|
||||||
|
if remoteAppVersion.isEmpty {
|
||||||
|
remoteUpdateMessage = Self.remoteUpdateNotice
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let generation = remoteVersionCheckGeneration
|
||||||
|
let appVersion = remoteAppVersion
|
||||||
|
// Only public release metadata is fetched; no peer ID or version is sent.
|
||||||
|
let url = URL(string: "https://version.crossdesk.cn/version.json")!
|
||||||
|
let request = URLRequest(url: url, cachePolicy: .reloadIgnoringLocalCacheData,
|
||||||
|
timeoutInterval: 15)
|
||||||
|
remoteVersionCheckTask = URLSession.shared.dataTask(with: request) {
|
||||||
|
[weak self] data, response, error in
|
||||||
|
let latest: String?
|
||||||
|
if error == nil, let data,
|
||||||
|
(response as? HTTPURLResponse)?.statusCode == 200 {
|
||||||
|
latest = CrossDeskRTCBridge.availableUpdate(appVersion: appVersion,
|
||||||
|
releaseJSON: data)
|
||||||
|
} else {
|
||||||
|
latest = nil
|
||||||
|
}
|
||||||
|
DispatchQueue.main.async { [weak self] in
|
||||||
|
guard let self,
|
||||||
|
self.remoteVersionCheckGeneration == generation,
|
||||||
|
self.isConnected else { return }
|
||||||
|
self.remoteVersionCheckTask = nil
|
||||||
|
guard latest != nil else { return }
|
||||||
|
self.remoteUpdateMessage = Self.remoteUpdateNotice
|
||||||
|
}
|
||||||
|
}
|
||||||
|
remoteVersionCheckTask?.resume()
|
||||||
|
}
|
||||||
|
|
||||||
func savedPassword(for remoteID: String) -> String {
|
func savedPassword(for remoteID: String) -> String {
|
||||||
ConnectionCredentialStore.password(for: remoteID) ?? ""
|
ConnectionCredentialStore.password(for: remoteID) ?? ""
|
||||||
}
|
}
|
||||||
@@ -879,6 +940,7 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
|
|||||||
case 1:
|
case 1:
|
||||||
connectionStatus = "已连接"
|
connectionStatus = "已连接"
|
||||||
sessionVisible = true
|
sessionVisible = true
|
||||||
|
checkRemoteVersionIfNeeded()
|
||||||
recordSuccessfulConnectionIfNeeded()
|
recordSuccessfulConnectionIfNeeded()
|
||||||
audioPlayer.setEnabled(audioEnabled)
|
audioPlayer.setEnabled(audioEnabled)
|
||||||
bridge.setAudioEnabled(audioEnabled)
|
bridge.setAudioEnabled(audioEnabled)
|
||||||
@@ -966,8 +1028,12 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
|
|||||||
|
|
||||||
func rtcBridge(_ bridge: CrossDeskRTCBridge,
|
func rtcBridge(_ bridge: CrossDeskRTCBridge,
|
||||||
didReceiveHostName hostName: String,
|
didReceiveHostName hostName: String,
|
||||||
|
appVersion: String,
|
||||||
displayNames remoteDisplayNames: [String],
|
displayNames remoteDisplayNames: [String],
|
||||||
displaySizes remoteDisplaySizes: [NSValue]) {
|
displaySizes remoteDisplaySizes: [NSValue]) {
|
||||||
|
remoteHostInfoReceived = true
|
||||||
|
remoteAppVersion = appVersion
|
||||||
|
checkRemoteVersionIfNeeded()
|
||||||
updateActiveConnectionName(hostName)
|
updateActiveConnectionName(hostName)
|
||||||
let names = remoteDisplayNames.enumerated().map { index, displayName in
|
let names = remoteDisplayNames.enumerated().map { index, displayName in
|
||||||
let name = displayName.trimmingCharacters(in: .whitespacesAndNewlines)
|
let name = displayName.trimmingCharacters(in: .whitespacesAndNewlines)
|
||||||
|
|||||||
@@ -147,6 +147,14 @@ struct RemoteSessionView: View {
|
|||||||
.zIndex(50)
|
.zIndex(50)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.alert("升级提示", isPresented: Binding(
|
||||||
|
get: { session.remoteUpdateMessage != nil },
|
||||||
|
set: { if !$0 { session.dismissRemoteUpdate() } }
|
||||||
|
)) {
|
||||||
|
Button("知道了", role: .cancel) { session.dismissRemoteUpdate() }
|
||||||
|
} message: {
|
||||||
|
Text(session.remoteUpdateMessage ?? "")
|
||||||
|
}
|
||||||
.onDisappear {
|
.onDisappear {
|
||||||
keyboardInputVisible = false
|
keyboardInputVisible = false
|
||||||
viewport = RemoteViewportState()
|
viewport = RemoteViewportState()
|
||||||
|
|||||||
@@ -121,7 +121,7 @@
|
|||||||
"text": "Files: gio/gaction.c, gio/gaction.h, gio/gactiongroup.c, gio/gactiongroup.h, gio/gactionmap.c, gio/gactionmap.h, gio/gapplication.c, gio/gapplication.h, gio/gapplicationimpl-dbus.c, gio/gremoteactiongroup.c, gio/gsimpleaction.c, gio/gsimpleaction.h, gio/gsimpleactiongroup.c, gio/gsimpleactiongroup.h\n\n/*\n * Copyright © 2010 Codethink Limited\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General\n * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.\n *\n * Authors: Ryan Lortie <desrt@desrt.ca>\n */\n\nFiles: gio/gactiongroupexporter.c, gio/gactiongroupexporter.h, gio/gdbusactiongroup-private.h, gio/gdbusactiongroup.c, gio/gdbusactiongroup.h\n\n/*\n * Copyright © 2010 Codethink Limited\n * Copyright © 2011 Canonical Limited\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General\n * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.\n *\n * Authors: Ryan Lortie <desrt@desrt.ca>\n */\n\nFiles: gio/gappinfo.c, gio/gappinfo.h, gio/gasynchelper.h, gio/gasyncresult.c, gio/gasyncresult.h, gio/gcancellable.h, gio/gcontenttype-fdo.c, gio/gcontenttype-win32.c, gio/gcontenttype.c, gio/gcontenttype.h, gio/gdatainputstream.h, gio/gdataoutputstream.h, gio/gdesktopappinfo.h, gio/gdummyfile.h, gio/gfile.h, gio/gfileattribute.c, gio/gfileattribute.h, gio/gfileenumerator.h, gio/gfileicon.h, gio/gfileinfo.c, gio/gfileinfo.h, gio/gfileinputstream.h, gio/gfilemonitor.h, gio/gfilenamecompleter.h, gio/gfileoutputstream.h, gio/gicon.h, gio/ginputstream.h, gio/gio-querymodules.c, gio/gio.h, gio/gioenums.h, gio/gioerror.h, gio/giomodule.h, gio/gioscheduler.h, gio/giotypes.h, gio/gloadableicon.h, gio/glocalfile.h, gio/glocalfileenumerator.h, gio/glocalfileinfo.h, gio/glocalfileinputstream.h, gio/glocalfilemonitor.c, gio/glocalfilemonitor.h, gio/glocalfileoutputstream.h, gio/glocalvfs.h, gio/gmountoperation.h, gio/gnativevolumemonitor.c, gio/gnativevolumemonitor.h, gio/goutputstream.h, gio/gpollfilemonitor.h, gio/gresource.h, gio/gresourcefile.c, gio/gseekable.h, gio/gsimpleasyncresult.c, gio/gsimpleasyncresult.h, gio/gthemedicon.h, gio/gunixinputstream.h, gio/gunixmounts.h, gio/gunixoutputstream.h, gio/gvfs.c, gio/gvfs.h\n\n/* GIO - GLib Input, Output and Streaming Library\n *\n * Copyright (C) 2006-2007 Red Hat, Inc.\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General\n * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.\n *\n * Author: Alexander Larsson <alexl@redhat.com>\n */\n\nFiles: gio/gappinfoprivate.h, gio/gbytesicon.c\n\n/* GIO - GLib Input, Output and Streaming Library\n *\n * Copyright © 2013 Canonical Limited\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General PublicLine truncated
|
"text": "Files: gio/gaction.c, gio/gaction.h, gio/gactiongroup.c, gio/gactiongroup.h, gio/gactionmap.c, gio/gactionmap.h, gio/gapplication.c, gio/gapplication.h, gio/gapplicationimpl-dbus.c, gio/gremoteactiongroup.c, gio/gsimpleaction.c, gio/gsimpleaction.h, gio/gsimpleactiongroup.c, gio/gsimpleactiongroup.h\n\n/*\n * Copyright © 2010 Codethink Limited\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General\n * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.\n *\n * Authors: Ryan Lortie <desrt@desrt.ca>\n */\n\nFiles: gio/gactiongroupexporter.c, gio/gactiongroupexporter.h, gio/gdbusactiongroup-private.h, gio/gdbusactiongroup.c, gio/gdbusactiongroup.h\n\n/*\n * Copyright © 2010 Codethink Limited\n * Copyright © 2011 Canonical Limited\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General\n * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.\n *\n * Authors: Ryan Lortie <desrt@desrt.ca>\n */\n\nFiles: gio/gappinfo.c, gio/gappinfo.h, gio/gasynchelper.h, gio/gasyncresult.c, gio/gasyncresult.h, gio/gcancellable.h, gio/gcontenttype-fdo.c, gio/gcontenttype-win32.c, gio/gcontenttype.c, gio/gcontenttype.h, gio/gdatainputstream.h, gio/gdataoutputstream.h, gio/gdesktopappinfo.h, gio/gdummyfile.h, gio/gfile.h, gio/gfileattribute.c, gio/gfileattribute.h, gio/gfileenumerator.h, gio/gfileicon.h, gio/gfileinfo.c, gio/gfileinfo.h, gio/gfileinputstream.h, gio/gfilemonitor.h, gio/gfilenamecompleter.h, gio/gfileoutputstream.h, gio/gicon.h, gio/ginputstream.h, gio/gio-querymodules.c, gio/gio.h, gio/gioenums.h, gio/gioerror.h, gio/giomodule.h, gio/gioscheduler.h, gio/giotypes.h, gio/gloadableicon.h, gio/glocalfile.h, gio/glocalfileenumerator.h, gio/glocalfileinfo.h, gio/glocalfileinputstream.h, gio/glocalfilemonitor.c, gio/glocalfilemonitor.h, gio/glocalfileoutputstream.h, gio/glocalvfs.h, gio/gmountoperation.h, gio/gnativevolumemonitor.c, gio/gnativevolumemonitor.h, gio/goutputstream.h, gio/gpollfilemonitor.h, gio/gresource.h, gio/gresourcefile.c, gio/gseekable.h, gio/gsimpleasyncresult.c, gio/gsimpleasyncresult.h, gio/gthemedicon.h, gio/gunixinputstream.h, gio/gunixmounts.h, gio/gunixoutputstream.h, gio/gvfs.c, gio/gvfs.h\n\n/* GIO - GLib Input, Output and Streaming Library\n *\n * Copyright (C) 2006-2007 Red Hat, Inc.\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General\n * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.\n *\n * Author: Alexander Larsson <alexl@redhat.com>\n */\n\nFiles: gio/gappinfoprivate.h, gio/gbytesicon.c\n\n/* GIO - GLib Input, Output and Streaming Library\n *\n * Copyright © 2013 Canonical Limited\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General PublicLine truncated
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"buildSourceURL": "https://github.com/kunkundi/minirtc/tree/6286ae6c1c015609d3070cc139e5feea900caf7c/thirdparty/glib"
|
"buildSourceURL": "https://github.com/kunkundi/minirtc/tree/24d9d9deefb95ede2cdb18e77cb01350101f70f8/thirdparty/glib"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "gssdp",
|
"id": "gssdp",
|
||||||
@@ -143,7 +143,7 @@
|
|||||||
"text": "Files: libgssdp/gssdp-client-private.h, libgssdp/gssdp.h\n\n/* \n * Copyright (C) 2006 OpenedHand Ltd.\n *\n * Author: Jorn Baayen <jorn@openedhand.com>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */\n\nFiles: libgssdp/gssdp-client.c\n\n/*\n * Copyright (C) 2006, 2007, 2008 OpenedHand Ltd.\n * Copyright (C) 2009 Nokia Corporation.\n * Copyright (C) 2013 Intel Corporation.\n *\n * Author: Jorn Baayen <jorn@openedhand.com>\n * Zeeshan Ali (Khattak) <zeeshanak@gnome.org>\n * <zeeshan.ali@nokia.com>\n * Jens Georg <jensg@openismus.com>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */\n\nFiles: libgssdp/gssdp-client.h, libgssdp/gssdp-error.c, libgssdp/gssdp-error.h, libgssdp/gssdp-protocol.h, libgssdp/gssdp-resource-browser.h, libgssdp/gssdp-resource-group.h\n\n/* \n * Copyright (C) 2006, 2007 OpenedHand Ltd.\n *\n * Author: Jorn Baayen <jorn@openedhand.com>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */\n\nFiles: libgssdp/gssdp-net-bionic.c, libgssdp/gssdp-net-posix.c, libgssdp/gssdp-net-win32.c, libgssdp/gssdp-net.h\n\n/*\n * Copyright (C) 2016 Jens Georg <mail@jensge.org>\n *\n * Author: Jens Georg <mail@jensge.org>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */\n\nFiles: libgssdp/gssdp-pktinfo-message.c, libgssdp/gssdp-pktinfo6-message.c\n\n/*\n * Copyright (C) 2014 Jens Georg.\n *\n * Author: Jens Georg <mail@jensge.org>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */\n\nFiles: libgssdp/gssdp-pktinfo-message.h, libgssdp/gssdp-pktinfo6-message.h\n\n/*\n * Copyright (C) 2014 Jens Georg <mail@jensge.org>\n *\n * Author: Jens Georg <mail@jensge.org>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */\n\nFiles: libgssdp/gssdp-resource-browser.c, libgssdp/gssdp-resource-group.c\n\n/* \n * Copyright (C) 2006, 2007, 2008 OpenedHand Ltd.\n *\n * Author: Jorn Baayen <jorn@openedhand.com>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */\n\nFiles: libgssdp/gssdp-socket-functions.c, libgssdp/gssdp-socket-functions.h\n\n/*\n * Copyright (C) 2010 Jens Georg <mail@jensge.org>\n *\n * Author: Jens Georg <mail@jensge.org>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */\n\nFiles: libgssdp/gssdp-socket-source.c\n\n/* \n * Copyright (C) 2006, 2007, 2008 OpenedHand Ltd.\n * Copyright (C) 2009 Nokia Corporation.\n * Copyright (C) 2010 Jens Georg <mail@jensge.org>\n *\n * Author: Jorn Baayen <jorn@openedhand.com>\n * Zeeshan Ali (Khattak) <zeeshanak@gnome.org>\n * <zeeshan.ali@nokia.com>\n * Jens Georg <mail@jensge.org>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */\n\nFiles: libgssdp/gssdp-socket-source.h\n\n/* \n * Copyright (C) 2006, 2007, 2008 OpenedHand Ltd.\n * Copyright (C) 2010 Jens Georg <mail@jensge.org>\n *\n * Author: Jorn Baayen <jorn@openedhand.com>\n * Jens Georg <mail@jensge.org>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */"
|
"text": "Files: libgssdp/gssdp-client-private.h, libgssdp/gssdp.h\n\n/* \n * Copyright (C) 2006 OpenedHand Ltd.\n *\n * Author: Jorn Baayen <jorn@openedhand.com>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */\n\nFiles: libgssdp/gssdp-client.c\n\n/*\n * Copyright (C) 2006, 2007, 2008 OpenedHand Ltd.\n * Copyright (C) 2009 Nokia Corporation.\n * Copyright (C) 2013 Intel Corporation.\n *\n * Author: Jorn Baayen <jorn@openedhand.com>\n * Zeeshan Ali (Khattak) <zeeshanak@gnome.org>\n * <zeeshan.ali@nokia.com>\n * Jens Georg <jensg@openismus.com>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */\n\nFiles: libgssdp/gssdp-client.h, libgssdp/gssdp-error.c, libgssdp/gssdp-error.h, libgssdp/gssdp-protocol.h, libgssdp/gssdp-resource-browser.h, libgssdp/gssdp-resource-group.h\n\n/* \n * Copyright (C) 2006, 2007 OpenedHand Ltd.\n *\n * Author: Jorn Baayen <jorn@openedhand.com>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */\n\nFiles: libgssdp/gssdp-net-bionic.c, libgssdp/gssdp-net-posix.c, libgssdp/gssdp-net-win32.c, libgssdp/gssdp-net.h\n\n/*\n * Copyright (C) 2016 Jens Georg <mail@jensge.org>\n *\n * Author: Jens Georg <mail@jensge.org>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */\n\nFiles: libgssdp/gssdp-pktinfo-message.c, libgssdp/gssdp-pktinfo6-message.c\n\n/*\n * Copyright (C) 2014 Jens Georg.\n *\n * Author: Jens Georg <mail@jensge.org>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */\n\nFiles: libgssdp/gssdp-pktinfo-message.h, libgssdp/gssdp-pktinfo6-message.h\n\n/*\n * Copyright (C) 2014 Jens Georg <mail@jensge.org>\n *\n * Author: Jens Georg <mail@jensge.org>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */\n\nFiles: libgssdp/gssdp-resource-browser.c, libgssdp/gssdp-resource-group.c\n\n/* \n * Copyright (C) 2006, 2007, 2008 OpenedHand Ltd.\n *\n * Author: Jorn Baayen <jorn@openedhand.com>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */\n\nFiles: libgssdp/gssdp-socket-functions.c, libgssdp/gssdp-socket-functions.h\n\n/*\n * Copyright (C) 2010 Jens Georg <mail@jensge.org>\n *\n * Author: Jens Georg <mail@jensge.org>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */\n\nFiles: libgssdp/gssdp-socket-source.c\n\n/* \n * Copyright (C) 2006, 2007, 2008 OpenedHand Ltd.\n * Copyright (C) 2009 Nokia Corporation.\n * Copyright (C) 2010 Jens Georg <mail@jensge.org>\n *\n * Author: Jorn Baayen <jorn@openedhand.com>\n * Zeeshan Ali (Khattak) <zeeshanak@gnome.org>\n * <zeeshan.ali@nokia.com>\n * Jens Georg <mail@jensge.org>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */\n\nFiles: libgssdp/gssdp-socket-source.h\n\n/* \n * Copyright (C) 2006, 2007, 2008 OpenedHand Ltd.\n * Copyright (C) 2010 Jens Georg <mail@jensge.org>\n *\n * Author: Jorn Baayen <jorn@openedhand.com>\n * Jens Georg <mail@jensge.org>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"buildSourceURL": "https://github.com/kunkundi/minirtc/tree/6286ae6c1c015609d3070cc139e5feea900caf7c/thirdparty/gupnp"
|
"buildSourceURL": "https://github.com/kunkundi/minirtc/tree/24d9d9deefb95ede2cdb18e77cb01350101f70f8/thirdparty/gupnp"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "gupnp",
|
"id": "gupnp",
|
||||||
@@ -165,7 +165,7 @@
|
|||||||
"text": "Files: libgupnp/gena-protocol.h, libgupnp/gupnp-device-info-private.h, libgupnp/gupnp-device.h, libgupnp/gupnp-error-private.h, libgupnp/gupnp-service-introspection-private.h, libgupnp/gupnp-service.h, libgupnp/gvalue-util.h\n\n/*\n * Copyright (C) 2007 OpenedHand Ltd.\n *\n * Author: Jorn Baayen <jorn@openedhand.com>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n */\n\nFiles: libgupnp/gupnp-acl-private.h\n\n/*\n * Copyright (C) 2013,2014 Jens Georg <mail@jensge.org>\n *\n * Author: Jens Georg <mail@jensge.org>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later \n */\n\nFiles: libgupnp/gupnp-acl.c, libgupnp/gupnp-acl.h\n\n/*\n * Copyright (C) 2013,2014 Jens Georg <mail@jensge.org>\n *\n * Author: Jens Georg <mail@jensge.org>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n */\n\nFiles: libgupnp/gupnp-connman-manager.c, libgupnp/gupnp-connman-manager.h\n\n/*\n * Copyright (C) 2012 Intel Corporation. All rights reserved.\n * Copyright (C) 2009 Nokia Corporation.\n *\n * Author: Ludovic Ferrandis <ludovic.ferrandis@intel.com>\n * Author: Zeeshan Ali (Khattak) <zeeshanak@gnome.org>\n * <zeeshan.ali@nokia.com>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n */\n\nFiles: libgupnp/gupnp-context-filter.c\n\n/*\n * Copyright (C) 2013 Intel Corporation.\n *\n * Author: Ludovic Ferrandis <ludovic.ferrandis@intel.com>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n */\n\nFiles: libgupnp/gupnp-context-filter.h\n\n/*\n * Copyright (C) 2013 Intel Corporation.\n *\n * Author: Ludovic Ferrandis <ludovic.ferrandis@intel.com>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */\n\nFiles: libgupnp/gupnp-context-manager.c\n\n/*\n * Copyright (C) 2009 Nokia Corporation.\n * Copyright (C) 2006, 2007, 2008 OpenedHand Ltd.\n * Copyright (C) 2013 Intel Corporation.\n *\n * Author: Zeeshan Ali (Khattak) <zeeshanak@gnome.org>\n * Jorn Baayen <jorn@openedhand.com>\n * Ludovic Ferrandis <ludovic.ferrandis@intel.com>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */\n\nFiles: libgupnp/gupnp-context-manager.h, libgupnp/gupnp-unix-context-manager.h\n\n/*\n * Copyright (C) 2009 Nokia Corporation.\n * Copyright (C) 2006, 2007, 2008 OpenedHand Ltd.\n *\n * Author: Zeeshan Ali (Khattak) <zeeshanak@gnome.org>\n * Jorn Baayen <jorn@openedhand.com>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n */\n\nFiles: libgupnp/gupnp-context-private.h, libgupnp/gupnp-context.h, libgupnp/gupnp-service-proxy.h\n\n/*\n * Copyright (C) 2006, 2007, 2008 OpenedHand Ltd.\n *\n * Author: Jorn Baayen <jorn@openedhand.com>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n */\n\nFiles: libgupnp/gupnp-context.c\n\n/*\n * Copyright (C) 2006, 2007, 2008 OpenedHand Ltd.\n * Copyright (C) 2009 Nokia Corporation.\n *\n * Author: Jorn Baayen <jorn@openedhand.com>\n * Zeeshan Ali (Khattak) <zeeshanak@gnome.org>\n * <zeeshan.ali@nokia.com>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */\n\nFiles: libgupnp/gupnp-control-point.c, libgupnp/gupnp-device-info.c, libgupnp/gupnp-service-proxy-action.c, libgupnp/gupnp-service-proxy.c\n\n/*\n * Copyright (C) 2006, 2007, 2008 OpenedHand Ltd.\n *\n * Author: Jorn Baayen <jorn@openedhand.com>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */\n\nFiles: libgupnp/gupnp-control-point.h, libgupnp/gupnp-device-info.h, libgupnp/gupnp-device-proxy.h, libgupnp/gupnp-error.h, libgupnp/gupnp-service-info.h, libgupnp/gupnp.h, libgupnp/xml-util.h\n\n/*\n * Copyright (C) 2006, 2007 OpenedHand Ltd.\n *\n * Author: Jorn Baayen <jorn@openedhand.com>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n */\n\nFiles: libgupnp/gupnp-device-proxy.c, libgupnp/gupnp-error.c, libgupnp/xml-util.c\n\n/*\n * Copyright (C) 2006, 2007 OpenedHand Ltd.\n *\n * Author: Jorn Baayen <jorn@openedhand.com>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */\n\nFiles: libgupnp/gupnp-device.c, libgupnp/gvalue-util.c\n\n/*\n * Copyright (C) 2007 OpenedHand Ltd.\n *\n * Author: Jorn Baayen <jorn@openedhand.com>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */\n\nFiles: libgupnp/gupnp-linux-context-manager.c\n\n/*\n * Copyright (C) 2011 Jens Georg\n *\n * Author: Jens Georg <mail@jensge.org>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */\n\nFiles: libgupnp/gupnp-linux-context-manager.h\n\n/*\n * Copyright (C) 2011 Jens Georg.\n *\n * Author: Jens Georg <mail@jensge.org>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n */\n\nFiles: libgupnp/gupnp-network-manager.c\n\n/*\n * Copyright (C) 2009 Nokia Corporation.\n *\n * Author: Zeeshan Ali (Khattak) <zeeshanak@gnome.org>\n * <zeeshan.ali@nokia.com>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Library General Public\n * License as published by the Free Software Foundation; either\n * version 2 of the License, or (at your optionLine truncated
|
"text": "Files: libgupnp/gena-protocol.h, libgupnp/gupnp-device-info-private.h, libgupnp/gupnp-device.h, libgupnp/gupnp-error-private.h, libgupnp/gupnp-service-introspection-private.h, libgupnp/gupnp-service.h, libgupnp/gvalue-util.h\n\n/*\n * Copyright (C) 2007 OpenedHand Ltd.\n *\n * Author: Jorn Baayen <jorn@openedhand.com>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n */\n\nFiles: libgupnp/gupnp-acl-private.h\n\n/*\n * Copyright (C) 2013,2014 Jens Georg <mail@jensge.org>\n *\n * Author: Jens Georg <mail@jensge.org>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later \n */\n\nFiles: libgupnp/gupnp-acl.c, libgupnp/gupnp-acl.h\n\n/*\n * Copyright (C) 2013,2014 Jens Georg <mail@jensge.org>\n *\n * Author: Jens Georg <mail@jensge.org>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n */\n\nFiles: libgupnp/gupnp-connman-manager.c, libgupnp/gupnp-connman-manager.h\n\n/*\n * Copyright (C) 2012 Intel Corporation. All rights reserved.\n * Copyright (C) 2009 Nokia Corporation.\n *\n * Author: Ludovic Ferrandis <ludovic.ferrandis@intel.com>\n * Author: Zeeshan Ali (Khattak) <zeeshanak@gnome.org>\n * <zeeshan.ali@nokia.com>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n */\n\nFiles: libgupnp/gupnp-context-filter.c\n\n/*\n * Copyright (C) 2013 Intel Corporation.\n *\n * Author: Ludovic Ferrandis <ludovic.ferrandis@intel.com>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n */\n\nFiles: libgupnp/gupnp-context-filter.h\n\n/*\n * Copyright (C) 2013 Intel Corporation.\n *\n * Author: Ludovic Ferrandis <ludovic.ferrandis@intel.com>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */\n\nFiles: libgupnp/gupnp-context-manager.c\n\n/*\n * Copyright (C) 2009 Nokia Corporation.\n * Copyright (C) 2006, 2007, 2008 OpenedHand Ltd.\n * Copyright (C) 2013 Intel Corporation.\n *\n * Author: Zeeshan Ali (Khattak) <zeeshanak@gnome.org>\n * Jorn Baayen <jorn@openedhand.com>\n * Ludovic Ferrandis <ludovic.ferrandis@intel.com>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */\n\nFiles: libgupnp/gupnp-context-manager.h, libgupnp/gupnp-unix-context-manager.h\n\n/*\n * Copyright (C) 2009 Nokia Corporation.\n * Copyright (C) 2006, 2007, 2008 OpenedHand Ltd.\n *\n * Author: Zeeshan Ali (Khattak) <zeeshanak@gnome.org>\n * Jorn Baayen <jorn@openedhand.com>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n */\n\nFiles: libgupnp/gupnp-context-private.h, libgupnp/gupnp-context.h, libgupnp/gupnp-service-proxy.h\n\n/*\n * Copyright (C) 2006, 2007, 2008 OpenedHand Ltd.\n *\n * Author: Jorn Baayen <jorn@openedhand.com>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n */\n\nFiles: libgupnp/gupnp-context.c\n\n/*\n * Copyright (C) 2006, 2007, 2008 OpenedHand Ltd.\n * Copyright (C) 2009 Nokia Corporation.\n *\n * Author: Jorn Baayen <jorn@openedhand.com>\n * Zeeshan Ali (Khattak) <zeeshanak@gnome.org>\n * <zeeshan.ali@nokia.com>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */\n\nFiles: libgupnp/gupnp-control-point.c, libgupnp/gupnp-device-info.c, libgupnp/gupnp-service-proxy-action.c, libgupnp/gupnp-service-proxy.c\n\n/*\n * Copyright (C) 2006, 2007, 2008 OpenedHand Ltd.\n *\n * Author: Jorn Baayen <jorn@openedhand.com>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */\n\nFiles: libgupnp/gupnp-control-point.h, libgupnp/gupnp-device-info.h, libgupnp/gupnp-device-proxy.h, libgupnp/gupnp-error.h, libgupnp/gupnp-service-info.h, libgupnp/gupnp.h, libgupnp/xml-util.h\n\n/*\n * Copyright (C) 2006, 2007 OpenedHand Ltd.\n *\n * Author: Jorn Baayen <jorn@openedhand.com>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n */\n\nFiles: libgupnp/gupnp-device-proxy.c, libgupnp/gupnp-error.c, libgupnp/xml-util.c\n\n/*\n * Copyright (C) 2006, 2007 OpenedHand Ltd.\n *\n * Author: Jorn Baayen <jorn@openedhand.com>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */\n\nFiles: libgupnp/gupnp-device.c, libgupnp/gvalue-util.c\n\n/*\n * Copyright (C) 2007 OpenedHand Ltd.\n *\n * Author: Jorn Baayen <jorn@openedhand.com>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */\n\nFiles: libgupnp/gupnp-linux-context-manager.c\n\n/*\n * Copyright (C) 2011 Jens Georg\n *\n * Author: Jens Georg <mail@jensge.org>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n *\n */\n\nFiles: libgupnp/gupnp-linux-context-manager.h\n\n/*\n * Copyright (C) 2011 Jens Georg.\n *\n * Author: Jens Georg <mail@jensge.org>\n *\n * SPDX-License-Identifier: LGPL-2.1-or-later\n */\n\nFiles: libgupnp/gupnp-network-manager.c\n\n/*\n * Copyright (C) 2009 Nokia Corporation.\n *\n * Author: Zeeshan Ali (Khattak) <zeeshanak@gnome.org>\n * <zeeshan.ali@nokia.com>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Library General Public\n * License as published by the Free Software Foundation; either\n * version 2 of the License, or (at your optionLine truncated
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"buildSourceURL": "https://github.com/kunkundi/minirtc/tree/6286ae6c1c015609d3070cc139e5feea900caf7c/thirdparty/gupnp"
|
"buildSourceURL": "https://github.com/kunkundi/minirtc/tree/24d9d9deefb95ede2cdb18e77cb01350101f70f8/thirdparty/gupnp"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "gupnp-igd",
|
"id": "gupnp-igd",
|
||||||
@@ -187,14 +187,14 @@
|
|||||||
"text": "Files: libgupnp-igd/gupnp-simple-igd-priv.h, libgupnp-igd/gupnp-simple-igd-thread.c, libgupnp-igd/gupnp-simple-igd-thread.h, libgupnp-igd/gupnp-simple-igd.c, libgupnp-igd/gupnp-simple-igd.h\n\n/*\n * GUPnP Simple IGD abstraction\n *\n * Copyright 2008 Collabora Ltd.\n * @author: Olivier Crete <olivier.crete@collabora.co.uk>\n * Copyright 2008 Nokia Corp.\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */"
|
"text": "Files: libgupnp-igd/gupnp-simple-igd-priv.h, libgupnp-igd/gupnp-simple-igd-thread.c, libgupnp-igd/gupnp-simple-igd-thread.h, libgupnp-igd/gupnp-simple-igd.c, libgupnp-igd/gupnp-simple-igd.h\n\n/*\n * GUPnP Simple IGD abstraction\n *\n * Copyright 2008 Collabora Ltd.\n * @author: Olivier Crete <olivier.crete@collabora.co.uk>\n * Copyright 2008 Nokia Corp.\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"buildSourceURL": "https://github.com/kunkundi/minirtc/tree/6286ae6c1c015609d3070cc139e5feea900caf7c/thirdparty/gupnp"
|
"buildSourceURL": "https://github.com/kunkundi/minirtc/tree/24d9d9deefb95ede2cdb18e77cb01350101f70f8/thirdparty/gupnp"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "inih",
|
"id": "inih",
|
||||||
"name": "inih / INIReader",
|
"name": "inih / INIReader",
|
||||||
"version": "6286ae6c1c015609d3070cc139e5feea900caf7c",
|
"version": "24d9d9deefb95ede2cdb18e77cb01350101f70f8",
|
||||||
"license": "BSD-3-Clause",
|
"license": "BSD-3-Clause",
|
||||||
"sourceURL": "https://github.com/kunkundi/minirtc/tree/6286ae6c1c015609d3070cc139e5feea900caf7c",
|
"sourceURL": "https://github.com/kunkundi/minirtc/tree/24d9d9deefb95ede2cdb18e77cb01350101f70f8",
|
||||||
"documents": [
|
"documents": [
|
||||||
{
|
{
|
||||||
"title": "deps/submodules/minirtc/src/inih/LICENSE",
|
"title": "deps/submodules/minirtc/src/inih/LICENSE",
|
||||||
@@ -248,7 +248,7 @@
|
|||||||
"text": "Files: include/rtc/av1rtppacketizer.hpp, src/av1rtppacketizer.cpp, src/h264rtpdepacketizer.cpp, src/mediahandler.cpp\n\n/**\n * Copyright (c) 2023 Paul-Louis Ageneau\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n\nFiles: include/rtc/candidate.hpp, include/rtc/common.hpp, include/rtc/configuration.hpp, include/rtc/datachannel.hpp, include/rtc/peerconnection.hpp, include/rtc/reliability.hpp, include/rtc/rtc.hpp, src/candidate.cpp, src/configuration.cpp, src/impl/certificate.cpp, src/impl/certificate.hpp, src/impl/datachannel.hpp, src/impl/dtlstransport.cpp, src/impl/dtlstransport.hpp, src/impl/queue.hpp, src/impl/sctptransport.cpp\n\n/**\n * Copyright (c) 2019 Paul-Louis Ageneau\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n\nFiles: include/rtc/channel.hpp, include/rtc/rtc.h, include/rtc/utils.hpp, src/capi.cpp, src/channel.cpp, src/datachannel.cpp, src/impl/channel.cpp, src/impl/channel.hpp, src/impl/datachannel.cpp, src/impl/internals.hpp, src/impl/peerconnection.hpp, src/impl/sctptransport.hpp\n\n/**\n * Copyright (c) 2019-2021 Paul-Louis Ageneau\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n\nFiles: include/rtc/dependencydescriptor.hpp, src/dependencydescriptor.cpp\n\n/**\n * Copyright (c) 2024 Shigemasa Watanabe (Wandbox)\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n\nFiles: include/rtc/description.hpp, src/description.cpp\n\n/**\n * Copyright (c) 2019-2020 Paul-Louis Ageneau\n * Copyright (c) 2020 Staz Modrzynski\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n\nFiles: include/rtc/frameinfo.hpp, include/rtc/message.hpp, src/impl/icetransport.cpp, src/impl/icetransport.hpp, src/impl/tls.cpp, src/impl/tls.hpp, src/message.cpp\n\n/**\n * Copyright (c) 2019-2020 Paul-Louis Ageneau\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n\nFiles: include/rtc/global.hpp, include/rtc/websocket.hpp, src/global.cpp, src/impl/pollinterrupter.cpp, src/impl/pollinterrupter.hpp, src/impl/track.hpp, src/impl/websocket.cpp, src/impl/websocket.hpp, src/impl/websocketserver.cpp, src/impl/websocketserver.hpp, src/impl/wshandshake.cpp, src/impl/wshandshake.hpp, src/impl/wstransport.cpp, src/impl/wstransport.hpp, src/track.cpp, src/websocket.cpp\n\n/**\n * Copyright (c) 2020-2021 Paul-Louis Ageneau\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n\nFiles: include/rtc/h264rtpdepacketizer.hpp, include/rtc/mediahandler.hpp, include/rtc/rtcpreceivingsession.hpp, src/rtcpreceivingsession.cpp\n\n/**\n * Copyright (c) 2020 Staz Modrzynski\n * Copyright (c) 2020 Paul-Louis Ageneau\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n\nFiles: include/rtc/h264rtppacketizer.hpp\n\n/**\n * Copyright (c) 2020 Filip Klembara (in2core)\n * Copyright (c) 2023 Paul-Louis Ageneau\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n\nFiles: include/rtc/h265nalunit.hpp, include/rtc/h265rtppacketizer.hpp, src/h265nalunit.cpp, src/h265rtppacketizer.cpp\n\n/**\n * Copyright (c) 2023 Zita Liao (Dolby)\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n\nFiles: include/rtc/h265rtpdepacketizer.hpp\n\n/**\n * Copyright (c) 2020 Staz Modrzynski\n * Copyright (c) 2020-2024 Paul-Louis Ageneau\n * Copyright (c) 2024 Robert Edmonds\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtaiLine truncated
|
"text": "Files: include/rtc/av1rtppacketizer.hpp, src/av1rtppacketizer.cpp, src/h264rtpdepacketizer.cpp, src/mediahandler.cpp\n\n/**\n * Copyright (c) 2023 Paul-Louis Ageneau\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n\nFiles: include/rtc/candidate.hpp, include/rtc/common.hpp, include/rtc/configuration.hpp, include/rtc/datachannel.hpp, include/rtc/peerconnection.hpp, include/rtc/reliability.hpp, include/rtc/rtc.hpp, src/candidate.cpp, src/configuration.cpp, src/impl/certificate.cpp, src/impl/certificate.hpp, src/impl/datachannel.hpp, src/impl/dtlstransport.cpp, src/impl/dtlstransport.hpp, src/impl/queue.hpp, src/impl/sctptransport.cpp\n\n/**\n * Copyright (c) 2019 Paul-Louis Ageneau\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n\nFiles: include/rtc/channel.hpp, include/rtc/rtc.h, include/rtc/utils.hpp, src/capi.cpp, src/channel.cpp, src/datachannel.cpp, src/impl/channel.cpp, src/impl/channel.hpp, src/impl/datachannel.cpp, src/impl/internals.hpp, src/impl/peerconnection.hpp, src/impl/sctptransport.hpp\n\n/**\n * Copyright (c) 2019-2021 Paul-Louis Ageneau\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n\nFiles: include/rtc/dependencydescriptor.hpp, src/dependencydescriptor.cpp\n\n/**\n * Copyright (c) 2024 Shigemasa Watanabe (Wandbox)\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n\nFiles: include/rtc/description.hpp, src/description.cpp\n\n/**\n * Copyright (c) 2019-2020 Paul-Louis Ageneau\n * Copyright (c) 2020 Staz Modrzynski\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n\nFiles: include/rtc/frameinfo.hpp, include/rtc/message.hpp, src/impl/icetransport.cpp, src/impl/icetransport.hpp, src/impl/tls.cpp, src/impl/tls.hpp, src/message.cpp\n\n/**\n * Copyright (c) 2019-2020 Paul-Louis Ageneau\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n\nFiles: include/rtc/global.hpp, include/rtc/websocket.hpp, src/global.cpp, src/impl/pollinterrupter.cpp, src/impl/pollinterrupter.hpp, src/impl/track.hpp, src/impl/websocket.cpp, src/impl/websocket.hpp, src/impl/websocketserver.cpp, src/impl/websocketserver.hpp, src/impl/wshandshake.cpp, src/impl/wshandshake.hpp, src/impl/wstransport.cpp, src/impl/wstransport.hpp, src/track.cpp, src/websocket.cpp\n\n/**\n * Copyright (c) 2020-2021 Paul-Louis Ageneau\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n\nFiles: include/rtc/h264rtpdepacketizer.hpp, include/rtc/mediahandler.hpp, include/rtc/rtcpreceivingsession.hpp, src/rtcpreceivingsession.cpp\n\n/**\n * Copyright (c) 2020 Staz Modrzynski\n * Copyright (c) 2020 Paul-Louis Ageneau\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n\nFiles: include/rtc/h264rtppacketizer.hpp\n\n/**\n * Copyright (c) 2020 Filip Klembara (in2core)\n * Copyright (c) 2023 Paul-Louis Ageneau\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n\nFiles: include/rtc/h265nalunit.hpp, include/rtc/h265rtppacketizer.hpp, src/h265nalunit.cpp, src/h265rtppacketizer.cpp\n\n/**\n * Copyright (c) 2023 Zita Liao (Dolby)\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n\nFiles: include/rtc/h265rtpdepacketizer.hpp\n\n/**\n * Copyright (c) 2020 Staz Modrzynski\n * Copyright (c) 2020-2024 Paul-Louis Ageneau\n * Copyright (c) 2024 Robert Edmonds\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtaiLine truncated
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"buildSourceURL": "https://github.com/kunkundi/minirtc/tree/6286ae6c1c015609d3070cc139e5feea900caf7c/thirdparty/libdatachannel"
|
"buildSourceURL": "https://github.com/kunkundi/minirtc/tree/24d9d9deefb95ede2cdb18e77cb01350101f70f8/thirdparty/libdatachannel"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "libffi",
|
"id": "libffi",
|
||||||
@@ -295,7 +295,7 @@
|
|||||||
"text": "Files: agent/interfaces.c\n\n/*\n * interfaces.c - Source for interface discovery code\n *\n * Copyright (C) 2006 Youness Alaoui <kakaroto@kakaroto.homelinux.net>\n * Copyright (C) 2007 Collabora, Nokia\n * Contact: Youness Alaoui\n * Copyright (C) 2008 Haakon Sporsheim <haakon.sporsheim@tandberg.com>\n *\n * The contents of this file are subject to the Mozilla Public License Version\n * 1.1 (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n * http://www.mozilla.org/MPL/\n *\n * Software distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License\n * for the specific language governing rights and limitations under the\n * License.\n *\n * The Original Code is the Nice GLib ICE library.\n *\n * The Initial Developers of the Original Code are Collabora Ltd and Nokia\n * Corporation. All Rights Reserved.\n *\n * Contributors:\n * Dafydd Harries, Collabora Ltd.\n * Youness Alaoui, Collabora Ltd.\n * Kai Vehmanen, Nokia\n * Philip Withnall, Collabora Ltd.\n * Haakon Sporsheim\n *\n * Alternatively, the contents of this file may be used under the terms of the\n * the GNU Lesser General Public License Version 2.1 (the \"LGPL\"), in which\n * case the provisions of LGPL are applicable instead of those above. If you\n * wish to allow use of your version of this file only under the terms of the\n * LGPL and not to allow others to use your version of this file under the\n * MPL, indicate your decision by deleting the provisions above and replace\n * them with the notice and other provisions required by the LGPL. If you do\n * not delete the provisions above, a recipient may use your version of this\n * file under either the MPL or the LGPL.\n */\n\nFiles: agent/interfaces.h\n\n/*\n * interfaces.h - Source for interface discovery code\n *\n * Farsight Helper functions\n * Copyright (C) 2006 Youness Alaoui <kakaroto@kakaroto.homelinux.net>\n * Copyright (C) 2008-2009 Collabora, Nokia\n * Contact: Youness Alaoui\n * Copyright (C) 2008-2009 Nokia Corporation. All rights reserved.\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\nFiles: agent/pseudotcp.c\n\n/*\n * libjingle\n * Copyright 2004--2005, Google Inc.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation\n * and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n * derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO\n * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nFiles: stun/stuncrc32.c\n\n/*\n * This file is part of the Nice GLib ICE library.\n *\n * (C) 2008-2009 Collabora Ltd.\n * Contact: Youness Alaoui\n * (C) 2007-2009 Nokia Corporation. All rights reserved.\n * Contact: Rémi Denis-Courmont\n * COPYRIGHT (C) 1986 Gary S. Brown\n * See documentation of the function crc32() below.\n *\n * The contents of this file are subject to the Mozilla Public License Version\n * 1.1 (the \"License\"); you may not use this file except in compliance with\n * the License. You mLine truncated
|
"text": "Files: agent/interfaces.c\n\n/*\n * interfaces.c - Source for interface discovery code\n *\n * Copyright (C) 2006 Youness Alaoui <kakaroto@kakaroto.homelinux.net>\n * Copyright (C) 2007 Collabora, Nokia\n * Contact: Youness Alaoui\n * Copyright (C) 2008 Haakon Sporsheim <haakon.sporsheim@tandberg.com>\n *\n * The contents of this file are subject to the Mozilla Public License Version\n * 1.1 (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n * http://www.mozilla.org/MPL/\n *\n * Software distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License\n * for the specific language governing rights and limitations under the\n * License.\n *\n * The Original Code is the Nice GLib ICE library.\n *\n * The Initial Developers of the Original Code are Collabora Ltd and Nokia\n * Corporation. All Rights Reserved.\n *\n * Contributors:\n * Dafydd Harries, Collabora Ltd.\n * Youness Alaoui, Collabora Ltd.\n * Kai Vehmanen, Nokia\n * Philip Withnall, Collabora Ltd.\n * Haakon Sporsheim\n *\n * Alternatively, the contents of this file may be used under the terms of the\n * the GNU Lesser General Public License Version 2.1 (the \"LGPL\"), in which\n * case the provisions of LGPL are applicable instead of those above. If you\n * wish to allow use of your version of this file only under the terms of the\n * LGPL and not to allow others to use your version of this file under the\n * MPL, indicate your decision by deleting the provisions above and replace\n * them with the notice and other provisions required by the LGPL. If you do\n * not delete the provisions above, a recipient may use your version of this\n * file under either the MPL or the LGPL.\n */\n\nFiles: agent/interfaces.h\n\n/*\n * interfaces.h - Source for interface discovery code\n *\n * Farsight Helper functions\n * Copyright (C) 2006 Youness Alaoui <kakaroto@kakaroto.homelinux.net>\n * Copyright (C) 2008-2009 Collabora, Nokia\n * Contact: Youness Alaoui\n * Copyright (C) 2008-2009 Nokia Corporation. All rights reserved.\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\nFiles: agent/pseudotcp.c\n\n/*\n * libjingle\n * Copyright 2004--2005, Google Inc.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation\n * and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n * derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO\n * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nFiles: stun/stuncrc32.c\n\n/*\n * This file is part of the Nice GLib ICE library.\n *\n * (C) 2008-2009 Collabora Ltd.\n * Contact: Youness Alaoui\n * (C) 2007-2009 Nokia Corporation. All rights reserved.\n * Contact: Rémi Denis-Courmont\n * COPYRIGHT (C) 1986 Gary S. Brown\n * See documentation of the function crc32() below.\n *\n * The contents of this file are subject to the Mozilla Public License Version\n * 1.1 (the \"License\"); you may not use this file except in compliance with\n * the License. You mLine truncated
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"buildSourceURL": "https://github.com/kunkundi/minirtc/tree/6286ae6c1c015609d3070cc139e5feea900caf7c/thirdparty/libnice"
|
"buildSourceURL": "https://github.com/kunkundi/minirtc/tree/24d9d9deefb95ede2cdb18e77cb01350101f70f8/thirdparty/libnice"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "upnp-libpsl",
|
"id": "upnp-libpsl",
|
||||||
@@ -317,7 +317,7 @@
|
|||||||
"text": "Files: include/libpsl.h\n\n/*\n * Copyright(c) 2014-2024 Tim Ruehsen\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n *\n * This file is part of libpsl.\n *\n * Header file for libpsl library routines\n *\n * Changelog\n * 20.03.2014 Tim Ruehsen created\n *\n */\n\nFiles: src/lookup_string_in_fixed_set.c\n\n/* Copyright 2015-2016 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE.chromium file.\n *\n * Converted to C89 2015 by Tim Rühsen\n */\n\nFiles: src/psl.c\n\n/*\n * Copyright(c) 2014-2024 Tim Ruehsen\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n *\n * This file is part of libpsl.\n *\n * Public Suffix List routines\n *\n * Changelog\n * 19.03.2014 Tim Ruehsen created from libmget/cookie.c\n *\n */"
|
"text": "Files: include/libpsl.h\n\n/*\n * Copyright(c) 2014-2024 Tim Ruehsen\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n *\n * This file is part of libpsl.\n *\n * Header file for libpsl library routines\n *\n * Changelog\n * 20.03.2014 Tim Ruehsen created\n *\n */\n\nFiles: src/lookup_string_in_fixed_set.c\n\n/* Copyright 2015-2016 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE.chromium file.\n *\n * Converted to C89 2015 by Tim Rühsen\n */\n\nFiles: src/psl.c\n\n/*\n * Copyright(c) 2014-2024 Tim Ruehsen\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n *\n * This file is part of libpsl.\n *\n * Public Suffix List routines\n *\n * Changelog\n * 19.03.2014 Tim Ruehsen created from libmget/cookie.c\n *\n */"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"buildSourceURL": "https://github.com/kunkundi/minirtc/tree/6286ae6c1c015609d3070cc139e5feea900caf7c/thirdparty/gupnp"
|
"buildSourceURL": "https://github.com/kunkundi/minirtc/tree/24d9d9deefb95ede2cdb18e77cb01350101f70f8/thirdparty/gupnp"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "libsoup",
|
"id": "libsoup",
|
||||||
@@ -339,7 +339,7 @@
|
|||||||
"text": "Files: libsoup/auth/soup-auth-basic.c\n\n/*\n * soup-auth-basic.c: HTTP Basic Authentication\n *\n * Copyright (C) 2001-2003, Ximian, Inc.\n */\n\nFiles: libsoup/auth/soup-auth-basic.h, libsoup/auth/soup-auth-digest.h, libsoup/http1/soup-message-io-data.h, libsoup/include/soup-installed.h, libsoup/server/soup-message-body.h, libsoup/server/soup-server.h, libsoup/soup-connection.h, libsoup/soup-message-io-completion.h, libsoup/soup-message-private.h, libsoup/soup-message.h, libsoup/soup-misc.h, libsoup/soup-session-private.h, libsoup/soup-session.h, libsoup/soup.h\n\n/*\n * Copyright (C) 2000-2003, Ximian, Inc.\n */\n\nFiles: libsoup/auth/soup-auth-digest.c\n\n/*\n * soup-auth-digest.c: HTTP Digest Authentication\n *\n * Copyright (C) 2001-2003, Ximian, Inc.\n */\n\nFiles: libsoup/auth/soup-auth-manager.c\n\n/*\n * soup-auth-manager.c: SoupAuth manager for SoupSession\n *\n * Copyright (C) 2007 Red Hat, Inc.\n */\n\nFiles: libsoup/auth/soup-auth-manager.h, libsoup/auth/soup-auth-ntlm.h\n\n/*\n * Copyright (C) 2007 Red Hat, Inc.\n */\n\nFiles: libsoup/auth/soup-auth-negotiate.c\n\n/*\n * soup-auth-negotiate.c: HTTP Negotiate Authentication helper\n *\n * Copyright (C) 2009,2013 Guido Guenther <agx@sigxcpu.org>\n * Copyright (C) 2016 Red Hat, Inc.\n */\n\nFiles: libsoup/auth/soup-auth-negotiate.h\n\n/*\n * Copyright (C) 2010 Guido Guenther <agx@sigxcpu.org>\n * Copyright (C) 2016 Red Hat, Inc.\n */\n\nFiles: libsoup/auth/soup-auth-ntlm.c\n\n/*\n * soup-auth-ntlm.c: HTTP NTLM Authentication helper\n *\n * Copyright (C) 2007 Red Hat, Inc.\n */\n\nFiles: libsoup/auth/soup-auth.c\n\n/*\n * soup-auth.c: HTTP Authentication framework\n *\n * Copyright (C) 2001-2003, Ximian, Inc.\n */\n\nFiles: libsoup/auth/soup-auth.h, libsoup/soup-headers.h\n\n/*\n * Copyright (C) 2001-2003, Ximian, Inc.\n */\n\nFiles: libsoup/auth/soup-connection-auth.c\n\n/*\n * soup-connection-auth.c: Abstract base class for hacky Microsoft\n * connection-based auth mechanisms (NTLM and Negotiate)\n *\n * Copyright (C) 2010 Red Hat, Inc.\n */\n\nFiles: libsoup/auth/soup-connection-auth.h, libsoup/content-sniffer/soup-content-sniffer-stream.h\n\n/*\n * Copyright (C) 2010 Red Hat, Inc.\n */\n\nFiles: libsoup/auth/soup-tls-interaction.c\n\n/*\n * soup-tls-interaction.c: TLS interaction implementation\n *\n * Copyright (C) 2021 Igalia S.L.\n */\n\nFiles: libsoup/auth/soup-tls-interaction.h, libsoup/http1/soup-client-message-io-http1.h, libsoup/http2/soup-client-message-io-http2.h, libsoup/soup-client-message-io.c, libsoup/soup-client-message-io.h, libsoup/soup-logger-input-stream.h, libsoup/soup-logger-private.h, libsoup/soup-message-headers-private.h\n\n/*\n * Copyright (C) 2021 Igalia S.L.\n */\n\nFiles: libsoup/cache/soup-cache-client-input-stream.c\n\n/*\n * soup-cache-client-input-stream.c\n *\n * Copyright 2015 Igalia S.L.\n */\n\nFiles: libsoup/cache/soup-cache-client-input-stream.h\n\n/*\n * Copyright 2015 Igalia S.L.\n */\n\nFiles: libsoup/cache/soup-cache-input-stream.c, libsoup/content-decoder/soup-content-processor.c, libsoup/content-decoder/soup-content-processor.h\n\n/*\n * Copyright (C) 2012 Igalia, S.L.\n */\n\nFiles: libsoup/cache/soup-cache-private.h\n\n/*\n * soup-cache-private.h:\n *\n * Copyright (C) 2010 Igalia, S.L.\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Library General Public\n * License as published by the Free Software Foundation; either\n * version 2 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Library General Public License for more details.\n *\n * You should have received a copy of the GNU Library General Public License\n * along with this library; see the file COPYING.LIB. If not, write to\n * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,\n * Boston, MA 02110-1301, USA.\n */\n\nFiles: libsoup/cache/soup-cache.c\n\n/*\n * soup-cache.c\n *\n * Copyright (C) 2009, 2010 Igalia S.L.\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Library General Public\n * License as published by the Free Software Foundation; either\n * version 2 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Library General Public License for more details.\n *\n * You should have received a copy of the GNU Library General Public License\n * along with this library; see the file COPYING.LIB. If not, write to\n * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,\n * Boston, MA 02110-1301, USA.\n */\n\nFiles: libsoup/cache/soup-Line truncated
|
"text": "Files: libsoup/auth/soup-auth-basic.c\n\n/*\n * soup-auth-basic.c: HTTP Basic Authentication\n *\n * Copyright (C) 2001-2003, Ximian, Inc.\n */\n\nFiles: libsoup/auth/soup-auth-basic.h, libsoup/auth/soup-auth-digest.h, libsoup/http1/soup-message-io-data.h, libsoup/include/soup-installed.h, libsoup/server/soup-message-body.h, libsoup/server/soup-server.h, libsoup/soup-connection.h, libsoup/soup-message-io-completion.h, libsoup/soup-message-private.h, libsoup/soup-message.h, libsoup/soup-misc.h, libsoup/soup-session-private.h, libsoup/soup-session.h, libsoup/soup.h\n\n/*\n * Copyright (C) 2000-2003, Ximian, Inc.\n */\n\nFiles: libsoup/auth/soup-auth-digest.c\n\n/*\n * soup-auth-digest.c: HTTP Digest Authentication\n *\n * Copyright (C) 2001-2003, Ximian, Inc.\n */\n\nFiles: libsoup/auth/soup-auth-manager.c\n\n/*\n * soup-auth-manager.c: SoupAuth manager for SoupSession\n *\n * Copyright (C) 2007 Red Hat, Inc.\n */\n\nFiles: libsoup/auth/soup-auth-manager.h, libsoup/auth/soup-auth-ntlm.h\n\n/*\n * Copyright (C) 2007 Red Hat, Inc.\n */\n\nFiles: libsoup/auth/soup-auth-negotiate.c\n\n/*\n * soup-auth-negotiate.c: HTTP Negotiate Authentication helper\n *\n * Copyright (C) 2009,2013 Guido Guenther <agx@sigxcpu.org>\n * Copyright (C) 2016 Red Hat, Inc.\n */\n\nFiles: libsoup/auth/soup-auth-negotiate.h\n\n/*\n * Copyright (C) 2010 Guido Guenther <agx@sigxcpu.org>\n * Copyright (C) 2016 Red Hat, Inc.\n */\n\nFiles: libsoup/auth/soup-auth-ntlm.c\n\n/*\n * soup-auth-ntlm.c: HTTP NTLM Authentication helper\n *\n * Copyright (C) 2007 Red Hat, Inc.\n */\n\nFiles: libsoup/auth/soup-auth.c\n\n/*\n * soup-auth.c: HTTP Authentication framework\n *\n * Copyright (C) 2001-2003, Ximian, Inc.\n */\n\nFiles: libsoup/auth/soup-auth.h, libsoup/soup-headers.h\n\n/*\n * Copyright (C) 2001-2003, Ximian, Inc.\n */\n\nFiles: libsoup/auth/soup-connection-auth.c\n\n/*\n * soup-connection-auth.c: Abstract base class for hacky Microsoft\n * connection-based auth mechanisms (NTLM and Negotiate)\n *\n * Copyright (C) 2010 Red Hat, Inc.\n */\n\nFiles: libsoup/auth/soup-connection-auth.h, libsoup/content-sniffer/soup-content-sniffer-stream.h\n\n/*\n * Copyright (C) 2010 Red Hat, Inc.\n */\n\nFiles: libsoup/auth/soup-tls-interaction.c\n\n/*\n * soup-tls-interaction.c: TLS interaction implementation\n *\n * Copyright (C) 2021 Igalia S.L.\n */\n\nFiles: libsoup/auth/soup-tls-interaction.h, libsoup/http1/soup-client-message-io-http1.h, libsoup/http2/soup-client-message-io-http2.h, libsoup/soup-client-message-io.c, libsoup/soup-client-message-io.h, libsoup/soup-logger-input-stream.h, libsoup/soup-logger-private.h, libsoup/soup-message-headers-private.h\n\n/*\n * Copyright (C) 2021 Igalia S.L.\n */\n\nFiles: libsoup/cache/soup-cache-client-input-stream.c\n\n/*\n * soup-cache-client-input-stream.c\n *\n * Copyright 2015 Igalia S.L.\n */\n\nFiles: libsoup/cache/soup-cache-client-input-stream.h\n\n/*\n * Copyright 2015 Igalia S.L.\n */\n\nFiles: libsoup/cache/soup-cache-input-stream.c, libsoup/content-decoder/soup-content-processor.c, libsoup/content-decoder/soup-content-processor.h\n\n/*\n * Copyright (C) 2012 Igalia, S.L.\n */\n\nFiles: libsoup/cache/soup-cache-private.h\n\n/*\n * soup-cache-private.h:\n *\n * Copyright (C) 2010 Igalia, S.L.\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Library General Public\n * License as published by the Free Software Foundation; either\n * version 2 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Library General Public License for more details.\n *\n * You should have received a copy of the GNU Library General Public License\n * along with this library; see the file COPYING.LIB. If not, write to\n * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,\n * Boston, MA 02110-1301, USA.\n */\n\nFiles: libsoup/cache/soup-cache.c\n\n/*\n * soup-cache.c\n *\n * Copyright (C) 2009, 2010 Igalia S.L.\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Library General Public\n * License as published by the Free Software Foundation; either\n * version 2 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Library General Public License for more details.\n *\n * You should have received a copy of the GNU Library General Public License\n * along with this library; see the file COPYING.LIB. If not, write to\n * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,\n * Boston, MA 02110-1301, USA.\n */\n\nFiles: libsoup/cache/soup-Line truncated
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"buildSourceURL": "https://github.com/kunkundi/minirtc/tree/6286ae6c1c015609d3070cc139e5feea900caf7c/thirdparty/gupnp"
|
"buildSourceURL": "https://github.com/kunkundi/minirtc/tree/24d9d9deefb95ede2cdb18e77cb01350101f70f8/thirdparty/gupnp"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "libsrtp",
|
"id": "libsrtp",
|
||||||
@@ -357,7 +357,7 @@
|
|||||||
"text": "Files: crypto/cipher/aes.c, crypto/hash/auth.c, crypto/hash/null_auth.c, crypto/hash/sha1.c, crypto/include/aes.h, crypto/include/aes_icm.h, crypto/include/aes_icm_ext.h, crypto/include/auth.h, crypto/include/datatypes.h, crypto/include/err.h, crypto/include/hmac.h, crypto/include/integers.h, crypto/include/null_auth.h, crypto/include/null_cipher.h, crypto/include/rdb.h, crypto/include/rdbx.h, crypto/include/sha1.h, crypto/replay/rdb.c, crypto/replay/rdbx.c, include/srtp.h, srtp/srtp.c\n\n/*\n *\n * Copyright (c) 2001-2017, Cisco Systems, Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *\n * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following\n * disclaimer in the documentation and/or other materials provided\n * with the distribution.\n *\n * Neither the name of the Cisco Systems, Inc. nor the names of its\n * contributors may be used to endorse or promote products derived\n * from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\n * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n * OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n */\n\nFiles: crypto/cipher/aes_gcm_mbedtls.c, crypto/cipher/aes_gcm_nss.c, crypto/cipher/aes_gcm_ossl.c, crypto/cipher/aes_icm_mbedtls.c, crypto/cipher/aes_icm_nss.c, crypto/cipher/aes_icm_ossl.c, crypto/include/aes_gcm.h\n\n/*\n *\n * Copyright (c) 2013-2017, Cisco Systems, Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *\n * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following\n * disclaimer in the documentation and/or other materials provided\n * with the distribution.\n *\n * Neither the name of the Cisco Systems, Inc. nor the names of its\n * contributors may be used to endorse or promote products derived\n * from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\n * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n * OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n */\n\nFiles: crypto/cipher/aes_icm.c, crypto/cipher/cipher.c, crypto/cipher/null_cipher.c, crypto/include/alloc.h, crypto/include/cipher.h, crypto/include/key.h, crypto/kernel/alloc.c, crypto/kernel/key.c, crypto/math/datatypes.c, include/srtp_priv.h\n\n/*\n *\n * Copyright (c) 2001-2017 Cisco Systems, Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *\n * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following\n * disclaimer in the documentation and/or other materials provided\n * with the distribution.\n *\n * Neither the name of the Cisco Systems, Inc. nor the names of its\n * contributors may be used to endLine truncated
|
"text": "Files: crypto/cipher/aes.c, crypto/hash/auth.c, crypto/hash/null_auth.c, crypto/hash/sha1.c, crypto/include/aes.h, crypto/include/aes_icm.h, crypto/include/aes_icm_ext.h, crypto/include/auth.h, crypto/include/datatypes.h, crypto/include/err.h, crypto/include/hmac.h, crypto/include/integers.h, crypto/include/null_auth.h, crypto/include/null_cipher.h, crypto/include/rdb.h, crypto/include/rdbx.h, crypto/include/sha1.h, crypto/replay/rdb.c, crypto/replay/rdbx.c, include/srtp.h, srtp/srtp.c\n\n/*\n *\n * Copyright (c) 2001-2017, Cisco Systems, Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *\n * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following\n * disclaimer in the documentation and/or other materials provided\n * with the distribution.\n *\n * Neither the name of the Cisco Systems, Inc. nor the names of its\n * contributors may be used to endorse or promote products derived\n * from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\n * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n * OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n */\n\nFiles: crypto/cipher/aes_gcm_mbedtls.c, crypto/cipher/aes_gcm_nss.c, crypto/cipher/aes_gcm_ossl.c, crypto/cipher/aes_icm_mbedtls.c, crypto/cipher/aes_icm_nss.c, crypto/cipher/aes_icm_ossl.c, crypto/include/aes_gcm.h\n\n/*\n *\n * Copyright (c) 2013-2017, Cisco Systems, Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *\n * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following\n * disclaimer in the documentation and/or other materials provided\n * with the distribution.\n *\n * Neither the name of the Cisco Systems, Inc. nor the names of its\n * contributors may be used to endorse or promote products derived\n * from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\n * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n * OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n */\n\nFiles: crypto/cipher/aes_icm.c, crypto/cipher/cipher.c, crypto/cipher/null_cipher.c, crypto/include/alloc.h, crypto/include/cipher.h, crypto/include/key.h, crypto/kernel/alloc.c, crypto/kernel/key.c, crypto/math/datatypes.c, include/srtp_priv.h\n\n/*\n *\n * Copyright (c) 2001-2017 Cisco Systems, Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *\n * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following\n * disclaimer in the documentation and/or other materials provided\n * with the distribution.\n *\n * Neither the name of the Cisco Systems, Inc. nor the names of its\n * contributors may be used to endLine truncated
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"buildSourceURL": "https://github.com/kunkundi/minirtc/tree/6286ae6c1c015609d3070cc139e5feea900caf7c/thirdparty/libsrtp"
|
"buildSourceURL": "https://github.com/kunkundi/minirtc/tree/24d9d9deefb95ede2cdb18e77cb01350101f70f8/thirdparty/libsrtp"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "upnp-libxml2",
|
"id": "upnp-libxml2",
|
||||||
@@ -375,7 +375,7 @@
|
|||||||
"text": "Files: HTMLparser.c\n\n/*\n * HTMLparser.c : an HTML parser\n *\n * References:\n * HTML Living Standard\n * https://html.spec.whatwg.org/multipage/parsing.html\n *\n * Tokenization now conforms to HTML5. Tree construction still follows\n * a custom, non-standard implementation. See:\n *\n * https://gitlab.gnome.org/GNOME/libxml2/-/issues/211\n *\n * See Copyright for the status of this software.\n *\n * daniel@veillard.com\n */\n\nFiles: HTMLtree.c\n\n/*\n * HTMLtree.c : implementation of access function for an HTML tree.\n *\n * See Copyright for the status of this software.\n *\n * daniel@veillard.com\n */\n\nFiles: SAX2.c\n\n/*\n * SAX2.c : Default SAX2 handler to build a tree.\n *\n * See Copyright for the status of this software.\n *\n * Daniel Veillard <daniel@veillard.com>\n */\n\nFiles: buf.c\n\n/*\n * buf.c: memory buffers for libxml2\n *\n * new buffer structures and entry points to simplify the maintenance\n * of libxml2 and ensure we keep good control over memory allocations\n * and stay 64 bits clean.\n * The new entry point use the xmlBufPtr opaque structure and\n * xmlBuf...() counterparts to the old xmlBuf...() functions\n *\n * See Copyright for the status of this software.\n *\n * daniel@veillard.com\n */\n\nFiles: c14n.c\n\n/*\n * \"Canonical XML\" implementation\n * http://www.w3.org/TR/xml-c14n\n *\n * \"Exclusive XML Canonicalization\" implementation\n * http://www.w3.org/TR/xml-exc-c14n\n *\n * See Copyright for the status of this software.\n *\n * Author: Aleksey Sanin <aleksey@aleksey.com>\n */\n\nFiles: catalog.c\n\n/**\n * catalog.c: set of generic Catalog related routines\n *\n * Reference: SGML Open Technical Resolution TR9401:1997.\n * http://www.jclark.com/sp/catalog.htm\n *\n * XML Catalogs Working Draft 06 August 2001\n * http://www.oasis-open.org/committees/entity/spec-2001-08-06.html\n *\n * See Copyright for the status of this software.\n *\n * Daniel.Veillard@imag.fr\n */\n\nFiles: debugXML.c\n\n/*\n * debugXML.c : This is a set of routines used for debugging the tree\n * produced by the XML parser.\n *\n * See Copyright for the status of this software.\n *\n * Daniel Veillard <daniel@veillard.com>\n */\n\nFiles: dict.c\n\n/*\n * dict.c: dictionary of reusable strings, just used to avoid allocation\n * and freeing operations.\n *\n * Copyright (C) 2003-2012 Daniel Veillard.\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND\n * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER.\n *\n * Author: daniel@veillard.com\n */\n\nFiles: dict.c\n\n/*****************************************************************\n *\n * The code below was rewritten and is additionally licensed under\n * the main license in file 'Copyright'.\n *\n *****************************************************************/\n\nFiles: encoding.c\n\n/*\n * encoding.c : implements the encoding conversion functions needed for XML\n *\n * Related specs:\n * rfc2044 (UTF-8 and UTF-16) F. Yergeau Alis Technologies\n * rfc2781 UTF-16, an encoding of ISO 10646, P. Hoffman, F. Yergeau\n * [ISO-10646] UTF-8 and UTF-16 in Annexes\n * [ISO-8859-1] ISO Latin-1 characters codes.\n * [UNICODE] The Unicode Consortium, \"The Unicode Standard --\n * Worldwide Character Encoding -- Version 1.0\", Addison-\n * Wesley, Volume 1, 1991, Volume 2, 1992. UTF-8 is\n * described in Unicode Technical Report #4.\n * [US-ASCII] Coded Character Set--7-bit American Standard Code for\n * Information Interchange, ANSI X3.4-1986.\n *\n * See Copyright for the status of this software.\n *\n * daniel@veillard.com\n *\n * Original code for IsoLatin1 and UTF-16 by \"Martin J. Duerst\" <duerst@w3.org>\n */\n\nFiles: entities.c\n\n/*\n * entities.c : implementation for the XML entities handling\n *\n * See Copyright for the status of this software.\n *\n * daniel@veillard.com\n */\n\nFiles: error.c\n\n/*\n * error.c: module displaying/handling XML parser errors\n *\n * See Copyright for the status of this software.\n *\n * Daniel Veillard <daniel@veillard.com>\n */\n\nFiles: globals.c\n\n/*\n * globals.c: definition and handling of the set of global variables\n * of the library\n *\n * See Copyright for the status of this software.\n *\n * Gary Pennington <Gary.Pennington@uk.sun.com>\n * daniel@veillard.com\n */\n\nFiles: hash.c\n\n/*\n * hash.c: hash tables\n *\n * Hash table with open addressing, linear probing and\n * Robin Hood reordering.\n *\n * See CopyLine truncated
|
"text": "Files: HTMLparser.c\n\n/*\n * HTMLparser.c : an HTML parser\n *\n * References:\n * HTML Living Standard\n * https://html.spec.whatwg.org/multipage/parsing.html\n *\n * Tokenization now conforms to HTML5. Tree construction still follows\n * a custom, non-standard implementation. See:\n *\n * https://gitlab.gnome.org/GNOME/libxml2/-/issues/211\n *\n * See Copyright for the status of this software.\n *\n * daniel@veillard.com\n */\n\nFiles: HTMLtree.c\n\n/*\n * HTMLtree.c : implementation of access function for an HTML tree.\n *\n * See Copyright for the status of this software.\n *\n * daniel@veillard.com\n */\n\nFiles: SAX2.c\n\n/*\n * SAX2.c : Default SAX2 handler to build a tree.\n *\n * See Copyright for the status of this software.\n *\n * Daniel Veillard <daniel@veillard.com>\n */\n\nFiles: buf.c\n\n/*\n * buf.c: memory buffers for libxml2\n *\n * new buffer structures and entry points to simplify the maintenance\n * of libxml2 and ensure we keep good control over memory allocations\n * and stay 64 bits clean.\n * The new entry point use the xmlBufPtr opaque structure and\n * xmlBuf...() counterparts to the old xmlBuf...() functions\n *\n * See Copyright for the status of this software.\n *\n * daniel@veillard.com\n */\n\nFiles: c14n.c\n\n/*\n * \"Canonical XML\" implementation\n * http://www.w3.org/TR/xml-c14n\n *\n * \"Exclusive XML Canonicalization\" implementation\n * http://www.w3.org/TR/xml-exc-c14n\n *\n * See Copyright for the status of this software.\n *\n * Author: Aleksey Sanin <aleksey@aleksey.com>\n */\n\nFiles: catalog.c\n\n/**\n * catalog.c: set of generic Catalog related routines\n *\n * Reference: SGML Open Technical Resolution TR9401:1997.\n * http://www.jclark.com/sp/catalog.htm\n *\n * XML Catalogs Working Draft 06 August 2001\n * http://www.oasis-open.org/committees/entity/spec-2001-08-06.html\n *\n * See Copyright for the status of this software.\n *\n * Daniel.Veillard@imag.fr\n */\n\nFiles: debugXML.c\n\n/*\n * debugXML.c : This is a set of routines used for debugging the tree\n * produced by the XML parser.\n *\n * See Copyright for the status of this software.\n *\n * Daniel Veillard <daniel@veillard.com>\n */\n\nFiles: dict.c\n\n/*\n * dict.c: dictionary of reusable strings, just used to avoid allocation\n * and freeing operations.\n *\n * Copyright (C) 2003-2012 Daniel Veillard.\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND\n * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER.\n *\n * Author: daniel@veillard.com\n */\n\nFiles: dict.c\n\n/*****************************************************************\n *\n * The code below was rewritten and is additionally licensed under\n * the main license in file 'Copyright'.\n *\n *****************************************************************/\n\nFiles: encoding.c\n\n/*\n * encoding.c : implements the encoding conversion functions needed for XML\n *\n * Related specs:\n * rfc2044 (UTF-8 and UTF-16) F. Yergeau Alis Technologies\n * rfc2781 UTF-16, an encoding of ISO 10646, P. Hoffman, F. Yergeau\n * [ISO-10646] UTF-8 and UTF-16 in Annexes\n * [ISO-8859-1] ISO Latin-1 characters codes.\n * [UNICODE] The Unicode Consortium, \"The Unicode Standard --\n * Worldwide Character Encoding -- Version 1.0\", Addison-\n * Wesley, Volume 1, 1991, Volume 2, 1992. UTF-8 is\n * described in Unicode Technical Report #4.\n * [US-ASCII] Coded Character Set--7-bit American Standard Code for\n * Information Interchange, ANSI X3.4-1986.\n *\n * See Copyright for the status of this software.\n *\n * daniel@veillard.com\n *\n * Original code for IsoLatin1 and UTF-16 by \"Martin J. Duerst\" <duerst@w3.org>\n */\n\nFiles: entities.c\n\n/*\n * entities.c : implementation for the XML entities handling\n *\n * See Copyright for the status of this software.\n *\n * daniel@veillard.com\n */\n\nFiles: error.c\n\n/*\n * error.c: module displaying/handling XML parser errors\n *\n * See Copyright for the status of this software.\n *\n * Daniel Veillard <daniel@veillard.com>\n */\n\nFiles: globals.c\n\n/*\n * globals.c: definition and handling of the set of global variables\n * of the library\n *\n * See Copyright for the status of this software.\n *\n * Gary Pennington <Gary.Pennington@uk.sun.com>\n * daniel@veillard.com\n */\n\nFiles: hash.c\n\n/*\n * hash.c: hash tables\n *\n * Hash table with open addressing, linear probing and\n * Robin Hood reordering.\n *\n * See CopyLine truncated
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"buildSourceURL": "https://github.com/kunkundi/minirtc/tree/6286ae6c1c015609d3070cc139e5feea900caf7c/thirdparty/gupnp"
|
"buildSourceURL": "https://github.com/kunkundi/minirtc/tree/24d9d9deefb95ede2cdb18e77cb01350101f70f8/thirdparty/gupnp"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "libyuv",
|
"id": "libyuv",
|
||||||
@@ -405,9 +405,9 @@
|
|||||||
{
|
{
|
||||||
"id": "minirtc",
|
"id": "minirtc",
|
||||||
"name": "MiniRTC",
|
"name": "MiniRTC",
|
||||||
"version": "6286ae6c1c015609d3070cc139e5feea900caf7c",
|
"version": "24d9d9deefb95ede2cdb18e77cb01350101f70f8",
|
||||||
"license": "LGPL-3.0-only",
|
"license": "LGPL-3.0-only",
|
||||||
"sourceURL": "https://github.com/kunkundi/minirtc/tree/6286ae6c1c015609d3070cc139e5feea900caf7c",
|
"sourceURL": "https://github.com/kunkundi/minirtc/tree/24d9d9deefb95ede2cdb18e77cb01350101f70f8",
|
||||||
"documents": [
|
"documents": [
|
||||||
{
|
{
|
||||||
"title": "deps/submodules/minirtc/LICENSE",
|
"title": "deps/submodules/minirtc/LICENSE",
|
||||||
@@ -448,7 +448,7 @@
|
|||||||
"text": "Files: src/lib_common/linear_binary_codes_utils/binary_matrix/of_hamming_weight.c, src/lib_common/linear_binary_codes_utils/binary_matrix/of_hamming_weight.h\n\n/*\n * Source: Wikipedia http://en.wikipedia.org/wiki/Hamming_weight\n *\n * Creative Commons Attribution-ShareAlike 3.0 Unported License.\n *\n * You are free:\n *\n * to Share — to copy, distribute and transmit the work\n * to Remix — to adapt the work\n *\n * Under the following conditions:\n *\n * Attribution — You must attribute the work in the manner specified by the author or licensor\n * (but not in any way that suggests that they endorse you or your use of the work).\n * Share Alike — If you alter, transform, or build upon this work, you may distribute the\n * resulting work only under the same, similar or a compatible license.\n *\n * With the understanding that:\n *\n * Waiver — Any of the above conditions can be waived if you get permission from the copyright holder.\n * Public Domain — Where the work or any of its elements is in the public domain under applicable law,\n * that status is in no way affected by the license.\n * Other Rights — In no way are any of the following rights affected by the license:\n * Your fair dealing or fair use rights, or other applicable copyright exceptions and limitations;\n * The author's moral rights;\n * Rights other persons may have either in the work itself or in how the work is used, such as publicity\n * or privacy rights.\n * Notice — For any reuse or distribution, you must make clear to others the license terms of this work.\n *\n * The best way to do this is with a link to this web page: http://creativecommons.org/licenses/by-sa/3.0/\n */\n\nFiles: src/lib_common/linear_binary_codes_utils/binary_matrix/of_matrix_convert.c, src/lib_common/linear_binary_codes_utils/it_decoding/of_it_decoding.c, src/lib_common/linear_binary_codes_utils/it_decoding/of_it_decoding.h, src/lib_common/linear_binary_codes_utils/ml_decoding/of_ml_decoding.c, src/lib_common/linear_binary_codes_utils/ml_decoding/of_ml_decoding.h, src/lib_common/linear_binary_codes_utils/of_symbol.c, src/lib_common/linear_binary_codes_utils/of_symbol.h, src/lib_common/of_cb.h, src/lib_common/of_debug.h, src/lib_common/of_mem.h, src/lib_common/of_openfec_api.c, src/lib_common/of_openfec_api.h, src/lib_common/of_openfec_profile.h, src/lib_common/of_rand.h, src/lib_common/of_types.h, src/lib_common/statistics/of_statistics.c, src/lib_common/statistics/of_statistics.h, src/lib_stable/2d_parity_matrix/of_2d_parity.h, src/lib_stable/2d_parity_matrix/of_2d_parity_api.c, src/lib_stable/2d_parity_matrix/of_2d_parity_api.h, src/lib_stable/2d_parity_matrix/of_2d_parity_includes.h, src/lib_stable/2d_parity_matrix/of_codec_profile.h, src/lib_stable/reed-solomon_gf_2_8/of_codec_profile.h, src/lib_stable/reed-solomon_gf_2_8/of_reed-solomon_gf_2_8.h, src/lib_stable/reed-solomon_gf_2_8/of_reed-solomon_gf_2_8_api.h, src/lib_stable/reed-solomon_gf_2_8/of_reed-solomon_gf_2_8_includes.h, src/lib_stable/reed-solomon_gf_2_m/galois_field_codes_utils/of_galois_field_code.c, src/lib_stable/reed-solomon_gf_2_m/galois_field_codes_utils/of_galois_field_code.h, src/lib_stable/reed-solomon_gf_2_m/of_codec_profile.h, src/lib_stable/reed-solomon_gf_2_m/of_reed-solomon_gf_2_m.h, src/lib_stable/reed-solomon_gf_2_m/of_reed-solomon_gf_2_m_api.c, src/lib_stable/reed-solomon_gf_2_m/of_reed-solomon_gf_2_m_api.h, src/lib_stable/reed-solomon_gf_2_m/of_reed-solomon_gf_2_m_includes.h\n\n/*\n * OpenFEC.org AL-FEC Library.\n * (c) Copyright 2009 - 2012 INRIA - All rights reserved\n * Contact: vincent.roca@inria.fr\n *\n * This software is governed by the CeCILL-C license under French law and\n * abiding by the rules of distribution of free software. You can use,\n * modify and/ or redistribute the software under the terms of the CeCILL-C\n * license as circulated by CEA, CNRS and INRIA at the following URL\n * \"http://www.cecill.info\".\n *\n * As a counterpart to the access to the source code and rights to copy,\n * modify and redistribute granted by the license, users are provided only\n * with a limited warranty and the software's author, the holder of the\n * economic rights, and the successive licensors have only limited\n * liability.\n *\n * In this respect, the user's attention is drawn to the risks associated\n * with loading, using, modifying and/or developing or reproducing the\n * software by the user in light of its specific status of free software,\n * that may mean that it is complicated to manipulate, and that also\n * therefore means that it is reserved for developers and experienced\n * professionals having in-depth computer knowledge. Users are therefore\n * encouraged to load and test the software's suitability as regards their\n * requirements in conditions enabling the security of their systems and/or\n * data to be eLine truncated
|
"text": "Files: src/lib_common/linear_binary_codes_utils/binary_matrix/of_hamming_weight.c, src/lib_common/linear_binary_codes_utils/binary_matrix/of_hamming_weight.h\n\n/*\n * Source: Wikipedia http://en.wikipedia.org/wiki/Hamming_weight\n *\n * Creative Commons Attribution-ShareAlike 3.0 Unported License.\n *\n * You are free:\n *\n * to Share — to copy, distribute and transmit the work\n * to Remix — to adapt the work\n *\n * Under the following conditions:\n *\n * Attribution — You must attribute the work in the manner specified by the author or licensor\n * (but not in any way that suggests that they endorse you or your use of the work).\n * Share Alike — If you alter, transform, or build upon this work, you may distribute the\n * resulting work only under the same, similar or a compatible license.\n *\n * With the understanding that:\n *\n * Waiver — Any of the above conditions can be waived if you get permission from the copyright holder.\n * Public Domain — Where the work or any of its elements is in the public domain under applicable law,\n * that status is in no way affected by the license.\n * Other Rights — In no way are any of the following rights affected by the license:\n * Your fair dealing or fair use rights, or other applicable copyright exceptions and limitations;\n * The author's moral rights;\n * Rights other persons may have either in the work itself or in how the work is used, such as publicity\n * or privacy rights.\n * Notice — For any reuse or distribution, you must make clear to others the license terms of this work.\n *\n * The best way to do this is with a link to this web page: http://creativecommons.org/licenses/by-sa/3.0/\n */\n\nFiles: src/lib_common/linear_binary_codes_utils/binary_matrix/of_matrix_convert.c, src/lib_common/linear_binary_codes_utils/it_decoding/of_it_decoding.c, src/lib_common/linear_binary_codes_utils/it_decoding/of_it_decoding.h, src/lib_common/linear_binary_codes_utils/ml_decoding/of_ml_decoding.c, src/lib_common/linear_binary_codes_utils/ml_decoding/of_ml_decoding.h, src/lib_common/linear_binary_codes_utils/of_symbol.c, src/lib_common/linear_binary_codes_utils/of_symbol.h, src/lib_common/of_cb.h, src/lib_common/of_debug.h, src/lib_common/of_mem.h, src/lib_common/of_openfec_api.c, src/lib_common/of_openfec_api.h, src/lib_common/of_openfec_profile.h, src/lib_common/of_rand.h, src/lib_common/of_types.h, src/lib_common/statistics/of_statistics.c, src/lib_common/statistics/of_statistics.h, src/lib_stable/2d_parity_matrix/of_2d_parity.h, src/lib_stable/2d_parity_matrix/of_2d_parity_api.c, src/lib_stable/2d_parity_matrix/of_2d_parity_api.h, src/lib_stable/2d_parity_matrix/of_2d_parity_includes.h, src/lib_stable/2d_parity_matrix/of_codec_profile.h, src/lib_stable/reed-solomon_gf_2_8/of_codec_profile.h, src/lib_stable/reed-solomon_gf_2_8/of_reed-solomon_gf_2_8.h, src/lib_stable/reed-solomon_gf_2_8/of_reed-solomon_gf_2_8_api.h, src/lib_stable/reed-solomon_gf_2_8/of_reed-solomon_gf_2_8_includes.h, src/lib_stable/reed-solomon_gf_2_m/galois_field_codes_utils/of_galois_field_code.c, src/lib_stable/reed-solomon_gf_2_m/galois_field_codes_utils/of_galois_field_code.h, src/lib_stable/reed-solomon_gf_2_m/of_codec_profile.h, src/lib_stable/reed-solomon_gf_2_m/of_reed-solomon_gf_2_m.h, src/lib_stable/reed-solomon_gf_2_m/of_reed-solomon_gf_2_m_api.c, src/lib_stable/reed-solomon_gf_2_m/of_reed-solomon_gf_2_m_api.h, src/lib_stable/reed-solomon_gf_2_m/of_reed-solomon_gf_2_m_includes.h\n\n/*\n * OpenFEC.org AL-FEC Library.\n * (c) Copyright 2009 - 2012 INRIA - All rights reserved\n * Contact: vincent.roca@inria.fr\n *\n * This software is governed by the CeCILL-C license under French law and\n * abiding by the rules of distribution of free software. You can use,\n * modify and/ or redistribute the software under the terms of the CeCILL-C\n * license as circulated by CEA, CNRS and INRIA at the following URL\n * \"http://www.cecill.info\".\n *\n * As a counterpart to the access to the source code and rights to copy,\n * modify and redistribute granted by the license, users are provided only\n * with a limited warranty and the software's author, the holder of the\n * economic rights, and the successive licensors have only limited\n * liability.\n *\n * In this respect, the user's attention is drawn to the risks associated\n * with loading, using, modifying and/or developing or reproducing the\n * software by the user in light of its specific status of free software,\n * that may mean that it is complicated to manipulate, and that also\n * therefore means that it is reserved for developers and experienced\n * professionals having in-depth computer knowledge. Users are therefore\n * encouraged to load and test the software's suitability as regards their\n * requirements in conditions enabling the security of their systems and/or\n * data to be eLine truncated
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"buildSourceURL": "https://github.com/kunkundi/minirtc/tree/6286ae6c1c015609d3070cc139e5feea900caf7c/thirdparty/openfec"
|
"buildSourceURL": "https://github.com/kunkundi/minirtc/tree/24d9d9deefb95ede2cdb18e77cb01350101f70f8/thirdparty/openfec"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "openssl3",
|
"id": "openssl3",
|
||||||
@@ -466,7 +466,7 @@
|
|||||||
"text": "Files: crypto/LPdir_nyi.c, crypto/LPdir_vms.c, crypto/LPdir_win.c, crypto/LPdir_win32.c, crypto/LPdir_wince.c, crypto/x509/v3_pcia.c\n\n/*\n * Copyright 2004-2016 The OpenSSL Project Authors. All Rights Reserved.\n *\n * Licensed under the Apache License 2.0 (the \"License\"). You may not use\n * this file except in compliance with the License. You can obtain a copy\n * in the file LICENSE in the source distribution or at\n * https://www.openssl.org/source/license.html\n */\n\nFiles: crypto/LPdir_nyi.c, include/internal/o_dir.h\n\n/*\n * This file is dual-licensed and is also available under the following\n * terms:\n *\n * Copyright (c) 2004, Richard Levitte <richard@levitte.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\nFiles: crypto/LPdir_unix.c, crypto/sha/sha256.c, crypto/x509/pcy_cache.c, crypto/x509/pcy_local.h, crypto/x509/pcy_node.c, crypto/x509/pcy_tree.c, crypto/x509/x509_vpm.c\n\n/*\n * Copyright 2004-2023 The OpenSSL Project Authors. All Rights Reserved.\n *\n * Licensed under the Apache License 2.0 (the \"License\"). You may not use\n * this file except in compliance with the License. You can obtain a copy\n * in the file LICENSE in the source distribution or at\n * https://www.openssl.org/source/license.html\n */\n\nFiles: crypto/LPdir_unix.c\n\n/*\n * This file is dual-licensed and is also available under the following\n * terms:\n *\n * Copyright (c) 2004, 2018, Richard Levitte <richard@levitte.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nFiles: crypto/LPdir_vms.c, crypto/LPdir_win.c, crypto/LPdir_win32.c, crypto/LPdir_wince.c\n\n/*\n * This file is dual-licensed and is also available under the following\n * terms:\n *\n * Copyright (c) 2004, Richard Levitte <richard@levitte.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * ``Line truncated
|
"text": "Files: crypto/LPdir_nyi.c, crypto/LPdir_vms.c, crypto/LPdir_win.c, crypto/LPdir_win32.c, crypto/LPdir_wince.c, crypto/x509/v3_pcia.c\n\n/*\n * Copyright 2004-2016 The OpenSSL Project Authors. All Rights Reserved.\n *\n * Licensed under the Apache License 2.0 (the \"License\"). You may not use\n * this file except in compliance with the License. You can obtain a copy\n * in the file LICENSE in the source distribution or at\n * https://www.openssl.org/source/license.html\n */\n\nFiles: crypto/LPdir_nyi.c, include/internal/o_dir.h\n\n/*\n * This file is dual-licensed and is also available under the following\n * terms:\n *\n * Copyright (c) 2004, Richard Levitte <richard@levitte.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\nFiles: crypto/LPdir_unix.c, crypto/sha/sha256.c, crypto/x509/pcy_cache.c, crypto/x509/pcy_local.h, crypto/x509/pcy_node.c, crypto/x509/pcy_tree.c, crypto/x509/x509_vpm.c\n\n/*\n * Copyright 2004-2023 The OpenSSL Project Authors. All Rights Reserved.\n *\n * Licensed under the Apache License 2.0 (the \"License\"). You may not use\n * this file except in compliance with the License. You can obtain a copy\n * in the file LICENSE in the source distribution or at\n * https://www.openssl.org/source/license.html\n */\n\nFiles: crypto/LPdir_unix.c\n\n/*\n * This file is dual-licensed and is also available under the following\n * terms:\n *\n * Copyright (c) 2004, 2018, Richard Levitte <richard@levitte.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nFiles: crypto/LPdir_vms.c, crypto/LPdir_win.c, crypto/LPdir_win32.c, crypto/LPdir_wince.c\n\n/*\n * This file is dual-licensed and is also available under the following\n * terms:\n *\n * Copyright (c) 2004, Richard Levitte <richard@levitte.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * ``Line truncated
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"buildSourceURL": "https://github.com/kunkundi/minirtc/tree/6286ae6c1c015609d3070cc139e5feea900caf7c/thirdparty/openssl"
|
"buildSourceURL": "https://github.com/kunkundi/minirtc/tree/24d9d9deefb95ede2cdb18e77cb01350101f70f8/thirdparty/openssl"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "libopus",
|
"id": "libopus",
|
||||||
@@ -623,9 +623,9 @@
|
|||||||
{
|
{
|
||||||
"id": "webrtc",
|
"id": "webrtc",
|
||||||
"name": "WebRTC-derived code in MiniRTC",
|
"name": "WebRTC-derived code in MiniRTC",
|
||||||
"version": "6286ae6c1c015609d3070cc139e5feea900caf7c",
|
"version": "24d9d9deefb95ede2cdb18e77cb01350101f70f8",
|
||||||
"license": "BSD-3-Clause and patent grant",
|
"license": "BSD-3-Clause and patent grant",
|
||||||
"sourceURL": "https://github.com/kunkundi/minirtc/tree/6286ae6c1c015609d3070cc139e5feea900caf7c",
|
"sourceURL": "https://github.com/kunkundi/minirtc/tree/24d9d9deefb95ede2cdb18e77cb01350101f70f8",
|
||||||
"documents": [
|
"documents": [
|
||||||
{
|
{
|
||||||
"title": "deps/submodules/minirtc/thirdparty/webrtc/LICENSE",
|
"title": "deps/submodules/minirtc/thirdparty/webrtc/LICENSE",
|
||||||
@@ -653,7 +653,7 @@
|
|||||||
"text": "Files: websocketpp/base64/base64.hpp\n\n/*\n ******\n base64.hpp is a repackaging of the base64.cpp and base64.h files into a\n single header suitable for use as a header only library. This conversion was\n done by Peter Thorson (webmaster@zaphoyd.com) in 2012. All modifications to\n the code are redistributed under the same license as the original, which is\n listed below.\n ******\n\n base64.cpp and base64.h\n\n Copyright (C) 2004-2008 René Nyffenegger\n\n This source code is provided 'as-is', without any express or implied\n warranty. In no event will the author be held liable for any damages\n arising from the use of this software.\n\n Permission is granted to anyone to use this software for any purpose,\n including commercial applications, and to alter it and redistribute it\n freely, subject to the following restrictions:\n\n 1. The origin of this source code must not be misrepresented; you must not\n claim that you wrote the original source code. If you use this source code\n in a product, an acknowledgment in the product documentation would be\n appreciated but is not required.\n\n 2. Altered source versions must be plainly marked as such, and must not be\n misrepresented as being the original source code.\n\n 3. This notice may not be removed or altered from any source distribution.\n\n René Nyffenegger rene.nyffenegger@adp-gmbh.ch\n\n*/\n\nFiles: websocketpp/client.hpp, websocketpp/close.hpp, websocketpp/common/connection_hdl.hpp, websocketpp/common/cpp11.hpp, websocketpp/common/functional.hpp, websocketpp/common/memory.hpp, websocketpp/common/network.hpp, websocketpp/common/platforms.hpp, websocketpp/common/random.hpp, websocketpp/common/regex.hpp, websocketpp/common/stdint.hpp, websocketpp/common/system_error.hpp, websocketpp/common/time.hpp, websocketpp/concurrency/basic.hpp, websocketpp/concurrency/none.hpp, websocketpp/config/asio.hpp, websocketpp/config/asio_client.hpp, websocketpp/config/asio_no_tls.hpp, websocketpp/config/asio_no_tls_client.hpp, websocketpp/config/boost_config.hpp, websocketpp/config/core.hpp, websocketpp/config/core_client.hpp, websocketpp/config/debug.hpp, websocketpp/config/debug_asio.hpp, websocketpp/config/debug_asio_no_tls.hpp, websocketpp/config/minimal_client.hpp, websocketpp/config/minimal_server.hpp, websocketpp/connection.hpp, websocketpp/connection_base.hpp, websocketpp/endpoint.hpp, websocketpp/endpoint_base.hpp, websocketpp/error.hpp, websocketpp/extensions/extension.hpp, websocketpp/extensions/permessage_deflate/disabled.hpp, websocketpp/frame.hpp, websocketpp/http/constants.hpp, websocketpp/http/impl/parser.hpp, websocketpp/http/impl/request.hpp, websocketpp/http/impl/response.hpp, websocketpp/http/parser.hpp, websocketpp/http/request.hpp, websocketpp/http/response.hpp, websocketpp/impl/connection_impl.hpp, websocketpp/impl/endpoint_impl.hpp, websocketpp/impl/utilities_impl.hpp, websocketpp/logger/basic.hpp, websocketpp/logger/levels.hpp, websocketpp/logger/stub.hpp, websocketpp/message_buffer/alloc.hpp, websocketpp/message_buffer/message.hpp, websocketpp/message_buffer/pool.hpp, websocketpp/processors/base.hpp, websocketpp/processors/hybi00.hpp, websocketpp/processors/hybi07.hpp, websocketpp/processors/hybi08.hpp, websocketpp/random/none.hpp, websocketpp/random/random_device.hpp, websocketpp/roles/client_endpoint.hpp, websocketpp/roles/server_endpoint.hpp, websocketpp/server.hpp, websocketpp/transport/base/connection.hpp, websocketpp/transport/base/endpoint.hpp, websocketpp/transport/debug/base.hpp, websocketpp/transport/debug/connection.hpp, websocketpp/transport/debug/endpoint.hpp, websocketpp/transport/iostream/base.hpp, websocketpp/transport/iostream/connection.hpp, websocketpp/transport/iostream/endpoint.hpp, websocketpp/transport/stub/base.hpp, websocketpp/transport/stub/connection.hpp, websocketpp/transport/stub/endpoint.hpp, websocketpp/uri.hpp, websocketpp/utilities.hpp\n\n/*\n * Copyright (c) 2014, Peter Thorson. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * * Neither the name of the WebSocket++ Project nor the\n * names of its contributors may be used to endorse or promote products\n * derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MLine truncated
|
"text": "Files: websocketpp/base64/base64.hpp\n\n/*\n ******\n base64.hpp is a repackaging of the base64.cpp and base64.h files into a\n single header suitable for use as a header only library. This conversion was\n done by Peter Thorson (webmaster@zaphoyd.com) in 2012. All modifications to\n the code are redistributed under the same license as the original, which is\n listed below.\n ******\n\n base64.cpp and base64.h\n\n Copyright (C) 2004-2008 René Nyffenegger\n\n This source code is provided 'as-is', without any express or implied\n warranty. In no event will the author be held liable for any damages\n arising from the use of this software.\n\n Permission is granted to anyone to use this software for any purpose,\n including commercial applications, and to alter it and redistribute it\n freely, subject to the following restrictions:\n\n 1. The origin of this source code must not be misrepresented; you must not\n claim that you wrote the original source code. If you use this source code\n in a product, an acknowledgment in the product documentation would be\n appreciated but is not required.\n\n 2. Altered source versions must be plainly marked as such, and must not be\n misrepresented as being the original source code.\n\n 3. This notice may not be removed or altered from any source distribution.\n\n René Nyffenegger rene.nyffenegger@adp-gmbh.ch\n\n*/\n\nFiles: websocketpp/client.hpp, websocketpp/close.hpp, websocketpp/common/connection_hdl.hpp, websocketpp/common/cpp11.hpp, websocketpp/common/functional.hpp, websocketpp/common/memory.hpp, websocketpp/common/network.hpp, websocketpp/common/platforms.hpp, websocketpp/common/random.hpp, websocketpp/common/regex.hpp, websocketpp/common/stdint.hpp, websocketpp/common/system_error.hpp, websocketpp/common/time.hpp, websocketpp/concurrency/basic.hpp, websocketpp/concurrency/none.hpp, websocketpp/config/asio.hpp, websocketpp/config/asio_client.hpp, websocketpp/config/asio_no_tls.hpp, websocketpp/config/asio_no_tls_client.hpp, websocketpp/config/boost_config.hpp, websocketpp/config/core.hpp, websocketpp/config/core_client.hpp, websocketpp/config/debug.hpp, websocketpp/config/debug_asio.hpp, websocketpp/config/debug_asio_no_tls.hpp, websocketpp/config/minimal_client.hpp, websocketpp/config/minimal_server.hpp, websocketpp/connection.hpp, websocketpp/connection_base.hpp, websocketpp/endpoint.hpp, websocketpp/endpoint_base.hpp, websocketpp/error.hpp, websocketpp/extensions/extension.hpp, websocketpp/extensions/permessage_deflate/disabled.hpp, websocketpp/frame.hpp, websocketpp/http/constants.hpp, websocketpp/http/impl/parser.hpp, websocketpp/http/impl/request.hpp, websocketpp/http/impl/response.hpp, websocketpp/http/parser.hpp, websocketpp/http/request.hpp, websocketpp/http/response.hpp, websocketpp/impl/connection_impl.hpp, websocketpp/impl/endpoint_impl.hpp, websocketpp/impl/utilities_impl.hpp, websocketpp/logger/basic.hpp, websocketpp/logger/levels.hpp, websocketpp/logger/stub.hpp, websocketpp/message_buffer/alloc.hpp, websocketpp/message_buffer/message.hpp, websocketpp/message_buffer/pool.hpp, websocketpp/processors/base.hpp, websocketpp/processors/hybi00.hpp, websocketpp/processors/hybi07.hpp, websocketpp/processors/hybi08.hpp, websocketpp/random/none.hpp, websocketpp/random/random_device.hpp, websocketpp/roles/client_endpoint.hpp, websocketpp/roles/server_endpoint.hpp, websocketpp/server.hpp, websocketpp/transport/base/connection.hpp, websocketpp/transport/base/endpoint.hpp, websocketpp/transport/debug/base.hpp, websocketpp/transport/debug/connection.hpp, websocketpp/transport/debug/endpoint.hpp, websocketpp/transport/iostream/base.hpp, websocketpp/transport/iostream/connection.hpp, websocketpp/transport/iostream/endpoint.hpp, websocketpp/transport/stub/base.hpp, websocketpp/transport/stub/connection.hpp, websocketpp/transport/stub/endpoint.hpp, websocketpp/uri.hpp, websocketpp/utilities.hpp\n\n/*\n * Copyright (c) 2014, Peter Thorson. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * * Neither the name of the WebSocket++ Project nor the\n * names of its contributors may be used to endorse or promote products\n * derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MLine truncated
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"buildSourceURL": "https://github.com/kunkundi/minirtc/tree/6286ae6c1c015609d3070cc139e5feea900caf7c/thirdparty/websocketpp"
|
"buildSourceURL": "https://github.com/kunkundi/minirtc/tree/24d9d9deefb95ede2cdb18e77cb01350101f70f8/thirdparty/websocketpp"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "zlib",
|
"id": "zlib",
|
||||||
|
|||||||
@@ -241,12 +241,12 @@
|
|||||||
{
|
{
|
||||||
"id": "inih",
|
"id": "inih",
|
||||||
"name": "inih / INIReader",
|
"name": "inih / INIReader",
|
||||||
"version": "6286ae6c1c015609d3070cc139e5feea900caf7c",
|
"version": "24d9d9deefb95ede2cdb18e77cb01350101f70f8",
|
||||||
"license": "BSD-3-Clause",
|
"license": "BSD-3-Clause",
|
||||||
"source": {
|
"source": {
|
||||||
"kind": "repository",
|
"kind": "repository",
|
||||||
"url": "https://github.com/kunkundi/minirtc",
|
"url": "https://github.com/kunkundi/minirtc",
|
||||||
"revision": "6286ae6c1c015609d3070cc139e5feea900caf7c"
|
"revision": "24d9d9deefb95ede2cdb18e77cb01350101f70f8"
|
||||||
},
|
},
|
||||||
"documents": [
|
"documents": [
|
||||||
{
|
{
|
||||||
@@ -527,12 +527,12 @@
|
|||||||
{
|
{
|
||||||
"id": "minirtc",
|
"id": "minirtc",
|
||||||
"name": "MiniRTC",
|
"name": "MiniRTC",
|
||||||
"version": "6286ae6c1c015609d3070cc139e5feea900caf7c",
|
"version": "24d9d9deefb95ede2cdb18e77cb01350101f70f8",
|
||||||
"license": "LGPL-3.0-only",
|
"license": "LGPL-3.0-only",
|
||||||
"source": {
|
"source": {
|
||||||
"kind": "repository",
|
"kind": "repository",
|
||||||
"url": "https://github.com/kunkundi/minirtc",
|
"url": "https://github.com/kunkundi/minirtc",
|
||||||
"revision": "6286ae6c1c015609d3070cc139e5feea900caf7c"
|
"revision": "24d9d9deefb95ede2cdb18e77cb01350101f70f8"
|
||||||
},
|
},
|
||||||
"documents": [
|
"documents": [
|
||||||
{
|
{
|
||||||
@@ -833,12 +833,12 @@
|
|||||||
{
|
{
|
||||||
"id": "webrtc",
|
"id": "webrtc",
|
||||||
"name": "WebRTC-derived code in MiniRTC",
|
"name": "WebRTC-derived code in MiniRTC",
|
||||||
"version": "6286ae6c1c015609d3070cc139e5feea900caf7c",
|
"version": "24d9d9deefb95ede2cdb18e77cb01350101f70f8",
|
||||||
"license": "BSD-3-Clause and patent grant",
|
"license": "BSD-3-Clause and patent grant",
|
||||||
"source": {
|
"source": {
|
||||||
"kind": "repository",
|
"kind": "repository",
|
||||||
"url": "https://github.com/kunkundi/minirtc",
|
"url": "https://github.com/kunkundi/minirtc",
|
||||||
"revision": "6286ae6c1c015609d3070cc139e5feea900caf7c"
|
"revision": "24d9d9deefb95ede2cdb18e77cb01350101f70f8"
|
||||||
},
|
},
|
||||||
"documents": [
|
"documents": [
|
||||||
{
|
{
|
||||||
@@ -898,7 +898,7 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"bundle_sha256": "09376251bbda3f5a1f7112f15dcbb1259fef7898f85b45aacafa767348aafdc2",
|
"bundle_sha256": "58702163ac79d8821007b1ae44ef054cf1d9a3cec9d6334b852f0bbe99b5af01",
|
||||||
"toolchain": {
|
"toolchain": {
|
||||||
"xmake_version": "3.1.1",
|
"xmake_version": "3.1.1",
|
||||||
"xmake_repository_revision": "121109352da272cd1a3d4ed52f2dcda34f839955"
|
"xmake_repository_revision": "121109352da272cd1a3d4ed52f2dcda34f839955"
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* @Author: DI JUNKUN
|
||||||
|
* @Date: 2026-09-28
|
||||||
|
* Copyright (c) 2026 by DI JUNKUN, All Rights Reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _APP_VERSION_H_
|
||||||
|
#define _APP_VERSION_H_
|
||||||
|
|
||||||
|
#include <optional>
|
||||||
|
#include <string>
|
||||||
|
#include <string_view>
|
||||||
|
|
||||||
|
namespace crossdesk {
|
||||||
|
|
||||||
|
struct VersionInfo {
|
||||||
|
std::string version;
|
||||||
|
std::string release_name;
|
||||||
|
std::string release_notes;
|
||||||
|
std::string release_date;
|
||||||
|
int patch = -1;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Shared desktop release parsing and comparison for desktop and iOS controllers.
|
||||||
|
std::optional<VersionInfo> ParseVersionInfoJSON(std::string_view json);
|
||||||
|
bool IsValidAppVersion(const std::string& version);
|
||||||
|
|
||||||
|
bool IsNewerVersion(const std::string& current, const std::string& latest);
|
||||||
|
|
||||||
|
// Pass latest_patch < 0 when patch metadata is unavailable.
|
||||||
|
bool IsNewerVersionWithMetadata(const std::string& current,
|
||||||
|
const std::string& latest,
|
||||||
|
const std::string& latest_date,
|
||||||
|
int latest_patch);
|
||||||
|
|
||||||
|
// Returns the latest release label when the peer is older. Missing or invalid
|
||||||
|
// peer versions are treated as legacy; the latest release must still be valid.
|
||||||
|
std::optional<std::string> AvailableAppUpdate(const std::string& current,
|
||||||
|
const VersionInfo& latest);
|
||||||
|
|
||||||
|
} // namespace crossdesk
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -119,6 +119,8 @@ struct CursorState {
|
|||||||
struct HostInfo {
|
struct HostInfo {
|
||||||
char host_name[64];
|
char host_name[64];
|
||||||
std::size_t host_name_size;
|
std::size_t host_name_size;
|
||||||
|
// Optional; an empty string means the peer version is unknown.
|
||||||
|
char app_version[64];
|
||||||
char** display_list;
|
char** display_list;
|
||||||
std::size_t display_num;
|
std::size_t display_num;
|
||||||
int* left;
|
int* left;
|
||||||
@@ -213,9 +215,11 @@ struct HostDisplay {
|
|||||||
// heap-allocated with the same layout the decoder produces; release the
|
// heap-allocated with the same layout the decoder produces; release the
|
||||||
// result with FreeRemoteAction. An allocation failure yields an empty display
|
// result with FreeRemoteAction. An allocation failure yields an empty display
|
||||||
// list rather than a partially filled one.
|
// list rather than a partially filled one.
|
||||||
|
// Missing or oversized app versions are advertised as unknown (empty).
|
||||||
RemoteAction MakeHostInformation(const std::string& host_name,
|
RemoteAction MakeHostInformation(const std::string& host_name,
|
||||||
const std::vector<HostDisplay>& displays,
|
const std::vector<HostDisplay>& displays,
|
||||||
bool supports_privacy_screen);
|
bool supports_privacy_screen,
|
||||||
|
const std::string& app_version = {});
|
||||||
|
|
||||||
} // namespace crossdesk
|
} // namespace crossdesk
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,368 @@
|
|||||||
|
#include <app_version.h>
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cctype>
|
||||||
|
#include <limits>
|
||||||
|
#include <sstream>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include <nlohmann/json.hpp>
|
||||||
|
|
||||||
|
namespace crossdesk {
|
||||||
|
|
||||||
|
std::vector<int> SplitVersion(const std::string& ver);
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
constexpr size_t kMaxInlinePatchDigits = 4;
|
||||||
|
|
||||||
|
struct ParsedVersion {
|
||||||
|
std::vector<int> numbers;
|
||||||
|
std::string date;
|
||||||
|
bool has_patch = false;
|
||||||
|
int patch = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool IsDigit(char c) {
|
||||||
|
return std::isdigit(static_cast<unsigned char>(c)) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsAlphaNumeric(char c) {
|
||||||
|
return std::isalnum(static_cast<unsigned char>(c)) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsAllDigits(const std::string& value) {
|
||||||
|
if (value.empty()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (char c : value) {
|
||||||
|
if (!IsDigit(c)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TryParseNonNegativeInt(const std::string& value, int* result) {
|
||||||
|
if (!IsAllDigits(value)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const long long parsed = std::stoll(value);
|
||||||
|
if (parsed > std::numeric_limits<int>::max()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
*result = static_cast<int>(parsed);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TryParseInlinePatch(const std::string& value, int* result) {
|
||||||
|
if (value.size() > kMaxInlinePatchDigits) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TryParseNonNegativeInt(value, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t FindNumericStart(const std::string& version) {
|
||||||
|
size_t start = 0;
|
||||||
|
while (start < version.size() && !IsDigit(version[start])) {
|
||||||
|
start++;
|
||||||
|
}
|
||||||
|
return start;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t FindNumericEnd(const std::string& version, size_t start) {
|
||||||
|
size_t end = start;
|
||||||
|
while (end < version.size() &&
|
||||||
|
(IsDigit(version[end]) || version[end] == '.')) {
|
||||||
|
end++;
|
||||||
|
}
|
||||||
|
return end;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HasDigitBoundary(const std::string& value, size_t pos, size_t len) {
|
||||||
|
const bool before_ok = pos == 0 || !IsDigit(value[pos - 1]);
|
||||||
|
const size_t end = pos + len;
|
||||||
|
const bool after_ok = end >= value.size() || !IsDigit(value[end]);
|
||||||
|
return before_ok && after_ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsCompactDateAt(const std::string& value, size_t pos) {
|
||||||
|
if (pos + 8 > value.size() || !HasDigitBoundary(value, pos, 8)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t i = 0; i < 8; ++i) {
|
||||||
|
if (!IsDigit(value[pos + i])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string CompactDateToIso(const std::string& compact_date) {
|
||||||
|
return compact_date.substr(0, 4) + "-" + compact_date.substr(4, 2) + "-" +
|
||||||
|
compact_date.substr(6, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ExtractDateFromText(const std::string& value,
|
||||||
|
std::string* date,
|
||||||
|
size_t* date_end) {
|
||||||
|
for (size_t i = 0; i < value.size(); ++i) {
|
||||||
|
if (IsCompactDateAt(value, i)) {
|
||||||
|
*date = CompactDateToIso(value.substr(i, 8));
|
||||||
|
*date_end = i + 8;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ParsedVersion ParseVersion(const std::string& version) {
|
||||||
|
const size_t numeric_start = FindNumericStart(version);
|
||||||
|
const size_t numeric_end = FindNumericEnd(version, numeric_start);
|
||||||
|
|
||||||
|
ParsedVersion parsed;
|
||||||
|
parsed.numbers = SplitVersion(version.substr(numeric_start,
|
||||||
|
numeric_end - numeric_start));
|
||||||
|
|
||||||
|
const std::string suffix = version.substr(numeric_end);
|
||||||
|
size_t pos = 0;
|
||||||
|
while (pos < suffix.size()) {
|
||||||
|
while (pos < suffix.size() && !IsAlphaNumeric(suffix[pos])) {
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
|
||||||
|
const size_t token_start = pos;
|
||||||
|
while (pos < suffix.size() && IsAlphaNumeric(suffix[pos])) {
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (token_start == pos) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string token = suffix.substr(token_start, pos - token_start);
|
||||||
|
if (parsed.date.empty() && IsCompactDateAt(token, 0)) {
|
||||||
|
parsed.date = CompactDateToIso(token);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
int patch = 0;
|
||||||
|
if (!parsed.has_patch && TryParseInlinePatch(token, &patch)) {
|
||||||
|
parsed.has_patch = true;
|
||||||
|
parsed.patch = patch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return parsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CompareNumericVersion(const std::vector<int>& current,
|
||||||
|
const std::vector<int>& latest) {
|
||||||
|
std::vector<int> current_parts = current;
|
||||||
|
std::vector<int> latest_parts = latest;
|
||||||
|
const size_t len = std::max(current_parts.size(), latest_parts.size());
|
||||||
|
current_parts.resize(len, 0);
|
||||||
|
latest_parts.resize(len, 0);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < len; ++i) {
|
||||||
|
if (latest_parts[i] > current_parts[i]) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (latest_parts[i] < current_parts[i]) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ReadPatchField(const nlohmann::json& json, int* patch) {
|
||||||
|
if (!json.contains("patch")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto& patch_value = json["patch"];
|
||||||
|
if (patch_value.is_number_unsigned()) {
|
||||||
|
const auto parsed = patch_value.get<unsigned long long>();
|
||||||
|
if (parsed > static_cast<unsigned long long>(std::numeric_limits<int>::max())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
*patch = static_cast<int>(parsed);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (patch_value.is_number_integer()) {
|
||||||
|
const long long parsed = patch_value.get<long long>();
|
||||||
|
if (parsed < 0 || parsed > std::numeric_limits<int>::max()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
*patch = static_cast<int>(parsed);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (patch_value.is_string()) {
|
||||||
|
return TryParseNonNegativeInt(patch_value.get<std::string>(), patch);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
std::string ExtractNumericPart(const std::string& ver) {
|
||||||
|
const size_t start = FindNumericStart(ver);
|
||||||
|
const size_t end = FindNumericEnd(ver, start);
|
||||||
|
return ver.substr(start, end - start);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<int> SplitVersion(const std::string& ver) {
|
||||||
|
std::vector<int> nums;
|
||||||
|
std::istringstream ss(ver);
|
||||||
|
std::string token;
|
||||||
|
while (std::getline(ss, token, '.')) {
|
||||||
|
try {
|
||||||
|
nums.push_back(std::stoi(token));
|
||||||
|
} catch (...) {
|
||||||
|
nums.push_back(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nums;
|
||||||
|
}
|
||||||
|
|
||||||
|
// extract date from version string (format: v1.2.3-20251113-abc
|
||||||
|
// or 1.2.3-20251113-abc)
|
||||||
|
std::string ExtractDateFromVersion(const std::string& version) {
|
||||||
|
const size_t numeric_start = FindNumericStart(version);
|
||||||
|
const size_t numeric_end = FindNumericEnd(version, numeric_start);
|
||||||
|
const std::string suffix = version.substr(numeric_end);
|
||||||
|
std::string date;
|
||||||
|
size_t date_end = 0;
|
||||||
|
if (ExtractDateFromText(suffix, &date, &date_end)) {
|
||||||
|
return date;
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
// compare two dates in YYYY-MM-DD format
|
||||||
|
bool IsNewerDate(const std::string& date1, const std::string& date2) {
|
||||||
|
if (date1.empty() || date2.empty()) return false;
|
||||||
|
// simple string comparison works for ISO date format (YYYY-MM-DD)
|
||||||
|
return date2 > date1;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsNewerVersion(const std::string& current, const std::string& latest) {
|
||||||
|
return IsNewerVersionWithMetadata(current, latest, "", -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsNewerVersionWithMetadata(const std::string& current,
|
||||||
|
const std::string& latest,
|
||||||
|
const std::string& latest_date,
|
||||||
|
int latest_patch) {
|
||||||
|
(void)latest_date;
|
||||||
|
|
||||||
|
const ParsedVersion current_version = ParseVersion(current);
|
||||||
|
const ParsedVersion latest_version = ParseVersion(latest);
|
||||||
|
|
||||||
|
const int numeric_compare =
|
||||||
|
CompareNumericVersion(current_version.numbers, latest_version.numbers);
|
||||||
|
if (numeric_compare > 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (numeric_compare < 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const bool metadata_has_patch = latest_patch >= 0;
|
||||||
|
const bool latest_has_patch = metadata_has_patch || latest_version.has_patch;
|
||||||
|
if (latest_has_patch || current_version.has_patch) {
|
||||||
|
const int resolved_latest_patch =
|
||||||
|
metadata_has_patch ? latest_patch
|
||||||
|
: (latest_version.has_patch ? latest_version.patch
|
||||||
|
: 0);
|
||||||
|
const int resolved_current_patch =
|
||||||
|
current_version.has_patch ? current_version.patch : 0;
|
||||||
|
return resolved_latest_patch > resolved_current_patch;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<VersionInfo> ParseVersionInfo(const nlohmann::json& json) {
|
||||||
|
if (!json.is_object()) {
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
const auto read_string = [&](const char* key) -> std::string {
|
||||||
|
const auto it = json.find(key);
|
||||||
|
return it != json.end() && it->is_string() ? it->get<std::string>()
|
||||||
|
: std::string{};
|
||||||
|
};
|
||||||
|
VersionInfo info;
|
||||||
|
info.version = read_string("latest_version");
|
||||||
|
if (info.version.empty()) {
|
||||||
|
info.version = read_string("version");
|
||||||
|
}
|
||||||
|
if (!info.version.empty() &&
|
||||||
|
(info.version.front() == 'v' || info.version.front() == 'V')) {
|
||||||
|
info.version.erase(0, 1);
|
||||||
|
}
|
||||||
|
// Invalid/missing version data is a failed check, never "up to date".
|
||||||
|
const auto numeric_end = FindNumericEnd(info.version, 0);
|
||||||
|
if (numeric_end == 0 || info.version[numeric_end - 1] == '.' ||
|
||||||
|
(numeric_end < info.version.size() &&
|
||||||
|
(numeric_end + 1 == info.version.size() ||
|
||||||
|
(info.version[numeric_end] != '-' && info.version[numeric_end] != '+')))) {
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
std::istringstream parts(info.version.substr(0, numeric_end));
|
||||||
|
std::string part;
|
||||||
|
int number = 0;
|
||||||
|
while (std::getline(parts, part, '.')) {
|
||||||
|
if (!TryParseNonNegativeInt(part, &number)) {
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
info.release_name = read_string("releaseName");
|
||||||
|
info.release_notes = read_string("releaseNotes");
|
||||||
|
info.release_date = read_string("releaseDate");
|
||||||
|
ReadPatchField(json, &info.patch);
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<VersionInfo> ParseVersionInfoJSON(std::string_view json) {
|
||||||
|
try {
|
||||||
|
return ParseVersionInfo(nlohmann::json::parse(json));
|
||||||
|
} catch (const nlohmann::json::exception&) {
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsValidAppVersion(const std::string& version) {
|
||||||
|
return ParseVersionInfo(nlohmann::json{{"version", version}}).has_value();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<std::string> AvailableAppUpdate(const std::string& current,
|
||||||
|
const VersionInfo& latest) {
|
||||||
|
if (!IsValidAppVersion(latest.version) ||
|
||||||
|
(IsValidAppVersion(current) &&
|
||||||
|
!IsNewerVersionWithMetadata(current, latest.version,
|
||||||
|
latest.release_date, latest.patch))) {
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
// Include the effective patch even when it exists only in release metadata.
|
||||||
|
// Build dates and hashes do not participate in release ordering.
|
||||||
|
const auto parsed = ParseVersion(latest.version);
|
||||||
|
std::string label = ExtractNumericPart(latest.version);
|
||||||
|
const int patch = latest.patch >= 0 ? latest.patch : parsed.patch;
|
||||||
|
if (patch > 0) label += "-" + std::to_string(patch);
|
||||||
|
return label;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace crossdesk
|
||||||
@@ -16,6 +16,7 @@ using json = nlohmann::json;
|
|||||||
void ResetHostInfo(HostInfo& info) {
|
void ResetHostInfo(HostInfo& info) {
|
||||||
info.host_name[0] = '\0';
|
info.host_name[0] = '\0';
|
||||||
info.host_name_size = 0;
|
info.host_name_size = 0;
|
||||||
|
info.app_version[0] = '\0';
|
||||||
info.display_list = nullptr;
|
info.display_list = nullptr;
|
||||||
info.display_num = 0;
|
info.display_num = 0;
|
||||||
info.left = nullptr;
|
info.left = nullptr;
|
||||||
@@ -50,7 +51,8 @@ char* DuplicateString(const std::string& value) {
|
|||||||
|
|
||||||
RemoteAction MakeHostInformation(const std::string& host_name,
|
RemoteAction MakeHostInformation(const std::string& host_name,
|
||||||
const std::vector<HostDisplay>& displays,
|
const std::vector<HostDisplay>& displays,
|
||||||
bool supports_privacy_screen) {
|
bool supports_privacy_screen,
|
||||||
|
const std::string& app_version) {
|
||||||
RemoteAction action{};
|
RemoteAction action{};
|
||||||
action.type = ControlType::host_infomation;
|
action.type = ControlType::host_infomation;
|
||||||
ResetHostInfo(action.i);
|
ResetHostInfo(action.i);
|
||||||
@@ -76,6 +78,11 @@ RemoteAction MakeHostInformation(const std::string& host_name,
|
|||||||
std::memcpy(action.i.host_name, host_name.data(), name_size);
|
std::memcpy(action.i.host_name, host_name.data(), name_size);
|
||||||
action.i.host_name[name_size] = '\0';
|
action.i.host_name[name_size] = '\0';
|
||||||
action.i.host_name_size = name_size;
|
action.i.host_name_size = name_size;
|
||||||
|
// Never advertise a truncated version as a different, valid release.
|
||||||
|
if (app_version.size() < sizeof(action.i.app_version) &&
|
||||||
|
app_version.find('\0') == std::string::npos) {
|
||||||
|
std::memcpy(action.i.app_version, app_version.c_str(), app_version.size() + 1);
|
||||||
|
}
|
||||||
return action;
|
return action;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -184,6 +191,7 @@ std::string RemoteAction::ToJson(const RemoteAction& action) {
|
|||||||
}
|
}
|
||||||
object["host_info"] = {
|
object["host_info"] = {
|
||||||
{"host_name", action.i.host_name},
|
{"host_name", action.i.host_name},
|
||||||
|
{"app_version", action.i.app_version},
|
||||||
{"display_num", action.i.display_num},
|
{"display_num", action.i.display_num},
|
||||||
{"displays", displays},
|
{"displays", displays},
|
||||||
{"supports_privacy_screen", action.i.supports_privacy_screen},
|
{"supports_privacy_screen", action.i.supports_privacy_screen},
|
||||||
@@ -360,6 +368,14 @@ bool RemoteAction::FromJson(const std::string& json_string,
|
|||||||
ResetHostInfo(output.i);
|
ResetHostInfo(output.i);
|
||||||
owns_host_info = true;
|
owns_host_info = true;
|
||||||
const auto& host_info_object = object.at("host_info");
|
const auto& host_info_object = object.at("host_info");
|
||||||
|
const auto app_version = host_info_object.find("app_version");
|
||||||
|
if (app_version != host_info_object.end() && app_version->is_string()) {
|
||||||
|
const auto& version = app_version->get_ref<const std::string&>();
|
||||||
|
if (version.size() < sizeof(output.i.app_version) &&
|
||||||
|
version.find('\0') == std::string::npos) {
|
||||||
|
std::memcpy(output.i.app_version, version.c_str(), version.size() + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
const auto privacy_support =
|
const auto privacy_support =
|
||||||
host_info_object.find("supports_privacy_screen");
|
host_info_object.find("supports_privacy_screen");
|
||||||
output.i.supports_privacy_screen =
|
output.i.supports_privacy_screen =
|
||||||
|
|||||||
@@ -134,6 +134,7 @@ int main() {
|
|||||||
crossdesk::RemoteAction host{};
|
crossdesk::RemoteAction host{};
|
||||||
host.type = crossdesk::ControlType::host_infomation;
|
host.type = crossdesk::ControlType::host_infomation;
|
||||||
std::strcpy(host.i.host_name, "Test Mac");
|
std::strcpy(host.i.host_name, "Test Mac");
|
||||||
|
std::strcpy(host.i.app_version, "1.5.3-2-20260928");
|
||||||
host.i.host_name_size = std::strlen(host.i.host_name);
|
host.i.host_name_size = std::strlen(host.i.host_name);
|
||||||
host.i.display_list = display_names;
|
host.i.display_list = display_names;
|
||||||
host.i.display_num = 1;
|
host.i.display_num = 1;
|
||||||
@@ -145,6 +146,7 @@ int main() {
|
|||||||
ok &= Expect(parsed_host.from_json(host.to_json()) &&
|
ok &= Expect(parsed_host.from_json(host.to_json()) &&
|
||||||
parsed_host.i.display_num == 1 &&
|
parsed_host.i.display_num == 1 &&
|
||||||
std::string(parsed_host.i.host_name) == "Test Mac" &&
|
std::string(parsed_host.i.host_name) == "Test Mac" &&
|
||||||
|
std::string(parsed_host.i.app_version) == "1.5.3-2-20260928" &&
|
||||||
std::string(parsed_host.i.display_list[0]) ==
|
std::string(parsed_host.i.display_list[0]) ==
|
||||||
"Built-in Display" &&
|
"Built-in Display" &&
|
||||||
parsed_host.i.right[0] == 2560 &&
|
parsed_host.i.right[0] == 2560 &&
|
||||||
@@ -152,6 +154,34 @@ int main() {
|
|||||||
"host information JSON round trip failed");
|
"host information JSON round trip failed");
|
||||||
crossdesk::FreeRemoteAction(parsed_host);
|
crossdesk::FreeRemoteAction(parsed_host);
|
||||||
|
|
||||||
|
auto advertised = crossdesk::MakeHostInformation("Host", {}, true,
|
||||||
|
"1.5.3-20260928");
|
||||||
|
ok &= Expect(parsed_host.from_json(advertised.to_json()) &&
|
||||||
|
std::string(parsed_host.i.app_version) == "1.5.3-20260928",
|
||||||
|
"host factory should advertise the app version");
|
||||||
|
crossdesk::FreeRemoteAction(parsed_host);
|
||||||
|
crossdesk::FreeRemoteAction(advertised);
|
||||||
|
|
||||||
|
// Missing and malformed optional versions must not break legacy host info.
|
||||||
|
for (const auto& version_field : std::vector<std::string>{
|
||||||
|
"", ",\"app_version\":null", ",\"app_version\":123",
|
||||||
|
",\"app_version\":\"\"",
|
||||||
|
",\"app_version\":\"1.5.3\\u0000unexpected\"",
|
||||||
|
",\"app_version\":\"" + std::string(64, '1') + "\""}) {
|
||||||
|
const auto message =
|
||||||
|
"{\"type\":3,\"host_info\":{\"host_name\":\"Legacy\","
|
||||||
|
"\"display_num\":0,\"displays\":[]" + version_field + "}}";
|
||||||
|
ok &= Expect(parsed_host.from_json(message) &&
|
||||||
|
parsed_host.i.app_version[0] == '\0',
|
||||||
|
"unknown optional app version should remain empty");
|
||||||
|
crossdesk::FreeRemoteAction(parsed_host);
|
||||||
|
}
|
||||||
|
advertised = crossdesk::MakeHostInformation("Host", {}, false,
|
||||||
|
std::string(64, '1'));
|
||||||
|
ok &= Expect(advertised.i.app_version[0] == '\0',
|
||||||
|
"oversized app version must not be truncated");
|
||||||
|
crossdesk::FreeRemoteAction(advertised);
|
||||||
|
|
||||||
const std::string name = "example.txt";
|
const std::string name = "example.txt";
|
||||||
const std::string payload = "CrossDesk wire";
|
const std::string payload = "CrossDesk wire";
|
||||||
const auto encoded = crossdesk::EncodeFileChunk(
|
const auto encoded = crossdesk::EncodeFileChunk(
|
||||||
|
|||||||
Reference in new issue
Block a user