[Feature][Modem]Update MTK MODEM V1.6 baseline version: MOLY.NR15.R3.MD700.IVT.MP1MR3.MP.V1.6
MTK modem version: MT2735_IVT_MOLY.NR15.R3.MD700.IVT.MP1MR3.MP.V1.6.tar.gz
RF modem version: NA
Change-Id: I45a4c2752fa9d1a618beacd5d40737fb39ab64fb
diff --git a/mcu/tools/perl/Spreadsheet/WriteExcel/OLEwriter.pm b/mcu/tools/perl/Spreadsheet/WriteExcel/OLEwriter.pm
new file mode 100644
index 0000000..7cbb49e
--- /dev/null
+++ b/mcu/tools/perl/Spreadsheet/WriteExcel/OLEwriter.pm
@@ -0,0 +1,449 @@
+package Spreadsheet::WriteExcel::OLEwriter;
+
+###############################################################################
+#
+# OLEwriter - A writer class to store BIFF data in a OLE compound storage file.
+#
+#
+# Used in conjunction with Spreadsheet::WriteExcel
+#
+# Copyright 2000-2010, John McNamara, jmcnamara@cpan.org
+#
+# Documentation after __END__
+#
+
+use Exporter;
+use strict;
+use Carp;
+use FileHandle;
+
+
+
+
+
+use vars qw($VERSION @ISA);
+@ISA = qw(Exporter);
+
+$VERSION = '2.37';
+
+###############################################################################
+#
+# new()
+#
+# Constructor
+#
+sub new {
+
+ my $class = shift;
+ my $self = {
+ _olefilename => $_[0],
+ _filehandle => "",
+ _fileclosed => 0,
+ _internal_fh => 0,
+ _biff_only => 0,
+ _size_allowed => 0,
+ _biffsize => 0,
+ _booksize => 0,
+ _big_blocks => 0,
+ _list_blocks => 0,
+ _root_start => 0,
+ _block_count => 4,
+ };
+
+ bless $self, $class;
+ $self->_initialize();
+ return $self;
+}
+
+
+###############################################################################
+#
+# _initialize()
+#
+# Create a new filehandle or use the provided filehandle.
+#
+sub _initialize {
+
+ my $self = shift;
+ my $olefile = $self->{_olefilename};
+ my $fh;
+
+ # If the filename is a reference it is assumed that it is a valid
+ # filehandle, if not we create a filehandle.
+ #
+ if (ref($olefile)) {
+ $fh = $olefile;
+ }
+ else{
+
+ # Create a new file, open for writing
+ $fh = FileHandle->new("> $olefile");
+
+ # Workbook.pm also checks this but something may have happened since
+ # then.
+ if (not defined $fh) {
+ croak "Can't open $olefile. It may be in use or protected.\n";
+ }
+
+ # binmode file whether platform requires it or not
+ binmode($fh);
+
+ $self->{_internal_fh} = 1;
+ }
+
+ # Store filehandle
+ $self->{_filehandle} = $fh;
+}
+
+
+###############################################################################
+#
+# set_size($biffsize)
+#
+# Set the size of the data to be written to the OLE stream
+#
+# $big_blocks = (109 depot block x (128 -1 marker word)
+# - (1 x end words)) = 13842
+# $maxsize = $big_blocks * 512 bytes = 7087104
+#
+sub set_size {
+
+ my $self = shift;
+ my $maxsize = 7_087_104; # Use Spreadsheet::WriteExcel::Big to exceed this
+
+ if ($_[0] > $maxsize) {
+ return $self->{_size_allowed} = 0;
+ }
+
+ $self->{_biffsize} = $_[0];
+
+ # Set the min file size to 4k to avoid having to use small blocks
+ if ($_[0] > 4096) {
+ $self->{_booksize} = $_[0];
+ }
+ else {
+ $self->{_booksize} = 4096;
+ }
+
+ return $self->{_size_allowed} = 1;
+
+}
+
+
+###############################################################################
+#
+# _calculate_sizes()
+#
+# Calculate various sizes needed for the OLE stream
+#
+sub _calculate_sizes {
+
+ my $self = shift;
+ my $datasize = $self->{_booksize};
+
+ if ($datasize % 512 == 0) {
+ $self->{_big_blocks} = $datasize/512;
+ }
+ else {
+ $self->{_big_blocks} = int($datasize/512) +1;
+ }
+ # There are 127 list blocks and 1 marker blocks for each big block
+ # depot + 1 end of chain block
+ $self->{_list_blocks} = int(($self->{_big_blocks})/127) +1;
+ $self->{_root_start} = $self->{_big_blocks};
+}
+
+
+###############################################################################
+#
+# close()
+#
+# Write root entry, big block list and close the filehandle.
+# This routine is used to explicitly close the open filehandle without
+# having to wait for DESTROY.
+#
+sub close {
+
+ my $self = shift;
+
+ return if not $self->{_size_allowed};
+
+ $self->_write_padding() if not $self->{_biff_only};
+ $self->_write_property_storage() if not $self->{_biff_only};
+ $self->_write_big_block_depot() if not $self->{_biff_only};
+
+ my $close = 1; # Default to no error for external filehandles.
+
+ # Close the filehandle if it was created internally.
+ $close = CORE::close($self->{_filehandle}) if $self->{_internal_fh};
+
+ $self->{_fileclosed} = 1;
+
+ return $close;
+}
+
+
+###############################################################################
+#
+# DESTROY()
+#
+# Close the filehandle if it hasn't already been explicitly closed.
+#
+sub DESTROY {
+
+ my $self = shift;
+
+ local ($@, $!, $^E, $?);
+
+ $self->close() unless $self->{_fileclosed};
+}
+
+
+###############################################################################
+#
+# write($data)
+#
+# Write BIFF data to OLE file.
+#
+sub write {
+
+ my $self = shift;
+
+ # Protect print() from -l on the command line.
+ local $\ = undef;
+ print {$self->{_filehandle}} $_[0];
+}
+
+
+###############################################################################
+#
+# write_header()
+#
+# Write OLE header block.
+#
+sub write_header {
+
+ my $self = shift;
+
+ return if $self->{_biff_only};
+ $self->_calculate_sizes();
+
+ my $root_start = $self->{_root_start};
+ my $num_lists = $self->{_list_blocks};
+
+ my $id = pack("NN", 0xD0CF11E0, 0xA1B11AE1);
+ my $unknown1 = pack("VVVV", 0x00, 0x00, 0x00, 0x00);
+ my $unknown2 = pack("vv", 0x3E, 0x03);
+ my $unknown3 = pack("v", -2);
+ my $unknown4 = pack("v", 0x09);
+ my $unknown5 = pack("VVV", 0x06, 0x00, 0x00);
+ my $num_bbd_blocks = pack("V", $num_lists);
+ my $root_startblock = pack("V", $root_start);
+ my $unknown6 = pack("VV", 0x00, 0x1000);
+ my $sbd_startblock = pack("V", -2);
+ my $unknown7 = pack("VVV", 0x00, -2 ,0x00);
+ my $unused = pack("V", -1);
+
+ # Protect print() from -l on the command line.
+ local $\ = undef;
+
+ print {$self->{_filehandle}} $id;
+ print {$self->{_filehandle}} $unknown1;
+ print {$self->{_filehandle}} $unknown2;
+ print {$self->{_filehandle}} $unknown3;
+ print {$self->{_filehandle}} $unknown4;
+ print {$self->{_filehandle}} $unknown5;
+ print {$self->{_filehandle}} $num_bbd_blocks;
+ print {$self->{_filehandle}} $root_startblock;
+ print {$self->{_filehandle}} $unknown6;
+ print {$self->{_filehandle}} $sbd_startblock;
+ print {$self->{_filehandle}} $unknown7;
+
+ for (1..$num_lists) {
+ $root_start++;
+ print {$self->{_filehandle}} pack("V", $root_start);
+ }
+
+ for ($num_lists..108) {
+ print {$self->{_filehandle}} $unused;
+ }
+}
+
+
+###############################################################################
+#
+# _write_big_block_depot()
+#
+# Write big block depot.
+#
+sub _write_big_block_depot {
+
+ my $self = shift;
+ my $num_blocks = $self->{_big_blocks};
+ my $num_lists = $self->{_list_blocks};
+ my $total_blocks = $num_lists *128;
+ my $used_blocks = $num_blocks + $num_lists +2;
+
+ my $marker = pack("V", -3);
+ my $end_of_chain = pack("V", -2);
+ my $unused = pack("V", -1);
+
+
+ # Protect print() from -l on the command line.
+ local $\ = undef;
+
+ for my $i (1..$num_blocks-1) {
+ print {$self->{_filehandle}} pack("V",$i);
+ }
+
+ print {$self->{_filehandle}} $end_of_chain;
+ print {$self->{_filehandle}} $end_of_chain;
+
+ for (1..$num_lists) {
+ print {$self->{_filehandle}} $marker;
+ }
+
+ for ($used_blocks..$total_blocks) {
+ print {$self->{_filehandle}} $unused;
+ }
+}
+
+
+###############################################################################
+#
+# _write_property_storage()
+#
+# Write property storage. TODO: add summary sheets
+#
+sub _write_property_storage {
+
+ my $self = shift;
+
+ my $rootsize = -2;
+ my $booksize = $self->{_booksize};
+
+ ################# name type dir start size
+ $self->_write_pps('Root Entry', 0x05, 1, -2, 0x00);
+ $self->_write_pps('Workbook', 0x02, -1, 0x00, $booksize);
+ $self->_write_pps('', 0x00, -1, 0x00, 0x0000);
+ $self->_write_pps('', 0x00, -1, 0x00, 0x0000);
+}
+
+
+###############################################################################
+#
+# _write_pps()
+#
+# Write property sheet in property storage
+#
+sub _write_pps {
+
+ my $self = shift;
+
+ my $name = $_[0];
+ my @name = ();
+ my $length = 0;
+
+ if ($name ne '') {
+ $name = $_[0] . "\0";
+ # Simulate a Unicode string
+ @name = map(ord, split('', $name));
+ $length = length($name) * 2;
+ }
+
+ my $rawname = pack("v*", @name);
+ my $zero = pack("C", 0);
+
+ my $pps_sizeofname = pack("v", $length); #0x40
+ my $pps_type = pack("v", $_[1]); #0x42
+ my $pps_prev = pack("V", -1); #0x44
+ my $pps_next = pack("V", -1); #0x48
+ my $pps_dir = pack("V", $_[2]); #0x4c
+
+ my $unknown1 = pack("V", 0);
+
+ my $pps_ts1s = pack("V", 0); #0x64
+ my $pps_ts1d = pack("V", 0); #0x68
+ my $pps_ts2s = pack("V", 0); #0x6c
+ my $pps_ts2d = pack("V", 0); #0x70
+ my $pps_sb = pack("V", $_[3]); #0x74
+ my $pps_size = pack("V", $_[4]); #0x78
+
+
+ # Protect print() from -l on the command line.
+ local $\ = undef;
+
+ print {$self->{_filehandle}} $rawname;
+ print {$self->{_filehandle}} $zero x (64 -$length);
+ print {$self->{_filehandle}} $pps_sizeofname;
+ print {$self->{_filehandle}} $pps_type;
+ print {$self->{_filehandle}} $pps_prev;
+ print {$self->{_filehandle}} $pps_next;
+ print {$self->{_filehandle}} $pps_dir;
+ print {$self->{_filehandle}} $unknown1 x 5;
+ print {$self->{_filehandle}} $pps_ts1s;
+ print {$self->{_filehandle}} $pps_ts1d;
+ print {$self->{_filehandle}} $pps_ts2d;
+ print {$self->{_filehandle}} $pps_ts2d;
+ print {$self->{_filehandle}} $pps_sb;
+ print {$self->{_filehandle}} $pps_size;
+ print {$self->{_filehandle}} $unknown1;
+}
+
+
+###############################################################################
+#
+# _write_padding()
+#
+# Pad the end of the file
+#
+sub _write_padding {
+
+ my $self = shift;
+ my $biffsize = $self->{_biffsize};
+ my $min_size;
+
+ if ($biffsize < 4096) {
+ $min_size = 4096;
+ }
+ else {
+ $min_size = 512;
+ }
+
+ # Protect print() from -l on the command line.
+ local $\ = undef;
+
+ if ($biffsize % $min_size != 0) {
+ my $padding = $min_size - ($biffsize % $min_size);
+ print {$self->{_filehandle}} "\0" x $padding;
+ }
+}
+
+
+1;
+
+
+__END__
+
+
+=head1 NAME
+
+OLEwriter - A writer class to store BIFF data in a OLE compound storage file.
+
+=head1 SYNOPSIS
+
+See the documentation for Spreadsheet::WriteExcel
+
+=head1 DESCRIPTION
+
+This module is used in conjunction with Spreadsheet::WriteExcel.
+
+=head1 AUTHOR
+
+John McNamara jmcnamara@cpan.org
+
+=head1 COPYRIGHT
+
+© MM-MMX, John McNamara.
+
+All Rights Reserved. This module is free software. It may be used, redistributed and/or modified under the same terms as Perl itself.