SDK reference
Every public type of the plugin SDK: Oadm.Sdk (server parts, no UI) and Oadm.Sdk.Client (dialogs, pages, toolbar entries and the shared controls). Generated from the source of main; the guide pages explain how the parts fit together, starting with the developer overview.
Default implementation marks an interface member with a body in the SDK. In an interface your plugin implements (ITaskPlugin), you may leave it out. In an interface OADM implements (ICorePluginContext), an older OADM answers with that default: null, an empty list or NotSupportedException, as the member says.
Oadm.Sdk.Actions
Section titled “Oadm.Sdk.Actions”Actions of the event rules: what a rule does when it turns on or off.
| Type | Description |
|---|---|
ActionChoice |
A choice of a ActionFieldType.Choice or ActionFieldType.DynamicChoice field. |
ActionEdge |
Why an action runs: a stateless rule fired, or a stateful rule turned on or off. |
ActionField |
One setting of an action. |
ActionFieldType |
Input kinds of a declarative action setting; the client draws the form from them. |
ActionInvocation |
One run of an action on one target (a device, or none for actions without IActionPlugin.NeedsDevice). |
ActionPlaceholder |
A placeholder of the event rule actions: “{serial}” and what it stands for. |
ActionPlaceholders |
The placeholders of the event rule actions (everything OADM knows about the rule, the event and the device), one list for the server (ActionPlaceholders.Fill) and the rule dialog’s placeholder panel. |
ActionSettings |
The host’s checks of declarative action settings (ActionField), shared by the server (before a rule is saved) and the rule dialog (errors below the fields): required values, number ranges, choices, lengths. |
ActionTrigger |
What happened, handed to an action run. |
IActionContext |
Server services for one action run. |
IActionPlugin |
An action of the event rules (“Set output”, “Run VAPIX command”, “Send email”). |
IActionQueryContext |
Services for IActionPlugin.ListChoicesAsync (read-only, while a rule is edited). |
IActionSource |
A core plugin that contributes actions implements this next to ICorePlugin. |
PlaceholderEscape |
How a placeholder value is written into a text with a format, so the text stays valid. |
Oadm.Sdk.Client
Section titled “Oadm.Sdk.Client”The client parts of a plugin: task dialogs, rail pages and toolbar entries, and what the client gives them.
| Type | Description |
|---|---|
DeviceOrder |
The order of device lists: IPv4 addresses numerically, host names and other addresses after them. |
DeviceTexts |
Device texts shared by the host and plugin pages (one phrase per concept). |
DeviceWebPages |
Pages of the relay itself. |
DeviceWebRefusedException |
The device cannot be opened now; the message is the shared device status text. |
FileSizeText |
The one file size format of the dialogs (file rows): “87.0 MB”, “412 KB”. |
HostPages |
Host pages a toolbar plugin can open (IToolbarContext.OpenAsync). |
ICorePluginClientContext |
What a core plugin page can see and do. |
ICorePluginPage |
UI page of a core plugin, shown in the navigation rail. |
IDeviceWebAccess |
Opens the web interface of a managed device for an embedded browser. |
IDeviceWebSession |
One relay for one device; dispose it when its browser tab closes or shows another device. |
ILiveVideo |
One live video: ILiveVideo.View goes into the page; ILiveVideo.Start shows a device. |
ILiveVideoAccess |
The host’s live video for plugin pages (ICorePluginClientContext.LiveVideo): the same picture as the Devices page’s live view, with adaptive quality, fullscreen, the channel switch and the zoom, focus and PTZ controls. |
ITaskDialogContext |
Server access for a task plugin dialog. |
ITaskPluginDialog |
Client part of a task plugin that needs user input before running. |
IToolbarContext |
What a toolbar plugin can see and do: the devices and the selection (with change events), the task plugins, the host pages and dialogs, and the same server access as a task plugin dialog. |
IToolbarPlugin |
A part of the Devices page toolbar: any Avalonia control (button, toggle, dropdown, text, …). |
LiveVideoPlace |
What a live video offers in its place. |
PluginEventWatch |
The live events of a plugin page, watched again after the connection drops. |
ServerErrors |
Server errors for plugin pages without a gRPC reference. |
ToolbarGroup |
Groups of the Devices page toolbar, left to right. |
ToolbarTaskPlugin |
A task plugin as the toolbar sees it (server TaskService.ListTaskPlugins). |
Oadm.Sdk.Client.Collections
Section titled “Oadm.Sdk.Client.Collections”Collections for grids that change in one step.
| Type | Description |
|---|---|
IResettableList |
A list whose whole content can be replaced in one step (one Reset notification). |
RangeObservableCollection<T> |
ObservableCollection |
Oadm.Sdk.Client.Controls
Section titled “Oadm.Sdk.Client.Controls”The shared controls of the OADM client for plugin dialogs and pages.
| Type | Description |
|---|---|
CardHeader |
The heading of a card, like the add devices page: card title, optional secondary description below it, optional controls on the right of the title (CardHeader.Trailing, e.g. |
CodeDocument |
What a CodeView shows: the (pretty-printed) text, the language used and its tokens (empty = plain text). |
CodeEditor |
The one editable code field (request bodies): a monospace TextBox for typing, selecting, the caret and undo, with the same text drawn colored on top of it (JSON, XML, param.cgi key=value; the tokenizer and colors of CodeView). |
CodeLanguage |
Language of a CodeView; CodeLanguage.Auto detects it from the content type and the text. |
CodeText |
Detection, pretty-printing and tokenizing behind CodeView (no UI types, testable on its own). |
CodeToken |
A highlighted range of CodeDocument.Text. |
CodeTokenKind |
Kind of a highlighted piece of code; each kind has a theme brush Oadm.Code. |
CodeView |
The one read-only code display (response bodies, headers): monospace, selectable and copyable, no line wrapping (horizontal scrolling), JSON and XML pretty-printed with 2 spaces and highlighted, param.cgi key=value text highlighted (keys, values, “# Error” lines). |
DeviceChoice |
The result of the DevicePickerWindow: all devices, the device of the event, or chosen devices and tags. |
DeviceChoiceKind |
What a DeviceChoice means. |
DeviceIcon |
The icon of a device everywhere a device is listed (the device grid, the Web View tree): the icon of its category (Icon.device.*), neutral while the device is OK, amber when it needs attention (Credentials required, Password not set, Certificate changed), red when it does not answer. |
DevicePickerOptions |
What the picker offers besides single devices (event rules: everything; a plain device list: nothing). |
DevicePickerViewModel |
The shared device picker (DevicePickerWindow): every managed device in address order, a search over address, model, MAC address, host name and tags, Select all / Select none for the devices the search shows, and the count. |
DevicePickerWindow |
The shared device picker of every dialog that needs a set of devices (host and plugins, one window, never a copy): title bar, one card with the count and a search, Select all / Select none for the devices the search shows, and a virtualized list with a check box per device (address, model; a device that cannot be chosen is greyed with the reason), then Cancel / OK. |
DevicePickItem |
One device in the DevicePickerWindow: check box, address, model, and why it cannot be chosen. |
DeviceSelectorTexts |
Short texts of a device choice for the “Selected devices: …” buttons (event rules, device triggers). |
DeviceTree |
The devices grouped by tag in one virtualized list (Web View, Live View): a group header with a chevron (a click collapses it), the devices with DeviceIcon and address below. |
DeviceTreeDevice |
A device under one tag group; a device with several tags has one row per tag. |
DeviceTreeGroup |
A tag (“No tag” for devices without one); collapsing hides its devices. |
DeviceTreeModel |
The rows of a device tree: the devices grouped by tag in tag order (a device with several tags under each, “No tag” last), sorted by address, filtered by a search and an optional DeviceTreeModel.Filter; collapsed groups hide their devices. |
DeviceTreeRow |
A row of the device tree (DeviceTree): a tag group header or a device under it. |
DialogFooter |
The button row at the bottom of every dialog, laid out like the add devices page: Cancel (secondary, Escape) on the left, the dialog’s own buttons (DialogFooter.Actions, e.g. |
DialogTitleBar |
The header of every dialog window (a window with WindowDecorations=“BorderOnly”, no system title bar): the title as a heading and an X that closes the window, aligned with the content. |
FileRow |
A chosen local file: file icon, file name, secondary details (size, what it is for), an error line when the file was rejected, and the “Choose file” button on the right. |
FormField |
The one labeled form row, used by every form of the host and the plugins: the label on the left (kept level with the input, also when a message appears below it), the input as content, and below the input either its validation error (red, small; the input’s own DataValidationErrors from INotifyDataErrorInfo, or FormField.Error for content without data validation such as a file row) or, when there is no error, the optional FormField.Hint. |
GroupedChoice |
One entry of a grouped select field (ComboBox with the class grouped): a group header (grey, not selectable) or a choice below it (indented). |
IconLabel |
The one icon + text row used everywhere (toolbar buttons, navigation rail, menus, dialogs). |
InfoIcon |
A small info icon next to an input (every “what does this mean” text): the text shows as a tooltip on hover and in a flyout on click. |
LoadingOverlay |
Hides the content of a dialog (or page area) while it loads: the window background with the theme’s ProgressRing and the text below it in the middle; it takes the pointer, so nothing below can be clicked. |
MessageWindow |
The message and confirmation dialog of the host and of plugin dialogs (one window, never a copy): title bar, the message, and a DialogFooter with Cancel on the left and the primary confirm button on the right. |
OadmIcon |
Monochrome outline icon. |
PageHeader |
Lets a plugin page put content into the host’s page header instead of a card heading: set ui:PageHeader.Subtitle (secondary line under the page title) and/or ui:PageHeader.Trailing (e.g. |
PageTab |
One tab of a page with tabs (Web View devices, Live View views): the title and a close button, the active one underlined in the accent color (theme Border.browserTab). |
PasswordBox |
The one password field used on every page and in every plugin dialog: a TextBox with the theme’s text box look (same height, padding and centering), masked with PasswordBox.Mask, and an eye button on the right that shows the password as plain text and hides it again (tooltip “Show password” / “Hide password”). |
ProgressRing |
An indeterminate progress ring: a faint circle with an accent arc that turns (the turning is the theme’s style ui |
ProgressRow |
The progress line used for scans and uploads: the theme progress bar (0 to 100, flowing “stream” dots while ProgressRow.IsActive) with a secondary status text on its right. |
SearchBox |
The one search field used on every page and dialog: search icon left, clear button right while text is present, fixed width from the theme. |
StatCard |
A monitoring card: a status icon and a title, a large count below and an optional detail line (e.g. |
StatusChip |
The one status display: a small icon colored by the status (check, warning, error, running, neutral) followed by plain text in the normal text color, like every other cell. |
TagPickItem |
One tag in the picker: check box, name, how many devices carry it. |
ToolbarButton |
The one toolbar button: IconLabel (icon + text) in a Button.toolbar, or Button.primary when ToolbarButton.IsPrimary. |
ToolbarSeparator |
The vertical line between toolbar groups (theme style Border.vseparator). |
WizardStepItem |
One step of a WizardSteps row: number, name, current / done, and whether it can be opened (every step before it complete). |
WizardSteps |
The step row of every wizard: a numbered circle and the name per step, a thin line between steps; the current step accent, done steps with a check, later steps grey. |
Oadm.Sdk.Client.Network
Section titled “Oadm.Sdk.Client.Network”The network interface select of plugin pages.
| Type | Description |
|---|---|
InterfaceSelection |
The “Listen on” select of a network service page (NTP server, DHCP server): the server’s interfaces as the server lists them, the selection kept across refreshes, and a configured interface that is gone stays selectable as “Ethernet (not available)” so the user sees what is configured. |
Oadm.Sdk.Client.Validation
Section titled “Oadm.Sdk.Client.Validation”Form validation with errors directly below the field.
| Type | Description |
|---|---|
FormValidator |
Field validation of a form view model for INotifyDataErrorInfo: every rule reports on the property it belongs to, so Avalonia shows the message directly below that input (DataValidationErrors, inside ui:FormField). |
IFormFieldVisits |
A form view model that wants to know when the user leaves a field (FormField calls it on lost focus with the bound property’s name); ValidatingViewModel shows that field’s error then. |
ValidatingViewModel |
Base class of every form view model (host and plugins): an ObservableObject that reports field errors through INotifyDataErrorInfo from the rules registered on ValidatingViewModel.Validation. |
Oadm.Sdk.Devices
Section titled “Oadm.Sdk.Devices”The managed devices as plugins see them, their status texts and the event streams.
| Type | Description |
|---|---|
DeviceAutoAddOutcome |
What IDeviceAutoAdd.AddAsync did with a device. |
DeviceAutoAddResult |
What happened when a core plugin asked the server to add a device it saw on the network. |
DeviceCategories |
Facts derived from a DeviceCategory. |
DeviceCategory |
Kind of Axis device. |
DeviceFollowResult |
What happened when a core plugin reported a managed device at a (possibly) new address. |
DeviceMessages |
The shared user texts for device problems, so the host and every plugin say the same thing: HTTP errors, timeouts, unreachable devices, a changed certificate and a removed device. |
DeviceMetadataDocument |
A complete metadata document as the device sent it, with the server’s receive time. |
DeviceStatus |
Whether OADM can work with a device, from the polling. |
DeviceStreamError |
Why a device stream could not be opened or broke. |
DeviceStreamException |
A device stream failure with a message the UI can show. |
IDeviceAutoAdd |
Adds devices a core plugin saw on the network (the DHCP server’s leases) through the same pipeline as the add page: anonymous Axis check, factory default check, automatic login with the credential list (never passwords of managed devices), then the device is stored like an add from the page and its first full refresh queued. |
IDeviceEventSource |
An open event stream; dispose to end it (RTSP TEARDOWN). |
IDeviceEventStreams |
Opens the event stream of a managed device on the server (RTSP metadata, rtsp:// |
IDeviceInfo |
Read-only view of a managed device, as exposed to plugins. |
IDeviceRepository |
The managed devices, read-only (ICorePluginContext.Devices). |
Oadm.Sdk.Events
Section titled “Oadm.Sdk.Events”Events for the event rules and the rule model.
| Type | Description |
|---|---|
DeviceSelector |
Which devices a condition or an action applies to. |
DeviceSelectorMode |
Which devices a condition or an action means. |
EventField |
A data field an event carries (“detection” = “blur”); a rule can filter on it (equals). |
EventFieldType |
Type of an event data field, for the condition filter of a rule. |
EventKind |
Stateless events are one-shot pulses (“rollout failed”); stateful events are on or off (“blur detected” until it clears). |
EventScope |
Device: one state (or pulse) per managed device. |
EventTypeInfo |
An event a source can publish. |
IDynamicEventSource |
An event source whose types change while it runs (types the user creates, e.g. |
IEventPublisher |
Publishes events to the server’s event rules. |
IEventSource |
A core plugin that publishes events for the event rules implements this next to ICorePlugin and publishes through ICorePluginContext.EventPublisher. |
RuleAction |
One action of a rule: the action plugin, its targets (devices for actions that act on devices) and its settings (JSON object; password fields are never sent to clients, see RuleAction.StoredSecretFields). |
RuleCondition |
One condition. |
RuleConditionKind |
What a condition checks. |
RuleDefinition |
An event rule as clients edit it (definition JSON of gRPC EventService). |
RuleSchedule |
Weekdays plus from / to (“08:00”, “18:00”); a “to” at or before “from” runs over midnight. |
Oadm.Sdk.Network
Section titled “Oadm.Sdk.Network”Helpers for plugins that serve the network: interfaces, port errors, rate limits, firewall rules.
| Type | Description |
|---|---|
BindErrorKind |
What a failed bind of a service port means. |
FirewallProtocol |
The protocol of a firewall rule. |
FirewallRule |
An inbound allow rule for the server executable on one local port (profiles Domain and Private). |
FirewallRuleKeeper |
Keeps one firewall rule in line with a service’s enabled state (NTP server, DHCP server): FirewallRuleKeeper.SyncAsync opens the rule when the service is enabled and closes it when disabled or stopped. |
HostOs |
The server’s operating system, for OS-specific status texts (bind errors, setup hints). |
HostOsInfo |
The operating system the server runs on. |
IFirewallRules |
The host firewall as far as plugins may change it. |
InterfaceOption |
One entry of a service page’s interface select (the server’s interfaces, listed by the server). |
InterfaceOptions |
Builds the entries of an interface select. |
IServerNetworkInterfaces |
Lists the server’s network interfaces. |
IWindowsServiceProbe |
Windows: whether a Windows service runs (it may hold a port). |
KeyedRateLimiter<TKey> |
Token buckets per client key (address, MAC) in a bounded LRU table plus one global bucket, shared by the network service plugins (NTP, DHCP). |
KeyedRateLimitOptions |
Limits of KeyedRateLimiter |
PortBindErrors |
Maps a failed bind of a service port (NTP 123, DHCP 67) per OS and builds the shared parts of the status texts. |
RateLimitDecision |
What to do with a request (KeyedRateLimiter |
RateLimitResult |
The answer of KeyedRateLimiter |
ScQueryServiceProbe |
Runs sc.exe query |
ServerNetworkInterface |
One network interface of the OADM server (for core plugins that serve the network, e.g. |
ServiceStatus |
The status line of a network service plugin (NTP server, DHCP server): kind ok / neutral / warning / error, a plain text for technicians and an optional detail (tooltip) with the fix. |
SystemNetworkInterfaces |
IServerNetworkInterfaces over NetworkInterface.GetAllNetworkInterfaces (Windows, Linux, macOS). |
Oadm.Sdk.Plugins
Section titled “Oadm.Sdk.Plugins”The plugin interfaces and the context the server gives them: task plugins, core plugins, steps, permissions.
| Type | Description |
|---|---|
CorePluginGroup |
Well-known context menu groups (ITaskPlugin.Group). |
DeviceIdentityException |
The device answering at an address is not the expected one (different or missing serial number). |
HostPermissionKeys |
The keys of the permissions OADM itself defines (the host’s rows of the matrix). |
ICorePlugin |
A service that runs inside the server while it is turned on, usually with a page in the navigation rail (ICorePluginPage in the client part). |
ICorePluginContext |
What the server gives a core plugin in ICorePlugin.StartAsync. |
ICorePluginDownloads |
Optional for a core plugin: files its page downloads (gRPC PluginService.Download). |
IPlugin |
What every plugin has: an id, a name and an icon. |
IPluginEvents |
Pushes live events from a core plugin to every client page watching it (gRPC PluginService.Watch). |
IPluginSettings |
Settings store namespaced per plugin. |
ISecretProtector |
Server-side encryption for secrets a plugin persists. |
ITaskExecutionContext |
What the server gives one task while it runs on one device. |
ITaskPlugin |
An entry of the device context menu that runs on the server, one task per selected device. |
ITaskPluginQuery |
Optional for task plugins whose dialog must read the current device state before the user decides (existing users, current network settings, installed ACAP applications, firmware status). |
ITaskQueryContext |
What the server gives a query (ITaskPluginQuery.QueryAsync). |
ITaskStep |
One named step of a task, started with ITaskExecutionContext.BeginStep. |
ITrustAnchors |
Extra certificate authorities the server trusts when it rates device certificates (the Certificate column of the device grid), e.g. |
IUploadedFiles |
Files the user uploaded from the client (firmware images, ACAP .eap packages). |
PermissionDefinition |
A right an administrator gives or takes per role on the Users page (the permission matrix). |
PermissionKeys |
Keys of permissions: the format the host stores and checks. |
PluginDownload |
A file a core plugin sends to its client page through gRPC PluginService.Download (ICorePluginDownloads.OpenDownloadAsync): the host copies PluginDownload.Content to the client in chunks and disposes the download afterwards, also when the client cancels. |
PluginEvent |
One live event of a core plugin for its client page (e.g. |
PluginManifest |
Content of plugin.json next to the plugin assemblies. |
SdkInfo |
The version of this SDK. |
TaskGroups |
Well-known context menu groups (ITaskPlugin.Group). |
TaskLogLevel |
The level of a task log entry (ITaskExecutionContext.Log). |
TaskPluginNames |
Display name rules for task plugins, applied by the server loader and the client menu. |
TaskStepExtensions |
Helpers for the common step patterns on ITaskExecutionContext. |
TaskStepInfo |
Immutable view of one step. |
TaskStepList |
The step list of one task: the state machine behind ITaskExecutionContext.PlanSteps and ITaskExecutionContext.BeginStep. |
TaskStepState |
State of one step of a task. |
TaskSupportReasons |
Plain-language texts for ITaskPlugin.NotSupportedReason: what is missing and what to do. |
UploadedFile |
An uploaded file. |
UserRole |
Role of an OADM user. |
Oadm.Sdk.Tasks
Section titled “Oadm.Sdk.Tasks”Starting and cancelling tasks from a core plugin.
| Type | Description |
|---|---|
ITaskRunner |
Starts and cancels tasks from a core plugin (ICorePluginContext.Tasks). |
Oadm.Sdk.Vapix
Section titled “Oadm.Sdk.Vapix”The logged-in VAPIX client of a device, API checks, request options and safe XML parsing.
| Type | Description |
|---|---|
BasicDeviceInfo |
The answer of basicdeviceinfo.cgi getAllProperties. |
DeviceApi |
One entry of the device’s VAPIX API discovery list (apidiscovery.cgi getApiList), e.g. |
DeviceApiExtensions |
Compatibility checks every task plugin must use before it changes anything on a device. |
DeviceNotCompatibleException |
The device does not offer a required VAPIX API version. |
DeviceXml |
The only way OADM and its plugins parse XML that came from a device: documents of at most DeviceXml.MaxCharacters characters (1 MB), DTD processing prohibited, no external resolver. |
IVapixClient |
Authenticated VAPIX access to one device, with the stored login and the pinned certificate. |
IVapixClientFactory |
Creates logged-in clients for managed devices (ICorePluginContext.Vapix). |
VapixRequestOptions |
Per-request options understood by IVapixClient.SendAsync. |
VideoResolution |
A video resolution in pixels. |
VideoResolutions |
Resolution choice shared by the live view and plugins (snapshots). |
VideoSource |
One video source of a device: a view area, a sensor of a multisensor camera or a channel of a video encoder. |