Win32-Exe

 view release on metacpan or  search on metacpan

lib/Win32/Exe/Manifest.pm  view on Meta::CPAN

    if($setval eq 'none') {
        # delete element and collapse tree if empty
        $self->_delete_collapse_tree($ref, [ qw(application windowSettings dpiAware) ] );
    } else {
        # create value if it does not exist
        my $writeref = $self->_get_first_tree_node($ref, [ qw(application windowsSettings)  ], $namealias );
        $writeref->{dpiAware} = [ { $elementvaluename => $setval } ];
        # add xmlns for windowsSettings
        my $xmlns = $schema->{elementtypes}->{windowsSettings}->{attributes}->{xmlns}->{default};
        $ref->{application}->[0]->{windowsSettings}->[0]->{xmlns} = $xmlns;
    }
    my $errors = $self->validate_errors;
    croak('Manifest XML had errors after dpiAware setting: ' . $errors) if $errors;
}

sub get_dpiaware {
    my $self = shift;
    my $ref = $self->refhash()->{assembly}->[0];
    my $elementvaluename = $self->default_content;
    return 'none' if(not exists($ref->{application}->[0]->{windowsSettings}->[0]->{dpiAware}->[0]->{$elementvaluename}));
    return $ref->{application}->[0]->{windowsSettings}->[0]->{dpiAware}->[0]->{$elementvaluename};
}

=head2 Manifest Information

=head3 get_manifest_type

    my $type = $manifest->get_manifest_type;

Returns the manifest type ( 'application' or 'assembly' );


=cut

sub get_manifest_type { $_[0]->{_w32_exe_datatype}; }


sub get_current_schema { $_[0]->{_w32_exe_schema}; }


sub set_current_schema {
    my($self, $schema) = @_;
    $self->{_w32_exe_schema} = $schema;
    my $errors = $self->validate_errors;
    croak('Manifest XML had errors following set schema: ' . $errors) if $errors;
}

sub default_xmldecl { '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' }

sub default_content { 'elementValue' }

sub get_parser_config {
    my $self = shift;
    my %config = (
        KeepRoot   => 1,
        ForceArray => 1,
        KeyAttr => {},
        XMLDecl => $self->default_xmldecl,
        ForceContent => 1,
        ContentKey => $self->default_content,
        # AttrIndent => 1,
    );
    return %config;
}

sub refhash { $_[0]->{_w32_exe_dataref}; }


sub merge_manifest {
    my($self, $xml) = @_;
    my $mergefest;
    my $class = ref($self);
    eval { $mergefest = $class->new($xml, $self->get_manifest_type); };
    croak(qq(Merging $@)) if $@;
    my $newref = $mergefest->refhash()->{assembly}->[0];
    my $oldref = $self->refhash()->{assembly}->[0];
    $self->_merge_element_merge('assembly', $oldref, $newref);
    my $errors = $self->validate_errors;
    croak('Manifest had errors after merging: ' . $errors) if $errors;
}


sub get_osname_from_osid {
    my($self, $osid) = @_;
    my $name = 'Unknown Windows Version';
    $name = 'Windows Vista' if $osid =~ /e2011457-1546-43c5-a5fe-008deee3d3f0/;
    $name = 'Windows 7' if $osid =~ /35138b9a-5d96-4fbd-8e2d-a2440225f93a/;
    return $name;
}

sub get_osid_from_osname {
    my($self, $name) = @_;
    my $osid = undef;
    $osid = '{e2011457-1546-43c5-a5fe-008deee3d3f0}' if(lc($name) eq 'windows vista');
    $osid = '{35138b9a-5d96-4fbd-8e2d-a2440225f93a}' if(lc($name) eq 'windows 7');
    return $osid;
}

sub _get_dependendency_index {
    my($self, $name) = @_;
    my $exref = $self->refhash()->{assembly}->[0];
    return undef if not exists $exref->{dependency};
    my $rval = undef;
    my @existing = @{ $exref->{dependency} };
    for(my $i = 0; $i < @existing; $i++) {
        my $depname = $existing[$i]->{dependentAssembly}->[0]->{assemblyIdentity}->[0]->{name};
        if($depname eq $name) {
            $rval = $i;
            last;
        }
    }
    return $rval;
}

sub _get_first_tree_node {
    my ($self, $ref, $paths, $namealias ) = @_;
    my $newref = $ref;
    while(my $path = shift(@$paths) ) {
        $newref->{$path} = [{}]  if(not exists($newref->{$path}));
        $newref = $newref->{$path}->[0];
        $newref->{elementnamespace} = $namealias if $namealias;



( run in 0.939 second using v1.01-cache-2.11-cpan-364913b4093 )