Files
onvif-go/device_storage.go
T
0x524a 96ac509c24 refactor: update HTTP request handling and improve documentation
- Replaced http.NewRequest with http.NewRequestWithContext in client tests for better context management.
- Updated method names and comments for clarity, including renaming GetWsdlUrl to GetWsdlURL and StorageUri to StorageURI for consistency.
- Enhanced comments across various files to provide clearer descriptions of functionality and ONVIF specifications.
2025-12-02 08:41:37 -05:00

181 lines
6.0 KiB
Go

package onvif
import (
"context"
"encoding/xml"
"fmt"
"github.com/0x524a/onvif-go/internal/soap"
)
// GetStorageConfigurations retrieves storage configurations. ONVIF Specification: GetStorageConfigurations operation.
func (c *Client) GetStorageConfigurations(ctx context.Context) ([]*StorageConfiguration, error) {
type GetStorageConfigurationsBody struct {
XMLName xml.Name `xml:"tds:GetStorageConfigurations"`
Xmlns string `xml:"xmlns:tds,attr"`
}
type GetStorageConfigurationsResponse struct {
XMLName xml.Name `xml:"GetStorageConfigurationsResponse"`
StorageConfigurations []*StorageConfiguration `xml:"StorageConfigurations"`
}
request := GetStorageConfigurationsBody{
Xmlns: deviceNamespace,
}
var response GetStorageConfigurationsResponse
username, password := c.GetCredentials()
soapClient := soap.NewClient(c.httpClient, username, password)
if err := soapClient.Call(ctx, c.endpoint, "", request, &response); err != nil {
return nil, fmt.Errorf("GetStorageConfigurations failed: %w", err)
}
return response.StorageConfigurations, nil
}
// GetStorageConfiguration retrieves a storage configuration. ONVIF Specification: GetStorageConfiguration operation.
func (c *Client) GetStorageConfiguration(ctx context.Context, token string) (*StorageConfiguration, error) {
type GetStorageConfigurationBody struct {
XMLName xml.Name `xml:"tds:GetStorageConfiguration"`
Xmlns string `xml:"xmlns:tds,attr"`
Token string `xml:"tds:Token"`
}
type GetStorageConfigurationResponse struct {
XMLName xml.Name `xml:"GetStorageConfigurationResponse"`
StorageConfiguration *StorageConfiguration `xml:"StorageConfiguration"`
}
request := GetStorageConfigurationBody{
Xmlns: deviceNamespace,
Token: token,
}
var response GetStorageConfigurationResponse
username, password := c.GetCredentials()
soapClient := soap.NewClient(c.httpClient, username, password)
if err := soapClient.Call(ctx, c.endpoint, "", request, &response); err != nil {
return nil, fmt.Errorf("GetStorageConfiguration failed: %w", err)
}
return response.StorageConfiguration, nil
}
// CreateStorageConfiguration creates a storage configuration.
// ONVIF Specification: CreateStorageConfiguration operation.
func (c *Client) CreateStorageConfiguration(ctx context.Context, config *StorageConfiguration) (string, error) {
type CreateStorageConfigurationBody struct {
XMLName xml.Name `xml:"tds:CreateStorageConfiguration"`
Xmlns string `xml:"xmlns:tds,attr"`
StorageConfiguration *StorageConfiguration `xml:"tds:StorageConfiguration"`
}
type CreateStorageConfigurationResponse struct {
XMLName xml.Name `xml:"CreateStorageConfigurationResponse"`
Token string `xml:"Token"`
}
request := CreateStorageConfigurationBody{
Xmlns: deviceNamespace,
StorageConfiguration: config,
}
var response CreateStorageConfigurationResponse
username, password := c.GetCredentials()
soapClient := soap.NewClient(c.httpClient, username, password)
if err := soapClient.Call(ctx, c.endpoint, "", request, &response); err != nil {
return "", fmt.Errorf("CreateStorageConfiguration failed: %w", err)
}
return response.Token, nil
}
// SetStorageConfiguration sets a storage configuration. ONVIF Specification: SetStorageConfiguration operation.
func (c *Client) SetStorageConfiguration(ctx context.Context, config *StorageConfiguration) error {
type SetStorageConfigurationBody struct {
XMLName xml.Name `xml:"tds:SetStorageConfiguration"`
Xmlns string `xml:"xmlns:tds,attr"`
StorageConfiguration *StorageConfiguration `xml:"tds:StorageConfiguration"`
}
type SetStorageConfigurationResponse struct {
XMLName xml.Name `xml:"SetStorageConfigurationResponse"`
}
request := SetStorageConfigurationBody{
Xmlns: deviceNamespace,
StorageConfiguration: config,
}
var response SetStorageConfigurationResponse
username, password := c.GetCredentials()
soapClient := soap.NewClient(c.httpClient, username, password)
if err := soapClient.Call(ctx, c.endpoint, "", request, &response); err != nil {
return fmt.Errorf("SetStorageConfiguration failed: %w", err)
}
return nil
}
// DeleteStorageConfiguration deletes a storage configuration.
// ONVIF Specification: DeleteStorageConfiguration operation.
func (c *Client) DeleteStorageConfiguration(ctx context.Context, token string) error {
type DeleteStorageConfigurationBody struct {
XMLName xml.Name `xml:"tds:DeleteStorageConfiguration"`
Xmlns string `xml:"xmlns:tds,attr"`
Token string `xml:"tds:Token"`
}
type DeleteStorageConfigurationResponse struct {
XMLName xml.Name `xml:"DeleteStorageConfigurationResponse"`
}
request := DeleteStorageConfigurationBody{
Xmlns: deviceNamespace,
Token: token,
}
var response DeleteStorageConfigurationResponse
username, password := c.GetCredentials()
soapClient := soap.NewClient(c.httpClient, username, password)
if err := soapClient.Call(ctx, c.endpoint, "", request, &response); err != nil {
return fmt.Errorf("DeleteStorageConfiguration failed: %w", err)
}
return nil
}
// SetHashingAlgorithm sets the hashing algorithm. ONVIF Specification: SetHashingAlgorithm operation.
func (c *Client) SetHashingAlgorithm(ctx context.Context, algorithm string) error {
type SetHashingAlgorithmBody struct {
XMLName xml.Name `xml:"tds:SetHashingAlgorithm"`
Xmlns string `xml:"xmlns:tds,attr"`
Algorithm string `xml:"tds:Algorithm"`
}
type SetHashingAlgorithmResponse struct {
XMLName xml.Name `xml:"SetHashingAlgorithmResponse"`
}
request := SetHashingAlgorithmBody{
Xmlns: deviceNamespace,
Algorithm: algorithm,
}
var response SetHashingAlgorithmResponse
username, password := c.GetCredentials()
soapClient := soap.NewClient(c.httpClient, username, password)
if err := soapClient.Call(ctx, c.endpoint, "", request, &response); err != nil {
return fmt.Errorf("SetHashingAlgorithm failed: %w", err)
}
return nil
}