#!/usr/bin/perl -w

use Shell qw(mv cp mkdir rm) ;
use File::Find;
use Cwd;

$origPwd = `pwd`;
chomp $origPwd;


if (@ARGV && $ARGV[0] eq 'update') {
  @packages = `ls -1d debian/*/DEBIAN`;
  foreach $dir (@packages) {
    chomp $dir;
    next if (! -d $dir);
    foreach $file (qw{postinst postrm preinst prerm}) {  
      next if (! -f "$dir/$file");
      $found = 0;
      open(IN, "$dir/$file");
      open(OUT, ">/tmp/kde.dpkg");
      while (<IN>) { 
	if (/^#KDEHELPER#/) {
	    $found = 1;
	    if (-d $dir . "/../usr/lib/mime/packages") {
	      if ($file eq 'postinst') {
		print OUT "# added by kderules\n";
		print OUT 'case "$1" in' . "\n";
		print OUT "  configure)\n";
		print OUT "    if [ -x /usr/sbin/update-mime ]; then\n";
		print OUT "       update-mime\n";
		print OUT "    fi\n";
		print OUT "  ;;\n";
		print OUT "esac\n";
	      } elsif ($file eq 'postrm') {
		print OUT "# added by kderules\n";
		print OUT 'case "$1" in' . "\n";
		print OUT "   remove|purge)\n";
		print OUT "    if [ -x /usr/sbin/update-mime ]; then\n";
		print OUT "       update-mime\n";
		print OUT "    fi\n";
		print OUT "  ;;\n";
		print OUT "esac\n";
	      }
	    }
	    
	    next;
	  }
	print OUT $_;
      }
      
      close IN;
      close OUT;

      if ($found == 0) {
	rm("/tmp/kde.dpkg");
      } else {
	mv("/tmp/kde.dpkg", "$dir/$file");
	chown("root.root","dir/$file");
	chmod(0755,"$dir/$file");   
      }
    }
  }
  exit;
}

if (@ARGV && $ARGV[0] eq 'echodirs') {
  print STDOUT "export kde_htmldir=/usr/doc/kde/HTML\n";
  print STDOUT "export kde_appsdir=/usr/share/applnk\n";
  print STDOUT "export kde_icondir=/usr/share/icons\n";
  print STDOUT "export kde_sounddir=/usr/share/sounds\n";
  print STDOUT "export kde_datadir=/usr/share/apps\n";
  print STDOUT "export kde_locale=/usr/share/locale\n";
  print STDOUT "export kde_cgidir=/usr/lib/cgi-bin\n";
  print STDOUT "export kde_confdir=/etc/kde\n";
  print STDOUT "export kde_mimedir=/usr/share/mimelnk\n";
  print STDOUT "export kde_toolbardir=/usr/share/toolbar\n";
  print STDOUT "export kde_wallpaperdir=/usr/share/wallpapers\n";
  print STDOUT "export kde_bindir=/usr/bin\n";
  print STDOUT "export kde_partsdir=/usr/lib/parts\n";
  print STDOUT "export includedir=/usr/include/kde\n";
  print STDOUT "export libdir=/usr/lib\n";

  exit
}

if (@ARGV && $ARGV[0]) {  
  $package = $ARGV[0];
} else {
  open(CHANGELOG,"debian/changelog") 
	or die "can't read debian/changelog : $!\n";
  $_ = <CHANGELOG>;
  close(CHANGELOG);
  /^(.*) \((.*)\) /;
  $package = $1;
}

# Find documentation and install it
sub docwanted {
        local $dir = $File::Find::dir;
        $dir =~ s/^$origPwd//;
	if ($dir =~ /debian/) { return 0 ; }
	if ( ( /debian/ ) or ( /^INSTALL$/ ) or ( /^LICENSE$/ ) 
	or ( /^ARTISTIC$/ ) or ( /^COPYING$/ ) ) { return 0 ; } 
	if ( (! /CVS/ )
	and ( /^[A-Z]*$/ or /^README$/ or /^ChangeLog$/ or /lsm$/ or /SWALLOW/
	or /^TODO$/ or /^kdedoc$/ or /Header/ or /Documentation/ or /Tutorial/ ) )
	{	
		if ($dir) {
		  $_ = "$dir/$_";
		  $_ =~ s/^\///;
		}
		push @docs, "$_" ;
	}
}

$pwd = './';

find(\&docwanted, $pwd);
if ($pwd =~ ?^(.*/)build_([^/]*)$?) {
  $pwd = $1 . $2;
  if (-d $pwd) {
     find(\&docwanted, $pwd);
  }
}

if (! -d "debian/tmp/usr/doc/$package") {
	mkdir("-p", "debian/tmp/usr/doc/$package") ;
}

if (! -d "debian/tmp/usr/share/pixmaps") {
       mkdir("-p", "debian/tmp/usr/share/pixmaps");
}


if (@docs) {
       chdir($origPwd);
       cp( "-aP", @docs, "debian/tmp/usr/doc/$package") ;
       if (-f "debian/tmp/usr/doc/$package/ChangeLog") {
	  mv("debian/tmp/usr/doc/$package/ChangeLog", 
		"debian/tmp/usr/doc/$package/changelog");
	}
	if (-f "debian/tmp/usr/doc/$package/CHANGES") {
	  mv("debian/tmp/usr/doc/$package/CHANGES",
		"debian/tmp/usr/doc/$package/changelog");
	}
}

# Create doc-base file

if (-d "debian/doc-base") {
        if (! -d "debian/tmp/usr/share/doc-base") {
                  mkdir("-p", "debian/tmp/usr/share/doc-base");
        }
        while (<debian/doc-base/*>) {
                  cp( "-a", $_, "debian/tmp/usr/share/doc-base")
                    unless (-d $_);
        }
#        cp( "-a", <debian/doc-base/*>, "debian/tmp/usr/share/doc-base") ;
}


# Create debian/menu files

sub findkdelnk {
	/\.kdelnk$/ && push @lnkfiles, "$File::Find::dir/$_" ;
}

if (-d "debian/tmp/usr/share/applnk") {
	find(\&findkdelnk,"debian/tmp/usr/share/applnk");
}

if (-e "debian/menu.in") {
	open MENUIN, "debian/menu.in" ;
	while (<MENUIN>) {
		chop ;
		($prog,$type,$sect) = split / /;
		$type{$prog}=$type;
		$sect{$prog}=$sect;
	}
	close MENUIN;
}

open MENU, ">debian/menu" or die "can't open debian/menu : $!\n";
open MIME, ">debian/mailcap" or die "can't open debian/mailcap : $!\n";

foreach $file (@lnkfiles) {
	open KDELNK, $file;
	undef %kdelnk;
	while (<KDELNK>) {
		/^#/ && next ;
		/^\[KDE Desktop Entry\]/ && next ;
		/^\s*$/ && next ;
		chop ;
		($what,$value) = split /=/ ;
		$kdelnk{ucfirst lc $what}=$value;
	}
	close KDELNK;
	if (defined $kdelnk{"Type"}) {
		if ($kdelnk{"Type"} ne "Application" ) {
			print STDERR "Type is not Application : $file !\n" ;
			next ;
		}
	} else {
		print STDERR "has no Type= defaults to Application : $file !\n" ;
	}
	if (! defined $kdelnk{"Exec"}) {
		print STDERR "has no Exec= : $file !\n" ;
		next ;
	}

	if (defined $kdelnk{"Mimetype"} && ! $kdelnk{"Mimetype"} eq '') {

  	   $execline = $kdelnk{"Exec"};
	   $execline =~ s/%f/%s/;
	   $execline =~ s/%c/$kdelnk{"Name"}/;
	   $execline =~ s/%i//;
	   $execline =~ s/%m//;
	   $execline =~ s/%u/%s/;
	   $mimeline = $kdelnk{"Mimetype"};
	   @mimetypes = split(';', $mimeline);
	   foreach $mimetype (@mimetypes) {
	   print MIME "$mimetype; $execline;" . 'test=test "$DISPLAY" != ""; priority=7' . "\n";
	   }

	}

	($prog,)=split / /, $kdelnk{"Exec"} ;
	if (! defined($type{$prog})) {
		open MENUIN, ">>debian/menu.in" ;
		print MENUIN "$prog x11 NONE\n";
		close MENUIN;
		next ;
	}
	if ($sect{$prog} eq "NONE") { next ; }
	$icon="";
	if (not defined $kdelnk{"Name"}) {
		print STDERR "No Name : $package $kdelnk\n";
		next ;
	}
	if (defined $kdelnk{"Icon"}) {
   	        $icon=$kdelnk{"Icon"} ;
		if (! -f "debian/tmp/usr/share/icons/$icon" ) {
                   $icon="";
	        } else {
		  system("/usr/bin/X11/convert -map /usr/X11R6/include/X11/pixmaps/cmap.xpm debian/tmp/usr/share/icons/$icon debian/tmp/usr/share/pixmaps/$icon");
	  	  $icon="/usr/share/pixmaps/" . $icon ;
               }
	}
	($kdelnk=$file) =~ s/^.*tmp// ;
	print MENU "?package($package):\\\n" ;
	print MENU "	needs=$type{$prog}\\\n" ;
	print MENU "	section=$sect{$prog}\\\n" ;
	print MENU "	title=\"$kdelnk{Name}\"\\\n" ;
	print MENU "	command=$prog\\\n" ;
	print MENU "	icon=\"$icon\"\n\n" ;

}

if (-e "debian/menu.add") {
	open MENUADD, "debian/menu.add" ;
	while (<MENUADD>) {
		print MENU $_ ;
	}
	close MENUADD;
}

close MENU;

if (-z "debian/menu") {
	rm("debian/menu");
}

close MIME;

if (-z "debian/mailcap") {
  rm("debian/mailcap");
} else {
  mkdir("-p", "debian/tmp/usr/lib/mime/packages");
  cp("debian/mailcap", "debian/tmp/usr/lib/mime/packages/$package");
}

