Implement native inventory manager workflows (#62)
This commit is contained in:
@@ -16,8 +16,10 @@ on:
|
|||||||
- "tools/check_milestone_09_issue_59.py"
|
- "tools/check_milestone_09_issue_59.py"
|
||||||
- "tools/check_milestone_09_issue_60.py"
|
- "tools/check_milestone_09_issue_60.py"
|
||||||
- "tools/check_milestone_09_issue_61.py"
|
- "tools/check_milestone_09_issue_61.py"
|
||||||
|
- "tools/check_milestone_09_issue_62.py"
|
||||||
- "crates/libremetaverse/src/agent_movement.rs"
|
- "crates/libremetaverse/src/agent_movement.rs"
|
||||||
- "crates/libremetaverse/src/inventory.rs"
|
- "crates/libremetaverse/src/inventory.rs"
|
||||||
|
- "crates/libremetaverse/src/inventory_manager.rs"
|
||||||
- "docs/agent-movement.md"
|
- "docs/agent-movement.md"
|
||||||
- "docs/inventory.md"
|
- "docs/inventory.md"
|
||||||
- "crates/libremetaverse/Cargo.toml"
|
- "crates/libremetaverse/Cargo.toml"
|
||||||
@@ -32,6 +34,8 @@ on:
|
|||||||
- "tests/compat/tests/wire_semantics.rs"
|
- "tests/compat/tests/wire_semantics.rs"
|
||||||
- "tests/compat/tests/appearance_visual_semantics.rs"
|
- "tests/compat/tests/appearance_visual_semantics.rs"
|
||||||
- "tests/compat/tests/inventory_store_semantics.rs"
|
- "tests/compat/tests/inventory_store_semantics.rs"
|
||||||
|
- "tests/compat/tests/inventory_manager_semantics.rs"
|
||||||
|
- "tests/compat/tests/task_inventory_semantics.rs"
|
||||||
- "tests/compat/tests/misclassified_link_semantics.rs"
|
- "tests/compat/tests/misclassified_link_semantics.rs"
|
||||||
- "tests/upstream-tests.json"
|
- "tests/upstream-tests.json"
|
||||||
pull_request:
|
pull_request:
|
||||||
@@ -49,8 +53,10 @@ on:
|
|||||||
- "tools/check_milestone_09_issue_59.py"
|
- "tools/check_milestone_09_issue_59.py"
|
||||||
- "tools/check_milestone_09_issue_60.py"
|
- "tools/check_milestone_09_issue_60.py"
|
||||||
- "tools/check_milestone_09_issue_61.py"
|
- "tools/check_milestone_09_issue_61.py"
|
||||||
|
- "tools/check_milestone_09_issue_62.py"
|
||||||
- "crates/libremetaverse/src/agent_movement.rs"
|
- "crates/libremetaverse/src/agent_movement.rs"
|
||||||
- "crates/libremetaverse/src/inventory.rs"
|
- "crates/libremetaverse/src/inventory.rs"
|
||||||
|
- "crates/libremetaverse/src/inventory_manager.rs"
|
||||||
- "docs/agent-movement.md"
|
- "docs/agent-movement.md"
|
||||||
- "docs/inventory.md"
|
- "docs/inventory.md"
|
||||||
- "crates/libremetaverse/Cargo.toml"
|
- "crates/libremetaverse/Cargo.toml"
|
||||||
@@ -65,6 +71,8 @@ on:
|
|||||||
- "tests/compat/tests/wire_semantics.rs"
|
- "tests/compat/tests/wire_semantics.rs"
|
||||||
- "tests/compat/tests/appearance_visual_semantics.rs"
|
- "tests/compat/tests/appearance_visual_semantics.rs"
|
||||||
- "tests/compat/tests/inventory_store_semantics.rs"
|
- "tests/compat/tests/inventory_store_semantics.rs"
|
||||||
|
- "tests/compat/tests/inventory_manager_semantics.rs"
|
||||||
|
- "tests/compat/tests/task_inventory_semantics.rs"
|
||||||
- "tests/compat/tests/misclassified_link_semantics.rs"
|
- "tests/compat/tests/misclassified_link_semantics.rs"
|
||||||
- "tests/upstream-tests.json"
|
- "tests/upstream-tests.json"
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
@@ -90,6 +98,7 @@ jobs:
|
|||||||
python3 tools/check_milestone_09_issue_59.py
|
python3 tools/check_milestone_09_issue_59.py
|
||||||
python3 tools/check_milestone_09_issue_60.py
|
python3 tools/check_milestone_09_issue_60.py
|
||||||
python3 tools/check_milestone_09_issue_61.py
|
python3 tools/check_milestone_09_issue_61.py
|
||||||
|
python3 tools/check_milestone_09_issue_62.py
|
||||||
cargo check --manifest-path tests/api-compile/Cargo.toml --locked
|
cargo check --manifest-path tests/api-compile/Cargo.toml --locked
|
||||||
- name: Test generated wire codecs and translated parity cases
|
- name: Test generated wire codecs and translated parity cases
|
||||||
run: |
|
run: |
|
||||||
@@ -98,6 +107,8 @@ jobs:
|
|||||||
cargo test -p libremetaverse --test packet_osd
|
cargo test -p libremetaverse --test packet_osd
|
||||||
cargo test -p libremetaverse-compat-tests --test wire_semantics
|
cargo test -p libremetaverse-compat-tests --test wire_semantics
|
||||||
cargo test -p libremetaverse-compat-tests --test inventory_store_semantics
|
cargo test -p libremetaverse-compat-tests --test inventory_store_semantics
|
||||||
|
cargo test -p libremetaverse-compat-tests --test inventory_manager_semantics
|
||||||
|
cargo test -p libremetaverse-compat-tests --test task_inventory_semantics
|
||||||
cargo test -p libremetaverse-compat-tests --test misclassified_link_semantics
|
cargo test -p libremetaverse-compat-tests --test misclassified_link_semantics
|
||||||
- name: Test generated visual and foliage catalogs
|
- name: Test generated visual and foliage catalogs
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
@@ -30,5 +30,6 @@ jobs:
|
|||||||
python3 tools/check_milestone_09_issue_59.py
|
python3 tools/check_milestone_09_issue_59.py
|
||||||
python3 tools/check_milestone_09_issue_60.py
|
python3 tools/check_milestone_09_issue_60.py
|
||||||
python3 tools/check_milestone_09_issue_61.py
|
python3 tools/check_milestone_09_issue_61.py
|
||||||
|
python3 tools/check_milestone_09_issue_62.py
|
||||||
- name: Compile every workspace target with bounded memory
|
- name: Compile every workspace target with bounded memory
|
||||||
run: cargo check --workspace --all-targets --locked -j 1
|
run: cargo check --workspace --all-targets --locked -j 1
|
||||||
|
|||||||
10
README.md
10
README.md
@@ -357,3 +357,13 @@ The versioned 64 MiB-bounded cache validates complete snapshots before install
|
|||||||
and uses same-directory temporary replacement with rollback. The compatibility
|
and uses same-directory temporary replacement with rollback. The compatibility
|
||||||
and persistence contract is documented in
|
and persistence contract is documented in
|
||||||
[`docs/inventory.md`](docs/inventory.md).
|
[`docs/inventory.md`](docs/inventory.md).
|
||||||
|
|
||||||
|
The client-owned `InventoryManager` now implements the packet-level create,
|
||||||
|
update, move, copy, remove, fetch, search, give, rez/derez, script-state, and
|
||||||
|
task-inventory workflows. Callback IDs and concurrent item/task waiters are
|
||||||
|
bounded and cancellation-safe; generated multi-block packets retain the UDP
|
||||||
|
codec's MTU-aware splitting. Capability replies and UDP replies are validated
|
||||||
|
before store reconciliation, and legacy task inventory uses a 16 MiB-bounded
|
||||||
|
`ReplyTaskInventory`/`RequestXfer` state machine. Focused translated and native
|
||||||
|
fake-packet tests cover correlation, stale replies, offers, bulk completion,
|
||||||
|
capability task inventory, and malformed transfer sizes.
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ Generated by `python3 tools/generate_api_shims.py`; do not edit by hand.
|
|||||||
|
|
||||||
| Assembly | Types | Members | Status |
|
| Assembly | Types | Members | Status |
|
||||||
|---|---:|---:|---|
|
|---|---:|---:|---|
|
||||||
| `LibreMetaverse` | 2,711 | 27,281 | native implementation: 153 types / 14,746 members; remaining surface is callable failure-only shims |
|
| `LibreMetaverse` | 2,711 | 27,281 | native implementation: 164 types / 14,877 members; remaining surface is callable failure-only shims |
|
||||||
| `LibreMetaverse.Imaging.Abstractions` | 3 | 20 | native implementation: 3 types / 20 members; no generated shims remain |
|
| `LibreMetaverse.Imaging.Abstractions` | 3 | 20 | native implementation: 3 types / 20 members; no generated shims remain |
|
||||||
| `LibreMetaverse.Imaging.Skia` | 1 | 3 | native implementation: 1 type / 3 members; no generated shims remain |
|
| `LibreMetaverse.Imaging.Skia` | 1 | 3 | native implementation: 1 type / 3 members; no generated shims remain |
|
||||||
| `LibreMetaverse.LslTools` | 164 | 768 | callable failure-only shim |
|
| `LibreMetaverse.LslTools` | 164 | 768 | callable failure-only shim |
|
||||||
|
|||||||
@@ -359,9 +359,10 @@ async fn run_seed_requests(weak: Weak<CapsInner>, cancellation: CancellationToke
|
|||||||
let Some(simulator) = inner.simulator() else {
|
let Some(simulator) = inner.simulator() else {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
if !simulator.native_is_connected() {
|
// Seed discovery is HTTP-only. It is valid for composed/fake clients
|
||||||
return;
|
// to install a simulator and query capabilities before a UDP circuit
|
||||||
}
|
// is started, and tying this request to UDP connectivity creates an
|
||||||
|
// unnecessary race for every capability-backed manager.
|
||||||
let http = simulator.client.native_http_caps_client();
|
let http = simulator.client.native_http_caps_client();
|
||||||
let response = http
|
let response = http
|
||||||
.post_with_uri_osd_format_osd_cancellation_token_i_progress(
|
.post_with_uri_osd_format_osd_cancellation_token_i_progress(
|
||||||
|
|||||||
@@ -118,6 +118,7 @@ struct ClientRuntime {
|
|||||||
caps_rate_limiter: Mutex<crate::caps_http::CapsRateLimiter>,
|
caps_rate_limiter: Mutex<crate::caps_http::CapsRateLimiter>,
|
||||||
network_manager: Mutex<std::sync::Weak<crate::network_manager::NetworkManagerInner>>,
|
network_manager: Mutex<std::sync::Weak<crate::network_manager::NetworkManagerInner>>,
|
||||||
agent_manager: Mutex<std::sync::Weak<crate::agent_manager::AgentManagerInner>>,
|
agent_manager: Mutex<std::sync::Weak<crate::agent_manager::AgentManagerInner>>,
|
||||||
|
inventory_manager: Mutex<Option<Arc<crate::inventory_manager::InventoryManagerInner>>>,
|
||||||
shutdown_complete: Condvar,
|
shutdown_complete: Condvar,
|
||||||
shutdown_wait: Mutex<()>,
|
shutdown_wait: Mutex<()>,
|
||||||
}
|
}
|
||||||
@@ -146,6 +147,7 @@ impl ClientRuntime {
|
|||||||
caps_rate_limiter: Mutex::new(caps_rate_limiter),
|
caps_rate_limiter: Mutex::new(caps_rate_limiter),
|
||||||
network_manager: Mutex::new(std::sync::Weak::new()),
|
network_manager: Mutex::new(std::sync::Weak::new()),
|
||||||
agent_manager: Mutex::new(std::sync::Weak::new()),
|
agent_manager: Mutex::new(std::sync::Weak::new()),
|
||||||
|
inventory_manager: Mutex::new(None),
|
||||||
shutdown_complete: Condvar::new(),
|
shutdown_complete: Condvar::new(),
|
||||||
shutdown_wait: Mutex::new(()),
|
shutdown_wait: Mutex::new(()),
|
||||||
}
|
}
|
||||||
@@ -218,6 +220,10 @@ impl ClientRuntime {
|
|||||||
.lock()
|
.lock()
|
||||||
.unwrap_or_else(std::sync::PoisonError::into_inner)
|
.unwrap_or_else(std::sync::PoisonError::into_inner)
|
||||||
.take();
|
.take();
|
||||||
|
self.inventory_manager
|
||||||
|
.lock()
|
||||||
|
.unwrap_or_else(std::sync::PoisonError::into_inner)
|
||||||
|
.take();
|
||||||
self.http_caps_client
|
self.http_caps_client
|
||||||
.lock()
|
.lock()
|
||||||
.unwrap_or_else(std::sync::PoisonError::into_inner)
|
.unwrap_or_else(std::sync::PoisonError::into_inner)
|
||||||
@@ -239,6 +245,30 @@ impl ClientRuntime {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A non-owning route back to a live client runtime.
|
||||||
|
///
|
||||||
|
/// Manager caches can hold this handle without creating an `Arc` cycle. The
|
||||||
|
/// settings and time provider are immutable client composition data and are
|
||||||
|
/// cloned only when a manager needs to perform an operation.
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub(crate) struct ClientWeakHandle {
|
||||||
|
runtime: std::sync::Weak<ClientRuntime>,
|
||||||
|
settings: Settings,
|
||||||
|
time_provider: TimeProvider,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ClientWeakHandle {
|
||||||
|
pub(crate) fn upgrade(&self) -> Option<GridClient> {
|
||||||
|
Some(GridClient {
|
||||||
|
settings: self.settings.clone(),
|
||||||
|
time_provider: self.time_provider.clone(),
|
||||||
|
runtime: self.runtime.upgrade()?,
|
||||||
|
network_manager: None,
|
||||||
|
agent_manager: None,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Native owner for the mapped C# `GridClient` lifecycle slice.
|
/// Native owner for the mapped C# `GridClient` lifecycle slice.
|
||||||
///
|
///
|
||||||
/// Construction is side-effect free: it creates no runtime, task, socket, or
|
/// Construction is side-effect free: it creates no runtime, task, socket, or
|
||||||
@@ -386,6 +416,40 @@ impl GridClient {
|
|||||||
Ok(manager)
|
Ok(manager)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn native_weak_handle(&self) -> ClientWeakHandle {
|
||||||
|
ClientWeakHandle {
|
||||||
|
runtime: Arc::downgrade(&self.runtime),
|
||||||
|
settings: self.settings.clone(),
|
||||||
|
time_provider: self.time_provider.clone(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn native_inventory(&self) -> Result<crate::InventoryManager, crate::Error> {
|
||||||
|
let mut cached = self
|
||||||
|
.runtime
|
||||||
|
.inventory_manager
|
||||||
|
.lock()
|
||||||
|
.unwrap_or_else(std::sync::PoisonError::into_inner);
|
||||||
|
if let Some(inner) = cached.as_ref() {
|
||||||
|
return Ok(
|
||||||
|
crate::inventory_manager::InventoryManager::native_from_inner(Arc::clone(inner)),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
let manager =
|
||||||
|
crate::inventory_manager::InventoryManager::native_new(Some(Arc::new(self.clone())))?;
|
||||||
|
*cached = Some(manager.native_inner());
|
||||||
|
Ok(manager)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(clippy::needless_pass_by_value)] // The mapped C# property setter owns its value.
|
||||||
|
pub(crate) fn native_set_inventory(&mut self, value: crate::InventoryManager) {
|
||||||
|
*self
|
||||||
|
.runtime
|
||||||
|
.inventory_manager
|
||||||
|
.lock()
|
||||||
|
.unwrap_or_else(std::sync::PoisonError::into_inner) = Some(value.native_inner());
|
||||||
|
}
|
||||||
|
|
||||||
#[allow(clippy::needless_pass_by_value)] // The mapped C# property setter owns its value.
|
#[allow(clippy::needless_pass_by_value)] // The mapped C# property setter owns its value.
|
||||||
pub(crate) fn native_set_network(&mut self, value: crate::NetworkManager) {
|
pub(crate) fn native_set_network(&mut self, value: crate::NetworkManager) {
|
||||||
*self
|
*self
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1462,6 +1462,16 @@ impl Inventory {
|
|||||||
.and_then(|value| value.clone_as::<T>()))
|
.and_then(|value| value.clone_as::<T>()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns the shared item portion regardless of the concrete inventory
|
||||||
|
/// subclass stored for the UUID.
|
||||||
|
pub(crate) fn native_item_value(&self, uuid: UUID) -> Option<InventoryItem> {
|
||||||
|
read(&self.inner.state)
|
||||||
|
.items
|
||||||
|
.get(&uuid)
|
||||||
|
.and_then(InventoryNode::value)
|
||||||
|
.and_then(|value| value.item().cloned())
|
||||||
|
}
|
||||||
|
|
||||||
pub fn try_get_value_with_uuid_inventory_base(
|
pub fn try_get_value_with_uuid_inventory_base(
|
||||||
&self,
|
&self,
|
||||||
uuid: UUID,
|
uuid: UUID,
|
||||||
|
|||||||
4779
crates/libremetaverse/src/inventory_manager.rs
Normal file
4779
crates/libremetaverse/src/inventory_manager.rs
Normal file
File diff suppressed because it is too large
Load Diff
@@ -15,6 +15,7 @@ mod download_manager;
|
|||||||
mod event_queue;
|
mod event_queue;
|
||||||
mod gesture;
|
mod gesture;
|
||||||
mod inventory;
|
mod inventory;
|
||||||
|
mod inventory_manager;
|
||||||
#[rustfmt::skip] // Deterministic machine output is formatted by the pinned generator.
|
#[rustfmt::skip] // Deterministic machine output is formatted by the pinned generator.
|
||||||
mod foliage_catalog;
|
mod foliage_catalog;
|
||||||
mod generated;
|
mod generated;
|
||||||
|
|||||||
@@ -1216,6 +1216,10 @@ impl Simulator {
|
|||||||
.map(|inner| Caps::native_from_inner(inner, self.native_clone_without_caps()))
|
.map(|inner| Caps::native_from_inner(inner, self.native_clone_without_caps()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn native_id(&self) -> UUID {
|
||||||
|
self.data.id
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) fn native_from_weak(data: &Weak<SimulatorData>) -> Option<Self> {
|
pub(crate) fn native_from_weak(data: &Weak<SimulatorData>) -> Option<Self> {
|
||||||
data.upgrade().map(|data| Self { caps: None, data })
|
data.upgrade().map(|data| Self { caps: None, data })
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,3 +36,36 @@ The focused compatibility suites are
|
|||||||
`inventory_store_semantics` and `misclassified_link_semantics`; native unit
|
`inventory_store_semantics` and `misclassified_link_semantics`; native unit
|
||||||
tests additionally cover concrete cache round trips, permissions, corruption,
|
tests additionally cover concrete cache round trips, permissions, corruption,
|
||||||
unknown versions, system-folder sorting, and callback re-entry.
|
unknown versions, system-folder sorting, and callback re-entry.
|
||||||
|
|
||||||
|
## UDP inventory manager
|
||||||
|
|
||||||
|
`InventoryManager` now owns the live inventory protocol boundary. Login installs
|
||||||
|
the agent and library skeletons in the transport-free store, while validated
|
||||||
|
`UpdateCreateInventoryItem`, `BulkUpdateInventory`, `FetchInventoryReply`, and
|
||||||
|
`InventoryDescendents` replies populate or reconcile it. Create and copy callback
|
||||||
|
IDs, item fetches, task replies, and inventory offers are correlated independently;
|
||||||
|
cancelling one waiter removes only that waiter. A cleanup worker bounds abandoned
|
||||||
|
requests to one minute, and the manager rejects more than 4,096 pending operations.
|
||||||
|
|
||||||
|
Outbound create, update, move, copy, remove, give, rez/derez, script-state, and
|
||||||
|
task-inventory operations build the generated protocol packet types. Generated
|
||||||
|
multi-block packets use the packet codec's `encode_multiple` path, so large batches
|
||||||
|
are split according to the UDP transport bounds while retaining the same agent,
|
||||||
|
session, transaction, callback, owner, and permission data. Capability-backed
|
||||||
|
inventory fetch and folder-content responses are parsed before becoming visible in
|
||||||
|
the store. Asset, material, script, notecard, and thumbnail upload bodies remain a
|
||||||
|
separate asset-pipeline concern.
|
||||||
|
|
||||||
|
Legacy task inventory uses a correlated `ReplyTaskInventory` filename followed by
|
||||||
|
a `RequestXfer` transfer. The implementation confirms packets, handles duplicate
|
||||||
|
or out-of-order packet numbers deterministically, aborts cancelled transfers, and
|
||||||
|
rejects announced or accumulated data above 16 MiB. Task text parsing is capped at
|
||||||
|
100,000 entries and accepts both plain asset IDs and the reference shadow-ID XOR
|
||||||
|
encoding. The capability path applies the same byte and entry limits.
|
||||||
|
|
||||||
|
No store lock is held across an await, a packet send, or an observer callback.
|
||||||
|
Reply data is decoded and validated before store mutation, and event registries
|
||||||
|
snapshot subscribers before invoking them. Focused coverage lives in
|
||||||
|
`inventory_manager_semantics`, `task_inventory_semantics`, and the native
|
||||||
|
`inventory_manager::tests` fake-packet cases for callback isolation, bulk-copy
|
||||||
|
completion, stale folder versions, offers, capability events, and bounded Xfer.
|
||||||
|
|||||||
152
tools/check_milestone_09_issue_62.py
Normal file
152
tools/check_milestone_09_issue_62.py
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Audit issue 62's native UDP inventory-manager boundary."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
import re
|
||||||
|
|
||||||
|
import generate_api_shims
|
||||||
|
|
||||||
|
|
||||||
|
ROOT = Path(__file__).resolve().parents[1]
|
||||||
|
SOURCE = ROOT / "crates" / "libremetaverse" / "src" / "inventory_manager.rs"
|
||||||
|
DOC = ROOT / "docs" / "inventory.md"
|
||||||
|
MANAGER_TESTS = ROOT / "tests" / "compat" / "tests" / "inventory_manager_semantics.rs"
|
||||||
|
TASK_TESTS = ROOT / "tests" / "compat" / "tests" / "task_inventory_semantics.rs"
|
||||||
|
STUB_RE = re.compile(r"\b(?:not_implemented|unimplemented_api)\b|\b(?:todo|unimplemented)!\s*\(")
|
||||||
|
|
||||||
|
REQUIRED_TYPES = {
|
||||||
|
"T:LibreMetaverse.FindObjectByPathReplyEventArgs",
|
||||||
|
"T:LibreMetaverse.FolderUpdatedEventArgs",
|
||||||
|
"T:LibreMetaverse.InventoryManager",
|
||||||
|
"T:LibreMetaverse.InventoryManager.CopyItemsResult",
|
||||||
|
"T:LibreMetaverse.InventoryManager.FolderUpdateResult",
|
||||||
|
"T:LibreMetaverse.InventoryObjectOfferedEventArgs",
|
||||||
|
"T:LibreMetaverse.ItemReceivedEventArgs",
|
||||||
|
"T:LibreMetaverse.SaveAssetToInventoryEventArgs",
|
||||||
|
"T:LibreMetaverse.ScriptRunningReplyEventArgs",
|
||||||
|
"T:LibreMetaverse.TaskInventoryReplyEventArgs",
|
||||||
|
"T:LibreMetaverse.TaskItemReceivedEventArgs",
|
||||||
|
}
|
||||||
|
|
||||||
|
REQUIRED_MEMBERS = {
|
||||||
|
"E:LibreMetaverse.InventoryManager.FindObjectByPathReply",
|
||||||
|
"E:LibreMetaverse.InventoryManager.FolderUpdated",
|
||||||
|
"E:LibreMetaverse.InventoryManager.InventoryObjectOffered",
|
||||||
|
"E:LibreMetaverse.InventoryManager.ItemReceived",
|
||||||
|
"E:LibreMetaverse.InventoryManager.ScriptRunningReply",
|
||||||
|
"E:LibreMetaverse.InventoryManager.TaskInventoryReply",
|
||||||
|
"E:LibreMetaverse.InventoryManager.TaskItemReceived",
|
||||||
|
"M:LibreMetaverse.InventoryManager.#ctor(LibreMetaverse.GridClient)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.CreateFolder(LibreMetaverse.UUID,System.String,LibreMetaverse.FolderType)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.CreateItemAsync(LibreMetaverse.UUID,System.String,System.String,LibreMetaverse.AssetType,LibreMetaverse.UUID,LibreMetaverse.InventoryType,LibreMetaverse.WearableType,LibreMetaverse.PermissionMask,System.Threading.CancellationToken)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.CreateLinkAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.String,System.String,LibreMetaverse.InventoryType,LibreMetaverse.UUID,System.Threading.CancellationToken)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.FetchItemAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.Threading.CancellationToken)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.FindObjectByPathAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.String,System.Threading.CancellationToken)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.FolderContentsAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.Boolean,System.Boolean,LibreMetaverse.InventorySortOrder,System.Threading.CancellationToken,System.Boolean)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.GetTaskInventoryAsync(LibreMetaverse.UUID,System.UInt32,LibreMetaverse.Simulator,System.Threading.CancellationToken)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.GiveFolderAsync(LibreMetaverse.UUID,System.String,LibreMetaverse.UUID,System.Boolean,System.Threading.CancellationToken)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.GiveItem(LibreMetaverse.UUID,System.String,LibreMetaverse.AssetType,LibreMetaverse.UUID,System.Boolean)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.MoveFolders(System.Collections.Generic.Dictionary{LibreMetaverse.UUID,LibreMetaverse.UUID},System.Threading.CancellationToken)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.MoveItemsAsync(System.Collections.Generic.Dictionary{LibreMetaverse.UUID,LibreMetaverse.UUID},System.Threading.CancellationToken)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RemoveItemsAsync(System.Collections.Generic.IEnumerable{LibreMetaverse.UUID},System.Threading.CancellationToken)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestCopyItemsWithResultAsync(System.Collections.Generic.List{LibreMetaverse.UUID},System.Collections.Generic.List{LibreMetaverse.UUID},System.Collections.Generic.List{System.String},LibreMetaverse.UUID,System.Threading.CancellationToken)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestDeRezToInventory(System.UInt32,LibreMetaverse.DeRezDestination,LibreMetaverse.UUID,LibreMetaverse.UUID)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestFetchInventoryAsync(System.Collections.Generic.Dictionary{LibreMetaverse.UUID,LibreMetaverse.UUID},System.Threading.CancellationToken,System.Action{System.Collections.Generic.List{LibreMetaverse.InventoryItem}})",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestRezFromInventory(LibreMetaverse.Simulator,LibreMetaverse.UUID,LibreMetaverse.Quaternion,LibreMetaverse.Vector3,LibreMetaverse.InventoryItem,LibreMetaverse.UUID,LibreMetaverse.UUID,System.Boolean)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestTaskInventory(System.UInt32,LibreMetaverse.Simulator)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestUpdateItems(System.Collections.Generic.List{LibreMetaverse.InventoryItem},LibreMetaverse.UUID)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.UpdateTaskInventory(System.UInt32,LibreMetaverse.InventoryItem,LibreMetaverse.Simulator,System.Boolean)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.WaitForNextInventoryOfferAsync(System.Threading.CancellationToken)",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def require_markers(path: Path, markers: tuple[str, ...]) -> None:
|
||||||
|
source = path.read_text()
|
||||||
|
missing = [marker for marker in markers if marker not in source]
|
||||||
|
if missing:
|
||||||
|
raise SystemExit(f"{path.name}: audit evidence missing: " + ", ".join(missing))
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> None:
|
||||||
|
native_types = (
|
||||||
|
generate_api_shims.NATIVE_TYPES.keys()
|
||||||
|
| generate_api_shims.NATIVE_DECLARATIONS.keys()
|
||||||
|
)
|
||||||
|
missing_types = sorted(REQUIRED_TYPES - native_types)
|
||||||
|
if missing_types:
|
||||||
|
raise SystemExit("issue 62 native types missing: " + ", ".join(missing_types))
|
||||||
|
missing_members = sorted(
|
||||||
|
REQUIRED_MEMBERS - generate_api_shims.NATIVE_MEMBER_BODIES.keys()
|
||||||
|
)
|
||||||
|
if missing_members:
|
||||||
|
raise SystemExit("issue 62 native members missing: " + ", ".join(missing_members))
|
||||||
|
update_task = (
|
||||||
|
"M:LibreMetaverse.InventoryManager.UpdateTaskInventory(System.UInt32,"
|
||||||
|
"LibreMetaverse.InventoryItem,LibreMetaverse.Simulator,System.Boolean)"
|
||||||
|
)
|
||||||
|
if "only_mod_meta.unwrap_or(true)" not in generate_api_shims.NATIVE_MEMBER_BODIES[update_task]:
|
||||||
|
raise SystemExit("UpdateTaskInventory must retain the C# metadata-only default")
|
||||||
|
for update_member in (
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestUpdateItem(LibreMetaverse.InventoryItem)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestUpdateItems(System.Collections.Generic.List{LibreMetaverse.InventoryItem})",
|
||||||
|
):
|
||||||
|
if "UUID::random()?" not in generate_api_shims.NATIVE_MEMBER_BODIES[update_member]:
|
||||||
|
raise SystemExit(f"{update_member} must generate a transaction ID")
|
||||||
|
if STUB_RE.search(SOURCE.read_text()):
|
||||||
|
raise SystemExit("issue 62 owned Rust stubs remain in inventory_manager.rs")
|
||||||
|
|
||||||
|
require_markers(
|
||||||
|
SOURCE,
|
||||||
|
(
|
||||||
|
"MAX_TASK_INVENTORY_BYTES",
|
||||||
|
"MAX_PENDING_REQUESTS",
|
||||||
|
"encode_multiple",
|
||||||
|
"pending_created",
|
||||||
|
"pending_fetches",
|
||||||
|
"pending_task_replies",
|
||||||
|
"callbacks are not invoked while an inventory lock is held",
|
||||||
|
"cancelling_one_fetch_waiter_preserves_concurrent_correlation",
|
||||||
|
"fake_bulk_copy_reply_waits_for_every_block",
|
||||||
|
"asset_type_without_folder_type_falls_back_to_inventory_root",
|
||||||
|
"stale_descendents_packet_cannot_mutate_store",
|
||||||
|
"task_xfer_rejects_announced_data_above_bound",
|
||||||
|
),
|
||||||
|
)
|
||||||
|
require_markers(
|
||||||
|
DOC,
|
||||||
|
(
|
||||||
|
"UDP inventory manager",
|
||||||
|
"4,096 pending operations",
|
||||||
|
"16 MiB",
|
||||||
|
"RequestXfer",
|
||||||
|
"No store lock is held across an await",
|
||||||
|
),
|
||||||
|
)
|
||||||
|
require_markers(
|
||||||
|
MANAGER_TESTS,
|
||||||
|
(
|
||||||
|
"inventory_manager_null_throws",
|
||||||
|
"encrypt_decrypt_round_trip",
|
||||||
|
"item_crc_is_deterministic_and_changes_when_fields_change",
|
||||||
|
"create_inventory_item_returns_correct_subclass",
|
||||||
|
),
|
||||||
|
)
|
||||||
|
require_markers(
|
||||||
|
TASK_TESTS,
|
||||||
|
(
|
||||||
|
"cap_available_returns_contents_folder_and_decrypts_shadow_id",
|
||||||
|
"plain_asset_id_parses_without_decryption",
|
||||||
|
"non_success_status_returns_contents_folder_only",
|
||||||
|
"no_capability_does_not_make_http_request",
|
||||||
|
),
|
||||||
|
)
|
||||||
|
print(
|
||||||
|
"issue 62 audit: native inventory packet mappings, bounded correlation and Xfer, "
|
||||||
|
"lock-free callback evidence, documentation, and translated compatibility cases are present"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@@ -82,12 +82,22 @@ NATIVE_TYPES = {
|
|||||||
"T:LibreMetaverse.InventoryObjectAddedEventArgs": "crate::inventory::InventoryObjectAddedEventArgs",
|
"T:LibreMetaverse.InventoryObjectAddedEventArgs": "crate::inventory::InventoryObjectAddedEventArgs",
|
||||||
"T:LibreMetaverse.InventoryObjectRemovedEventArgs": "crate::inventory::InventoryObjectRemovedEventArgs",
|
"T:LibreMetaverse.InventoryObjectRemovedEventArgs": "crate::inventory::InventoryObjectRemovedEventArgs",
|
||||||
"T:LibreMetaverse.InventoryObjectUpdatedEventArgs": "crate::inventory::InventoryObjectUpdatedEventArgs",
|
"T:LibreMetaverse.InventoryObjectUpdatedEventArgs": "crate::inventory::InventoryObjectUpdatedEventArgs",
|
||||||
|
"T:LibreMetaverse.InventoryObjectOfferedEventArgs": "crate::inventory_manager::InventoryObjectOfferedEventArgs",
|
||||||
|
"T:LibreMetaverse.InventoryManager.CopyItemsResult": "crate::inventory_manager::InventoryManagerCopyItemsResult",
|
||||||
|
"T:LibreMetaverse.InventoryManager.FolderUpdateResult": "crate::inventory_manager::InventoryManagerFolderUpdateResult",
|
||||||
|
"T:LibreMetaverse.ItemReceivedEventArgs": "crate::inventory_manager::ItemReceivedEventArgs",
|
||||||
"T:LibreMetaverse.InventorySettings": "crate::inventory::InventorySettings",
|
"T:LibreMetaverse.InventorySettings": "crate::inventory::InventorySettings",
|
||||||
"T:LibreMetaverse.InventorySnapshot": "crate::inventory::InventorySnapshot",
|
"T:LibreMetaverse.InventorySnapshot": "crate::inventory::InventorySnapshot",
|
||||||
"T:LibreMetaverse.InventorySound": "crate::inventory::InventorySound",
|
"T:LibreMetaverse.InventorySound": "crate::inventory::InventorySound",
|
||||||
"T:LibreMetaverse.InventoryTexture": "crate::inventory::InventoryTexture",
|
"T:LibreMetaverse.InventoryTexture": "crate::inventory::InventoryTexture",
|
||||||
"T:LibreMetaverse.InventoryWearable": "crate::inventory::InventoryWearable",
|
"T:LibreMetaverse.InventoryWearable": "crate::inventory::InventoryWearable",
|
||||||
"T:LibreMetaverse.Permissions": "crate::inventory::Permissions",
|
"T:LibreMetaverse.Permissions": "crate::inventory::Permissions",
|
||||||
|
"T:LibreMetaverse.FindObjectByPathReplyEventArgs": "crate::inventory_manager::FindObjectByPathReplyEventArgs",
|
||||||
|
"T:LibreMetaverse.FolderUpdatedEventArgs": "crate::inventory_manager::FolderUpdatedEventArgs",
|
||||||
|
"T:LibreMetaverse.SaveAssetToInventoryEventArgs": "crate::inventory_manager::SaveAssetToInventoryEventArgs",
|
||||||
|
"T:LibreMetaverse.ScriptRunningReplyEventArgs": "crate::inventory_manager::ScriptRunningReplyEventArgs",
|
||||||
|
"T:LibreMetaverse.TaskInventoryReplyEventArgs": "crate::inventory_manager::TaskInventoryReplyEventArgs",
|
||||||
|
"T:LibreMetaverse.TaskItemReceivedEventArgs": "crate::inventory_manager::TaskItemReceivedEventArgs",
|
||||||
"T:LibreMetaverse.ChatEventArgs": "crate::agent_messages::ChatEventArgs",
|
"T:LibreMetaverse.ChatEventArgs": "crate::agent_messages::ChatEventArgs",
|
||||||
"T:LibreMetaverse.ChatSessionMember": "crate::agent_messages::ChatSessionMember",
|
"T:LibreMetaverse.ChatSessionMember": "crate::agent_messages::ChatSessionMember",
|
||||||
"T:LibreMetaverse.ChatSessionMemberAddedEventArgs": "crate::agent_messages::ChatSessionMemberAddedEventArgs",
|
"T:LibreMetaverse.ChatSessionMemberAddedEventArgs": "crate::agent_messages::ChatSessionMemberAddedEventArgs",
|
||||||
@@ -251,6 +261,7 @@ NATIVE_TYPES = {
|
|||||||
NATIVE_DECLARATIONS = {
|
NATIVE_DECLARATIONS = {
|
||||||
"T:LibreMetaverse.AgentManager": "crate::agent_manager::AgentManager",
|
"T:LibreMetaverse.AgentManager": "crate::agent_manager::AgentManager",
|
||||||
"T:LibreMetaverse.GridClient": "crate::client_core::GridClient",
|
"T:LibreMetaverse.GridClient": "crate::client_core::GridClient",
|
||||||
|
"T:LibreMetaverse.InventoryManager": "crate::inventory_manager::InventoryManager",
|
||||||
"T:LibreMetaverse.NetworkManager": "crate::network_manager::NetworkManager",
|
"T:LibreMetaverse.NetworkManager": "crate::network_manager::NetworkManager",
|
||||||
"T:LibreMetaverse.Settings": "crate::client_core::Settings",
|
"T:LibreMetaverse.Settings": "crate::client_core::Settings",
|
||||||
"T:LibreMetaverse.Simulator": "crate::network_manager::Simulator",
|
"T:LibreMetaverse.Simulator": "crate::network_manager::Simulator",
|
||||||
@@ -322,12 +333,192 @@ NATIVE_MEMBER_BODIES = {
|
|||||||
"self.native_http_caps_client()",
|
"self.native_http_caps_client()",
|
||||||
"P:LibreMetaverse.GridClient.HttpCapsClient#set":
|
"P:LibreMetaverse.GridClient.HttpCapsClient#set":
|
||||||
"self.native_set_http_caps_client(value)",
|
"self.native_set_http_caps_client(value)",
|
||||||
|
"P:LibreMetaverse.GridClient.Inventory":
|
||||||
|
"self.native_inventory().unwrap_or_else(|_| panic!(\"failed to construct InventoryManager\"))",
|
||||||
|
"P:LibreMetaverse.GridClient.Inventory#set":
|
||||||
|
"self.native_set_inventory(value)",
|
||||||
"P:LibreMetaverse.GridClient.Network":
|
"P:LibreMetaverse.GridClient.Network":
|
||||||
"self.native_network().unwrap_or_else(|_| panic!(\"failed to construct NetworkManager\"))",
|
"self.native_network().unwrap_or_else(|_| panic!(\"failed to construct NetworkManager\"))",
|
||||||
"P:LibreMetaverse.GridClient.Network#set":
|
"P:LibreMetaverse.GridClient.Network#set":
|
||||||
"self.native_set_network(value)",
|
"self.native_set_network(value)",
|
||||||
"P:LibreMetaverse.GridClient.Self":
|
"P:LibreMetaverse.GridClient.Self":
|
||||||
"self.native_self()",
|
"self.native_self()",
|
||||||
|
"E:LibreMetaverse.InventoryManager.FindObjectByPathReply":
|
||||||
|
"self.native_subscribe_find_object_by_path_reply(handler)",
|
||||||
|
"E:LibreMetaverse.InventoryManager.FolderUpdated":
|
||||||
|
"self.native_subscribe_folder_updated(handler)",
|
||||||
|
"E:LibreMetaverse.InventoryManager.InventoryObjectOffered":
|
||||||
|
"self.native_subscribe_inventory_object_offered(handler)",
|
||||||
|
"E:LibreMetaverse.InventoryManager.ItemReceived":
|
||||||
|
"self.native_subscribe_item_received(handler)",
|
||||||
|
"E:LibreMetaverse.InventoryManager.SaveAssetToInventory":
|
||||||
|
"self.native_subscribe_save_asset_to_inventory(handler)",
|
||||||
|
"E:LibreMetaverse.InventoryManager.ScriptRunningReply":
|
||||||
|
"self.native_subscribe_script_running_reply(handler)",
|
||||||
|
"E:LibreMetaverse.InventoryManager.TaskInventoryReply":
|
||||||
|
"self.native_subscribe_task_inventory_reply(handler)",
|
||||||
|
"E:LibreMetaverse.InventoryManager.TaskItemReceived":
|
||||||
|
"self.native_subscribe_task_item_received(handler)",
|
||||||
|
"F:LibreMetaverse.InventoryManager.MAGIC_ID":
|
||||||
|
"crate::inventory_manager::InventoryManager::native_magic_id()",
|
||||||
|
"M:LibreMetaverse.InventoryManager.#ctor(LibreMetaverse.GridClient)":
|
||||||
|
"crate::inventory_manager::InventoryManager::native_new(client)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.CreateInventoryItem(LibreMetaverse.InventoryType,LibreMetaverse.UUID)":
|
||||||
|
"crate::inventory_manager::InventoryManager::native_create_inventory_item(type_, id)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.CopyItemAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.String,LibreMetaverse.UUID,System.Threading.CancellationToken)":
|
||||||
|
"self.native_copy_item(item, new_parent, new_name, old_owner_id, cancellation_token).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.CopyItemAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.String,System.Threading.CancellationToken)":
|
||||||
|
"self.native_copy_item_default_owner(item, new_parent, new_name, cancellation_token).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.CopyScriptToTask(System.UInt32,LibreMetaverse.InventoryItem,System.Boolean,LibreMetaverse.Simulator)":
|
||||||
|
"self.native_copy_script_to_task(object_local_id, item, enable_script, simulator)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.CreateFolder(LibreMetaverse.UUID,System.String)":
|
||||||
|
"self.native_create_folder(parent_id, name, libremetaverse_types::FolderType::None)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.CreateFolder(LibreMetaverse.UUID,System.String,LibreMetaverse.FolderType)":
|
||||||
|
"self.native_create_folder(parent_id, name, preferred_type)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.CreateItemAsync(LibreMetaverse.UUID,System.String,System.String,LibreMetaverse.AssetType,LibreMetaverse.UUID,LibreMetaverse.InventoryType,LibreMetaverse.PermissionMask,System.Threading.CancellationToken)":
|
||||||
|
"self.native_create_item(parent_folder, name, description, type_, asset_transaction_id, inv_type, libremetaverse_types::WearableType::Shape, next_owner_mask, cancellation_token).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.CreateItemAsync(LibreMetaverse.UUID,System.String,System.String,LibreMetaverse.AssetType,LibreMetaverse.UUID,LibreMetaverse.InventoryType,LibreMetaverse.WearableType,LibreMetaverse.PermissionMask,System.Threading.CancellationToken)":
|
||||||
|
"self.native_create_item(parent_folder, name, description, type_, asset_transaction_id, inv_type, wearable_type, next_owner_mask, cancellation_token).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.CreateLinkAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.String,System.String,LibreMetaverse.InventoryType,LibreMetaverse.UUID,System.Threading.CancellationToken)":
|
||||||
|
"self.native_create_link(folder_id, item_id, name, description, inv_type, transaction_id, cancellation_token).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.CreateLinksAsync(LibreMetaverse.UUID,System.Collections.Generic.IEnumerable{System.ValueTuple{LibreMetaverse.InventoryBase,System.String}},System.Action{System.Boolean},System.Threading.CancellationToken)":
|
||||||
|
"self.native_create_links(folder_id, links_to_create, callback, cancellation_token).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.CreateOrRetrieveInventoryItem(LibreMetaverse.InventoryType,LibreMetaverse.UUID)":
|
||||||
|
"self.native_create_or_retrieve_inventory_item(inv_type, item_id)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.DecryptShadowID(LibreMetaverse.UUID)":
|
||||||
|
"crate::inventory_manager::InventoryManager::native_decrypt_shadow_id(shadow_id)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.Dispose":
|
||||||
|
"self.native_dispose()",
|
||||||
|
"M:LibreMetaverse.InventoryManager.EncryptAssetID(LibreMetaverse.UUID)":
|
||||||
|
"crate::inventory_manager::InventoryManager::native_encrypt_asset_id(asset_id)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.EmptyFolder(LibreMetaverse.UUID)":
|
||||||
|
"self.native_empty_folder(folder_id)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.EmptyLostAndFoundAsync(System.Threading.CancellationToken)":
|
||||||
|
"self.native_empty_system_folder(libremetaverse_types::FolderType::LostAndFound, cancellation_token).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.EmptyTrashAsync(System.Threading.CancellationToken)":
|
||||||
|
"self.native_empty_system_folder(libremetaverse_types::FolderType::Trash, cancellation_token).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.FetchItemAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.Threading.CancellationToken)":
|
||||||
|
"self.native_fetch_item(item_id, owner_id, cancellation_token, false).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.FetchItemHttpAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.Threading.CancellationToken)":
|
||||||
|
"self.native_fetch_item(item_id, owner_id, token, true).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.FindFolderForType(LibreMetaverse.AssetType)":
|
||||||
|
"Ok(self.native_find_folder_for_asset_type(type_))",
|
||||||
|
"M:LibreMetaverse.InventoryManager.FindFolderForType(LibreMetaverse.FolderType)":
|
||||||
|
"Ok(self.native_find_folder_for_type(type_))",
|
||||||
|
"M:LibreMetaverse.InventoryManager.FindObjectByPathAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.String,System.Threading.CancellationToken)":
|
||||||
|
"self.native_find_object_by_path(base_folder, inventory_owner, path, cancellation_token).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.FolderContentsAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.Boolean,System.Boolean,LibreMetaverse.InventorySortOrder,System.Threading.CancellationToken,System.Boolean)":
|
||||||
|
"self.native_folder_contents(folder, owner, fetch_folders, fetch_items, order, cancellation_token, follow_links.unwrap_or(false)).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.GetInventoryRecursiveAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.Collections.Generic.List{LibreMetaverse.InventoryFolder},System.Collections.Generic.List{LibreMetaverse.InventoryItem},System.Threading.CancellationToken)":
|
||||||
|
"self.native_get_inventory_recursive(folder_id, owner, cats, items, cancellation_token).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.GetTaskInventoryAsync(LibreMetaverse.UUID,System.UInt32,LibreMetaverse.Simulator,System.Threading.CancellationToken)":
|
||||||
|
"self.native_get_task_inventory(object_id, object_local_id, simulator, cancellation_token).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.GiveFolderAsync(LibreMetaverse.UUID,System.String,LibreMetaverse.UUID,System.Boolean,System.Threading.CancellationToken)":
|
||||||
|
"self.native_give_folder(folder_id, folder_name, recipient, do_effect, cancellation_token).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.GiveItem(LibreMetaverse.UUID,System.String,LibreMetaverse.AssetType,LibreMetaverse.UUID,System.Boolean)":
|
||||||
|
"self.native_give_item(item_id, item_name, asset_type, recipient, do_effect)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.ItemCRC(LibreMetaverse.InventoryItem)":
|
||||||
|
"crate::inventory_manager::InventoryManager::native_item_crc(&iitem)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.ParseTaskInventory(System.String)":
|
||||||
|
"crate::inventory_manager::InventoryManager::native_parse_task_inventory(task_data)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.LocalFind(LibreMetaverse.UUID,System.String[],System.Int32,System.Boolean)":
|
||||||
|
"self.native_local_find(base_folder, path, level, first_only)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.Move(LibreMetaverse.InventoryBase,LibreMetaverse.InventoryFolder)":
|
||||||
|
"self.native_move_object(item, new_parent)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.MoveFolder(LibreMetaverse.UUID,LibreMetaverse.UUID,System.Threading.CancellationToken)":
|
||||||
|
"self.native_move_folders(std::collections::HashMap::from([(folder_id, new_parent_id)]), cancellation_token)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.MoveFolderAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.Threading.CancellationToken)":
|
||||||
|
"self.native_move_folders_async(std::collections::HashMap::from([(folder_id, new_parent_id)]), cancellation_token).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.MoveFolders(System.Collections.Generic.Dictionary{LibreMetaverse.UUID,LibreMetaverse.UUID},System.Threading.CancellationToken)":
|
||||||
|
"self.native_move_folders(folders_new_parents, cancellation_token)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.MoveFoldersAsync(System.Collections.Generic.Dictionary{LibreMetaverse.UUID,LibreMetaverse.UUID},System.Threading.CancellationToken)":
|
||||||
|
"self.native_move_folders_async(folders_new_parents, cancellation_token).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.MoveItem(LibreMetaverse.UUID,LibreMetaverse.UUID,System.String,System.Threading.CancellationToken)":
|
||||||
|
"self.native_move_items(std::collections::HashMap::from([(item_id, (folder_id, new_name))]), cancellation_token)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.MoveItem(LibreMetaverse.UUID,LibreMetaverse.UUID,System.Threading.CancellationToken)":
|
||||||
|
"self.native_move_items(std::collections::HashMap::from([(item_id, (folder_id, String::new()))]), cancellation_token)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.MoveItemAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.String,System.Threading.CancellationToken)":
|
||||||
|
"self.native_move_items_async(std::collections::HashMap::from([(item_id, (folder_id, new_name))]), cancellation_token).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.MoveItemAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.Threading.CancellationToken)":
|
||||||
|
"self.native_move_items_async(std::collections::HashMap::from([(item_id, (folder_id, String::new()))]), cancellation_token).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.MoveItems(System.Collections.Generic.Dictionary{LibreMetaverse.UUID,LibreMetaverse.UUID},System.Threading.CancellationToken)":
|
||||||
|
"self.native_move_items(items_new_folders.into_iter().map(|(item, folder)| (item, (folder, String::new()))).collect(), cancellation_token)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.MoveItemsAsync(System.Collections.Generic.Dictionary{LibreMetaverse.UUID,LibreMetaverse.UUID},System.Threading.CancellationToken)":
|
||||||
|
"self.native_move_items_async(items_new_folders.into_iter().map(|(item, folder)| (item, (folder, String::new()))).collect(), cancellation_token).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.MoveTaskInventory(System.UInt32,LibreMetaverse.UUID,LibreMetaverse.UUID,LibreMetaverse.Simulator)":
|
||||||
|
"self.native_move_task_inventory(object_local_id, task_item_id, inventory_folder_id, simulator)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RemoveDescendantsAsync(LibreMetaverse.UUID,System.Threading.CancellationToken)":
|
||||||
|
"self.native_remove_descendants(folder, cancellation_token).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RemoveFolderAsync(LibreMetaverse.UUID,System.Threading.CancellationToken)":
|
||||||
|
"self.native_remove_inventory_objects(Vec::new(), vec![folder], cancellation_token).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RemoveItemAsync(LibreMetaverse.UUID,System.Threading.CancellationToken)":
|
||||||
|
"self.native_remove_inventory_objects(vec![item], Vec::new(), cancellation_token).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RemoveItemsAsync(System.Collections.Generic.IEnumerable{LibreMetaverse.UUID},System.Threading.CancellationToken)":
|
||||||
|
"self.native_remove_inventory_objects(items.collect(), Vec::new(), cancellation_token).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RemoveTaskInventory(System.UInt32,LibreMetaverse.UUID,LibreMetaverse.Simulator)":
|
||||||
|
"self.native_remove_task_inventory(object_local_id, task_item_id, simulator)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestCopyItemAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.String,LibreMetaverse.UUID,System.Threading.CancellationToken)":
|
||||||
|
"self.native_copy_item(item, new_parent, new_name, old_owner_id, cancellation_token).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestCopyItemAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.String,System.Threading.CancellationToken)":
|
||||||
|
"self.native_copy_item_default_owner(item, new_parent, new_name, cancellation_token).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestCopyItemFromNotecardAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,LibreMetaverse.UUID,LibreMetaverse.UUID,System.Threading.CancellationToken,System.IProgress{LibreMetaverse.HttpCapsClient.ProgressReport})":
|
||||||
|
"self.native_copy_item_from_notecard(object_id, notecard_id, folder_id, item_id, cancellation_token, progress).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestCopyItemsAsync(System.Collections.Generic.List{LibreMetaverse.UUID},System.Collections.Generic.List{LibreMetaverse.UUID},System.Collections.Generic.List{System.String},LibreMetaverse.UUID,System.Threading.CancellationToken)":
|
||||||
|
"self.native_copy_items(items, target_folders, new_names, old_owner_id, cancellation_token).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestCopyItemsWithResultAsync(System.Collections.Generic.List{LibreMetaverse.UUID},System.Collections.Generic.List{LibreMetaverse.UUID},System.Collections.Generic.List{System.String},LibreMetaverse.UUID,System.Threading.CancellationToken)":
|
||||||
|
"self.native_copy_items(items, target_folders, new_names, old_owner_id, cancellation_token).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestDeRezToInventory(System.UInt32)":
|
||||||
|
"self.native_de_rez_to_objects_folder(object_local_id)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestDeRezToInventory(System.UInt32,LibreMetaverse.DeRezDestination,LibreMetaverse.UUID,LibreMetaverse.UUID)":
|
||||||
|
"self.native_de_rez_to_inventory(object_local_id, dest_type, dest_folder, transaction_id)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestFetchInventory(LibreMetaverse.UUID,LibreMetaverse.UUID,System.Threading.CancellationToken)":
|
||||||
|
"self.native_request_fetch_inventory(std::collections::HashMap::from([(item_id, owner_id)]), cancellation_token)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestFetchInventory(System.Collections.Generic.Dictionary{LibreMetaverse.UUID,LibreMetaverse.UUID},System.Threading.CancellationToken)":
|
||||||
|
"self.native_request_fetch_inventory(items, cancellation_token)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestFetchInventoryAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.Threading.CancellationToken)":
|
||||||
|
"self.native_request_fetch_inventory_async(std::collections::HashMap::from([(item_id, owner_id)]), cancellation_token, None).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestFetchInventoryAsync(System.Collections.Generic.Dictionary{LibreMetaverse.UUID,LibreMetaverse.UUID},System.Threading.CancellationToken,System.Action{System.Collections.Generic.List{LibreMetaverse.InventoryItem}})":
|
||||||
|
"self.native_request_fetch_inventory_async(items, cancellation_token, callback).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestFindObjectByPathAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.String,System.Threading.CancellationToken)":
|
||||||
|
"self.native_find_object_by_path(base_folder, inventory_owner, path, cancellation_token).await.map(|_| ())",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestFolderContentsAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.Boolean,System.Boolean,LibreMetaverse.InventorySortOrder,System.Threading.CancellationToken)":
|
||||||
|
"self.native_request_folder_contents(folder_id, owner_id, fetch_folders, fetch_items, order, cancellation_token).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestFolderContentsAsync(System.Collections.Generic.List{LibreMetaverse.InventoryFolder},System.Uri,System.Boolean,System.Boolean,LibreMetaverse.InventorySortOrder,System.Threading.CancellationToken)":
|
||||||
|
"self.native_request_folder_contents_batch(batch, capability_uri, fetch_folders, fetch_items, order, cancellation_token).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestFolderUpdateAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.Boolean,System.Boolean,LibreMetaverse.InventorySortOrder,System.Threading.CancellationToken)":
|
||||||
|
"self.native_request_folder_update(folder_id, owner_id, fetch_folders.unwrap_or(true), fetch_items.unwrap_or(true), order.unwrap_or(crate::InventorySortOrder::BY_NAME), cancellation_token).await",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestGetScriptRunning(LibreMetaverse.UUID,LibreMetaverse.UUID)":
|
||||||
|
"self.native_request_get_script_running(object_id, script_id)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestRestoreRezFromInventory(LibreMetaverse.Simulator,LibreMetaverse.InventoryItem,LibreMetaverse.UUID)":
|
||||||
|
"self.native_restore_rez_from_inventory(simulator, item, query_id)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestRezFromInventory(LibreMetaverse.Simulator,LibreMetaverse.Quaternion,LibreMetaverse.Vector3,LibreMetaverse.InventoryItem)":
|
||||||
|
"self.native_rez_from_inventory_default(simulator, rotation, position, item, None)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestRezFromInventory(LibreMetaverse.Simulator,LibreMetaverse.Quaternion,LibreMetaverse.Vector3,LibreMetaverse.InventoryItem,LibreMetaverse.UUID)":
|
||||||
|
"self.native_rez_from_inventory_default(simulator, rotation, position, item, Some(group_owner))",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestRezFromInventory(LibreMetaverse.Simulator,LibreMetaverse.UUID,LibreMetaverse.Quaternion,LibreMetaverse.Vector3,LibreMetaverse.InventoryItem,LibreMetaverse.UUID,LibreMetaverse.UUID,System.Boolean)":
|
||||||
|
"self.native_rez_from_inventory(simulator, task_id, rotation, position, item, group_owner, query_id, rez_selected)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestSetScriptRunning(LibreMetaverse.UUID,LibreMetaverse.UUID,System.Boolean)":
|
||||||
|
"self.native_request_set_script_running(object_id, script_id, running)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestTaskInventory(System.UInt32)":
|
||||||
|
"self.native_request_task_inventory(object_local_id, None)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestTaskInventory(System.UInt32,LibreMetaverse.Simulator)":
|
||||||
|
"self.native_request_task_inventory(object_local_id, simulator)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestUpdateItem(LibreMetaverse.InventoryItem)":
|
||||||
|
"self.native_request_update_items(vec![item], libremetaverse_types::UUID::random()?)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestUpdateItems(System.Collections.Generic.List{LibreMetaverse.InventoryItem})":
|
||||||
|
"self.native_request_update_items(items, libremetaverse_types::UUID::random()?)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.RequestUpdateItems(System.Collections.Generic.List{LibreMetaverse.InventoryItem},LibreMetaverse.UUID)":
|
||||||
|
"self.native_request_update_items(items, transaction_id)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.UpdateFolderProperties(LibreMetaverse.UUID,LibreMetaverse.UUID,System.String,LibreMetaverse.FolderType)":
|
||||||
|
"self.native_update_folder_properties(folder_id, parent_id, name, type_)",
|
||||||
|
"M:LibreMetaverse.InventoryManager.UpdateTaskInventory(System.UInt32,LibreMetaverse.InventoryItem,LibreMetaverse.Simulator,System.Boolean)":
|
||||||
|
"self.native_update_task_inventory(object_local_id, item, simulator, only_mod_meta.unwrap_or(true))",
|
||||||
|
"M:LibreMetaverse.InventoryManager.WaitForNextInventoryOfferAsync(System.Threading.CancellationToken)":
|
||||||
|
"self.native_wait_for_next_inventory_offer(cancellation_token).await",
|
||||||
|
"P:LibreMetaverse.InventoryManager.NoResults":
|
||||||
|
"crate::inventory_manager::InventoryManager::native_no_results()",
|
||||||
|
"P:LibreMetaverse.InventoryManager.Store":
|
||||||
|
"self.native_store()",
|
||||||
"E:LibreMetaverse.AgentManager.IM":
|
"E:LibreMetaverse.AgentManager.IM":
|
||||||
"self.native_subscribe_im(handler)",
|
"self.native_subscribe_im(handler)",
|
||||||
"E:LibreMetaverse.AgentManager.AgentDataReply":
|
"E:LibreMetaverse.AgentManager.AgentDataReply":
|
||||||
|
|||||||
@@ -994,6 +994,7 @@ def validate_generated_shims() -> None:
|
|||||||
"crate::gesture::",
|
"crate::gesture::",
|
||||||
"crate::json_codec::",
|
"crate::json_codec::",
|
||||||
"crate::inventory::",
|
"crate::inventory::",
|
||||||
|
"crate::inventory_manager::",
|
||||||
"crate::message_codec::",
|
"crate::message_codec::",
|
||||||
"crate::message_decoder::",
|
"crate::message_decoder::",
|
||||||
"crate::notation::",
|
"crate::notation::",
|
||||||
|
|||||||
Reference in New Issue
Block a user