listview and filehandles

Edward <[email protected]>
Newsgroups gmane.comp.kde.devel.perl
Message-ID <[email protected]>
ok well. heres something really odd. when using the listView in perlqt i 
can no longer close or write to filehandles. they supposedly open fine 
but when i print to them nothing prints and when i close them using
close FHA or die "cant close $pathname: $!";
i get cant close /tmp/Adema.Adema: Bad file descriptor at 
/root/ui/form1.pl line 234

im really new to all this perlqt stuff and limited experience with perl 
but here is the code that i have so far. its a media library for mp3's i 
couldnt find any one that i liked so i have to make one. any help with 
this would be appreciated. just need help with not being able to print 
after listView2 gets created. i have tried with/without the extra use's 
including strict. i am using perqt 3.0.0.8 and perl 5.8.2 on FreeBSD 5.2.

#!/usr/local/bin/perl
# Form implementation generated from reading ui file 'form1.ui'
#
# Created: Fri Apr 23 23:39:55 2004
#      by: The PerlQt User Interface Compiler (puic)
#
# WARNING! All changes made in this file will be lost!


use strict;
use utf8;

package Form1;

use Qt;
use Qt::isa qw(Qt::Widget);
use Qt::slots
    mine => [],
    endme => [];
use Qt::attributes qw(
    listView2
    btnpopulate
    btnexit
);

use File::Basename;
use List::Compare;
use MP3::Tag;
use Data::Dumper;
use constant SEARCH_ALL   => 'all';
use IO::Handle;
use Fcntl qw(:DEFAULT :flock); #might not be needed
my $basedir = "/tmp/"; #base dir for the files

my %supported_frames = (
            TIT1 => 1,
            TIT2 => 1,
            TRCK => 1,
            TALB => 1,
            TPE1 => 1,
            COMM => 1,
            WXXX => 1,
            TYER => 1,
               );
my @supported_frames = keys %supported_frames;
my $artist = "";
my $trackname = "";
my $tracknumber = "";
my $tracklength = "";
my $genre = "";
my $album = "";
my $combochars = "----------";
my $file = "";
my @rawdata=[];
sub TRUE { 1 }
sub FALSE { -1 }
my $DEBUG = FALSE;



# simple check for the base dir to make sure it has the trailing /.
if (!(substr($basedir,-1,1) eq "/")) {
    $basedir = $basedir."/";
}



my @song = ["", "", "", ""];
my @album = [@song];

my @artist = [@album];
my @artists = (["Artist",@artist]);
my @newsong = [];
sub NEW {
    shift->SUPER::NEW(@_[0..2]);

    if ( name() eq "unnamed" ) {
        setName("Form1" );
    }
    #*******
    #*******
    #******* THIS IS THE LAST POINT WHERE THIS WORKS CORRECTLY.
    #    $pathname = "/tmp/Adema.Adema";
    #    print "Opening file and printing to it\n";
    #    open(FHA, "> $pathname")    or die "can't open $pathname: $!";
    #    #flock(FH, LOCK_EX)        or die "can't flock $pathname: $!";
    #    print FHA "hello there\n"     or die "cant print $pathname: $!";
    #    close(FHA)            or die "cant close $pathname: $!";
    #
    #
    #
       
    listView2 = Qt::ListView(this, trUtf8("listView2"));
    listView2->addColumn(trUtf8("Artist"));
    listView2->addColumn(trUtf8("Album"));
    listView2->addColumn(trUtf8("Song"));
    listView2->addColumn(trUtf8("Time"));
    listView2->addColumn(trUtf8("Track Number"));
   
    listView2->setGeometry( Qt::Rect(0, 0, 520, 500) );
    listView2->setSizePolicy( Qt::SizePolicy(4, 4, 100, 100, 
listView2->sizePolicy()->hasHeightForWidth()) );

    btnpopulate = Qt::PushButton(this, "btnpopulate");
    btnpopulate->setGeometry( Qt::Rect(0, 500, 107, 27) );

    btnexit = Qt::PushButton(this, "btnexit");
    btnexit->setGeometry( Qt::Rect(410, 500, 107, 27) );
    btnexit->setFlat( 0 );
    languageChange();
    my $resize = Qt::Size(520, 529);
    $resize = $resize->expandedTo(minimumSizeHint());
    resize( $resize );
    clearWState( &Qt::WState_Polished );

    Qt::Object::connect(btnexit, SIGNAL "released()", this, SLOT "endme()");
    Qt::Object::connect(btnpopulate, SIGNAL "released()", this, SLOT 
"mine()");
}
sub languageChange {
    setCaption(trUtf8("Form1") );
    listView2->header()->setLabel( 0, trUtf8("Artist") );
    listView2->header()->setLabel( 1, trUtf8("Album") );
    listView2->header()->setLabel( 2, trUtf8("Song") );
    listView2->header()->setLabel( 3, trUtf8("Time") );
    listView2->header()->setLabel( 4, trUtf8("Track Number") );
    listView2->clear();
    my $item = Qt::ListViewItem(listView2, undef);
    $item->setText(0, trUtf8("New Item"));

    btnpopulate->setText( trUtf8("Populate") );
    btnexit->setText( trUtf8("Exit") );
}

sub mine {
    print "Form1->mine(): Not implemented yet.\n";
    print "Creating a listitem\n";
    puttrackinfo_tofile();
    print "artist=$artist\n" if ($DEBUG eq TRUE);
    print "trackname=$trackname\n" if ($DEBUG eq TRUE);
    print "tracknumber=$tracknumber\n" if ($DEBUG eq TRUE);
    print "tracklength=$tracklength\n" if ($DEBUG eq TRUE);
    print "genre=$genre\n" if ($DEBUG eq TRUE);
    print "album=$album\n" if ($DEBUG eq TRUE);
    my $artistitem = Qt::ListViewItem(listView2, undef);
    my $songitem = Qt::ListViewItem($artistitem, undef);
    $artistitem->setText(0, trUtf8($artist));
    $songitem->setText(1, trUtf8(" Maybe"));
    my $songitem = Qt::ListViewItem($artistitem, undef);
    $songitem->setText(1, trUtf8(" Hopefully"));
}

sub endme {
    Qt::Application::exit();
}


sub generateinfofromfilename {
    print "Not Implemented Yet generateinfofromfilename\n";
}

sub gettrackinfo_frommp3 {
    #$tag->{COMM} = $id3v1->comment();
    #$tag->{TIT2} = $id3v1->song();
    #$tag->{TPE1} = $id3v1->artist();
    #$tag->{TALB} = $id3v1->album();
    #$tag->{TYER} = $id3v1->year();
    #$tag->{TRCK} = $id3v1->track();
    #$tag->{TIT1} = $id3v1->genre();
    print "WORK IN PROGRESS: GETTRACKINFO_FROMMP3\n";
    $artist = "adema";
    $trackname = "close friends";
    $tracknumber = "1";
    $tracklength = "60";
    $genre = "rock";
    $album = "black";
    $file = "/files/mp3/Adema/Adema/Adema - Blow It Away.mp3";
    my $tag = get_tag($file, 1);
    unless (defined $tag) {
        if (-r $file && -f $file) {
            generateinfofromfilename();
        }
        else {
            print "Nonexistent file $file, skipping";
        }
        next;
    }
   
    print "Got tag ", Dumper $tag if ($DEBUG eq TRUE);
    $artist = $tag->{TPE1};
    $trackname = $tag->{TIT2};
    $tracknumber = $tag->{TRCK};
    $tracklength = "NOT IMPLEMENT TRACK LENGTH GETTRACKINFO_FROMMP3";
    $genre = $tag->{TIT1};
    if (!($genre)) { $genre="Rock"; }
    $album = $tag->{TALB};
}

sub gettrackinfo_fromfile {
    print "Not Implemented Yet PUTTRACKINFO_FROMFILE\n";

}

sub puttrackinfo_tofile {
    my $pathname = $basedir.$artist.".$album";
    my $line;
    my $dontadd = FALSE;
    my $lookforme;
    my $counter;
    open(ALBUMINFO, "$pathname");
    my @rawdata = <ALBUMINFO>;
    close ALBUMINFO;
    $lookforme = join($combochars, $artist, $album, $tracknumber, 
$trackname, $tracklength, $genre);
    print $pathname,"\n";
    print $#rawdata,"\n";
    if (!$#rawdata == -1) {
        foreach $line (@rawdata) {
            if ("$line" eq "$lookforme") {  
                $dontadd=TRUE;
            }
            print $line,"\n";
        }
    }
    #if ($dontadd == FALSE) {
        $pathname = "/tmp/Adema.Adema";
        print "Opening file and printing to it\n";
        open(FHA, "> $pathname")    or die "can't open $pathname: $!";
        #flock(FH, LOCK_EX)        or die "can't flock $pathname: $!"; 
#we probably dont need this.
        print FHA "$lookforme\n"     or die "cant print $pathname: $!"; 
#printing to the filehandle wont work but if we move these few lines up 
before were listview gets initialized it works fine.
        close(FHA)            or die "cant close $pathname: $!"; 
#close(FHA) close FHA and FHA->close report the same thing :(
    #}

   
}

sub makeuppercase {
    $artist = uc $artist;
    $trackname = uc $trackname;
    $tracknumber = uc $tracknumber;
    $tracklength = uc $tracklength;
    $genre = uc $genre;
    $album = uc $album;
}

sub is_valid_track_number {
    my $text = shift @_;
    return $text && length $text && $text =~ m/\d/;
}

sub set_tag {
    my $file = shift @_;
    my $tag  = shift @_;
    my $mp3 = MP3::Tag->new($file);
    print Dumper $tag;
    my $tags = $mp3->get_tags();
    my $id3v2;

    if (ref $tags eq 'HASH' && exists $tags->{ID3v2}) {
        $id3v2 = $tags->{ID3v2};
    }
    else {
        $id3v2 = $mp3->new_tag("ID3v2");
    }
    my %old_frames = %{$id3v2->get_frame_ids()};
    foreach my $fname (keys %$tag) {
        $id3v2->remove_frame($fname) if exists $old_frames{$fname};
        if ($fname eq 'WXXX') {
            $id3v2->add_frame('WXXX', 'ENG', 'FreeDB URL', $tag->{WXXX}) ;
        }
        elsif ($fname eq 'COMM') {
            $id3v2->add_frame('COMM', 'ENG', 'Comment', $tag->{COMM}) ;
        }
        else {
            $id3v2->add_frame($fname, $tag->{$fname});
        }
    }
     $id3v2->write_tag();
    return 0;
}

sub get_tag {
    my $file    = shift @_;
    my $upgrade = shift @_;
    my $mp3 = MP3::Tag->new($file);
    return undef unless defined $mp3;
    $mp3->get_tags();
    my $tag = {};
    if (exists $mp3->{ID3v2}){
        my $id3v2 = $mp3->{ID3v2};
        my $frames = $id3v2->supported_frames();
        while (my ($fname, $longname) = each %$frames) {
            # only grab the frames we know
            next unless exists $supported_frames{$fname};
            $tag->{$fname} = $id3v2->get_frame($fname);
            delete $tag->{$fname} unless defined $tag->{$fname};
            $tag->{$fname} = $tag->{$fname}->{Text} if $fname eq 'COMM';
            $tag->{$fname} = $tag->{$fname}->{URL} if $fname eq 'WXXX';
            $tag->{$fname} = '' unless defined $tag->{$fname};
        }
    }
    elsif (exists $mp3->{ID3v1}) {
        warn "No ID3 v2 TAG info in $file, using the v1 tag";
        my $id3v1 = $mp3->{ID3v1};
        $tag->{COMM} = $id3v1->comment();
        $tag->{TIT2} = $id3v1->song();
        $tag->{TPE1} = $id3v1->artist();
        $tag->{TALB} = $id3v1->album();
        $tag->{TYER} = $id3v1->year();
        $tag->{TRCK} = $id3v1->track();
        $tag->{TIT1} = $id3v1->genre();
        set_tag($file, $tag);
    }
    else {
        warn "No ID3 TAG info in $file, creating it";
        $tag = { TIT2 => '', TPE1 => '', TALB => '', TYER => 9999, COMM 
=> '' };
    }
    print "Got tag ", Dumper $tag if ($DEBUG eq TRUE);
    return $tag;
    }

sub print_tag_info {
 my $filename = shift @_;
 my $tag      = shift @_;
 my $extra    = shift @_ || 'Track info';

 # argument checking
 return unless ref $tag eq 'HASH';

 print "$extra for '$filename':\n";

 foreach (keys %$tag)
 {
  printf "%10s : %s\n", $_, $tag->{$_};
 }
}

1;
   
package main;
use Qt;
 
use Form1;
 
my $a = Qt::Application(\@ARGV);
my $w = Form1;
$a->setMainWidget($w);
$w->show;
exit $a->exec;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.