releasing/cbrtools/perl/RemoteSite/NetDrive/MultiVolumeImport.pm
author Ross Qin <ross.qin@nokia.com>
Tue, 30 Nov 2010 14:05:41 +0800
changeset 713 7b7f0409fc00
parent 602 3145852acc89
permissions -rw-r--r--
merge
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
602
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
     1
# Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
     2
# All rights reserved.
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
     3
# This component and the accompanying materials are made available
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
     4
# under the terms of the License "Eclipse Public License v1.0"
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
     5
# which accompanies this distribution, and is available
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
     6
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
     7
# 
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
     8
# Initial Contributors:
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
     9
# Nokia Corporation - initial contribution.
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    10
# 
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    11
# Contributors:
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    12
# 
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    13
# Description:
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    14
# 
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    15
#
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    16
# Description:
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    17
# RemoteSite::NetDrive::MultiVolumeImport.pm
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    18
#
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    19
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    20
package RemoteSite::NetDrive::MultiVolumeImport;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    21
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    22
use strict;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    23
use File::Copy;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    24
use File::Basename;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    25
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    26
use RemoteSite;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    27
use RemoteSite::NetDrive;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    28
use vars qw(@ISA);
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    29
@ISA=("RemoteSite::NetDrive");
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    30
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    31
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    32
#
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    33
# Initialization
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    34
#
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    35
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    36
sub Initialize {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    37
  my $self = shift;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    38
  $self->SUPER::Initialize(@_);
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    39
  $self->Connect();	
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    40
}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    41
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    42
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    43
#
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    44
# Public (from RemoteSite)
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    45
#
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    46
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    47
sub SendFile {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    48
  my $self = shift;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    49
  $self->HandleError("Function 'SendFile' not supported by ".ref($self)."\n");
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    50
}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    51
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    52
sub GetFile {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    53
  my $self = shift;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    54
  my $remoteFile = shift;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    55
  my $localFile = shift;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    56
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    57
  unless (defined $localFile and defined $remoteFile) {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    58
    $self->HandleError("Incorrect args passed to ".ref($self)."::GetFile");
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    59
  }
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    60
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    61
  $self->InitAppropriateImportVolume($remoteFile);
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    62
  $self->SUPER::GetFile($remoteFile, $localFile);
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    63
}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    64
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    65
sub FileExists {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    66
  my $self = shift;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    67
  my $remoteFile = shift;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    68
  unless (defined $remoteFile) {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    69
    return 0;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    70
  }
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    71
  $self->Connect();
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    72
  return (defined $self->LookupIndexEntry($remoteFile));
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    73
}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    74
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    75
sub DirList {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    76
  my $self = shift;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    77
  $self->HandleError("Function 'DirList' not supported by ".ref($self)."\n");
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    78
}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    79
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    80
sub MakeDir {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    81
  my $self = shift;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    82
  $self->HandleError("Function 'MakeDir' not supported by ".ref($self)."\n");
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    83
}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    84
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    85
sub FileSize {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    86
  my $self = shift;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    87
  $self->HandleError("Function 'FileSize' not supported by ".ref($self)."\n");
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    88
}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    89
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    90
sub DeleteFile {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    91
  my $self = shift;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    92
  $self->HandleError("Function 'DeleteFile' not supported by ".ref($self)."\n");
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    93
}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    94
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    95
sub MoveFile {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    96
  my $self = shift;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    97
  $self->HandleError("Function 'MoveFile' not supported by ".ref($self)."\n");
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    98
}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    99
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   100
sub FileModifiedTime {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   101
  my $self = shift;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   102
  $self->HandleError("Function 'FileModifiedTime' not supported by ".ref($self)."\n");
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   103
}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   104
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   105
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   106
#
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   107
# Private.
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   108
#
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   109
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   110
sub LookupIndexEntry {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   111
  my $self = shift;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   112
  my $file = lc(shift);
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   113
  Utils::TidyFileName(\$file);
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   114
  unless (exists $self->{index}) {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   115
    $self->InternaliseIndex();
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   116
  }
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   117
  if (exists $self->{index}->{$file}) {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   118
    return $self->{index}->{$file};
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   119
  }
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   120
  return undef;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   121
}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   122
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   123
sub InternaliseIndex {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   124
  # Read the index created by MultiVolumeExport.
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   125
  my $self = shift;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   126
  my $index = $self->Host(). '/index';
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   127
  unless (-e $index) {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   128
    $self->ChangeImportVolume(0);
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   129
  }
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   130
  open (INDEX, $index) or die "Error: Couldn't open \"$index\": $!\n";
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   131
  while (my $line = <INDEX>) {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   132
    (my $file, my $volume) = $line =~ /(.*)\t(.*)/;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   133
    $self->{index}->{$file} = $volume;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   134
  }
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   135
  close (INDEX);
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   136
}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   137
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   138
sub InitAppropriateImportVolume {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   139
  my $self = shift;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   140
  my $file = shift;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   141
  my $requiredVolume = $self->LookupIndexEntry($file);
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   142
  unless (defined $requiredVolume) {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   143
    die "Error: \"$file\" not found in any volumes\n";
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   144
  }
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   145
  if ($requiredVolume == $self->{currentImportVolume}) {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   146
    return;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   147
  }
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   148
  else {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   149
    $file = Utils::ConcatenateDirNames($self->Host(), $file);
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   150
  AGAIN:
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   151
    $self->ChangeImportVolume($requiredVolume);
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   152
    unless (-e $file) {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   153
      print "Error: \"$file\" not found
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   154
       Try again? [y/n] ";
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   155
      my $response = <STDIN>;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   156
      chomp $response;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   157
      if ($response =~ /^y$/i) {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   158
	goto AGAIN;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   159
      }
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   160
      die "Aborting...\n";
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   161
    }
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   162
  }
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   163
}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   164
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   165
sub ChangeImportVolume {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   166
  my $self = shift;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   167
  my $volume = shift;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   168
  print "Insert import volume #$volume and hit return...\n";
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   169
  <STDIN>;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   170
  $self->{currentImportVolume} = $volume;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   171
}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   172
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   173
1;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   174
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   175
=head1 NAME
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   176
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   177
RemoteSite::NetDrive::MultiVolumeImport.pm - Import releases that were exported using RemoteSite::NetDrive::MultiVolumeExport
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   178
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   179
=head1 DESCRIPTION
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   180
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   181
The purpose of this remote site module is to allow releases that were exported using C<RemoteSite::NetDrive::MultiVolumeExport> to be imported. The export process writes a complete index into each volume. This is read to determine which volumes contain which files. The user is prompted to change volumes are necessary. Location of the import volume is specified using the C<IniData> keyword C<remote_host>.
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   182
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   183
=head1 INTERFACE
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   184
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   185
=head2 New
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   186
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   187
Passed an argument list in the form of hash key value pairs. The supported arguments are...
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   188
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   189
  host      => $host_address_string
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   190
  verbose   => $verbosity_integer
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   191
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   192
Returns a reference to a C<RemoteSite::NetDrive::MultiVolumeImport> object
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   193
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   194
=head2 SendFile
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   195
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   196
Not suppored, since this module may only be used for importing.
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   197
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   198
=head2 GetFile
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   199
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   200
Passed a remote and local file name. Finds out which volume the file lives on, and requests that the user changes volumes if necessary. Then differs to C<RemoteSite::NetDrive> to perform the copy.
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   201
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   202
=head2 FileExists
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   203
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   204
Passed a filename (with full path). Returns true if the file exists in the volume index, false otherwise.
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   205
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   206
=head1 KNOWN BUGS
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   207
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   208
None
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   209
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   210
=head1 COPYRIGHT
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   211
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   212
 Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   213
 All rights reserved.
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   214
 This component and the accompanying materials are made available
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   215
 under the terms of the License "Eclipse Public License v1.0"
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   216
 which accompanies this distribution, and is available
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   217
 at the URL "http://www.eclipse.org/legal/epl-v10.html".
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   218
 
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   219
 Initial Contributors:
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   220
 Nokia Corporation - initial contribution.
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   221
 
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   222
 Contributors:
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   223
 
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   224
 Description:
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   225
 
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   226
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   227
=cut