[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/Properties.pm b/mcu/tools/perl/Spreadsheet/WriteExcel/Properties.pm
new file mode 100644
index 0000000..62c933a
--- /dev/null
+++ b/mcu/tools/perl/Spreadsheet/WriteExcel/Properties.pm
@@ -0,0 +1,352 @@
+package Spreadsheet::WriteExcel::Properties;
+
+###############################################################################
+#
+# Properties - A module for creating Excel property sets.
+#
+#
+# Used in conjunction with Spreadsheet::WriteExcel
+#
+# Copyright 2000-2010, John McNamara.
+#
+# Documentation after __END__
+#
+
+use Exporter;
+use strict;
+use Carp;
+use POSIX 'fmod';
+use Time::Local 'timelocal';
+
+
+
+
+use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
+@ISA = qw(Exporter);
+
+$VERSION = '2.37';
+
+# Set up the exports.
+my @all_functions = qw(
+ create_summary_property_set
+ create_doc_summary_property_set
+ _pack_property_data
+ _pack_VT_I2
+ _pack_VT_LPSTR
+ _pack_VT_FILETIME
+);
+
+my @pps_summaries = qw(
+ create_summary_property_set
+ create_doc_summary_property_set
+);
+
+@EXPORT = ();
+@EXPORT_OK = (@all_functions);
+%EXPORT_TAGS = (testing => \@all_functions,
+ property_sets => \@pps_summaries,
+ );
+
+
+###############################################################################
+#
+# create_summary_property_set().
+#
+# Create the SummaryInformation property set. This is mainly used for the
+# Title, Subject, Author, Keywords, Comments, Last author keywords and the
+# creation date.
+#
+sub create_summary_property_set {
+
+ my @properties = @{$_[0]};
+
+ my $byte_order = pack 'v', 0xFFFE;
+ my $version = pack 'v', 0x0000;
+ my $system_id = pack 'V', 0x00020105;
+ my $class_id = pack 'H*', '00000000000000000000000000000000';
+ my $num_property_sets = pack 'V', 0x0001;
+ my $format_id = pack 'H*', 'E0859FF2F94F6810AB9108002B27B3D9';
+ my $offset = pack 'V', 0x0030;
+ my $num_property = pack 'V', scalar @properties;
+ my $property_offsets = '';
+
+ # Create the property set data block and calculate the offsets into it.
+ my ($property_data, $offsets) = _pack_property_data(\@properties);
+
+ # Create the property type and offsets based on the previous calculation.
+ for my $i (0 .. @properties -1) {
+ $property_offsets .= pack('VV', $properties[$i]->[0], $offsets->[$i]);
+ }
+
+ # Size of $size (4 bytes) + $num_property (4 bytes) + the data structures.
+ my $size = 8 + length($property_offsets) + length($property_data);
+ $size = pack 'V', $size;
+
+
+ return $byte_order .
+ $version .
+ $system_id .
+ $class_id .
+ $num_property_sets .
+ $format_id .
+ $offset .
+ $size .
+ $num_property .
+ $property_offsets .
+ $property_data;
+}
+
+
+###############################################################################
+#
+# Create the DocSummaryInformation property set. This is mainly used for the
+# Manager, Company and Category keywords.
+#
+# The DocSummary also contains a stream for user defined properties. However
+# this is a little arcane and probably not worth the implementation effort.
+#
+sub create_doc_summary_property_set {
+
+ my @properties = @{$_[0]};
+
+ my $byte_order = pack 'v', 0xFFFE;
+ my $version = pack 'v', 0x0000;
+ my $system_id = pack 'V', 0x00020105;
+ my $class_id = pack 'H*', '00000000000000000000000000000000';
+ my $num_property_sets = pack 'V', 0x0002;
+
+ my $format_id_0 = pack 'H*', '02D5CDD59C2E1B10939708002B2CF9AE';
+ my $format_id_1 = pack 'H*', '05D5CDD59C2E1B10939708002B2CF9AE';
+ my $offset_0 = pack 'V', 0x0044;
+ my $num_property_0 = pack 'V', scalar @properties;
+ my $property_offsets_0 = '';
+
+ # Create the property set data block and calculate the offsets into it.
+ my ($property_data_0, $offsets) = _pack_property_data(\@properties);
+
+ # Create the property type and offsets based on the previous calculation.
+ for my $i (0 .. @properties -1) {
+ $property_offsets_0 .= pack('VV', $properties[$i]->[0], $offsets->[$i]);
+ }
+
+ # Size of $size (4 bytes) + $num_property (4 bytes) + the data structures.
+ my $data_len = 8 + length($property_offsets_0) + length($property_data_0);
+ my $size_0 = pack 'V', $data_len;
+
+
+ # The second property set offset is at the end of the first property set.
+ my $offset_1 = pack 'V', 0x0044 + $data_len;
+
+ # We will use a static property set stream rather than try to generate it.
+ my $property_data_1 = pack 'H*', join '', qw (
+ 98 00 00 00 03 00 00 00 00 00 00 00 20 00 00 00
+ 01 00 00 00 36 00 00 00 02 00 00 00 3E 00 00 00
+ 01 00 00 00 02 00 00 00 0A 00 00 00 5F 50 49 44
+ 5F 47 55 49 44 00 02 00 00 00 E4 04 00 00 41 00
+ 00 00 4E 00 00 00 7B 00 31 00 36 00 43 00 34 00
+ 42 00 38 00 33 00 42 00 2D 00 39 00 36 00 35 00
+ 46 00 2D 00 34 00 42 00 32 00 31 00 2D 00 39 00
+ 30 00 33 00 44 00 2D 00 39 00 31 00 30 00 46 00
+ 41 00 44 00 46 00 41 00 37 00 30 00 31 00 42 00
+ 7D 00 00 00 00 00 00 00 2D 00 39 00 30 00 33 00
+ );
+
+
+ return $byte_order .
+ $version .
+ $system_id .
+ $class_id .
+ $num_property_sets .
+ $format_id_0 .
+ $offset_0 .
+ $format_id_1 .
+ $offset_1 .
+
+ $size_0 .
+ $num_property_0 .
+ $property_offsets_0 .
+ $property_data_0 .
+
+ $property_data_1;
+}
+
+
+###############################################################################
+#
+# _pack_property_data().
+#
+# Create a packed property set structure. Strings are null terminated and
+# padded to a 4 byte boundary. We also use this function to keep track of the
+# property offsets within the data structure. These offsets are used by the
+# calling functions. Currently we only need to handle 4 property types:
+# VT_I2, VT_LPSTR, VT_FILETIME.
+#
+sub _pack_property_data {
+
+ my @properties = @{$_[0]};
+ my $offset = $_[1] || 0;
+ my $packed_property = '';
+ my $data = '';
+ my @offsets;
+
+ # Get the strings codepage from the first property.
+ my $codepage = $properties[0]->[2];
+
+ # The properties start after 8 bytes for size + num_properties + 8 bytes
+ # for each propety type/offset pair.
+ $offset += 8 * (@properties + 1);
+
+ for my $property (@properties) {
+ push @offsets, $offset;
+
+ my $property_type = $property->[1];
+
+ if ($property_type eq 'VT_I2') {
+ $packed_property = _pack_VT_I2($property->[2]);
+ }
+ elsif ($property_type eq 'VT_LPSTR') {
+ $packed_property = _pack_VT_LPSTR($property->[2], $codepage);
+ }
+ elsif ($property_type eq 'VT_FILETIME') {
+ $packed_property = _pack_VT_FILETIME($property->[2]);
+ }
+ else {
+ croak "Unknown property type: $property_type\n";
+ }
+
+ $offset += length $packed_property;
+ $data .= $packed_property;
+ }
+
+ return $data, \@offsets;
+}
+
+
+###############################################################################
+#
+# _pack_VT_I2().
+#
+# Pack an OLE property type: VT_I2, 16-bit signed integer.
+#
+sub _pack_VT_I2 {
+
+ my $type = 0x0002;
+ my $value = $_[0];
+
+ my $data = pack 'VV', $type, $value;
+
+ return $data;
+}
+
+
+###############################################################################
+#
+# _pack_VT_LPSTR().
+#
+# Pack an OLE property type: VT_LPSTR, String in the Codepage encoding.
+# The strings are null terminated and padded to a 4 byte boundary.
+#
+sub _pack_VT_LPSTR {
+
+ my $type = 0x001E;
+ my $string = $_[0] . "\0";
+ my $codepage = $_[1];
+ my $length;
+ my $byte_string;
+
+ if ($codepage == 0x04E4) {
+ # Latin1
+ $byte_string = $string;
+ $length = length $byte_string;
+ }
+ elsif ($codepage == 0xFDE9) {
+ # UTF-8
+ if ( $] > 5.008 ) {
+ require Encode;
+ if (Encode::is_utf8($string)) {
+ $byte_string = Encode::encode_utf8($string);
+ }
+ else {
+ $byte_string = $string;
+ }
+ }
+ else {
+ $byte_string = $string;
+ }
+
+ $length = length $byte_string;
+ }
+ else {
+ croak "Unknown codepage: $codepage\n";
+ }
+
+ # Pack the data.
+ my $data = pack 'VV', $type, $length;
+ $data .= $byte_string;
+
+ # The packed data has to null padded to a 4 byte boundary.
+ if (my $extra = $length % 4) {
+ $data .= "\0" x (4 - $extra);
+ }
+
+ return $data;
+}
+
+
+###############################################################################
+#
+# _pack_VT_FILETIME().
+#
+# Pack an OLE property type: VT_FILETIME.
+#
+sub _pack_VT_FILETIME {
+
+ my $type = 0x0040;
+ my $localtime = $_[0];
+
+ # Convert from localtime to seconds.
+ my $seconds = Time::Local::timelocal(@{$localtime});
+
+ # Add the number of seconds between the 1601 and 1970 epochs.
+ $seconds += 11644473600;
+
+ # The FILETIME seconds are in units of 100 nanoseconds.
+ my $nanoseconds = $seconds * 1E7;
+
+ # Pack the total nanoseconds into 64 bits.
+ my $time_hi = int($nanoseconds / 2**32);
+ my $time_lo = POSIX::fmod($nanoseconds, 2**32);
+
+ my $data = pack 'VVV', $type, $time_lo, $time_hi;
+
+ return $data;
+}
+
+
+1;
+
+
+__END__
+
+
+=head1 NAME
+
+Properties - A module for creating Excel property sets.
+
+=head1 SYNOPSIS
+
+See the C<set_properties()> method in the Spreadsheet::WriteExcel documentation.
+
+=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.