#***************************************************************************
#                                  _   _ ____  _
#  Project                     ___| | | |  _ \| |
#                             / __| | | | |_) | |
#                            | (__| |_| |  _ <| |___
#                             \___|\___/|_| \_\_____|
#
# Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
# are also available at http://curl.haxx.se/docs/copyright.html.
#
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
# copies of the Software, and permit persons to whom the Software is
# furnished to do so, under the terms of the COPYING file.
#
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
# KIND, either express or implied.
#
###########################################################################
%file_chmod1 = (
  'name'      => 'chmod1',
  'content'   => "This file should have permissions 444\n",
  'perm'      => 'r--r--r--',
  'time'      => 'Jan 11 10:00',
  'dostime'   => '01-11-10  10:00AM',
);

%file_chmod2 = (
  'name'      => 'chmod2',
  'content'   => "This file should have permissions 666\n",
  'perm'      => 'rw-rw-rw-',
  'time'      => 'Feb  1  8:00',
  'dostime'   => '02-01-10  08:00AM',
);

%file_chmod3 = (
  'name'      => 'chmod3',
  'content'   => "This file should have permissions 777\n",
  'perm'      => 'rwxrwxrwx',
  'time'      => 'Feb  1  8:00',
  'dostime'   => '02-01-10  08:00AM',
);

%file_chmod4 = (
  'type'      => 'd',
  'name'      => 'chmod4',
  'content'   => "This file should have permissions 001\n",
  'perm'      => '--S--S--t',
  'time'      => 'May  4  4:31',
  'dostime'   => '05-04-10  04:31AM'
);

%file_chmod5 = (
  'type'      => 'd',
  'name'      => 'chmod5',
  'content'   => "This file should have permissions 110\n",
  'perm'      => '--s--s--T',
  'time'      => 'May  4  4:31',
  'dostime'   => '05-04-10  04:31AM'
);

%link_link = (
  'type'      => 'l',
  'name'      => 'link -> file.txt',
  'size'      => '8',
  'perm'      => 'rwxrwxrwx',
  'time'      => 'Jan  6  4:42'
);

%link_link_absolute = (
  'type'      => 'l',
  'name'      => 'link_absolute -> /data/ftp/file.txt',
  'size'      => '15',
  'perm'      => 'rwxrwxrwx',
  'time'      => 'Jan  6  4:45'
);

%dir_dot = (
  'type'      => "d",
  'name'      => ".",
  'hlink'     => "4",
  'time'      => "Apr 27  5:12",
  'size'      => "20480",
  'dostime'   => "04-27-10  05:12AM",
  'perm'      => "rwxrwxrwx"
);

%dir_ddot = (
  'type'      => "d",
  'name'      => "..",
  'hlink'     => "4",
  'size'      => "20480",
  'time'      => "Apr 23  3:12",
  'dostime'   => "04-23-10  03:12AM",
  'perm'      => "rwxrwxrwx"
);

%dir_weirddir_txt = (
  'type'      => "d",
  'name'      => "weirddir.txt",
  'hlink'     => "2",
  'size'      => "4096",
  'time'      => "Apr 23  3:12",
  'dostime'   => "04-23-10  03:12AM",
  'perm'      => "rwxr-xrwx"
);

%dir_UNIX = (
  'type'      => "d",
  'name'      => "UNIX",
  'hlink'     => "11",
  'size'      => "4096",
  'time'      => "Nov 01  2008",
  'dostime'   => "11-01-08  11:11AM",
  'perm'      => "rwx--x--x"
);

%dir_DOS = (
  'type'      => "d",
  'name'      => "DOS",
  'hlink'     => "11",
  'size'      => "4096",
  'time'      => "Nov 01  2008",
  'dostime'   => "11-01-08  11:11AM",
  'perm'      => "rwx--x--x"
);

%dir_dot_NeXT = (
  'type'      => "d",
  'name'      => ".NeXT",
  'hlink'     => "4",
  'size'      => "4096",
  'time'      => "Jan 23  2:05",
  'dostime'   => "01-23-05  02:05AM",
  'perm'      => "rwxrwxrwx"
);

%file_empty_file_dat = (
  'name'      => "empty_file.dat",
  'content'   => "",
  'perm'      => "rw-r--r--",
  'time'      => "Apr 27 11:01",
  'dostime'   => "04-27-10  11:01AM"
);

%file_file_txt = (
  'name'      => "file.txt",
  'content'   => "This is content of file \"file.txt\"\n",
  'time'      => "Apr 27 11:01",
  'dostime'   => "04-27-10  11:01AM",
  'perm'      => "rw-r--r--"
);

%file_someothertext_txt = (
  'name'      => "someothertext.txt",
  'content'   => "Some junk ;-) This file does not really exist.\n",
  'time'      => "Apr 27 11:01",
  'dostime'   => "04-27-10  11:01AM",
  'perm'      => "rw-r--r--"
);

%lists = (
  '/fully_simulated/' => {
    'files'   => [ \%dir_dot, \%dir_ddot, \%dir_DOS, \%dir_UNIX ],
    'eol'     => "\r\n",
    'type'    => "unix"
  },
  '/fully_simulated/UNIX/' => {
    'files'   => [ \%dir_dot, \%dir_ddot,
                   \%file_chmod1, \%file_chmod2, \%file_chmod3, \%file_chmod4, \%file_chmod5,
                   \%file_empty_file_dat, \%file_file_txt,
                   \%link_link, \%link_link_absolute, \%dir_dot_NeXT,
                   \%file_someothertext_txt, \%dir_weirddir_txt ],
    'eol'     => "\r\n",
    'type'    => 'unix'
  },
  '/fully_simulated/DOS/' => {
    'files'   => [ \%dir_dot, \%dir_ddot,
                   \%file_chmod1, \%file_chmod2, \%file_chmod3, \%file_chmod4, \%file_chmod5,
                   \%file_empty_file_dat, \%file_file_txt,
                   \%dir_dot_NeXT, \%file_someothertext_txt, \%dir_weirddir_txt ],
    'eol'     => "\r\n",
    'type'    => 'dos'
  }
);

sub ftp_createcontent($) {
  my (%list) = @_;

  $type = $$list{'type'};
  $eol  = $$list{'eol'};
  $list_ref = $$list{'files'};

  my @diroutput;
  my @contentlist;
  if($type eq "unix") {
    for(@$list_ref) {
      my %file = %$_;
      my $line = "";
      my $ftype  = $file{'type'}  ? $file{'type'}  : "-";
      my $fperm  = $file{'perm'}  ? $file{'perm'}  : "rwxr-xr-x";
      my $fuser  = $file{'user'}  ? sprintf("%15s", $file{'user'})   : "ftp-default";
      my $fgroup = $file{'group'} ? sprintf("%15s", $file{'group'})  : "ftp-default";
      my $fsize = "";
      if($file{'type'} eq "d") {
        $fsize = $file{'size'} ? sprintf("%7s", $file{'size'}) : sprintf("%7d", 4096);
      }
      else {
        $fsize = sprintf("%7d", length $file{'content'});
      }
      my $fhlink = $file{'hlink'} ? sprintf("%4d",  $file{'hlink'})  : "   1";
      my $ftime  = $file{'time'}  ? sprintf("%10s", $file{'time'})   : "Jan 9  1933";
      push(@contentlist, "$ftype$fperm $fhlink $fuser $fgroup $fsize $ftime $file{'name'}$eol");
    }

    return @contentlist;
  }
  elsif($type =~ /^dos$/) {
    for(@$list_ref) {
      my %file = %$_;
      my $line = "";
      my $time = $file{'dostime'} ? $file{'dostime'} : "06-25-97  09:12AM";
      my $size_or_dir;
      if($file{'type'} =~ /^d$/) {
        $size_or_dir = "      <DIR>         ";
      }
      else {
        $size_or_dir = sprintf("%20d", length $file{'content'});
      }
      push(@contentlist, "$time $size_or_dir $file{'name'}$eol");
    }
    return @contentlist;
  }
}

sub wildcard_filesize($$) {
  my ($list_type, $file) = @_;
  $list = $lists{$list_type};
  if($list) {
    my $files = $list->{'files'};
    for(@$files) {
      my %f = %$_;
      if ($f{'name'} eq $file) {
        if($f{'content'}) {
          return length $f{'content'};
        }
        elsif ($f{'type'} ne "d"){
          return 0;
        }
        else {
          return -1;
        }
      }
    }
  }
  return -1;
}
sub wildcard_getfile($$) {
  my ($list_type, $file) = @_;
  $list = $lists{$list_type};
  if($list) {
    my $files = $list->{'files'};
    for(@$files) {
      my %f = %$_;
      if ($f{'name'} eq $file) {
        if($f{'content'}) {
          return (length $f{'content'}, $f{'content'});
        }
        elsif ($f{'type'} ne "d"){
          return (0, "");
        }
        else {
          return (-1, 0);
        }
      }
    }
  }
  return (-1, 0);
}

sub ftp_contentlist {
  my $listname = $_[0];
  $list = $lists{$listname};
  return ftp_createcontent(\$list);
}
