[Feature]Upload Modem source code
Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/tools/3rdPartiesLicChk.pl b/mcu/tools/3rdPartiesLicChk.pl
new file mode 100644
index 0000000..a86608f
--- /dev/null
+++ b/mcu/tools/3rdPartiesLicChk.pl
@@ -0,0 +1,969 @@
+#!/usr/bin/perl -w
+#
+# Copyright Statement:
+# --------------------
+# This software is protected by Copyright and the information contained
+# herein is confidential. The software may not be copied and the information
+# contained herein may not be used or disclosed except with the written
+# permission of MediaTek Inc. (C) 2006
+#
+# BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+# THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+# RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+# AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+# NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+# SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+# SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+# THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+# NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+# SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+#
+# BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+# LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+# AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+# OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+# MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+#
+# THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+# WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+# LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+# RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+# THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+#
+#
+#*****************************************************************************
+#*
+#* Filename:
+#* ---------
+#* 3rdPartiesLicChk.pl
+#*
+#* Project:
+#* --------
+#* Maui_Software
+#*
+#* Description:
+#* ------------
+#* This script will check the licences of third party tools
+#*
+#*
+#* Author:
+#* -------
+#* Xxxxx Xxxx (mtkxxxx)
+#*
+#*============================================================================
+#* HISTORY
+#* Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+#*------------------------------------------------------------------------------
+#* $Revision: $
+#* $Modtime: $
+#* $Log: $
+#*
+#*------------------------------------------------------------------------------
+#* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+#*============================================================================
+
+#Since there is symbolic references @line 137, cannot use strict;
+#use strict;
+use warnings;
+
+&Usage() if ($#ARGV < 1); # be compatible with executing in standalone mode without feature's source level license check
+&Usage() if ($#ARGV > 1 && $#ARGV < 5);
+
+use lib "/perl";
+use Spreadsheet::ParseExcel;
+use Cwd;
+use File::Basename;
+use File::Copy;
+use Net::SMTP;
+use LWP::UserAgent;
+use Time::HiRes qw(gettimeofday tv_interval);
+
+my $CWD = cwd();
+chomp $CWD;
+$CWD =~ s/\/$// if ($CWD =~ /\/$/);
+
+my $DefaultThrdPtyLicFile = '\\\\glbfs14/wcp/sw_releases/@Portal_Material/Custom_Release_Info/customer_3rdparty_info/WCP-SA-Customer_Management.xls';
+my $AplixFeatSettingChgLogPth = '\\\\glbfs14/wcp/sw_releases/@Portal_Material/Custom_Release_Info/customer_3rdparty_info/Aplix_Feature_Setting_Changes';
+my $AACPlusFeatSettingChgLogPth = '\\\\glbfs14/wcp/sw_releases/@Portal_Material/Custom_Release_Info/customer_3rdparty_info/AACPlus_Feature_Setting_Changes';
+
+
+#parse command line arguments
+my $InputPrjFile = $ARGV[0];
+my $InputLicFile = ($ARGV[1] eq "")? $DefaultThrdPtyLicFile : $ARGV[1];
+my $Feat2ModTbl = (defined $ARGV[2])? $ARGV[2] : '';
+my @SRCModList = (defined $ARGV[3])? split(' ',$ARGV[3]) : ();
+my @PSRCModList = (defined $ARGV[4])? split(' ',$ARGV[4]) : ();
+my @OBJModList = (defined $ARGV[5])? split(' ',$ARGV[5]) : ();
+
+if (!-e $InputPrjFile)
+{
+ print "$InputPrjFile does NOT exist!!!\n";
+ &Usage();
+}
+
+if (!-e $InputLicFile)
+{
+ print "$InputLicFile does NOT exist!!!\n";
+ &Usage();
+}
+
+if ($Feat2ModTbl eq '')
+{
+ warn "Skip 3rd party feature's source level license check due to NOT specify \"Feat2ModTbl\" argument on command line!!!\n";
+}
+else
+{
+ warn "$Feat2ModTbl does NOT exist, skip 3rd party feature's source level license check!!!" if (!-e $Feat2ModTbl);
+ warn "skip 3rd party feature's source level license check due to NOT specify \"CUS_REL_SRC_COMP\" argument on command line!!!" if (!@SRCModList);
+ warn "skip 3rd party feature's source level license check due to NOT specify \"CUS_REL_PAR_SRC_COMP\" argument on command line!!!" if (!@PSRCModList);
+ warn "skip 3rd party feature's source level license check due to NOT specify \"CUS_REL_MTK_COMP\" argument on command line!!!" if (!@OBJModList);
+}
+
+my $ProjectMF = basename($InputPrjFile);
+my $ProjectNm = basename($ProjectMF, ".mak");
+my $MFPath = dirname($InputPrjFile);
+$MFPath =~ s/\/$//;
+open(MF, "<$MFPath/$ProjectMF") or die "cannot open $MFPath/$ProjectMF!!!\n";
+while (<MF>)
+{
+ next if (/^\s*#/);
+ if (/^\s*(\w+)\s*=\s*(\w+)/)
+ {
+ my $keyname = uc($1);
+ $$keyname = uc($2);
+ }
+}
+close(MF);
+
+
+#*****************************************************************************
+# feature related modules setting for source level license check
+# such as @WAP_SUPPORT_OBIGO_Q03C = qw(obigo03cadp obigo03capp obigo03clib)
+#*****************************************************************************
+if (($Feat2ModTbl ne '') && (-e $Feat2ModTbl))
+{
+ $Feat2ModTbl = (dirname($Feat2ModTbl) =~ /:|^\\\\\w/)? $Feat2ModTbl : "$CWD/$Feat2ModTbl";
+ open(FH, "<$Feat2ModTbl") or die "cannot open $Feat2ModTbl!!!\n";
+ while (<FH>)
+ {
+ next if (/^\s*#/);
+ if (/^\s*(\w+)\s*=\s*(\w+(\s+\w+)*)\s*/)
+ {
+ my $keyname = uc($1);
+ @$keyname = split(' ',$2);
+ }
+ }
+ close(FH);
+}
+
+
+# Data Structure
+#my $ThirdPartiesLicInfo =
+#{
+# CustID => string,
+# ActFlg => boolean,
+# CustNm => string,
+# ShrtNm => string,
+# LicToken => { Opt1 => boolean,
+# Opt2 => boolean,
+# Opt3 => boolean,
+# ......,
+# Optn => boolean},
+# # if customer have Aplix or RollTech license,
+# # the following two elements will be available
+# AplixLicToken => { Opt1 => boolean,
+# Opt2 => boolean,
+# ......,
+# Optn => boolean},
+# RollTechLicToken => { Opt1 => boolean,
+# Opt2 => boolean,
+# ......,
+# Optn => boolean}
+#};
+#*****************************************************************************
+# Read all customers' 3rd party feature license info. from license table
+#*****************************************************************************
+my $PrintLicInfoonScrn = 0; #dump license info. or NOT
+my $ErrMsg = '';
+my $ErrCnt = 0; # Err. counter
+
+# global varialbes setting for Main table 'Customer_3rdParties'
+my $CustID_col = 0;
+my $IsCustActive_col = 2;
+my $MainShtCustNm_col = 4;
+my $MainShtShrtNm_col = 5;
+my $MainShtFirstOpt_col = 7;
+my $MainShtFeatSeting_row = 1;
+my $MainShtFirstCust_row = 4;
+
+# global varialbes setting for Aplix table 'Aplix'
+my $AplixShtCustNm_col = 1;
+my $AplixShtShrtNm_col = 2;
+my $AplixShtFirstOpt_col = 5;
+my $AplixShtFeatSeting_row = 3;
+my $AplixShtFirstCust_row = 4;
+my $AplixFeature = '';
+my $AplixIgrptrn = '^\s*SW release request date\s*$|^\s*Expiration date\s*$|^\s*Contract type\s*$|^\s*Note\s*$';
+
+# global varialbes setting for RollTech table 'RollTech'
+my $RollTechShtCustNm_col = 22;
+my $RollTechShtShrtNm_col = 3;
+my $RollTechShtFirstOpt_col = 4;
+my $RollTechShtFeatSeting_row = 1;
+my $RollTechShtFirstCust_row = 2;
+my $RollTechFeature = '';
+my $RollTechIgrptrn = '^\s*Scope\s*$|^\s*Platform or Project\s*$|^\s*Note\s*$';
+
+# copy the excel file and open it
+my @ActCustLicInfo = ();
+my ($seconds, $microseconds) = gettimeofday;
+my $ThirdPartyLicFile = (dirname($InputLicFile) =~ /:|^\\\\\w/)? $InputLicFile : "$CWD/$InputLicFile";
+my $ThirdPartyLicFileCpy = "$CWD/".basename($ThirdPartyLicFile,'.xls')."_" .$microseconds.'.xls';
+my $ExcelParser = Spreadsheet::ParseExcel->new();
+copy($ThirdPartyLicFile,$ThirdPartyLicFileCpy) or die "Copy failed: $!";
+my $Book = $ExcelParser->parse($ThirdPartyLicFileCpy);
+
+# get the last row and column
+my $MainSheet = $Book->Worksheet('Customer_3rdParties'); # most 3rd parties license table
+my ($MainShtcol_min, $MainShtLastOpt_col) = $MainSheet->col_range();
+my ($MainShtrow_min, $MainShtLastCust_row) = $MainSheet->row_range();
+
+my $AplixSheet = $Book->Worksheet('Aplix');
+my ($AplixShtcol_min, $AplixShtLastOpt_col) = $AplixSheet->col_range();
+my ($AplixShtrow_min, $AplixShtLastCust_row) = $AplixSheet->row_range();
+
+my $RollTechSheet = $Book->Worksheet('RollTech');
+my ($RollTechShtcol_min, $RollTechShtLastOpt_col) = $RollTechSheet->col_range();
+my ($RollTechShtrow_min, $RollTechShtLastCust_row) = $RollTechSheet->row_range();
+#*****************************************************************************
+# Main Table(Customer_3rdParties), Most 3rd party feature license info. for all customers
+#*****************************************************************************
+
+foreach my $row ($MainShtFirstCust_row..$MainShtLastCust_row)
+{
+ my $ThirdPartiesLicInfo = {};
+ next unless defined $MainSheet->get_cell($row,$IsCustActive_col);
+ next unless defined $MainSheet->get_cell($row,$IsCustActive_col)->value();
+ next unless $MainSheet->get_cell($row,$IsCustActive_col)->value() =~ /^\s*Y\s*$/i;
+ next unless defined $MainSheet->get_cell($row,$MainShtShrtNm_col);
+ next unless defined $MainSheet->get_cell($row,$MainShtShrtNm_col)->value();
+ next if($MainSheet->get_cell($row,$MainShtShrtNm_col)->value() eq "");
+ $ThirdPartiesLicInfo->{CustID} = $MainSheet->get_cell($row,$CustID_col)->value();
+ push (@ActCustLicInfo, $ThirdPartiesLicInfo);
+ $ThirdPartiesLicInfo->{ActFlg} = $MainSheet->get_cell($row,$IsCustActive_col)->value();
+ $ThirdPartiesLicInfo->{CustNm} = $MainSheet->get_cell($row,$MainShtCustNm_col)->value();
+ $ThirdPartiesLicInfo->{ShrtNm} = $MainSheet->get_cell($row,$MainShtShrtNm_col)->value();
+ $ThirdPartiesLicInfo->{LicToken} = {};
+ foreach my $col ($MainShtFirstOpt_col..$MainShtLastOpt_col)
+ {
+ next unless defined $MainSheet->get_cell($MainShtFeatSeting_row,$col);
+ next unless defined $MainSheet->get_cell($MainShtFeatSeting_row,$col)->value();
+ next if($MainSheet->get_cell($MainShtFeatSeting_row,$col)->value() eq "");
+ my $OptSetting = uc($MainSheet->get_cell($MainShtFeatSeting_row,$col)->value());
+ $OptSetting =~ s/\s//g;
+ $AplixFeature = "$OptSetting" if (($AplixFeature eq '') && ($OptSetting =~ /^J2ME_SUPPORT=JBLENDIA$/i));
+ $RollTechFeature = "$OptSetting" if (($RollTechFeature eq '') && ($OptSetting =~ /^J2ME_SUPPORT=IJET$/i));
+ if (!defined $MainSheet->get_cell($row,$col) ||
+ !defined $MainSheet->get_cell($row,$col)->value())
+ {
+ $ThirdPartiesLicInfo->{LicToken}->{"$OptSetting"} = 0 if (!defined $ThirdPartiesLicInfo->{LicToken}->{"$OptSetting"});
+ next;
+ }
+
+ if ($MainSheet->get_cell($row,$col)->value() =~ /^\s*V.*(Partial Source|PSRC)/i)
+ {# feature with partial source
+ $ThirdPartiesLicInfo->{LicToken}->{"$OptSetting"} = 3;
+ }
+ elsif ($MainSheet->get_cell($row,$col)->value() =~ /^\s*V.*(Source|SRC)/i)
+ {# feature with full source
+ $ThirdPartiesLicInfo->{LicToken}->{"$OptSetting"} = 4;
+ }
+ elsif ($MainSheet->get_cell($row,$col)->value() =~ /^\s*V.*(Object|OBJ)/i)
+ {# feature ONLY with library
+ $ThirdPartiesLicInfo->{LicToken}->{"$OptSetting"} = 2;
+ }
+ elsif ($MainSheet->get_cell($row,$col)->value() =~ /^\s*V/i)
+ {
+ $ThirdPartiesLicInfo->{LicToken}->{"$OptSetting"} = 1;
+ }
+ elsif (!defined $ThirdPartiesLicInfo->{LicToken}->{"$OptSetting"})
+ {
+ $ThirdPartiesLicInfo->{LicToken}->{"$OptSetting"} = 0;
+ }
+ }# foreach my $col ($MainShtFirstOpt_col..$MainShtLastOpt_col)
+
+ $ThirdPartiesLicInfo->{LicToken}->{"AAC_PLUS_DECODE=TRUE"} = 1; # for recording AAC Plus rel. info.
+}
+
+
+#*****************************************************************************
+# Read Aplix JAVA feature license info. of customers
+#*****************************************************************************
+@ActCustLicInfo = &ReadJavaLicInfo(\@ActCustLicInfo,
+ 'Aplix',
+ $AplixFeature,
+ $AplixShtFirstCust_row,
+ $AplixShtLastCust_row,
+ $AplixShtShrtNm_col,
+ $AplixShtFirstOpt_col,
+ $AplixShtLastOpt_col,
+ $AplixShtFeatSeting_row,
+ 'AplixLicToken',
+ $AplixIgrptrn);
+
+#*****************************************************************************
+# Read RollTech JAVA feature license info. of customers
+#*****************************************************************************
+@ActCustLicInfo = &ReadJavaLicInfo(\@ActCustLicInfo,
+ 'RollTech',
+ $RollTechFeature,
+ $RollTechShtFirstCust_row,
+ $RollTechShtLastCust_row,
+ $RollTechShtShrtNm_col,
+ $RollTechShtFirstOpt_col,
+ $RollTechShtLastOpt_col,
+ $RollTechShtFeatSeting_row,
+ 'RollTechLicToken',
+ $RollTechIgrptrn);
+
+unlink $ThirdPartyLicFileCpy or die "Delete failed: $!";
+#*****************************************************************************
+# Checking license for 3rd party features
+#*****************************************************************************
+@ActCustLicInfo = sort {$a->{ShrtNm} cmp $b->{ShrtNm}} @ActCustLicInfo;
+@ActCustLicInfo = reverse @ActCustLicInfo;
+foreach my $cust (@ActCustLicInfo)
+{
+ if ($cust->{ShrtNm} && $ProjectMF =~ /^$cust->{ShrtNm}/i)
+ {
+ ($ErrMsg, $ErrCnt) = &ChkLicense($cust->{CustNm}, $cust->{LicToken}, $ErrMsg, $ErrCnt);
+ ($ErrMsg, $ErrCnt) = &ChkJavaLicense($J2ME_SUPPORT, $cust, $ErrMsg, $ErrCnt) if (defined $J2ME_SUPPORT);
+ ($ErrMsg, $ErrCnt) = &ChkSrcLvlLic($cust->{CustNm}, $cust->{LicToken}, $ErrMsg, $ErrCnt);
+
+ last;
+ }
+}
+
+#*****************************************************************************
+# Dump 3rd party features license info. to temp. file if necessary
+# Print the checking result on screen
+#*****************************************************************************
+&PrintLicInfoonScrn(\@ActCustLicInfo) if ($PrintLicInfoonScrn);
+&PrintChkRst($ErrMsg, $ErrCnt, $ThirdPartyLicFile);
+
+
+#******************************************************************************
+## FUNCTION
+## ReadJavaLicInfo
+## ...
+## ...
+## ...
+##******************************************************************************
+sub ReadJavaLicInfo
+{
+ my ($arr_ref,
+ $JavaVendor,
+ $JavaFeature,
+ $JavaShtFirstCust_row,
+ $JavaShtLastCust_row,
+ $JavaShtShrtNm_col,
+ $JavaShtFirstOpt_col,
+ $JavaShtLastOpt_col,
+ $JavaShtFeatSeting_row,
+ $JavaLicToken,
+ $JavaTblIgrPtrn) = @_;
+ my $JavaSheet = $Book->Worksheet($JavaVendor);
+ foreach my $customer (@$arr_ref)
+ {
+ next if (!$customer->{LicToken}->{$JavaFeature});
+ foreach my $row ($JavaShtFirstCust_row..$JavaShtLastCust_row)
+ {
+ next unless defined $JavaSheet->get_cell($row,$JavaShtShrtNm_col);
+ next unless defined $JavaSheet->get_cell($row,$JavaShtShrtNm_col)->value();
+ if ($customer->{ShrtNm} eq $JavaSheet->get_cell($row,$JavaShtShrtNm_col)->value())
+ {
+ $customer->{$JavaLicToken} = {};
+ foreach my $col ($JavaShtFirstOpt_col..$JavaShtLastOpt_col)
+ {
+ next unless defined $JavaSheet->get_cell($JavaShtFeatSeting_row,$col);
+ next unless defined $JavaSheet->get_cell($JavaShtFeatSeting_row,$col)->value();
+ next if ($JavaSheet->get_cell($JavaShtFeatSeting_row,$col)->value() =~
+ /$JavaTblIgrPtrn/i);
+
+ my $OptSetting = uc($JavaSheet->get_cell($JavaShtFeatSeting_row,$col)->value());
+ $OptSetting =~ s/\s//g;
+
+ if (!defined $JavaSheet->get_cell($row,$col)->value())
+ {
+ $customer->{$JavaLicToken}->{"$OptSetting"} = 0;
+ next;
+ }
+ if ($JavaSheet->get_cell($row,$col)->value() =~ /^\s*V/i)
+ {
+ $customer->{$JavaLicToken}->{"$OptSetting"} = 1;
+ }
+ else
+ {
+ $customer->{$JavaLicToken}->{"$OptSetting"} = 0;
+ }
+ }# foreach my $col ($JavaShtFirstOpt_col..$JavaShtLastOpt_col)
+ last;
+ }# if ($customer->{ShrtNm} eq $JavaSheet->get_cell($row,$JavaShtShrtNm_col)->value())
+ }# foreach my $row ($JavaShtFirstCust_row..$JavaShtLastCust_row)
+ }# foreach my $customer (@$arr_ref)
+ return @$arr_ref;
+}
+
+
+#******************************************************************************
+## FUNCTION
+## ChkJavaLicense
+## ...
+## ...
+## ...
+##******************************************************************************
+sub ChkJavaLicense
+{
+ my ($javasln, $hash_ref, $str, $i) = @_;
+ my $tmpcnt = $i;
+
+ if ($javasln eq 'JBLENDIA')
+ {
+ ($str, $i) = &ChkLicense($hash_ref->{CustNm}, $hash_ref->{AplixLicToken}, $str, $i);
+
+ if ($i != $tmpcnt)
+ { # the customer has no JBLENDIA license, need notify Aplix
+ my ($OrgJavaFeatSet, $RelJavaFeatSet) = &GetJBLDFeatChgs($AplixFeatSettingChgLogPth);
+ if (($OrgJavaFeatSet ne "") && ($RelJavaFeatSet ne ""))
+ {
+ my ($CustStr, $modem) = &GetCustStrAndMODEM($ProjectMF);
+ my (undef, $week, $branch) = &GetVernoInfo("$MFPath/Verno_$CustStr\.bld");
+ my $CustNameStr = &CPMQuery($CustStr, "Customer");
+ my $sender = 'justin.chu@mediatek.com';
+ my $toAplix = 'mtk-biz@aplix.co.jp';
+ my $toSWPM = 'wcp_mt_cpm2@mediatek.com';
+ my $cc = 'justin.chu@mediatek.com, money.kang@mediatek.com';
+ my $subject = "Change project feature set notification from MTK";
+ my $body = "Dear Aplix partners,\n\n"
+ . " Please be informed that MediaTek will change the feature set of $CustStr($week) project with $PLATFORM chipset on $branch branch "
+ . "for $CustNameStr customer. Since the feature set is different with the last released, "
+ . "please help confirm whether the feature set is acceptable for release to the "
+ . "above-mentioned customer by providing a return e-mail to MediaTek within two (2) "
+ . "business days of this e-mail. This release request shall be deemed automatically "
+ . "accepted by Aplix if MediaTek receives no response from Aplix within two (2) business days of this e-mail./n/n";
+ $body .= "The two feature sets are as follows,\n"
+ . "Original Feature Set:\n"
+ . "$OrgJavaFeatSet\n"
+ . "Released Feature Set:\n"
+ . "$RelJavaFeatSet";
+
+ &SendEmailNotify($sender, $toAplix, $cc, $subject, $body);
+ &SendEmailNotify($sender, $toSWPM, $cc, $subject, $body);
+ }
+ }
+ }
+ elsif ($javasln eq 'IJET')
+ {
+ ($str, $i) = &ChkLicense($hash_ref->{CustNm}, $hash_ref->{RollTechLicToken}, $str, $i);
+ }
+ return ($str, $i);
+}
+
+
+#******************************************************************************
+## FUNCTION
+## ChkLicense
+## ...
+## ...
+## ...
+##******************************************************************************
+sub ChkLicense
+{
+ my ($customer, $hash_ref, $str, $i) = @_;
+ foreach my $opt (keys %{$hash_ref})
+ {
+ if ($opt =~ /^(AAC_PLUS_DECODE)=TRUE$/)
+ {# AAC_PLUS_DECODE
+ if (defined $AAC_PLUS_DECODE && $AAC_PLUS_DECODE =~ /^TRUE$/)
+ {
+ my ($CustStr, $modem) = &GetCustStrAndMODEM($ProjectMF);
+ my ($VernoStr,undef,undef) = &GetVernoInfo("$MFPath/Verno_$CustStr\.bld");
+ &RecAACPlusRelInfo("$AACPlusFeatSettingChgLogPth/AACPlusRelInfo.log",
+ &GetCurTime(),
+ $customer,
+ $VernoStr,
+ $ProjectNm,
+ "AAC Plus");
+ }
+ }# if ($opt =~ /^(AAC_PLUS_DECODE)=TRUE$/)
+ elsif ($opt =~ /^(AAC_PLUS_PS_DECODE)=TRUE$/)
+ {# AAC_PLUS_PS_DECODE
+ if (defined $AAC_PLUS_PS_DECODE && $AAC_PLUS_PS_DECODE =~ /^TRUE$/)
+ {
+ my ($CustStr, $modem) = &GetCustStrAndMODEM($ProjectMF);
+ my ($VernoStr,undef,undef) = &GetVernoInfo("$MFPath/Verno_$CustStr\.bld");
+ &RecAACPlusRelInfo("$AACPlusFeatSettingChgLogPth//AACPlusV2RelInfo.log",
+ &GetCurTime(),
+ $customer,
+ $VernoStr,
+ $ProjectNm,
+ "AAC Plus V2");
+ }
+ }# if ($opt =~ /^(AAC_PLUS_PS_DECODE)=TRUE$/)
+ elsif ($opt =~ /^(SYNCML_DM_SUPPORT)=TRUE$/)
+ {# SYNCML_DM_SUPPORT
+ my $OptNm = $1;
+ if ((defined $OPTR_SPEC && $OPTR_SPEC =~ /^CMCC/ && $OPTR_SPEC !~ /SEGA/) && defined $$OptNm && !$hash_ref->{$opt})
+ {
+ $i += 1;
+ $str .= "$i: $customer has no license for feature \"$opt\"!!!\n";
+ }
+ }# if ($opt =~ /^(SYNCML_DM_SUPPORT)=TRUE$/)
+ elsif ($opt =~ /^(SINGLE_SIM_MMI_ONLY)=FALSE$/)
+ {# SINGLE_SIM_MMI_ONLY (dual sim)
+ my $OptNm = $1;
+ if ((defined $GEMINI && $GEMINI =~ /^TRUE$/) && (defined $SINGLE_SIM_MMI_ONLY && $SINGLE_SIM_MMI_ONLY =~ /^FALSE$/) && !$hash_ref->{$opt})
+ {
+ $i += 1;
+ $str .= "$i: $customer has no license for feature \"$opt\"!!!\n";
+ }
+ }# elsif ($opt =~ /^(SINGLE_SIM_MMI_ONLY)=FALSE$/)
+ elsif ($opt =~ /^(\w+)=(\w+)$/)
+ {
+ my $OptNm = $1;
+ my $OptVal = $2;
+ if (defined $$OptNm && ($$OptNm eq $OptVal) && !$hash_ref->{$opt})
+ {
+ $i += 1;
+ $str .= "$i: $customer has no license for feature \"$opt\"!!!\n";
+ }
+ }# elsif ($opt =~ /^(\w+)=(\w+)$/)
+ elsif ($opt =~ /^(\w+)=((\w+)\.+)$/)
+ {# CMCC_......
+ my $OptNm = $1;
+ my $OptValPfx = $3;
+ if (defined $$OptNm && ($$OptNm =~ /^$OptValPfx/) && !$hash_ref->{$opt})
+ {
+ $i += 1;
+ $str .= "$i: $customer has no license for feature \"$OptNm=$$OptNm\"!!!\n";
+ }
+ }# elsif ($opt =~ /^(\w+)=((\w+)\.+)$/)
+ }
+ return ($str, $i);
+}
+
+
+#******************************************************************************
+## FUNCTION
+## ChkSrcLvlLic
+## ...
+## ...
+## ...
+##******************************************************************************
+sub ChkSrcLvlLic
+{
+ my ($customer, $hash_ref, $str, $i) = @_;
+ foreach my $opt (keys %{$hash_ref})
+ {
+ if ($opt =~ /^(\w+)=(\w+)$/)
+ {
+ my $ArrNm = $1.'_'.$2;
+ if (@$ArrNm)
+ {
+ if (($hash_ref->{$opt} == 4) && !&IsSubArr(\@$ArrNm, \@SRCModList))
+ {
+ $i += 1;
+ $str .= "$i: $customer should have source release for feature \"$opt\"!!!\n";
+ }
+ if (($hash_ref->{$opt} == 3) && !&IsSubArr(\@$ArrNm, \@PSRCModList))
+ {
+ $i += 1;
+ $str .= "$i: $customer should have partial source release for feature \"$opt\"!!!\n";
+ }
+ if (($hash_ref->{$opt} == 2) && !&IsSubArr(\@$ArrNm, \@OBJModList))
+ {
+ $i += 1;
+ $str .= "$i: $customer should have library release for feature \"$opt\"!!!\n";
+ }
+ }
+ }
+ }
+ return ($str, $i);
+}
+
+
+#******************************************************************************
+## FUNCTION
+## IsSubArr
+## ...
+## ...
+## ...
+##******************************************************************************
+sub IsSubArr
+{
+ my ($arr_ref1, $arr_ref2) = @_;
+ my $cnt = 0;
+ foreach my $i (@$arr_ref1)
+ {
+ $cnt++ if (grep(/^$i$/, @$arr_ref2));
+ }
+ return 1 if ($cnt == @$arr_ref1);
+ return 0;
+}
+
+sub PrintChkRst
+{
+ my ($str, $i, $licfile) = @_;
+ if ($i)
+ {
+ print $i == 1?
+ "There is license problem in the following $i feature setting.\n":
+ "There are license problems in the following $i features setting.\n";
+ print $str;
+ print "PLEASE check details from 3rd party feature license table \"$licfile\" !!!\n";
+ exit 1;
+ }
+ else
+ {
+ print "Checking 3rd party features license DONE!!!\n";
+ exit 0;
+ }
+}
+
+
+#******************************************************************************
+## FUNCTION
+## PrintLicInfoonScrn
+## ...
+## Print the the cusotmer's 3rd party feature License info.
+## ...
+## ...
+##******************************************************************************
+sub PrintLicInfoonScrn
+{
+ open(FH,">~3rdPtyLicInfo.tmp") or die "Cannot open ~3rdPtyLicInfo.tmp!!!\n";
+ my $arr_ref = shift;
+ foreach my $i (@$arr_ref)
+ {
+ print FH "#****************************************************\n";
+ print FH "# $i->{CustNm}\n";
+ print FH "#****************************************************\n";
+ # $i ===> $ThirdPartyLicFile
+ foreach my $k (keys %{$i})
+ {#$k ===> CustID, ActFlg, CustNm, ShrtNm, LicToken
+ if ($k =~ /^LicToken$/i)
+ {
+ print FH "[License Token]\n";
+ foreach my $t (keys %{$i->{$k}})
+ { # $i->{$k} ===> $ThirdPartyLicFile->{LicToken}
+ # $t ===> Opt1,Opt2,...,Optn
+ printf FH "%-70s%5d\n",$t,$i->{$k}->{$t};
+ }
+ }# if ($k =~ /^LicToken$/i)
+ elsif ($k =~ /^AplixLicToken$/i)
+ {
+ print FH "[Aplix License Token]\n";
+ foreach my $t (keys %{$i->{$k}})
+ { # $i->{$k} ===> $ThirdPartyLicFile->{LicToken}
+ # $t ===> Opt1,Opt2,...,Optn
+ printf FH "%-70s%5d\n",$t,$i->{$k}->{$t};
+ }
+ }# elsif ($k =~ /^AplixLicToken$/i)
+ elsif ($k =~ /^RollTechLicToken$/i)
+ {
+ print FH "[Rolltech License Token]\n";
+ foreach my $t (keys %{$i->{$k}})
+ { # $i->{$k} ===> $ThirdPartyLicFile->{LicToken}
+ # $t ===> Opt1,Opt2,...,Optn
+ printf FH "%-70s%5d\n",$t,$i->{$k}->{$t};
+ }
+ }# elsif ($k =~ /^RollTechLicToken$/i)
+ else
+ {
+ printf FH "%-70s%5s\n",$k,$i->{$k};
+ # CustID: string
+ # ActFlg: boolean
+ # CustNm: string
+ # ShrtNm: string
+ }
+ }
+ }
+ close(FH);
+}
+
+
+#******************************************************************************
+## FUNCTION
+## CPMQuery
+## ...
+## ...
+## ...
+##******************************************************************************
+sub CPMQuery
+{
+ my ($string1, $string2) = @_;
+ my ($statuscode, $headers, $file) = ();
+ my $my_result = ();
+ my $CPM_address = "/CPM/httpService/CPMService.cfm";
+
+ my ($Srv, $UsrNm, $Pwd);
+ my $CPMAuthInfo = dirname($DefaultThrdPtyLicFile)."/CPMAuthInfo.ini";
+ open(AUTHFILE, $CPMAuthInfo) or die "can NOT open $CPMAuthInfo!\n";
+ while(<AUTHFILE>)
+ {
+ chomp;
+ $Srv = $1 if (/^\s*CPM_SERVER\s*=\s*(.*)/);
+ $UsrNm = $1 if (/^\s*CPM_ACCOUNT\s*=\s*(.*)/);
+ $Pwd = $1 if (/^\s*CPM_PWD\s*=\s*(.*)/);
+ }
+ close(AUTHFILE);
+
+ my $url;
+ my $Connection = LWP::UserAgent->new();
+ $Connection->credentials($Srv, "realm-name", $UsrNm => $Pwd);
+ if ($string2 ne "Customer")
+ {
+
+ $url = "http://".$Srv."$CPM_address?func=getFeatureValuOfProject\&project=$string1\&feature=$string2";
+ }
+ else
+ {
+ $url = "http://".$Srv."$CPM_address?func=getCustomerNameOfProject\&project=$string1";
+ }
+ $response = $Connection->get($url);
+ if ($response->is_success)
+ {
+ $statuscode = $response->code;
+ $headers = $response->headers;
+ $file = $response->content;
+ }
+ else
+ {
+ die "Cannot connect to CPM $url $!\n".$response->status_line;
+ }
+
+ $my_result = $file;
+ $my_result =~ s/<[^\<\>]*>//g;
+
+ return $my_result;
+}
+
+
+#******************************************************************************
+## FUNCTION
+## RGetJBLDFeatChgs
+## ...
+## ...
+## ...
+##******************************************************************************
+sub GetJBLDFeatChgs
+{
+ my $logpath = shift;
+ my $ChgCnt = 0;
+ my @OrgSet = ();
+ my @CurSet = ();
+ my ($CustStr, $modem) = &GetCustStrAndMODEM($ProjectMF);
+ my ($VernoStr,undef,undef) = &GetVernoInfo("$MFPath/Verno_$CustStr\.bld");
+ my $logfile = $VernoStr."_".$CustStr."_".$modem."\.log"; # the log is generated by project creation process
+
+ if (-e "$logpath/$logfile")
+ {
+ open(LOGFILE,"<$logpath/$logfile") or die "can NOT open $logpath/$logfile!\n";
+ while(<LOGFILE>)
+ {
+ next if (/^\s*#/);
+ if (/^\s*(\w+)\s*=\s*(\w+)/)
+ {
+ my $opt = $1;
+ my $orgval = $2;
+ next if ($opt =~ /^CHIP_VER$/);
+ push(@OrgSet, "$opt = $orgval");
+ push(@CurSet, "$opt = $$opt");
+ $ChgCnt++ if ($$opt ne $orgval);
+ }
+ }
+ close(LOGFILE);
+ }
+ if (!$ChgCnt)
+ {
+ @OrgSet = ();
+ @CurSet = ();
+ }
+ return (join("\n",@OrgSet), join("\n",@CurSet));
+}
+
+
+#******************************************************************************
+## FUNCTION
+## GetCustStrAndMODEM
+## ...
+## ...
+## ...
+##******************************************************************************
+sub GetCustStrAndMODEM
+{
+ my $pMF = shift;
+ my $modem = '';
+ my $CustStr = '';
+ my @modem_type = qw (LIS BASIC GSM GPRS UMTS UDVT HSPA TDD128 TDD128DPA TDD128HSPA);
+ foreach my $p (@modem_type)
+ {
+ if ($pMF =~ /(.*)_$p\.mak$/i)
+ {
+ $CustStr = $1;
+ $modem = $p;
+ last;
+ }
+ }
+ return ($CustStr, $modem);
+}
+
+
+#******************************************************************************
+## FUNCTION
+## GetVernoInfo
+## ...
+## ...
+## ...
+##******************************************************************************
+sub GetVernoInfo
+{
+ my $vernofile = shift;
+ my $verno = '';
+ my $weekStr = '';
+ my $branchStr = '';
+ open(VERNOFILE, "<$vernofile") or die "can NOT open $vernofile!\n";
+ while(<VERNOFILE>)
+ {
+ if (/^\s*VERNO\s*=\s*(MAUI\.((\w+)\.)?(W\d\d\.\d\d)\.?(((OF|MP|SP)\w*)\.?)?.*)/i)
+ {
+ $verno = $1;
+ $weekStr = $4;
+ my ($elem3, $elem5, $elem6) = ($3, $5, $6);
+ my $tmp = $weekStr;
+ $tmp =~ s/\.//;
+ $branchStr = ((defined($elem3) && ($elem3 ne ""))? $elem3 : "MAUI")
+ . ((defined($elem5) && ($elem5 ne ""))? $tmp.$elem6 : "");
+ }
+ }
+ close(VERNOFILE);
+ return ($verno, $weekStr, $branchStr);
+}
+
+
+#******************************************************************************
+## FUNCTION
+## RecAACPlusReInfo
+## ...
+## ...
+## ...
+##******************************************************************************
+sub RecAACPlusRelInfo
+{
+ my $writed = 0;
+ my ($logfile, $timestr, $customer, $verno, $projectname, $featurename) = @_;
+ for (1..20)
+ {
+ if(open(LOGFILE, ">>$logfile"))
+ {
+ print LOGFILE "$timestr\t$customer\t$verno\t$projectname\t$featurename\n";
+ close(LOGFILE);
+ $writed = 1;
+ last;
+ }
+ else
+ {
+ system("echo cannot open $logfile Wait 3 sec to open again");
+ sleep(3);
+ }
+ }
+ if(!$writed)
+ {
+ die "cannot open $timestr\t$customer\t$verno\t$projectname\t$featurename";
+ }
+}
+
+
+#******************************************************************************
+## FUNCTION
+## GetCurTime
+## ...
+## ...
+## ...
+##******************************************************************************
+sub GetCurTime
+{
+ my ($sec, $min, $hour, $mday, $mon, $year) = localtime(time);
+ my $timeStr = sprintf("%4.4d-%2.2d-%2.2d %2.2d:%2.2d:%2.2d", $year+1900, $mon+1, $mday, $hour, $min, $sec);
+ return $timeStr;
+}
+
+
+#******************************************************************************
+## FUNCTION
+## SendEmailNotify
+## ...
+## ...
+## ...
+##******************************************************************************
+sub SendEmailNotify
+{
+ my ($sender, $to_list, $cc_list, $mail_subject, $mail_content) = @_;
+ my $smtp_server = 'mtksmtp2.mtk.com.tw'; #"172.21.100.20"
+ my $msg = <<__EOFNOTIFY
+To: $to_list
+Cc: $cc_list
+Subject: $mail_subject
+From: $sender
+
+$mail_content
+
+__EOFNOTIFY
+;
+ my $smtp = Net::SMTP->new($smtp_server);
+ $smtp->mail($sender);
+ map { $smtp->to($_); } split(/,/, $to_list);
+ map { $smtp->cc($_); } split(/,/, $cc_list);
+ $smtp->data($msg);
+ $smtp->quit;
+}
+
+
+#******************************************************************************
+## FUNCTION
+## Usage
+## ...
+## ...
+## ...
+##******************************************************************************
+sub Usage
+{
+ print <<"__EOFUSAGE";
+
+usage: $0 PrjMF 3rdPtyLicFile [<Feat2ModTbl> <CUS_REL_SRC_COMP> <CUS_REL_PAR_SRC_COMP> <CUS_REL_MTK_COMP>]
+
+PrjMF project makefile
+
+3rdPtyLicFile 3rd parties license table, if specified as "",
+ the default licese table will be used
+
+Feat2ModTbl Mapping file for feature and its module(s)
+ should be specified together with CUS_REL_SRC_COMP,
+ CUS_REL_PAR_SRC_COMP & CUS_REL_MTK_COMP
+
+CUS_REL_SRC_COMP SRC module list
+ should be specified together with Feat2ModTbl,
+ CUS_REL_PAR_SRC_COMP & CUS_REL_MTK_COMP
+
+CUS_REL_PAR_SRC_COMP PSRC module list
+ should be specified together with Feat2ModTbl,
+ CUS_REL_SRC_COMP & CUS_REL_MTK_COMP
+
+CUS_REL_MTK_COMP OBJ module list
+ should be specified together with Feat2ModTbl,
+ CUS_REL_SRC_COMP & CUS_REL_PAR_SRC_COMP
+__EOFUSAGE
+ exit 1;
+}