#!/usr/bin/perl

# barrybkup version 0.1

# Copyright (C) 2008, ashley willis <barry@venamous.net>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
# or FITNESS FOR A PARTICULAR PURPOSE.
#
# See the GNU General Public License in the COPYING file at the
# root directory of this project for more details.

# backs up each DB in phone, or each DB given on command line,
# to file ~/.barry/backup/<PIN>/<PIN>-<DATE>-<TIME>.tar.gz
# (identical output as the barrybackup GUI).

`bcharge`;		# inits phone

if (@ARGV) {
  @list = @ARGV;
  $arg = 1;
}
else {
  @list = `btool -t`;	# gets list of databases
}
$i = 0;
#print "@list\n";

@pin = `btool`;
chomp $pin[2];
$pin[2] =~ s/^Using device \(PIN\): //;
$pin = $pin[2];

$tmpdir = "$0-$$";
$tmpdir =~ s/^.*\//\/tmp\//;
print "$tmpdir\n";
mkdir($tmpdir);

foreach (@list) {
  if ($arg) {
    $found = 1;
    $db[$i] = $_;
  }
  elsif (s/    Database: 0x[\da-f][\da-f]? '//) {
    $found = 1;
    ($db[$i], $records[$i]) = split(/' \(records: /);
    $records[$i] =~ s/\)$//;
  }
  else {
    $found = 0;
  }
  if ($found) {
    print "### $i $db[$i] ###\n";
    $hex = `btool -n -d "$db[$i]"`;
    #print "### CONVERTING ###\n";
    convert($hex);
    #print "### DONE ###\n";
    $i++;
  }

}
print "count=$i\n";
$date = `date +%Y%m%d-%H%M%S`;
chomp $date;
$tgz = "$pin-$date.tar.gz"; # use PIN instead of "bb-"
print "$tgz\n";
#`tar zcf $tgz -C $tmpdir $dirs`;
#$pwd = `pwd`;
#chomp $pwd;
`cd $tmpdir; tar zc $dirs > ~/.barry/backup/$pin/$tgz`;
#`cd $tmpdir; tar zc $dirs > $pwd/$tgz; cd -`;
`rm -rf $tmpdir`;

sub convert() {
  $file = $db[$i];
  mkdir("$tmpdir/$file");
  $dirs .= "\"$file/\"* ";
  $record = -1;
  $data = $_[0];
  @hex = split(/\n/, $data);
  my @out;
  foreach (@hex) {
    if (s/^Raw record dump for record: //) {
      #($record) and close (OUT);
      $record++;
      #open(OUT, ">$file/$record");
    }
    if (/^    0/) {
      s/^    0[\da-f]{7}: //;
      s/  .*$//;
      s/ //g;
      $out[$record] .= pack("H*", $_);
      #print OUT $out;
    }
  }
  foreach $record (@out) {
    $nl = $/;
    $/ = undef;
    $record =~ s/(^[ -]{15})//;
    $header = $1;
    $/ = $nl;
    @header = split(//, $header);
#$recType = $header[0] . $header[1];
#$length = $header[2] . $header[3];
#$u1 = $header[4] . $header[5] . $header[6];
    $dbVersion = $header[7];
#$dbRecordHandler = $header[8] . $header[9];
    $recordID = $header[10] . $header[11] . $header[12] . $header[13];
#$u2 = $header[14];
#print "$recType\t$length\t$u1\t$dbVersion\t$dbRecordHandler\t$recordID\t$u2\n";
    $recordIDTXT = reverse(unpack ("h*", $recordID));
    $recordIDTXT =~ s/^0+//;
    ($recordIDTXT) or $recordIDTXT = "0";
    $dbVersionTXT = unpack ("H*", reverse($dbVersion));
    $dbVersionTXT =~ s/^0+//;
    ($dbVersionTXT) or $dbVersionTXT = "0";
    open(OUT, ">$tmpdir/$file/$recordIDTXT $dbVersionTXT");
    #print OUT $header;
    print OUT $record;
    close OUT;
  }
  #close(OUT);
}
