Skip to content

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.

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.

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).

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 with bulk operations that raise a single NotifyCollectionChangedAction.Reset instead of one event per item.

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.Brush.
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.

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.

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.

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:///axis-media/media.amp?video=0&audio=0&event=on) with the credentials OADM stores for it.
IDeviceInfo Read-only view of a managed device, as exposed to plugins.
IDeviceRepository The managed devices, read-only (ICorePluginContext.Devices).

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.

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.Check).
RateLimitResult The answer of KeyedRateLimiter.Check for one request.
ScQueryServiceProbe Runs sc.exe query (state names are not localized) with a 3 s timeout; false elsewhere.
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).

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.

Starting and cancelling tasks from a core plugin.

Type Description
ITaskRunner Starts and cancels tasks from a core plugin (ICorePluginContext.Tasks).

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.