package Geo::GDAL::FFI::Object; use v5.10; use strict; use warnings; use Carp; our $VERSION = 0.0900; sub GetDescription { my $self = shift; return Geo::GDAL::FFI::GDALGetDescription($$self); } sub HasCapability { my ($self, $cap) = @_; my $tmp = $Geo::GDAL::FFI::capabilities{$cap}; confess "Unknown capability: $cap." unless defined $tmp; my $md = $self->GetMetadata(''); return $md->{'DCAP_'.$cap}; } sub GetMetadataDomainList { my ($self) = @_; my $csl = Geo::GDAL::FFI::GDALGetMetadataDomainList($$self); my @list; for my $i (0..Geo::GDAL::FFI::CSLCount($csl)-1) { push @list, Geo::GDAL::FFI::CSLGetField($csl, $i); } Geo::GDAL::FFI::CSLDestroy($csl); return wantarray ? @list : \@list; } sub GetMetadata { my ($self, $domain) = @_; my %md; unless (defined $domain) { for $domain ($self->GetMetadataDomainList) { $md{$domain} = $self->GetMetadata($domain); } return wantarray ? %md : \%md; } my $csl = Geo::GDAL::FFI::GDALGetMetadata($$self, $domain); for my $i (0..Geo::GDAL::FFI::CSLCount($csl)-1) { my ($name, $value) = split /=/, Geo::GDAL::FFI::CSLGetField($csl, $i); $md{$name} = $value; } return wantarray ? %md : \%md; } sub SetMetadata { my ($self, $metadata, $domain) = @_; unless (defined $domain) { for $domain (keys %$metadata) { $self->SetMetadata($metadata->{$domain}, $domain); } } else { my $csl = 0; for my $name (keys %$metadata) { $csl = Geo::GDAL::FFI::CSLAddString($csl, "$name=$metadata->{$name}"); } my $err = Geo::GDAL::FFI::GDALSetMetadata($$self, $csl, $domain); Geo::GDAL::FFI::CSLDestroy($csl); confess Geo::GDAL::FFI::error_msg() if $err == $Geo::GDAL::FFI::Failure; warn Geo::GDAL::FFI::error_msg() if $err == $Geo::GDAL::FFI::Warning; } } sub GetMetadataItem { my ($self, $name, $domain) = @_; $domain //= ""; return Geo::GDAL::FFI::GDALGetMetadataItem($$self, $name, $domain); } sub SetMetadataItem { my ($self, $name, $value, $domain) = @_; $domain //= ""; my $err = Geo::GDAL::FFI::GDALSetMetadataItem($$self, $name, $value, $domain); confess Geo::GDAL::FFI::error_msg() if $err == $Geo::GDAL::FFI::Failure; warn Geo::GDAL::FFI::error_msg() if $err == $Geo::GDAL::FFI::Warning; } 1; =pod =encoding UTF-8 =head1 NAME Geo::GDAL::FFI::Object - A GDAL major object =head1 SYNOPSIS =head1 DESCRIPTION The base class for classes Driver, Dataset, Band, and Layer. =head1 METHODS =head2 GetDescription my $desc = $object->GetDescription; =head2 HasCapability my $has_cap = $object->HasCapability($capability); =head2 GetMetadataDomainList my @domains = $object->GetMetadataDomainList; =head2 GetMetadata my %metadata = $object->GetMetadata($domain); Returns the object metadata of a given domain. my $metadata = $object->GetMetadata($domain); Returns the object metadata of a given domain in an anonymous hash. my %metadata = $object->GetMetadata; Returns the object metadata. my $metadata = $object->GetMetadata; Returns the object metadata in an anonymous hash. =head2 SetMetadata $object->SetMetadata($metadata, $domain); Sets the object metadata in a given domain. The metadata is in an anonymous hash. $object->SetMetadata($metadata); Sets the object metadata in the domains that are the keys of the hash $metadata references. The values of the hash are the metadata in anonymous hashes. =head2 GetMetadataItem my $value = $object->GetMetadataItem($item, $domain) Gets the value of the metadata item in a domain (by default an empty string). =head2 SetMetadataItem $object->GetMetadataItem($item, $value, $domain) Sets the value of the metadata item in a domain (by default an empty string). =head1 LICENSE This software is released under the Artistic License. See L. =head1 AUTHOR Ari Jolma - Ari.Jolma at gmail.com =head1 SEE ALSO L L, L, L =cut __END__;