[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;
+}