OLD | NEW |
---|---|
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "xfa/fxfa/fm2js/xfa_fm2jscontext.h" | 7 #include "xfa/fxfa/fm2js/xfa_fm2jscontext.h" |
8 | 8 |
9 #include <time.h> | 9 #include <time.h> |
10 | 10 |
(...skipping 3671 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3682 szResultString.Clear(); | 3682 szResultString.Clear(); |
3683 szResultString << FX_UTF8Encode(wsXMLBuf.GetBuffer(), wsXMLBuf.GetLength()) | 3683 szResultString << FX_UTF8Encode(wsXMLBuf.GetBuffer(), wsXMLBuf.GetLength()) |
3684 .AsStringC(); | 3684 .AsStringC(); |
3685 } | 3685 } |
3686 | 3686 |
3687 // static | 3687 // static |
3688 void CXFA_FM2JSContext::Encode(CFXJSE_Value* pThis, | 3688 void CXFA_FM2JSContext::Encode(CFXJSE_Value* pThis, |
3689 const CFX_ByteStringC& szFuncName, | 3689 const CFX_ByteStringC& szFuncName, |
3690 CFXJSE_Arguments& args) { | 3690 CFXJSE_Arguments& args) { |
3691 int32_t argc = args.GetLength(); | 3691 int32_t argc = args.GetLength(); |
3692 if (argc < 1 || argc > 2) { | |
3693 ToJSContext(pThis, nullptr) | |
3694 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Encode"); | |
3695 return; | |
3696 } | |
3697 | |
3692 if (argc == 1) { | 3698 if (argc == 1) { |
3693 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); | 3699 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); |
3694 if (ValueIsNull(pThis, argOne.get())) { | 3700 if (ValueIsNull(pThis, argOne.get())) { |
3695 args.GetReturnValue()->SetNull(); | 3701 args.GetReturnValue()->SetNull(); |
3696 } else { | 3702 return; |
3697 CFX_ByteString toEncodeString; | |
3698 ValueToUTF8String(argOne.get(), toEncodeString); | |
3699 CFX_ByteTextBuf resultBuf; | |
3700 EncodeURL(toEncodeString.AsStringC(), resultBuf); | |
3701 args.GetReturnValue()->SetString(resultBuf.AsStringC()); | |
3702 } | 3703 } |
3703 } else if (argc == 2) { | 3704 |
3704 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); | 3705 CFX_ByteString toEncodeString; |
3705 std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); | 3706 ValueToUTF8String(argOne.get(), toEncodeString); |
3706 if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get())) { | 3707 CFX_ByteTextBuf resultBuf; |
3707 args.GetReturnValue()->SetNull(); | 3708 EncodeURL(toEncodeString.AsStringC(), resultBuf); |
3708 } else { | 3709 args.GetReturnValue()->SetString(resultBuf.AsStringC()); |
3709 CFX_ByteString toEncodeString; | 3710 return; |
3710 ValueToUTF8String(argOne.get(), toEncodeString); | |
3711 CFX_ByteString identifyString; | |
3712 ValueToUTF8String(argTwo.get(), identifyString); | |
3713 CFX_ByteTextBuf resultBuf; | |
3714 if (identifyString.EqualNoCase("html")) { | |
3715 EncodeHTML(toEncodeString.AsStringC(), resultBuf); | |
3716 } else if (identifyString.EqualNoCase("xml")) { | |
3717 EncodeXML(toEncodeString.AsStringC(), resultBuf); | |
3718 } else { | |
3719 EncodeURL(toEncodeString.AsStringC(), resultBuf); | |
3720 } | |
3721 args.GetReturnValue()->SetString(resultBuf.AsStringC()); | |
3722 } | |
3723 } else { | |
3724 ToJSContext(pThis, nullptr) | |
3725 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Encode"); | |
3726 } | 3711 } |
3712 | |
3713 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); | |
3714 std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); | |
3715 if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get())) { | |
3716 args.GetReturnValue()->SetNull(); | |
3717 return; | |
3718 } | |
3719 | |
3720 CFX_ByteString toEncodeString; | |
3721 ValueToUTF8String(argOne.get(), toEncodeString); | |
3722 CFX_ByteString identifyString; | |
3723 ValueToUTF8String(argTwo.get(), identifyString); | |
3724 CFX_ByteTextBuf resultBuf; | |
3725 if (identifyString.EqualNoCase("html")) | |
3726 EncodeHTML(toEncodeString.AsStringC(), resultBuf); | |
3727 else if (identifyString.EqualNoCase("xml")) | |
3728 EncodeXML(toEncodeString.AsStringC(), resultBuf); | |
3729 else | |
3730 EncodeURL(toEncodeString.AsStringC(), resultBuf); | |
3731 | |
3732 args.GetReturnValue()->SetString(resultBuf.AsStringC()); | |
3727 } | 3733 } |
3728 | 3734 |
3729 // static | 3735 // static |
3730 void CXFA_FM2JSContext::EncodeURL(const CFX_ByteStringC& szURLString, | 3736 void CXFA_FM2JSContext::EncodeURL(const CFX_ByteStringC& szURLString, |
3731 CFX_ByteTextBuf& szResultBuf) { | 3737 CFX_ByteTextBuf& szResultBuf) { |
3732 CFX_WideString wsURLString = CFX_WideString::FromUTF8(szURLString); | 3738 CFX_WideString wsURLString = CFX_WideString::FromUTF8(szURLString); |
3733 CFX_WideTextBuf wsResultBuf; | 3739 CFX_WideTextBuf wsResultBuf; |
3734 FX_WCHAR ch = 0; | |
3735 int32_t iLength = wsURLString.GetLength(); | |
3736 FX_WCHAR strEncode[4]; | 3740 FX_WCHAR strEncode[4]; |
3737 strEncode[0] = '%'; | 3741 strEncode[0] = '%'; |
3738 strEncode[3] = 0; | 3742 strEncode[3] = 0; |
3739 FX_WCHAR strUnsafe[] = {' ', '<', '>', '"', '#', '%', '{', '}', | 3743 FX_WCHAR strUnsafe[] = {' ', '<', '>', '"', '#', '%', '{', '}', |
3740 '|', '\\', '^', '~', '[', ']', '`'}; | 3744 '|', '\\', '^', '~', '[', ']', '`'}; |
3741 FX_WCHAR strReserved[] = {';', '/', '?', ':', '@', '=', '&'}; | 3745 FX_WCHAR strReserved[] = {';', '/', '?', ':', '@', '=', '&'}; |
3742 FX_WCHAR strSpecial[] = {'$', '-', '+', '!', '*', '\'', '(', ')', ','}; | 3746 FX_WCHAR strSpecial[] = {'$', '-', '+', '!', '*', '\'', '(', ')', ','}; |
3743 const FX_WCHAR* strCode = L"0123456789abcdef"; | 3747 const FX_WCHAR* strCode = L"0123456789abcdef"; |
3744 for (int32_t u = 0; u < iLength; ++u) { | 3748 for (int32_t u = 0; u < wsURLString.GetLength(); ++u) { |
3745 ch = wsURLString.GetAt(u); | 3749 FX_WCHAR ch = wsURLString.GetAt(u); |
3746 int32_t i = 0; | 3750 int32_t i = 0; |
3747 int32_t iCount = sizeof(strUnsafe) / sizeof(strUnsafe[0]); | 3751 int32_t iCount = FX_ArraySize(strUnsafe); |
3748 while (i < iCount) { | 3752 while (i < iCount) { |
3749 if (ch == strUnsafe[i]) { | 3753 if (ch == strUnsafe[i]) { |
3750 int32_t iIndex = ch / 16; | 3754 int32_t iIndex = ch / 16; |
3751 strEncode[1] = strCode[iIndex]; | 3755 strEncode[1] = strCode[iIndex]; |
3752 strEncode[2] = strCode[ch - iIndex * 16]; | 3756 strEncode[2] = strCode[ch - iIndex * 16]; |
3753 wsResultBuf << FX_WSTRC(strEncode); | 3757 wsResultBuf << FX_WSTRC(strEncode); |
3754 break; | 3758 break; |
3755 } | 3759 } |
3756 ++i; | 3760 ++i; |
3757 } | 3761 } |
3758 if (i < iCount) { | 3762 if (i < iCount) |
3759 continue; | 3763 continue; |
3760 } | 3764 |
3761 i = 0; | 3765 i = 0; |
3762 iCount = sizeof(strReserved) / sizeof(strReserved[0]); | 3766 iCount = FX_ArraySize(strReserved); |
3763 while (i < iCount) { | 3767 while (i < iCount) { |
3764 if (ch == strReserved[i]) { | 3768 if (ch == strReserved[i]) { |
3765 int32_t iIndex = ch / 16; | 3769 int32_t iIndex = ch / 16; |
3766 strEncode[1] = strCode[iIndex]; | 3770 strEncode[1] = strCode[iIndex]; |
3767 strEncode[2] = strCode[ch - iIndex * 16]; | 3771 strEncode[2] = strCode[ch - iIndex * 16]; |
3768 wsResultBuf << FX_WSTRC(strEncode); | 3772 wsResultBuf << FX_WSTRC(strEncode); |
3769 break; | 3773 break; |
3770 } | 3774 } |
3771 ++i; | 3775 ++i; |
3772 } | 3776 } |
3773 if (i < iCount) { | 3777 if (i < iCount) |
3774 continue; | 3778 continue; |
3775 } | 3779 |
3776 i = 0; | 3780 i = 0; |
3777 iCount = sizeof(strSpecial) / sizeof(strSpecial[0]); | 3781 iCount = FX_ArraySize(strSpecial); |
3778 while (i < iCount) { | 3782 while (i < iCount) { |
3779 if (ch == strSpecial[i]) { | 3783 if (ch == strSpecial[i]) { |
3780 wsResultBuf.AppendChar(ch); | 3784 wsResultBuf.AppendChar(ch); |
3781 break; | 3785 break; |
3782 } | 3786 } |
3783 ++i; | 3787 ++i; |
3784 } | 3788 } |
3785 if (i < iCount) { | 3789 if (i < iCount) |
3786 continue; | 3790 continue; |
3787 } | 3791 |
3788 if (ch >= 0x80 && ch <= 0xff) { | 3792 if ((ch >= 0x80 && ch <= 0xff) || ch <= 0x1f || ch == 0x7f) { |
3789 int32_t iIndex = ch / 16; | 3793 int32_t iIndex = ch / 16; |
3790 strEncode[1] = strCode[iIndex]; | 3794 strEncode[1] = strCode[iIndex]; |
3791 strEncode[2] = strCode[ch - iIndex * 16]; | 3795 strEncode[2] = strCode[ch - iIndex * 16]; |
3792 wsResultBuf << FX_WSTRC(strEncode); | |
3793 } else if (ch <= 0x1f || ch == 0x7f) { | |
3794 int32_t iIndex = ch / 16; | |
3795 strEncode[1] = strCode[iIndex]; | |
3796 strEncode[2] = strCode[ch - iIndex * 16]; | |
3797 wsResultBuf << FX_WSTRC(strEncode); | 3796 wsResultBuf << FX_WSTRC(strEncode); |
3798 } else if (ch >= 0x20 && ch <= 0x7e) { | 3797 } else if (ch >= 0x20 && ch <= 0x7e) { |
3799 wsResultBuf.AppendChar(ch); | 3798 wsResultBuf.AppendChar(ch); |
3800 } else { | 3799 } else { |
3801 const FX_WCHAR iRadix = 16; | 3800 const FX_WCHAR iRadix = 16; |
3802 CFX_WideString strTmp; | 3801 CFX_WideString strTmp; |
3803 while (ch >= iRadix) { | 3802 while (ch >= iRadix) { |
3804 FX_WCHAR tmp = strCode[ch % iRadix]; | 3803 FX_WCHAR tmp = strCode[ch % iRadix]; |
3805 ch /= iRadix; | 3804 ch /= iRadix; |
3806 strTmp += tmp; | 3805 strTmp += tmp; |
3807 } | 3806 } |
3808 strTmp += strCode[ch]; | 3807 strTmp += strCode[ch]; |
3809 int32_t iLen = strTmp.GetLength(); | 3808 int32_t iLen = strTmp.GetLength(); |
3810 if (iLen < 2) { | 3809 if (iLen < 2) |
3811 break; | 3810 break; |
3812 } | 3811 |
3813 int32_t iIndex = 0; | 3812 int32_t iIndex = 0; |
3814 if (iLen % 2 != 0) { | 3813 if (iLen % 2 != 0) { |
3815 strEncode[1] = '0'; | 3814 strEncode[1] = '0'; |
3816 strEncode[2] = strTmp.GetAt(iLen - 1); | 3815 strEncode[2] = strTmp.GetAt(iLen - 1); |
3817 iIndex = iLen - 2; | 3816 iIndex = iLen - 2; |
3818 } else { | 3817 } else { |
3819 strEncode[1] = strTmp.GetAt(iLen - 1); | 3818 strEncode[1] = strTmp.GetAt(iLen - 1); |
3820 strEncode[2] = strTmp.GetAt(iLen - 2); | 3819 strEncode[2] = strTmp.GetAt(iLen - 2); |
3821 iIndex = iLen - 3; | 3820 iIndex = iLen - 3; |
3822 } | 3821 } |
3823 wsResultBuf << FX_WSTRC(strEncode); | 3822 wsResultBuf << FX_WSTRC(strEncode); |
3824 while (iIndex > 0) { | 3823 while (iIndex > 0) { |
3825 strEncode[1] = strTmp.GetAt(iIndex); | 3824 strEncode[1] = strTmp.GetAt(iIndex); |
3826 strEncode[2] = strTmp.GetAt(iIndex - 1); | 3825 strEncode[2] = strTmp.GetAt(iIndex - 1); |
3827 iIndex -= 2; | 3826 iIndex -= 2; |
3828 wsResultBuf << FX_WSTRC(strEncode); | 3827 wsResultBuf << FX_WSTRC(strEncode); |
3829 } | 3828 } |
3830 } | 3829 } |
3831 } | 3830 } |
3832 wsResultBuf.AppendChar(0); | 3831 wsResultBuf.AppendChar(0); |
3833 szResultBuf.Clear(); | 3832 szResultBuf.Clear(); |
3833 | |
3834 szResultBuf << FX_UTF8Encode(wsResultBuf.GetBuffer(), wsResultBuf.GetLength()) | 3834 szResultBuf << FX_UTF8Encode(wsResultBuf.GetBuffer(), wsResultBuf.GetLength()) |
3835 .AsStringC(); | 3835 .AsStringC(); |
3836 } | 3836 } |
3837 | 3837 |
3838 // static | 3838 // static |
3839 void CXFA_FM2JSContext::EncodeHTML(const CFX_ByteStringC& szHTMLString, | 3839 void CXFA_FM2JSContext::EncodeHTML(const CFX_ByteStringC& szHTMLString, |
3840 CFX_ByteTextBuf& szResultBuf) { | 3840 CFX_ByteTextBuf& szResultBuf) { |
3841 CFX_ByteString str = szHTMLString.c_str(); | 3841 CFX_ByteString str = szHTMLString.c_str(); |
3842 CFX_WideString wsHTMLString = CFX_WideString::FromUTF8(str.AsStringC()); | 3842 CFX_WideString wsHTMLString = CFX_WideString::FromUTF8(str.AsStringC()); |
3843 const FX_WCHAR* strCode = L"0123456789abcdef"; | 3843 const FX_WCHAR* strCode = L"0123456789abcdef"; |
3844 FX_WCHAR strEncode[9]; | 3844 FX_WCHAR strEncode[9]; |
3845 strEncode[0] = '&'; | 3845 strEncode[0] = '&'; |
3846 strEncode[1] = '#'; | 3846 strEncode[1] = '#'; |
3847 strEncode[2] = 'x'; | 3847 strEncode[2] = 'x'; |
3848 strEncode[5] = ';'; | 3848 strEncode[5] = ';'; |
3849 strEncode[6] = 0; | 3849 strEncode[6] = 0; |
3850 strEncode[7] = ';'; | 3850 strEncode[7] = ';'; |
3851 strEncode[8] = 0; | 3851 strEncode[8] = 0; |
3852 CFX_WideTextBuf wsResultBuf; | 3852 CFX_WideTextBuf wsResultBuf; |
3853 uint32_t ch = 0; | |
3854 int32_t iLen = wsHTMLString.GetLength(); | 3853 int32_t iLen = wsHTMLString.GetLength(); |
3855 int32_t i = 0; | 3854 int32_t i = 0; |
3856 const FX_WCHAR* pData = wsHTMLString.c_str(); | 3855 const FX_WCHAR* pData = wsHTMLString.c_str(); |
3857 int32_t iIndex = 0; | |
3858 CFX_WideString htmlReserve; | |
3859 while (i < iLen) { | 3856 while (i < iLen) { |
3860 ch = pData[i]; | 3857 uint32_t ch = pData[i]; |
3861 htmlReserve.clear(); | 3858 CFX_WideString htmlReserve; |
3862 if (HTMLCode2STR(ch, htmlReserve)) { | 3859 if (HTMLCode2STR(ch, htmlReserve)) { |
3863 wsResultBuf.AppendChar(L'&'); | 3860 wsResultBuf.AppendChar(L'&'); |
3864 wsResultBuf << htmlReserve; | 3861 wsResultBuf << htmlReserve; |
3865 wsResultBuf.AppendChar(L';'); | 3862 wsResultBuf.AppendChar(L';'); |
3863 } else if (ch >= 32 && ch <= 126) { | |
3864 wsResultBuf.AppendChar((FX_WCHAR)ch); | |
3865 } else if (ch < 256) { | |
3866 int32_t iIndex = ch / 16; | |
3867 strEncode[3] = strCode[iIndex]; | |
3868 strEncode[4] = strCode[ch - iIndex * 16]; | |
3869 strEncode[5] = ';'; | |
3870 strEncode[6] = 0; | |
3871 wsResultBuf << FX_WSTRC(strEncode); | |
3866 } else { | 3872 } else { |
3867 if (ch >= 32 && ch <= 126) { | 3873 int32_t iBigByte = ch / 256; |
3868 wsResultBuf.AppendChar((FX_WCHAR)ch); | 3874 int32_t iLittleByte = ch % 256; |
3869 } else if (ch < 256) { | 3875 strEncode[3] = strCode[iBigByte / 16]; |
3870 iIndex = ch / 16; | 3876 strEncode[4] = strCode[iBigByte % 16]; |
3871 strEncode[3] = strCode[iIndex]; | 3877 strEncode[5] = strCode[iLittleByte / 16]; |
3872 strEncode[4] = strCode[ch - iIndex * 16]; | 3878 strEncode[6] = strCode[iLittleByte % 16]; |
3873 strEncode[5] = ';'; | 3879 wsResultBuf << FX_WSTRC(strEncode); |
3874 strEncode[6] = 0; | |
3875 wsResultBuf << FX_WSTRC(strEncode); | |
3876 } else { | |
3877 int32_t iBigByte = ch / 256; | |
3878 int32_t iLittleByte = ch % 256; | |
3879 strEncode[3] = strCode[iBigByte / 16]; | |
3880 strEncode[4] = strCode[iBigByte % 16]; | |
3881 strEncode[5] = strCode[iLittleByte / 16]; | |
3882 strEncode[6] = strCode[iLittleByte % 16]; | |
3883 wsResultBuf << FX_WSTRC(strEncode); | |
3884 } | |
3885 } | 3880 } |
3886 ++i; | 3881 ++i; |
3887 } | 3882 } |
3888 wsResultBuf.AppendChar(0); | 3883 wsResultBuf.AppendChar(0); |
3889 szResultBuf.Clear(); | 3884 szResultBuf.Clear(); |
3885 | |
3890 szResultBuf << FX_UTF8Encode(wsResultBuf.GetBuffer(), wsResultBuf.GetLength()) | 3886 szResultBuf << FX_UTF8Encode(wsResultBuf.GetBuffer(), wsResultBuf.GetLength()) |
3891 .AsStringC(); | 3887 .AsStringC(); |
3892 } | 3888 } |
3893 | 3889 |
3894 // static | 3890 // static |
3895 void CXFA_FM2JSContext::EncodeXML(const CFX_ByteStringC& szXMLString, | 3891 void CXFA_FM2JSContext::EncodeXML(const CFX_ByteStringC& szXMLString, |
3896 CFX_ByteTextBuf& szResultBuf) { | 3892 CFX_ByteTextBuf& szResultBuf) { |
3897 CFX_WideString wsXMLString = CFX_WideString::FromUTF8(szXMLString); | 3893 CFX_WideString wsXMLString = CFX_WideString::FromUTF8(szXMLString); |
3898 CFX_WideTextBuf wsResultBuf; | 3894 CFX_WideTextBuf wsResultBuf; |
3899 enum { | |
3900 QUOT, | |
3901 AMP, | |
3902 APOS, | |
3903 LT, | |
3904 GT, | |
3905 }; | |
3906 FX_WCHAR strEncode[9]; | 3895 FX_WCHAR strEncode[9]; |
3907 strEncode[0] = '&'; | 3896 strEncode[0] = '&'; |
3908 strEncode[1] = '#'; | 3897 strEncode[1] = '#'; |
3909 strEncode[2] = 'x'; | 3898 strEncode[2] = 'x'; |
3910 strEncode[5] = ';'; | 3899 strEncode[5] = ';'; |
3911 strEncode[6] = 0; | 3900 strEncode[6] = 0; |
3912 strEncode[7] = ';'; | 3901 strEncode[7] = ';'; |
3913 strEncode[8] = 0; | 3902 strEncode[8] = 0; |
3914 const FX_WCHAR* const strName[] = {L"quot", L"amp", L"apos", L"lt", L"gt"}; | |
3915 const FX_WCHAR* strCode = L"0123456789abcdef"; | 3903 const FX_WCHAR* strCode = L"0123456789abcdef"; |
3916 FX_WCHAR ch = 0; | |
3917 int32_t iLength = wsXMLString.GetLength(); | |
3918 int32_t iIndex = 0; | |
3919 int32_t u = 0; | |
3920 const FX_WCHAR* pData = wsXMLString.c_str(); | 3904 const FX_WCHAR* pData = wsXMLString.c_str(); |
3921 for (u = 0; u < iLength; ++u) { | 3905 for (int32_t u = 0; u < wsXMLString.GetLength(); ++u) { |
3922 ch = pData[u]; | 3906 FX_WCHAR ch = pData[u]; |
3923 switch (ch) { | 3907 switch (ch) { |
3924 case '"': | 3908 case '"': |
3925 wsResultBuf.AppendChar('&'); | 3909 wsResultBuf.AppendChar('&'); |
3926 wsResultBuf << CFX_WideStringC(strName[QUOT]); | 3910 wsResultBuf << CFX_WideStringC(L"quot"); |
3927 wsResultBuf.AppendChar(';'); | 3911 wsResultBuf.AppendChar(';'); |
3928 break; | 3912 break; |
3929 case '&': | 3913 case '&': |
3930 wsResultBuf.AppendChar('&'); | 3914 wsResultBuf.AppendChar('&'); |
3931 wsResultBuf << CFX_WideStringC(strName[AMP]); | 3915 wsResultBuf << CFX_WideStringC(L"amp"); |
3932 wsResultBuf.AppendChar(';'); | 3916 wsResultBuf.AppendChar(';'); |
3933 break; | 3917 break; |
3934 case '\'': | 3918 case '\'': |
3935 wsResultBuf.AppendChar('&'); | 3919 wsResultBuf.AppendChar('&'); |
3936 wsResultBuf << CFX_WideStringC(strName[APOS]); | 3920 wsResultBuf << CFX_WideStringC(L"apos"); |
3937 wsResultBuf.AppendChar(';'); | 3921 wsResultBuf.AppendChar(';'); |
3938 break; | 3922 break; |
3939 case '<': | 3923 case '<': |
3940 wsResultBuf.AppendChar('&'); | 3924 wsResultBuf.AppendChar('&'); |
3941 wsResultBuf << CFX_WideStringC(strName[LT]); | 3925 wsResultBuf << CFX_WideStringC(L"lt"); |
3942 wsResultBuf.AppendChar(';'); | 3926 wsResultBuf.AppendChar(';'); |
3943 break; | 3927 break; |
3944 case '>': | 3928 case '>': |
3945 wsResultBuf.AppendChar('&'); | 3929 wsResultBuf.AppendChar('&'); |
3946 wsResultBuf << CFX_WideStringC(strName[GT]); | 3930 wsResultBuf << CFX_WideStringC(L"gt"); |
3947 wsResultBuf.AppendChar(';'); | 3931 wsResultBuf.AppendChar(';'); |
3948 break; | 3932 break; |
3949 default: { | 3933 default: { |
3950 if (ch >= 32 && ch <= 126) { | 3934 if (ch >= 32 && ch <= 126) { |
3951 wsResultBuf.AppendChar(ch); | 3935 wsResultBuf.AppendChar(ch); |
3952 } else if (ch < 256) { | 3936 } else if (ch < 256) { |
3953 iIndex = ch / 16; | 3937 int32_t iIndex = ch / 16; |
3954 strEncode[3] = strCode[iIndex]; | 3938 strEncode[3] = strCode[iIndex]; |
3955 strEncode[4] = strCode[ch - iIndex * 16]; | 3939 strEncode[4] = strCode[ch - iIndex * 16]; |
3956 strEncode[5] = ';'; | 3940 strEncode[5] = ';'; |
3957 strEncode[6] = 0; | 3941 strEncode[6] = 0; |
3958 wsResultBuf << FX_WSTRC(strEncode); | 3942 wsResultBuf << FX_WSTRC(strEncode); |
3959 } else { | 3943 } else { |
3960 int32_t iBigByte = ch / 256; | 3944 int32_t iBigByte = ch / 256; |
3961 int32_t iLittleByte = ch % 256; | 3945 int32_t iLittleByte = ch % 256; |
3962 strEncode[3] = strCode[iBigByte / 16]; | 3946 strEncode[3] = strCode[iBigByte / 16]; |
3963 strEncode[4] = strCode[iBigByte % 16]; | 3947 strEncode[4] = strCode[iBigByte % 16]; |
3964 strEncode[5] = strCode[iLittleByte / 16]; | 3948 strEncode[5] = strCode[iLittleByte / 16]; |
3965 strEncode[6] = strCode[iLittleByte % 16]; | 3949 strEncode[6] = strCode[iLittleByte % 16]; |
3966 wsResultBuf << FX_WSTRC(strEncode); | 3950 wsResultBuf << FX_WSTRC(strEncode); |
3967 } | 3951 } |
3968 } break; | 3952 break; |
3953 } | |
3969 } | 3954 } |
3970 } | 3955 } |
3971 wsResultBuf.AppendChar(0); | 3956 wsResultBuf.AppendChar(0); |
3972 szResultBuf.Clear(); | 3957 szResultBuf.Clear(); |
3958 | |
3973 szResultBuf << FX_UTF8Encode(wsResultBuf.GetBuffer(), wsResultBuf.GetLength()) | 3959 szResultBuf << FX_UTF8Encode(wsResultBuf.GetBuffer(), wsResultBuf.GetLength()) |
3974 .AsStringC(); | 3960 .AsStringC(); |
3975 } | 3961 } |
3976 | 3962 |
3977 // static | 3963 // static |
3978 FX_BOOL CXFA_FM2JSContext::HTMLSTR2Code(const CFX_WideStringC& pData, | 3964 FX_BOOL CXFA_FM2JSContext::HTMLSTR2Code(const CFX_WideStringC& pData, |
3979 uint32_t& iCode) { | 3965 uint32_t& iCode) { |
3980 uint32_t uHash = FX_HashCode_GetW(pData, false); | 3966 uint32_t uHash = FX_HashCode_GetW(pData, false); |
3981 int32_t iStart = 0; | 3967 int32_t iStart = 0; |
3982 int32_t iEnd = FX_ArraySize(reservesForDecode) - 1; | 3968 int32_t iEnd = FX_ArraySize(reservesForDecode) - 1; |
3983 do { | 3969 do { |
3984 int32_t iMid = (iStart + iEnd) / 2; | 3970 int32_t iMid = (iStart + iEnd) / 2; |
3985 XFA_FMHtmlHashedReserveCode htmlhashedreservecode = reservesForDecode[iMid]; | 3971 XFA_FMHtmlHashedReserveCode htmlhashedreservecode = reservesForDecode[iMid]; |
3986 if (uHash == htmlhashedreservecode.m_uHash) { | 3972 if (uHash == htmlhashedreservecode.m_uHash) { |
3987 iCode = htmlhashedreservecode.m_uCode; | 3973 iCode = htmlhashedreservecode.m_uCode; |
3988 return TRUE; | 3974 return TRUE; |
3989 } | 3975 } |
3990 if (uHash < htmlhashedreservecode.m_uHash) { | 3976 |
3977 if (uHash < htmlhashedreservecode.m_uHash) | |
3991 iEnd = iMid - 1; | 3978 iEnd = iMid - 1; |
3992 } else { | 3979 else |
3993 iStart = iMid + 1; | 3980 iStart = iMid + 1; |
3994 } | |
3995 } while (iStart <= iEnd); | 3981 } while (iStart <= iEnd); |
3996 return FALSE; | 3982 return FALSE; |
3997 } | 3983 } |
3998 | 3984 |
3999 // static | 3985 // static |
4000 FX_BOOL CXFA_FM2JSContext::HTMLCode2STR(uint32_t iCode, | 3986 FX_BOOL CXFA_FM2JSContext::HTMLCode2STR(uint32_t iCode, |
4001 CFX_WideString& wsHTMLReserve) { | 3987 CFX_WideString& wsHTMLReserve) { |
4002 XFA_FMHtmlReserveCode htmlreservecode; | 3988 int32_t iStart = 0; |
4003 int32_t iStart = 0, | 3989 int32_t iEnd = FX_ArraySize(reservesForEncode) - 1; |
4004 iEnd = (sizeof(reservesForEncode) / sizeof(reservesForEncode[0])) - 1; | |
4005 int32_t iMid = (iStart + iEnd) / 2; | |
4006 do { | 3990 do { |
4007 iMid = (iStart + iEnd) / 2; | 3991 int32_t iMid = (iStart + iEnd) / 2; |
4008 htmlreservecode = reservesForEncode[iMid]; | 3992 XFA_FMHtmlReserveCode htmlreservecode = reservesForEncode[iMid]; |
4009 if (iCode == htmlreservecode.m_uCode) { | 3993 if (iCode == htmlreservecode.m_uCode) { |
4010 wsHTMLReserve = htmlreservecode.m_htmlReserve; | 3994 wsHTMLReserve = htmlreservecode.m_htmlReserve; |
4011 return TRUE; | 3995 return TRUE; |
4012 } else if (iCode < htmlreservecode.m_uCode) { | 3996 } |
3997 | |
3998 if (iCode < htmlreservecode.m_uCode) | |
4013 iEnd = iMid - 1; | 3999 iEnd = iMid - 1; |
4014 } else { | 4000 else |
4015 iStart = iMid + 1; | 4001 iStart = iMid + 1; |
4016 } | |
4017 } while (iStart <= iEnd); | 4002 } while (iStart <= iEnd); |
4018 return FALSE; | 4003 return FALSE; |
4019 } | 4004 } |
4020 | 4005 |
4021 // static | 4006 // static |
4022 void CXFA_FM2JSContext::Format(CFXJSE_Value* pThis, | 4007 void CXFA_FM2JSContext::Format(CFXJSE_Value* pThis, |
4023 const CFX_ByteStringC& szFuncName, | 4008 const CFX_ByteStringC& szFuncName, |
4024 CFXJSE_Arguments& args) { | 4009 CFXJSE_Arguments& args) { |
4025 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr); | 4010 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr); |
4026 if (args.GetLength() >= 2) { | 4011 if (args.GetLength() < 2) { |
4027 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); | 4012 pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Format"); |
4028 std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); | 4013 return; |
4029 CFX_ByteString szPattern; | 4014 } |
4030 ValueToUTF8String(argOne.get(), szPattern); | 4015 |
4031 CFX_ByteString szValue; | 4016 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); |
4032 ValueToUTF8String(argTwo.get(), szValue); | 4017 CFX_ByteString szPattern; |
4033 CXFA_Document* pDoc = pContext->GetDocument(); | 4018 ValueToUTF8String(argOne.get(), szPattern); |
4034 IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr(); | 4019 |
4035 CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject()); | 4020 std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); |
4036 ASSERT(pThisNode); | 4021 CFX_ByteString szValue; |
4037 CXFA_WidgetData widgetData(pThisNode); | 4022 ValueToUTF8String(argTwo.get(), szValue); |
4038 IFX_Locale* pLocale = widgetData.GetLocal(); | 4023 |
4039 uint32_t patternType; | 4024 CXFA_Document* pDoc = pContext->GetDocument(); |
4040 CFX_WideString wsPattern = CFX_WideString::FromUTF8(szPattern.AsStringC()); | 4025 CXFA_LocaleMgr* pMgr = pDoc->GetLocalMgr(); |
4041 CFX_WideString wsValue = CFX_WideString::FromUTF8(szValue.AsStringC()); | 4026 CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject()); |
4042 if (!PatternStringType(szPattern.AsStringC(), patternType)) { | 4027 ASSERT(pThisNode); |
4043 switch (patternType) { | 4028 |
4044 case XFA_VT_DATETIME: { | 4029 CXFA_WidgetData widgetData(pThisNode); |
4045 FX_STRSIZE iTChar = wsPattern.Find(L'T'); | 4030 IFX_Locale* pLocale = widgetData.GetLocal(); |
4046 CFX_WideString wsDatePattern(L"date{"); | 4031 uint32_t patternType; |
4047 wsDatePattern += wsPattern.Left(iTChar); | 4032 CFX_WideString wsPattern = CFX_WideString::FromUTF8(szPattern.AsStringC()); |
4048 wsDatePattern += FX_WSTRC(L"} "); | 4033 CFX_WideString wsValue = CFX_WideString::FromUTF8(szValue.AsStringC()); |
4049 CFX_WideString wsTimePattern(L"time{"); | 4034 if (!PatternStringType(szPattern.AsStringC(), patternType)) { |
4050 wsTimePattern += wsPattern.Mid(iTChar + 1); | 4035 switch (patternType) { |
4051 wsTimePattern += FX_WSTRC(L"}"); | 4036 case XFA_VT_DATETIME: { |
4052 wsPattern = wsDatePattern + wsTimePattern; | 4037 FX_STRSIZE iTChar = wsPattern.Find(L'T'); |
4053 } break; | 4038 CFX_WideString wsDatePattern(L"date{"); |
4054 case XFA_VT_DATE: { | 4039 wsDatePattern += wsPattern.Left(iTChar); |
4055 wsPattern = FX_WSTRC(L"date{") + wsPattern; | 4040 wsDatePattern += FX_WSTRC(L"} "); |
4056 wsPattern += FX_WSTRC(L"}"); | 4041 |
4057 } break; | 4042 CFX_WideString wsTimePattern(L"time{"); |
4058 case XFA_VT_TIME: { | 4043 wsTimePattern += wsPattern.Mid(iTChar + 1); |
4059 wsPattern = FX_WSTRC(L"time{") + wsPattern; | 4044 wsTimePattern += FX_WSTRC(L"}"); |
4060 wsPattern += FX_WSTRC(L"}"); | 4045 wsPattern = wsDatePattern + wsTimePattern; |
4061 } break; | 4046 } break; |
4062 case XFA_VT_TEXT: { | 4047 case XFA_VT_DATE: { |
4063 wsPattern = FX_WSTRC(L"text{") + wsPattern; | 4048 wsPattern = FX_WSTRC(L"date{") + wsPattern; |
4064 wsPattern += FX_WSTRC(L"}"); | 4049 wsPattern += FX_WSTRC(L"}"); |
Tom Sepez
2016/06/08 17:24:07
nit: why not just
wsPattern = FX_WSTRC(L"date{"
dsinclair
2016/06/08 19:56:25
Done.
| |
4065 } break; | 4050 } break; |
4066 case XFA_VT_FLOAT: { | 4051 case XFA_VT_TIME: { |
4067 wsPattern = FX_WSTRC(L"num{") + wsPattern; | 4052 wsPattern = FX_WSTRC(L"time{") + wsPattern; |
4068 wsPattern += FX_WSTRC(L"}"); | 4053 wsPattern += FX_WSTRC(L"}"); |
4069 } break; | 4054 } break; |
4070 default: { | 4055 case XFA_VT_TEXT: { |
4071 CFX_WideString wsTestPattern; | 4056 wsPattern = FX_WSTRC(L"text{") + wsPattern; |
4072 wsTestPattern = FX_WSTRC(L"num{") + wsPattern; | 4057 wsPattern += FX_WSTRC(L"}"); |
4058 } break; | |
4059 case XFA_VT_FLOAT: { | |
4060 wsPattern = FX_WSTRC(L"num{") + wsPattern; | |
4061 wsPattern += FX_WSTRC(L"}"); | |
4062 } break; | |
4063 default: { | |
4064 CFX_WideString wsTestPattern; | |
4065 wsTestPattern = FX_WSTRC(L"num{") + wsPattern; | |
4066 wsTestPattern += FX_WSTRC(L"}"); | |
4067 CXFA_LocaleValue tempLocaleValue(XFA_VT_FLOAT, wsValue, wsTestPattern, | |
4068 pLocale, pMgr); | |
4069 if (tempLocaleValue.IsValid()) { | |
4070 wsPattern = wsTestPattern; | |
4071 patternType = XFA_VT_FLOAT; | |
4072 } else { | |
4073 wsTestPattern = FX_WSTRC(L"text{") + wsPattern; | |
4073 wsTestPattern += FX_WSTRC(L"}"); | 4074 wsTestPattern += FX_WSTRC(L"}"); |
4074 CXFA_LocaleValue tempLocaleValue(XFA_VT_FLOAT, wsValue, wsTestPattern, | 4075 wsPattern = wsTestPattern; |
4075 pLocale, (CXFA_LocaleMgr*)pMgr); | 4076 patternType = XFA_VT_TEXT; |
4076 if (tempLocaleValue.IsValid()) { | 4077 } |
4077 wsPattern = wsTestPattern; | 4078 } break; |
4078 patternType = XFA_VT_FLOAT; | |
4079 } else { | |
4080 wsTestPattern = FX_WSTRC(L"text{") + wsPattern; | |
4081 wsTestPattern += FX_WSTRC(L"}"); | |
4082 wsPattern = wsTestPattern; | |
4083 patternType = XFA_VT_TEXT; | |
4084 } | |
4085 } break; | |
4086 } | |
4087 } | 4079 } |
4088 CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern, pLocale, | |
4089 (CXFA_LocaleMgr*)pMgr); | |
4090 CFX_WideString wsRet; | |
4091 if (localeValue.FormatPatterns(wsRet, wsPattern, pLocale, | |
4092 XFA_VALUEPICTURE_Display)) { | |
4093 args.GetReturnValue()->SetString( | |
4094 FX_UTF8Encode(wsRet.c_str(), wsRet.GetLength()).AsStringC()); | |
4095 } else { | |
4096 args.GetReturnValue()->SetString(""); | |
4097 } | |
4098 } else { | |
4099 pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Format"); | |
4100 } | 4080 } |
4081 CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern, pLocale, pMgr); | |
4082 CFX_WideString wsRet; | |
4083 if (!localeValue.FormatPatterns(wsRet, wsPattern, pLocale, | |
4084 XFA_VALUEPICTURE_Display)) { | |
4085 args.GetReturnValue()->SetString(""); | |
4086 return; | |
4087 } | |
4088 | |
4089 args.GetReturnValue()->SetString( | |
4090 FX_UTF8Encode(wsRet.c_str(), wsRet.GetLength()).AsStringC()); | |
4101 } | 4091 } |
4102 | 4092 |
4103 // static | 4093 // static |
4104 void CXFA_FM2JSContext::Left(CFXJSE_Value* pThis, | 4094 void CXFA_FM2JSContext::Left(CFXJSE_Value* pThis, |
4105 const CFX_ByteStringC& szFuncName, | 4095 const CFX_ByteStringC& szFuncName, |
4106 CFXJSE_Arguments& args) { | 4096 CFXJSE_Arguments& args) { |
4107 if (args.GetLength() == 2) { | 4097 if (args.GetLength() != 2) { |
4108 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); | |
4109 std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); | |
4110 FX_BOOL argIsNull = FALSE; | |
4111 if ((ValueIsNull(pThis, argOne.get())) || | |
4112 (ValueIsNull(pThis, argTwo.get()))) { | |
4113 argIsNull = TRUE; | |
4114 } | |
4115 if (argIsNull) { | |
4116 args.GetReturnValue()->SetNull(); | |
4117 } else { | |
4118 CFX_ByteString sourceString; | |
4119 ValueToUTF8String(argOne.get(), sourceString); | |
4120 int32_t count = ValueToInteger(pThis, argTwo.get()); | |
4121 if (count < 0) { | |
4122 count = 0; | |
4123 } | |
4124 args.GetReturnValue()->SetString(sourceString.Left(count).AsStringC()); | |
4125 } | |
4126 } else { | |
4127 ToJSContext(pThis, nullptr) | 4098 ToJSContext(pThis, nullptr) |
4128 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Left"); | 4099 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Left"); |
4100 return; | |
4129 } | 4101 } |
4102 | |
4103 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); | |
4104 std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); | |
4105 if ((ValueIsNull(pThis, argOne.get())) || | |
4106 (ValueIsNull(pThis, argTwo.get()))) { | |
4107 args.GetReturnValue()->SetNull(); | |
4108 return; | |
4109 } | |
4110 | |
4111 CFX_ByteString sourceString; | |
4112 ValueToUTF8String(argOne.get(), sourceString); | |
4113 int32_t count = std::max(0, ValueToInteger(pThis, argTwo.get())); | |
4114 args.GetReturnValue()->SetString(sourceString.Left(count).AsStringC()); | |
4130 } | 4115 } |
4131 | 4116 |
4132 // static | 4117 // static |
4133 void CXFA_FM2JSContext::Len(CFXJSE_Value* pThis, | 4118 void CXFA_FM2JSContext::Len(CFXJSE_Value* pThis, |
4134 const CFX_ByteStringC& szFuncName, | 4119 const CFX_ByteStringC& szFuncName, |
4135 CFXJSE_Arguments& args) { | 4120 CFXJSE_Arguments& args) { |
4136 if (args.GetLength() == 1) { | 4121 if (args.GetLength() != 1) { |
4137 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); | |
4138 if (ValueIsNull(pThis, argOne.get())) { | |
4139 args.GetReturnValue()->SetNull(); | |
4140 } else { | |
4141 CFX_ByteString sourceString; | |
4142 ValueToUTF8String(argOne.get(), sourceString); | |
4143 args.GetReturnValue()->SetInteger(sourceString.GetLength()); | |
4144 } | |
4145 } else { | |
4146 ToJSContext(pThis, nullptr) | 4122 ToJSContext(pThis, nullptr) |
4147 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Len"); | 4123 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Len"); |
4124 return; | |
4148 } | 4125 } |
4126 | |
4127 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); | |
4128 if (ValueIsNull(pThis, argOne.get())) { | |
4129 args.GetReturnValue()->SetNull(); | |
4130 return; | |
4131 } | |
4132 | |
4133 CFX_ByteString sourceString; | |
4134 ValueToUTF8String(argOne.get(), sourceString); | |
4135 args.GetReturnValue()->SetInteger(sourceString.GetLength()); | |
4149 } | 4136 } |
4150 | 4137 |
4151 // static | 4138 // static |
4152 void CXFA_FM2JSContext::Lower(CFXJSE_Value* pThis, | 4139 void CXFA_FM2JSContext::Lower(CFXJSE_Value* pThis, |
4153 const CFX_ByteStringC& szFuncName, | 4140 const CFX_ByteStringC& szFuncName, |
4154 CFXJSE_Arguments& args) { | 4141 CFXJSE_Arguments& args) { |
4155 int32_t argc = args.GetLength(); | 4142 int32_t argc = args.GetLength(); |
4156 if ((argc > 0) && (argc < 3)) { | 4143 if (argc < 1 || argc > 2) { |
4157 CFX_ByteString argString; | |
4158 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); | |
4159 if (ValueIsNull(pThis, argOne.get())) { | |
4160 args.GetReturnValue()->SetNull(); | |
4161 } else { | |
4162 ValueToUTF8String(argOne.get(), argString); | |
4163 CFX_WideTextBuf lowStringBuf; | |
4164 CFX_WideString wsArgString = | |
4165 CFX_WideString::FromUTF8(argString.AsStringC()); | |
4166 const FX_WCHAR* pData = wsArgString.c_str(); | |
4167 int32_t iLen = argString.GetLength(); | |
4168 int32_t i = 0; | |
4169 int32_t ch = 0; | |
4170 while (i < iLen) { | |
4171 ch = pData[i]; | |
4172 if (ch >= 0x41 && ch <= 0x5A) { | |
4173 ch += 32; | |
4174 } else if (ch >= 0xC0 && ch <= 0xDE) { | |
4175 ch += 32; | |
4176 } else if (ch == 0x100 || ch == 0x102 || ch == 0x104) { | |
4177 ch += 1; | |
4178 } | |
4179 lowStringBuf.AppendChar(ch); | |
4180 ++i; | |
4181 } | |
4182 lowStringBuf.AppendChar(0); | |
4183 args.GetReturnValue()->SetString( | |
4184 FX_UTF8Encode(lowStringBuf.GetBuffer(), lowStringBuf.GetLength()) | |
4185 .AsStringC()); | |
4186 } | |
4187 } else { | |
4188 ToJSContext(pThis, nullptr) | 4144 ToJSContext(pThis, nullptr) |
4189 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Lower"); | 4145 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Lower"); |
4146 return; | |
4190 } | 4147 } |
4148 | |
4149 CFX_ByteString argString; | |
4150 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); | |
4151 if (ValueIsNull(pThis, argOne.get())) { | |
4152 args.GetReturnValue()->SetNull(); | |
4153 return; | |
4154 } | |
4155 | |
4156 ValueToUTF8String(argOne.get(), argString); | |
4157 CFX_WideTextBuf lowStringBuf; | |
4158 CFX_WideString wsArgString = CFX_WideString::FromUTF8(argString.AsStringC()); | |
4159 const FX_WCHAR* pData = wsArgString.c_str(); | |
4160 int32_t i = 0; | |
4161 while (i < argString.GetLength()) { | |
4162 int32_t ch = pData[i]; | |
4163 if ((ch >= 0x41 && ch <= 0x5A) || (ch >= 0xC0 && ch <= 0xDE)) | |
4164 ch += 32; | |
4165 else if (ch == 0x100 || ch == 0x102 || ch == 0x104) | |
4166 ch += 1; | |
4167 | |
4168 lowStringBuf.AppendChar(ch); | |
4169 ++i; | |
4170 } | |
4171 lowStringBuf.AppendChar(0); | |
4172 | |
4173 args.GetReturnValue()->SetString( | |
4174 FX_UTF8Encode(lowStringBuf.GetBuffer(), lowStringBuf.GetLength()) | |
4175 .AsStringC()); | |
4191 } | 4176 } |
4192 | 4177 |
4193 // static | 4178 // static |
4194 void CXFA_FM2JSContext::Ltrim(CFXJSE_Value* pThis, | 4179 void CXFA_FM2JSContext::Ltrim(CFXJSE_Value* pThis, |
4195 const CFX_ByteStringC& szFuncName, | 4180 const CFX_ByteStringC& szFuncName, |
4196 CFXJSE_Arguments& args) { | 4181 CFXJSE_Arguments& args) { |
4197 if (args.GetLength() == 1) { | 4182 if (args.GetLength() != 1) { |
4198 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); | |
4199 if (ValueIsNull(pThis, argOne.get())) { | |
4200 args.GetReturnValue()->SetNull(); | |
4201 } else { | |
4202 CFX_ByteString sourceString; | |
4203 ValueToUTF8String(argOne.get(), sourceString); | |
4204 sourceString.TrimLeft(); | |
4205 args.GetReturnValue()->SetString(sourceString.AsStringC()); | |
4206 } | |
4207 } else { | |
4208 ToJSContext(pThis, nullptr) | 4183 ToJSContext(pThis, nullptr) |
4209 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Ltrim"); | 4184 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Ltrim"); |
4185 return; | |
4210 } | 4186 } |
4187 | |
4188 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); | |
4189 if (ValueIsNull(pThis, argOne.get())) { | |
4190 args.GetReturnValue()->SetNull(); | |
4191 return; | |
4192 } | |
4193 | |
4194 CFX_ByteString sourceString; | |
4195 ValueToUTF8String(argOne.get(), sourceString); | |
4196 sourceString.TrimLeft(); | |
4197 args.GetReturnValue()->SetString(sourceString.AsStringC()); | |
4211 } | 4198 } |
4212 | 4199 |
4213 // static | 4200 // static |
4214 void CXFA_FM2JSContext::Parse(CFXJSE_Value* pThis, | 4201 void CXFA_FM2JSContext::Parse(CFXJSE_Value* pThis, |
4215 const CFX_ByteStringC& szFuncName, | 4202 const CFX_ByteStringC& szFuncName, |
4216 CFXJSE_Arguments& args) { | 4203 CFXJSE_Arguments& args) { |
4217 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr); | 4204 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr); |
4218 if (args.GetLength() == 2) { | 4205 if (args.GetLength() != 2) { |
4219 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); | |
4220 std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); | |
4221 if (ValueIsNull(pThis, argTwo.get())) { | |
4222 args.GetReturnValue()->SetNull(); | |
4223 } else { | |
4224 CFX_ByteString szPattern; | |
4225 ValueToUTF8String(argOne.get(), szPattern); | |
4226 CFX_ByteString szValue; | |
4227 ValueToUTF8String(argTwo.get(), szValue); | |
4228 CXFA_Document* pDoc = pContext->GetDocument(); | |
4229 IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr(); | |
4230 CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject()); | |
4231 ASSERT(pThisNode); | |
4232 CXFA_WidgetData widgetData(pThisNode); | |
4233 IFX_Locale* pLocale = widgetData.GetLocal(); | |
4234 uint32_t patternType; | |
4235 CFX_WideString wsPattern = | |
4236 CFX_WideString::FromUTF8(szPattern.AsStringC()); | |
4237 CFX_WideString wsValue = CFX_WideString::FromUTF8(szValue.AsStringC()); | |
4238 CFX_ByteString szParsedValue; | |
4239 if (PatternStringType(szPattern.AsStringC(), patternType)) { | |
4240 CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern, pLocale, | |
4241 (CXFA_LocaleMgr*)pMgr); | |
4242 if (localeValue.IsValid()) { | |
4243 szParsedValue = FX_UTF8Encode(localeValue.GetValue()); | |
4244 args.GetReturnValue()->SetString(szParsedValue.AsStringC()); | |
4245 } else { | |
4246 args.GetReturnValue()->SetString(""); | |
4247 } | |
4248 } else { | |
4249 switch (patternType) { | |
4250 case XFA_VT_DATETIME: { | |
4251 FX_STRSIZE iTChar = wsPattern.Find(L'T'); | |
4252 CFX_WideString wsDatePattern(L"date{"); | |
4253 wsDatePattern += wsPattern.Left(iTChar); | |
4254 wsDatePattern += FX_WSTRC(L"} "); | |
4255 CFX_WideString wsTimePattern(L"time{"); | |
4256 wsTimePattern += wsPattern.Mid(iTChar + 1); | |
4257 wsTimePattern += FX_WSTRC(L"}"); | |
4258 wsPattern = wsDatePattern + wsTimePattern; | |
4259 CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern, | |
4260 pLocale, (CXFA_LocaleMgr*)pMgr); | |
4261 if (localeValue.IsValid()) { | |
4262 szParsedValue = FX_UTF8Encode(localeValue.GetValue()); | |
4263 args.GetReturnValue()->SetString(szParsedValue.AsStringC()); | |
4264 } else { | |
4265 args.GetReturnValue()->SetString(""); | |
4266 } | |
4267 } break; | |
4268 case XFA_VT_DATE: { | |
4269 wsPattern = FX_WSTRC(L"date{") + wsPattern; | |
4270 wsPattern += FX_WSTRC(L"}"); | |
4271 CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern, | |
4272 pLocale, (CXFA_LocaleMgr*)pMgr); | |
4273 if (localeValue.IsValid()) { | |
4274 szParsedValue = FX_UTF8Encode(localeValue.GetValue()); | |
4275 args.GetReturnValue()->SetString(szParsedValue.AsStringC()); | |
4276 } else { | |
4277 args.GetReturnValue()->SetString(""); | |
4278 } | |
4279 } break; | |
4280 case XFA_VT_TIME: { | |
4281 wsPattern = FX_WSTRC(L"time{") + wsPattern; | |
4282 wsPattern += FX_WSTRC(L"}"); | |
4283 CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern, | |
4284 pLocale, (CXFA_LocaleMgr*)pMgr); | |
4285 if (localeValue.IsValid()) { | |
4286 szParsedValue = FX_UTF8Encode(localeValue.GetValue()); | |
4287 args.GetReturnValue()->SetString(szParsedValue.AsStringC()); | |
4288 } else { | |
4289 args.GetReturnValue()->SetString(""); | |
4290 } | |
4291 } break; | |
4292 case XFA_VT_TEXT: { | |
4293 wsPattern = FX_WSTRC(L"text{") + wsPattern; | |
4294 wsPattern += FX_WSTRC(L"}"); | |
4295 CXFA_LocaleValue localeValue(XFA_VT_TEXT, wsValue, wsPattern, | |
4296 pLocale, (CXFA_LocaleMgr*)pMgr); | |
4297 if (localeValue.IsValid()) { | |
4298 szParsedValue = FX_UTF8Encode(localeValue.GetValue()); | |
4299 args.GetReturnValue()->SetString(szParsedValue.AsStringC()); | |
4300 } else { | |
4301 args.GetReturnValue()->SetString(""); | |
4302 } | |
4303 } break; | |
4304 case XFA_VT_FLOAT: { | |
4305 wsPattern = FX_WSTRC(L"num{") + wsPattern; | |
4306 wsPattern += FX_WSTRC(L"}"); | |
4307 CXFA_LocaleValue localeValue(XFA_VT_FLOAT, wsValue, wsPattern, | |
4308 pLocale, (CXFA_LocaleMgr*)pMgr); | |
4309 if (localeValue.IsValid()) { | |
4310 args.GetReturnValue()->SetDouble(localeValue.GetDoubleNum()); | |
4311 } else { | |
4312 args.GetReturnValue()->SetString(""); | |
4313 } | |
4314 } break; | |
4315 default: { | |
4316 CFX_WideString wsTestPattern; | |
4317 wsTestPattern = FX_WSTRC(L"num{") + wsPattern; | |
4318 wsTestPattern += FX_WSTRC(L"}"); | |
4319 CXFA_LocaleValue localeValue(XFA_VT_FLOAT, wsValue, wsTestPattern, | |
4320 pLocale, (CXFA_LocaleMgr*)pMgr); | |
4321 if (localeValue.IsValid()) { | |
4322 args.GetReturnValue()->SetDouble(localeValue.GetDoubleNum()); | |
4323 } else { | |
4324 wsTestPattern = FX_WSTRC(L"text{") + wsPattern; | |
4325 wsTestPattern += FX_WSTRC(L"}"); | |
4326 CXFA_LocaleValue localeValue2(XFA_VT_TEXT, wsValue, wsTestPattern, | |
4327 pLocale, (CXFA_LocaleMgr*)pMgr); | |
4328 if (localeValue2.IsValid()) { | |
4329 szParsedValue = FX_UTF8Encode(localeValue2.GetValue()); | |
4330 args.GetReturnValue()->SetString(szParsedValue.AsStringC()); | |
4331 } else { | |
4332 args.GetReturnValue()->SetString(""); | |
4333 } | |
4334 } | |
4335 } break; | |
4336 } | |
4337 } | |
4338 } | |
4339 } else { | |
4340 pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Parse"); | 4206 pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Parse"); |
4207 return; | |
4208 } | |
4209 | |
4210 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); | |
4211 std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); | |
4212 if (ValueIsNull(pThis, argTwo.get())) { | |
4213 args.GetReturnValue()->SetNull(); | |
4214 return; | |
4215 } | |
4216 | |
4217 CFX_ByteString szPattern; | |
4218 ValueToUTF8String(argOne.get(), szPattern); | |
4219 CFX_ByteString szValue; | |
4220 ValueToUTF8String(argTwo.get(), szValue); | |
4221 | |
4222 CXFA_Document* pDoc = pContext->GetDocument(); | |
4223 CXFA_LocaleMgr* pMgr = pDoc->GetLocalMgr(); | |
4224 CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject()); | |
4225 ASSERT(pThisNode); | |
4226 | |
4227 CXFA_WidgetData widgetData(pThisNode); | |
4228 IFX_Locale* pLocale = widgetData.GetLocal(); | |
4229 CFX_WideString wsPattern = CFX_WideString::FromUTF8(szPattern.AsStringC()); | |
4230 CFX_WideString wsValue = CFX_WideString::FromUTF8(szValue.AsStringC()); | |
4231 uint32_t patternType; | |
4232 if (PatternStringType(szPattern.AsStringC(), patternType)) { | |
4233 CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern, pLocale, | |
4234 pMgr); | |
4235 if (!localeValue.IsValid()) { | |
4236 args.GetReturnValue()->SetString(""); | |
4237 return; | |
4238 } | |
4239 args.GetReturnValue()->SetString( | |
4240 FX_UTF8Encode(localeValue.GetValue()).AsStringC()); | |
4241 return; | |
4242 } | |
4243 | |
4244 switch (patternType) { | |
4245 case XFA_VT_DATETIME: { | |
4246 FX_STRSIZE iTChar = wsPattern.Find(L'T'); | |
4247 CFX_WideString wsDatePattern(L"date{"); | |
4248 wsDatePattern += wsPattern.Left(iTChar); | |
4249 wsDatePattern += FX_WSTRC(L"} "); | |
4250 CFX_WideString wsTimePattern(L"time{"); | |
4251 wsTimePattern += wsPattern.Mid(iTChar + 1); | |
4252 wsTimePattern += FX_WSTRC(L"}"); | |
4253 wsPattern = wsDatePattern + wsTimePattern; | |
4254 CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern, pLocale, | |
4255 pMgr); | |
4256 if (!localeValue.IsValid()) { | |
4257 args.GetReturnValue()->SetString(""); | |
4258 return; | |
4259 } | |
4260 args.GetReturnValue()->SetString( | |
4261 FX_UTF8Encode(localeValue.GetValue()).AsStringC()); | |
4262 return; | |
4263 } | |
4264 case XFA_VT_DATE: { | |
4265 wsPattern = FX_WSTRC(L"date{") + wsPattern; | |
4266 wsPattern += FX_WSTRC(L"}"); | |
4267 CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern, pLocale, | |
4268 pMgr); | |
4269 if (!localeValue.IsValid()) { | |
4270 args.GetReturnValue()->SetString(""); | |
4271 return; | |
4272 } | |
4273 args.GetReturnValue()->SetString( | |
4274 FX_UTF8Encode(localeValue.GetValue()).AsStringC()); | |
4275 return; | |
4276 } | |
4277 case XFA_VT_TIME: { | |
4278 wsPattern = FX_WSTRC(L"time{") + wsPattern; | |
4279 wsPattern += FX_WSTRC(L"}"); | |
4280 CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern, pLocale, | |
4281 pMgr); | |
4282 if (!localeValue.IsValid()) { | |
4283 args.GetReturnValue()->SetString(""); | |
4284 return; | |
4285 } | |
4286 args.GetReturnValue()->SetString( | |
4287 FX_UTF8Encode(localeValue.GetValue()).AsStringC()); | |
4288 return; | |
4289 } | |
4290 case XFA_VT_TEXT: { | |
4291 wsPattern = FX_WSTRC(L"text{") + wsPattern; | |
4292 wsPattern += FX_WSTRC(L"}"); | |
4293 CXFA_LocaleValue localeValue(XFA_VT_TEXT, wsValue, wsPattern, pLocale, | |
4294 pMgr); | |
4295 if (!localeValue.IsValid()) { | |
4296 args.GetReturnValue()->SetString(""); | |
4297 return; | |
4298 } | |
4299 args.GetReturnValue()->SetString( | |
4300 FX_UTF8Encode(localeValue.GetValue()).AsStringC()); | |
4301 return; | |
4302 } | |
4303 case XFA_VT_FLOAT: { | |
4304 wsPattern = FX_WSTRC(L"num{") + wsPattern; | |
4305 wsPattern += FX_WSTRC(L"}"); | |
4306 CXFA_LocaleValue localeValue(XFA_VT_FLOAT, wsValue, wsPattern, pLocale, | |
4307 pMgr); | |
4308 if (!localeValue.IsValid()) { | |
4309 args.GetReturnValue()->SetString(""); | |
4310 return; | |
4311 } | |
4312 args.GetReturnValue()->SetDouble(localeValue.GetDoubleNum()); | |
4313 return; | |
4314 } | |
4315 default: { | |
4316 CFX_WideString wsTestPattern; | |
4317 wsTestPattern = FX_WSTRC(L"num{") + wsPattern; | |
4318 wsTestPattern += FX_WSTRC(L"}"); | |
4319 CXFA_LocaleValue localeValue(XFA_VT_FLOAT, wsValue, wsTestPattern, | |
4320 pLocale, pMgr); | |
4321 if (localeValue.IsValid()) { | |
4322 args.GetReturnValue()->SetDouble(localeValue.GetDoubleNum()); | |
4323 return; | |
4324 } | |
4325 | |
4326 wsTestPattern = FX_WSTRC(L"text{") + wsPattern; | |
4327 wsTestPattern += FX_WSTRC(L"}"); | |
4328 CXFA_LocaleValue localeValue2(XFA_VT_TEXT, wsValue, wsTestPattern, | |
4329 pLocale, pMgr); | |
4330 if (!localeValue2.IsValid()) { | |
4331 args.GetReturnValue()->SetString(""); | |
4332 return; | |
4333 } | |
4334 args.GetReturnValue()->SetString( | |
4335 FX_UTF8Encode(localeValue2.GetValue()).AsStringC()); | |
4336 return; | |
4337 } | |
4341 } | 4338 } |
4342 } | 4339 } |
4343 | 4340 |
4344 // static | 4341 // static |
4345 void CXFA_FM2JSContext::Replace(CFXJSE_Value* pThis, | 4342 void CXFA_FM2JSContext::Replace(CFXJSE_Value* pThis, |
4346 const CFX_ByteStringC& szFuncName, | 4343 const CFX_ByteStringC& szFuncName, |
4347 CFXJSE_Arguments& args) { | 4344 CFXJSE_Arguments& args) { |
4348 int32_t argc = args.GetLength(); | 4345 int32_t argc = args.GetLength(); |
4349 if ((argc == 2) || (argc == 3)) { | 4346 if (argc < 2 || argc > 3) { |
4350 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); | |
4351 std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); | |
4352 CFX_ByteString oneString; | |
4353 CFX_ByteString twoString; | |
4354 CFX_ByteString threeString; | |
4355 if (!ValueIsNull(pThis, argOne.get()) && | |
4356 !ValueIsNull(pThis, argTwo.get())) { | |
4357 ValueToUTF8String(argOne.get(), oneString); | |
4358 ValueToUTF8String(argTwo.get(), twoString); | |
4359 } | |
4360 if (argc > 2) { | |
4361 std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2); | |
4362 ValueToUTF8String(argThree.get(), threeString); | |
4363 } | |
4364 int32_t iSrcLen = oneString.GetLength(); | |
4365 int32_t iFindLen = twoString.GetLength(); | |
4366 CFX_ByteTextBuf resultString; | |
4367 int32_t iFindIndex = 0; | |
4368 uint8_t ch = 0; | |
4369 for (int32_t u = 0; u < iSrcLen; ++u) { | |
4370 ch = oneString.GetAt(u); | |
4371 if (ch == twoString.GetAt(iFindIndex)) { | |
4372 int32_t iTemp = u + 1; | |
4373 ++iFindIndex; | |
4374 uint8_t chTemp = 0; | |
4375 while (iFindIndex < iFindLen) { | |
4376 chTemp = oneString.GetAt(iTemp); | |
4377 if (chTemp == twoString.GetAt(iFindIndex)) { | |
4378 ++iTemp; | |
4379 ++iFindIndex; | |
4380 } else { | |
4381 iFindIndex = 0; | |
4382 break; | |
4383 } | |
4384 } | |
4385 if (iFindIndex == iFindLen) { | |
4386 resultString << threeString.AsStringC(); | |
4387 u += iFindLen - 1; | |
4388 iFindIndex = 0; | |
4389 } else { | |
4390 resultString.AppendChar(ch); | |
4391 } | |
4392 } else { | |
4393 resultString.AppendChar(ch); | |
4394 } | |
4395 } | |
4396 resultString.AppendChar(0); | |
4397 args.GetReturnValue()->SetString(resultString.AsStringC()); | |
4398 } else { | |
4399 ToJSContext(pThis, nullptr) | 4347 ToJSContext(pThis, nullptr) |
4400 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Replace"); | 4348 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Replace"); |
4401 } | 4349 return; |
4350 } | |
4351 | |
4352 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); | |
4353 std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); | |
4354 CFX_ByteString oneString; | |
4355 CFX_ByteString twoString; | |
4356 if (!ValueIsNull(pThis, argOne.get()) && !ValueIsNull(pThis, argTwo.get())) { | |
4357 ValueToUTF8String(argOne.get(), oneString); | |
4358 ValueToUTF8String(argTwo.get(), twoString); | |
4359 } | |
4360 | |
4361 CFX_ByteString threeString; | |
4362 if (argc > 2) { | |
4363 std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2); | |
4364 ValueToUTF8String(argThree.get(), threeString); | |
4365 } | |
4366 | |
4367 int32_t iFindLen = twoString.GetLength(); | |
4368 CFX_ByteTextBuf resultString; | |
4369 int32_t iFindIndex = 0; | |
4370 for (int32_t u = 0; u < oneString.GetLength(); ++u) { | |
4371 uint8_t ch = oneString.GetAt(u); | |
4372 if (ch != twoString.GetAt(iFindIndex)) { | |
4373 resultString.AppendChar(ch); | |
4374 continue; | |
4375 } | |
4376 | |
4377 int32_t iTemp = u + 1; | |
4378 ++iFindIndex; | |
4379 while (iFindIndex < iFindLen) { | |
4380 uint8_t chTemp = oneString.GetAt(iTemp); | |
4381 if (chTemp != twoString.GetAt(iFindIndex)) { | |
4382 iFindIndex = 0; | |
4383 break; | |
4384 } | |
4385 | |
4386 ++iTemp; | |
4387 ++iFindIndex; | |
4388 } | |
4389 if (iFindIndex == iFindLen) { | |
4390 resultString << threeString.AsStringC(); | |
4391 u += iFindLen - 1; | |
4392 iFindIndex = 0; | |
4393 } else { | |
4394 resultString.AppendChar(ch); | |
4395 } | |
4396 } | |
4397 resultString.AppendChar(0); | |
4398 args.GetReturnValue()->SetString(resultString.AsStringC()); | |
4402 } | 4399 } |
4403 | 4400 |
4404 // static | 4401 // static |
4405 void CXFA_FM2JSContext::Right(CFXJSE_Value* pThis, | 4402 void CXFA_FM2JSContext::Right(CFXJSE_Value* pThis, |
4406 const CFX_ByteStringC& szFuncName, | 4403 const CFX_ByteStringC& szFuncName, |
4407 CFXJSE_Arguments& args) { | 4404 CFXJSE_Arguments& args) { |
4408 if (args.GetLength() == 2) { | 4405 if (args.GetLength() != 2) { |
4409 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); | |
4410 std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); | |
4411 FX_BOOL argIsNull = FALSE; | |
4412 if ((ValueIsNull(pThis, argOne.get())) || | |
4413 (ValueIsNull(pThis, argTwo.get()))) { | |
4414 argIsNull = TRUE; | |
4415 } | |
4416 if (argIsNull) { | |
4417 args.GetReturnValue()->SetNull(); | |
4418 } else { | |
4419 CFX_ByteString sourceString; | |
4420 ValueToUTF8String(argOne.get(), sourceString); | |
4421 int32_t count = ValueToInteger(pThis, argTwo.get()); | |
4422 if (count < 0) { | |
4423 count = 0; | |
4424 } | |
4425 args.GetReturnValue()->SetString(sourceString.Right(count).AsStringC()); | |
4426 } | |
4427 } else { | |
4428 ToJSContext(pThis, nullptr) | 4406 ToJSContext(pThis, nullptr) |
4429 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Right"); | 4407 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Right"); |
4430 } | 4408 return; |
4409 } | |
4410 | |
4411 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); | |
4412 std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); | |
4413 if ((ValueIsNull(pThis, argOne.get())) || | |
4414 (ValueIsNull(pThis, argTwo.get()))) { | |
4415 args.GetReturnValue()->SetNull(); | |
4416 return; | |
4417 } | |
4418 | |
4419 CFX_ByteString sourceString; | |
4420 ValueToUTF8String(argOne.get(), sourceString); | |
4421 int32_t count = std::max(0, ValueToInteger(pThis, argTwo.get())); | |
4422 args.GetReturnValue()->SetString(sourceString.Right(count).AsStringC()); | |
4431 } | 4423 } |
4432 | 4424 |
4433 // static | 4425 // static |
4434 void CXFA_FM2JSContext::Rtrim(CFXJSE_Value* pThis, | 4426 void CXFA_FM2JSContext::Rtrim(CFXJSE_Value* pThis, |
4435 const CFX_ByteStringC& szFuncName, | 4427 const CFX_ByteStringC& szFuncName, |
4436 CFXJSE_Arguments& args) { | 4428 CFXJSE_Arguments& args) { |
4437 if (args.GetLength() == 1) { | 4429 if (args.GetLength() != 1) { |
4438 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); | |
4439 if (ValueIsNull(pThis, argOne.get())) { | |
4440 args.GetReturnValue()->SetNull(); | |
4441 } else { | |
4442 CFX_ByteString sourceString; | |
4443 ValueToUTF8String(argOne.get(), sourceString); | |
4444 sourceString.TrimRight(); | |
4445 args.GetReturnValue()->SetString(sourceString.AsStringC()); | |
4446 } | |
4447 } else { | |
4448 ToJSContext(pThis, nullptr) | 4430 ToJSContext(pThis, nullptr) |
4449 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Rtrim"); | 4431 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Rtrim"); |
4450 } | 4432 return; |
4433 } | |
4434 | |
4435 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); | |
4436 if (ValueIsNull(pThis, argOne.get())) { | |
4437 args.GetReturnValue()->SetNull(); | |
4438 return; | |
4439 } | |
4440 | |
4441 CFX_ByteString sourceString; | |
4442 ValueToUTF8String(argOne.get(), sourceString); | |
4443 sourceString.TrimRight(); | |
4444 args.GetReturnValue()->SetString(sourceString.AsStringC()); | |
4451 } | 4445 } |
4452 | 4446 |
4453 // static | 4447 // static |
4454 void CXFA_FM2JSContext::Space(CFXJSE_Value* pThis, | 4448 void CXFA_FM2JSContext::Space(CFXJSE_Value* pThis, |
4455 const CFX_ByteStringC& szFuncName, | 4449 const CFX_ByteStringC& szFuncName, |
4456 CFXJSE_Arguments& args) { | 4450 CFXJSE_Arguments& args) { |
4457 if (args.GetLength() == 1) { | 4451 if (args.GetLength() != 1) { |
4458 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); | |
4459 if (CFXJSE_Value::IsNull(argOne.get())) { | |
4460 args.GetReturnValue()->SetNull(); | |
4461 } else { | |
4462 int32_t count = 0; | |
4463 count = ValueToInteger(pThis, argOne.get()); | |
4464 count = (count < 0) ? 0 : count; | |
4465 CFX_ByteTextBuf spaceString; | |
4466 int32_t index = 0; | |
4467 while (index < count) { | |
4468 spaceString.AppendByte(' '); | |
4469 index++; | |
4470 } | |
4471 spaceString.AppendByte(0); | |
4472 args.GetReturnValue()->SetString(spaceString.AsStringC()); | |
4473 } | |
4474 } else { | |
4475 ToJSContext(pThis, nullptr) | 4452 ToJSContext(pThis, nullptr) |
4476 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Space"); | 4453 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Space"); |
4477 } | 4454 return; |
4478 } | 4455 } |
4479 | 4456 |
4480 // static | 4457 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); |
4458 if (CFXJSE_Value::IsNull(argOne.get())) { | |
4459 args.GetReturnValue()->SetNull(); | |
4460 return; | |
4461 } | |
4462 | |
4463 int32_t count = std::max(0, ValueToInteger(pThis, argOne.get())); | |
4464 CFX_ByteTextBuf spaceString; | |
4465 int32_t index = 0; | |
4466 while (index < count) { | |
4467 spaceString.AppendByte(' '); | |
4468 index++; | |
4469 } | |
4470 spaceString.AppendByte(0); | |
4471 args.GetReturnValue()->SetString(spaceString.AsStringC()); | |
4472 } | |
4473 | |
4474 // static | |
4481 void CXFA_FM2JSContext::Str(CFXJSE_Value* pThis, | 4475 void CXFA_FM2JSContext::Str(CFXJSE_Value* pThis, |
4482 const CFX_ByteStringC& szFuncName, | 4476 const CFX_ByteStringC& szFuncName, |
4483 CFXJSE_Arguments& args) { | 4477 CFXJSE_Arguments& args) { |
4484 int32_t argc = args.GetLength(); | 4478 int32_t argc = args.GetLength(); |
4485 if ((argc > 0) && (argc < 4)) { | 4479 if (argc < 1 || argc > 3) { |
4486 FX_BOOL bFlags = FALSE; | |
4487 FX_FLOAT fNumber = 0.0f; | |
4488 int32_t iWidth = 10; | |
4489 int32_t iPrecision = 0; | |
4490 std::unique_ptr<CFXJSE_Value> numberValue = GetSimpleValue(pThis, args, 0); | |
4491 if (CFXJSE_Value::IsNull(numberValue.get())) { | |
4492 bFlags = TRUE; | |
4493 } else { | |
4494 fNumber = ValueToFloat(pThis, numberValue.get()); | |
4495 } | |
4496 if (argc > 1) { | |
4497 std::unique_ptr<CFXJSE_Value> widthValue = GetSimpleValue(pThis, args, 1); | |
4498 iWidth = (int32_t)ValueToFloat(pThis, widthValue.get()); | |
4499 } | |
4500 if (argc > 2) { | |
4501 std::unique_ptr<CFXJSE_Value> precisionValue = | |
4502 GetSimpleValue(pThis, args, 2); | |
4503 iPrecision = (int32_t)ValueToFloat(pThis, precisionValue.get()); | |
4504 if (iPrecision < 0) { | |
4505 iPrecision = 0; | |
4506 } | |
4507 } | |
4508 if (!bFlags) { | |
4509 CFX_ByteString numberString; | |
4510 CFX_ByteString formatStr = "%"; | |
4511 if (iPrecision) { | |
4512 formatStr += "."; | |
4513 formatStr += CFX_ByteString::FormatInteger(iPrecision); | |
4514 } | |
4515 formatStr += "f"; | |
4516 numberString.Format(formatStr.c_str(), fNumber); | |
4517 const FX_CHAR* pData = numberString.c_str(); | |
4518 int32_t iLength = numberString.GetLength(); | |
4519 int32_t u = 0; | |
4520 while (u < iLength) { | |
4521 if (pData[u] == '.') { | |
4522 break; | |
4523 } | |
4524 ++u; | |
4525 } | |
4526 CFX_ByteTextBuf resultBuf; | |
4527 if (u > iWidth || (iPrecision + u) >= iWidth) { | |
4528 int32_t i = 0; | |
4529 while (i < iWidth) { | |
4530 resultBuf.AppendChar('*'); | |
4531 ++i; | |
4532 } | |
4533 resultBuf.AppendChar(0); | |
4534 } else { | |
4535 if (u == iLength) { | |
4536 if (iLength > iWidth) { | |
4537 int32_t i = 0; | |
4538 while (i < iWidth) { | |
4539 resultBuf.AppendChar('*'); | |
4540 ++i; | |
4541 } | |
4542 } else { | |
4543 int32_t i = 0; | |
4544 int32_t iSpace = iWidth - iLength; | |
4545 while (i < iSpace) { | |
4546 resultBuf.AppendChar(' '); | |
4547 ++i; | |
4548 } | |
4549 resultBuf << pData; | |
4550 } | |
4551 } else { | |
4552 int32_t iLeavingSpace = 0; | |
4553 if (iPrecision == 0) { | |
4554 iLeavingSpace = iWidth - (u + iPrecision); | |
4555 } else { | |
4556 iLeavingSpace = iWidth - (u + iPrecision + 1); | |
4557 } | |
4558 int32_t i = 0; | |
4559 while (i < iLeavingSpace) { | |
4560 resultBuf.AppendChar(' '); | |
4561 ++i; | |
4562 } | |
4563 i = 0; | |
4564 while (i < u) { | |
4565 resultBuf.AppendChar(pData[i]); | |
4566 ++i; | |
4567 } | |
4568 if (iPrecision != 0) { | |
4569 resultBuf.AppendChar('.'); | |
4570 } | |
4571 u++; | |
4572 i = 0; | |
4573 while (u < iLength) { | |
4574 if (i >= iPrecision) { | |
4575 break; | |
4576 } | |
4577 resultBuf.AppendChar(pData[u]); | |
4578 ++i; | |
4579 ++u; | |
4580 } | |
4581 while (i < iPrecision) { | |
4582 resultBuf.AppendChar('0'); | |
4583 ++i; | |
4584 } | |
4585 resultBuf.AppendChar(0); | |
4586 } | |
4587 } | |
4588 args.GetReturnValue()->SetString(resultBuf.AsStringC()); | |
4589 } else { | |
4590 args.GetReturnValue()->SetNull(); | |
4591 } | |
4592 } else { | |
4593 ToJSContext(pThis, nullptr) | 4480 ToJSContext(pThis, nullptr) |
4594 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Str"); | 4481 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Str"); |
4482 return; | |
4595 } | 4483 } |
4484 | |
4485 std::unique_ptr<CFXJSE_Value> numberValue = GetSimpleValue(pThis, args, 0); | |
4486 if (CFXJSE_Value::IsNull(numberValue.get())) { | |
4487 args.GetReturnValue()->SetNull(); | |
4488 return; | |
4489 } | |
4490 FX_FLOAT fNumber = ValueToFloat(pThis, numberValue.get()); | |
4491 | |
4492 int32_t iWidth = 10; | |
4493 if (argc > 1) { | |
4494 std::unique_ptr<CFXJSE_Value> widthValue = GetSimpleValue(pThis, args, 1); | |
4495 iWidth = static_cast<int32_t>(ValueToFloat(pThis, widthValue.get())); | |
4496 } | |
4497 | |
4498 int32_t iPrecision = 0; | |
4499 if (argc > 2) { | |
4500 std::unique_ptr<CFXJSE_Value> precisionValue = | |
4501 GetSimpleValue(pThis, args, 2); | |
4502 iPrecision = std::max( | |
4503 0, static_cast<int32_t>(ValueToFloat(pThis, precisionValue.get()))); | |
4504 } | |
4505 | |
4506 CFX_ByteString numberString; | |
4507 CFX_ByteString formatStr = "%"; | |
4508 if (iPrecision) { | |
4509 formatStr += "."; | |
4510 formatStr += CFX_ByteString::FormatInteger(iPrecision); | |
4511 } | |
4512 formatStr += "f"; | |
4513 numberString.Format(formatStr.c_str(), fNumber); | |
4514 | |
4515 const FX_CHAR* pData = numberString.c_str(); | |
4516 int32_t iLength = numberString.GetLength(); | |
4517 int32_t u = 0; | |
4518 while (u < iLength) { | |
4519 if (pData[u] == '.') | |
4520 break; | |
4521 | |
4522 ++u; | |
4523 } | |
4524 | |
4525 CFX_ByteTextBuf resultBuf; | |
4526 if (u > iWidth || (iPrecision + u) >= iWidth) { | |
4527 int32_t i = 0; | |
4528 while (i < iWidth) { | |
4529 resultBuf.AppendChar('*'); | |
4530 ++i; | |
4531 } | |
4532 resultBuf.AppendChar(0); | |
4533 args.GetReturnValue()->SetString(resultBuf.AsStringC()); | |
4534 return; | |
4535 } | |
4536 | |
4537 if (u == iLength) { | |
4538 if (iLength > iWidth) { | |
4539 int32_t i = 0; | |
4540 while (i < iWidth) { | |
4541 resultBuf.AppendChar('*'); | |
4542 ++i; | |
4543 } | |
4544 } else { | |
4545 int32_t i = 0; | |
4546 while (i < iWidth - iLength) { | |
4547 resultBuf.AppendChar(' '); | |
4548 ++i; | |
4549 } | |
4550 resultBuf << pData; | |
4551 } | |
4552 args.GetReturnValue()->SetString(resultBuf.AsStringC()); | |
4553 return; | |
4554 } | |
4555 | |
4556 int32_t iLeavingSpace = iWidth - u - iPrecision; | |
4557 if (iPrecision != 0) | |
4558 iLeavingSpace--; | |
4559 | |
4560 int32_t i = 0; | |
4561 while (i < iLeavingSpace) { | |
4562 resultBuf.AppendChar(' '); | |
4563 ++i; | |
4564 } | |
4565 i = 0; | |
4566 while (i < u) { | |
4567 resultBuf.AppendChar(pData[i]); | |
4568 ++i; | |
4569 } | |
4570 if (iPrecision != 0) | |
4571 resultBuf.AppendChar('.'); | |
4572 | |
4573 u++; | |
4574 i = 0; | |
4575 while (u < iLength) { | |
4576 if (i >= iPrecision) | |
4577 break; | |
4578 | |
4579 resultBuf.AppendChar(pData[u]); | |
4580 ++i; | |
4581 ++u; | |
4582 } | |
4583 while (i < iPrecision) { | |
4584 resultBuf.AppendChar('0'); | |
4585 ++i; | |
4586 } | |
4587 resultBuf.AppendChar(0); | |
4588 args.GetReturnValue()->SetString(resultBuf.AsStringC()); | |
4596 } | 4589 } |
4597 | 4590 |
4598 // static | 4591 // static |
4599 void CXFA_FM2JSContext::Stuff(CFXJSE_Value* pThis, | 4592 void CXFA_FM2JSContext::Stuff(CFXJSE_Value* pThis, |
4600 const CFX_ByteStringC& szFuncName, | 4593 const CFX_ByteStringC& szFuncName, |
4601 CFXJSE_Arguments& args) { | 4594 CFXJSE_Arguments& args) { |
4602 int32_t argc = args.GetLength(); | 4595 int32_t argc = args.GetLength(); |
4603 if ((argc == 3) || (argc == 4)) { | 4596 if (argc < 3 || argc > 4) { |
4604 CFX_ByteString sourceString; | |
4605 CFX_ByteString insertString; | |
4606 int32_t iLength = 0; | |
4607 int32_t iStart = 0; | |
4608 int32_t iDelete = 0; | |
4609 std::unique_ptr<CFXJSE_Value> sourceValue = GetSimpleValue(pThis, args, 0); | |
4610 std::unique_ptr<CFXJSE_Value> startValue = GetSimpleValue(pThis, args, 1); | |
4611 std::unique_ptr<CFXJSE_Value> deleteValue = GetSimpleValue(pThis, args, 2); | |
4612 if (!CFXJSE_Value::IsNull(sourceValue.get()) && | |
4613 !CFXJSE_Value::IsNull(startValue.get()) && | |
4614 !CFXJSE_Value::IsNull(deleteValue.get())) { | |
4615 ValueToUTF8String(sourceValue.get(), sourceString); | |
4616 iLength = sourceString.GetLength(); | |
4617 iStart = (int32_t)ValueToFloat(pThis, startValue.get()); | |
4618 if (iStart < 1) { | |
4619 iStart = 1; | |
4620 } | |
4621 if (iStart > iLength) { | |
4622 iStart = iLength; | |
4623 } | |
4624 iDelete = (int32_t)ValueToFloat(pThis, deleteValue.get()); | |
4625 if (iDelete <= 0) { | |
4626 iDelete = 0; | |
4627 } | |
4628 } | |
4629 if (argc > 3) { | |
4630 std::unique_ptr<CFXJSE_Value> insertValue = | |
4631 GetSimpleValue(pThis, args, 3); | |
4632 ValueToUTF8String(insertValue.get(), insertString); | |
4633 } | |
4634 iStart -= 1; | |
4635 CFX_ByteTextBuf resultString; | |
4636 int32_t i = 0; | |
4637 while (i < iStart) { | |
4638 resultString.AppendChar(sourceString.GetAt(i)); | |
4639 ++i; | |
4640 } | |
4641 resultString << insertString.AsStringC(); | |
4642 i = iStart + iDelete; | |
4643 while (i < iLength) { | |
4644 resultString.AppendChar(sourceString.GetAt(i)); | |
4645 ++i; | |
4646 } | |
4647 resultString.AppendChar(0); | |
4648 args.GetReturnValue()->SetString(resultString.AsStringC()); | |
4649 } else { | |
4650 ToJSContext(pThis, nullptr) | 4597 ToJSContext(pThis, nullptr) |
4651 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Stuff"); | 4598 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Stuff"); |
4599 return; | |
4652 } | 4600 } |
4601 | |
4602 CFX_ByteString sourceString; | |
4603 CFX_ByteString insertString; | |
4604 int32_t iLength = 0; | |
4605 int32_t iStart = 0; | |
4606 int32_t iDelete = 0; | |
4607 std::unique_ptr<CFXJSE_Value> sourceValue = GetSimpleValue(pThis, args, 0); | |
4608 std::unique_ptr<CFXJSE_Value> startValue = GetSimpleValue(pThis, args, 1); | |
4609 std::unique_ptr<CFXJSE_Value> deleteValue = GetSimpleValue(pThis, args, 2); | |
4610 if (!CFXJSE_Value::IsNull(sourceValue.get()) && | |
4611 !CFXJSE_Value::IsNull(startValue.get()) && | |
4612 !CFXJSE_Value::IsNull(deleteValue.get())) { | |
4613 ValueToUTF8String(sourceValue.get(), sourceString); | |
4614 iLength = sourceString.GetLength(); | |
4615 iStart = std::min(iLength, std::max(1, static_cast<int32_t>(ValueToFloat( | |
4616 pThis, startValue.get())))); | |
4617 iDelete = std::max( | |
4618 0, static_cast<int32_t>(ValueToFloat(pThis, deleteValue.get()))); | |
4619 } | |
4620 | |
4621 if (argc > 3) { | |
4622 std::unique_ptr<CFXJSE_Value> insertValue = GetSimpleValue(pThis, args, 3); | |
4623 ValueToUTF8String(insertValue.get(), insertString); | |
4624 } | |
4625 | |
4626 iStart -= 1; | |
4627 CFX_ByteTextBuf resultString; | |
4628 int32_t i = 0; | |
4629 while (i < iStart) { | |
4630 resultString.AppendChar(sourceString.GetAt(i)); | |
4631 ++i; | |
4632 } | |
4633 resultString << insertString.AsStringC(); | |
4634 i = iStart + iDelete; | |
4635 while (i < iLength) { | |
4636 resultString.AppendChar(sourceString.GetAt(i)); | |
4637 ++i; | |
4638 } | |
4639 resultString.AppendChar(0); | |
4640 args.GetReturnValue()->SetString(resultString.AsStringC()); | |
4653 } | 4641 } |
4654 | 4642 |
4655 // static | 4643 // static |
4656 void CXFA_FM2JSContext::Substr(CFXJSE_Value* pThis, | 4644 void CXFA_FM2JSContext::Substr(CFXJSE_Value* pThis, |
4657 const CFX_ByteStringC& szFuncName, | 4645 const CFX_ByteStringC& szFuncName, |
4658 CFXJSE_Arguments& args) { | 4646 CFXJSE_Arguments& args) { |
4659 if (args.GetLength() == 3) { | 4647 if (args.GetLength() != 3) { |
4660 std::unique_ptr<CFXJSE_Value> stringValue = GetSimpleValue(pThis, args, 0); | |
4661 std::unique_ptr<CFXJSE_Value> startValue = GetSimpleValue(pThis, args, 1); | |
4662 std::unique_ptr<CFXJSE_Value> endValue = GetSimpleValue(pThis, args, 2); | |
4663 if (ValueIsNull(pThis, stringValue.get()) || | |
4664 (ValueIsNull(pThis, startValue.get())) || | |
4665 (ValueIsNull(pThis, endValue.get()))) { | |
4666 args.GetReturnValue()->SetNull(); | |
4667 } else { | |
4668 CFX_ByteString szSourceStr; | |
4669 int32_t iStart = 0; | |
4670 int32_t iCount = 0; | |
4671 ValueToUTF8String(stringValue.get(), szSourceStr); | |
4672 int32_t iLength = szSourceStr.GetLength(); | |
4673 if (iLength == 0) { | |
4674 args.GetReturnValue()->SetString(""); | |
4675 } else { | |
4676 iStart = (int32_t)ValueToFloat(pThis, startValue.get()); | |
4677 iCount = (int32_t)ValueToFloat(pThis, endValue.get()); | |
4678 if (iStart < 1) { | |
4679 iStart = 1; | |
4680 } | |
4681 if (iStart > iLength) { | |
4682 iStart = iLength; | |
4683 } | |
4684 if (iCount <= 0) { | |
4685 iCount = 0; | |
4686 } | |
4687 iStart -= 1; | |
4688 args.GetReturnValue()->SetString( | |
4689 szSourceStr.Mid(iStart, iCount).AsStringC()); | |
4690 } | |
4691 } | |
4692 } else { | |
4693 ToJSContext(pThis, nullptr) | 4648 ToJSContext(pThis, nullptr) |
4694 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Substr"); | 4649 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Substr"); |
4650 return; | |
4695 } | 4651 } |
4652 | |
4653 std::unique_ptr<CFXJSE_Value> stringValue = GetSimpleValue(pThis, args, 0); | |
4654 std::unique_ptr<CFXJSE_Value> startValue = GetSimpleValue(pThis, args, 1); | |
4655 std::unique_ptr<CFXJSE_Value> endValue = GetSimpleValue(pThis, args, 2); | |
4656 if (ValueIsNull(pThis, stringValue.get()) || | |
4657 (ValueIsNull(pThis, startValue.get())) || | |
4658 (ValueIsNull(pThis, endValue.get()))) { | |
4659 args.GetReturnValue()->SetNull(); | |
4660 return; | |
4661 } | |
4662 | |
4663 CFX_ByteString szSourceStr; | |
4664 int32_t iStart = 0; | |
4665 int32_t iCount = 0; | |
4666 ValueToUTF8String(stringValue.get(), szSourceStr); | |
4667 int32_t iLength = szSourceStr.GetLength(); | |
4668 if (iLength == 0) { | |
4669 args.GetReturnValue()->SetString(""); | |
4670 return; | |
4671 } | |
4672 | |
4673 iStart = std::min( | |
4674 iLength, | |
4675 std::max(1, static_cast<int32_t>(ValueToFloat(pThis, startValue.get())))); | |
4676 iCount = | |
4677 std::max(0, static_cast<int32_t>(ValueToFloat(pThis, endValue.get()))); | |
4678 | |
4679 iStart -= 1; | |
4680 args.GetReturnValue()->SetString(szSourceStr.Mid(iStart, iCount).AsStringC()); | |
4696 } | 4681 } |
4697 | 4682 |
4698 // static | 4683 // static |
4699 void CXFA_FM2JSContext::Uuid(CFXJSE_Value* pThis, | 4684 void CXFA_FM2JSContext::Uuid(CFXJSE_Value* pThis, |
4700 const CFX_ByteStringC& szFuncName, | 4685 const CFX_ByteStringC& szFuncName, |
4701 CFXJSE_Arguments& args) { | 4686 CFXJSE_Arguments& args) { |
4702 int32_t argc = args.GetLength(); | 4687 int32_t argc = args.GetLength(); |
4703 if ((argc == 0) || (argc == 1)) { | 4688 if (argc < 0 || argc > 1) { |
4704 int32_t iNum = 0; | |
4705 if (argc > 0) { | |
4706 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); | |
4707 iNum = (int32_t)ValueToFloat(pThis, argOne.get()); | |
4708 } | |
4709 FX_GUID guid; | |
4710 FX_GUID_CreateV4(&guid); | |
4711 CFX_ByteString bsUId; | |
4712 FX_GUID_ToString(&guid, bsUId, iNum); | |
4713 args.GetReturnValue()->SetString(bsUId.AsStringC()); | |
4714 } else { | |
4715 ToJSContext(pThis, nullptr) | 4689 ToJSContext(pThis, nullptr) |
4716 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Uuid"); | 4690 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Uuid"); |
4691 return; | |
4717 } | 4692 } |
4693 | |
4694 int32_t iNum = 0; | |
4695 if (argc > 0) { | |
4696 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); | |
4697 iNum = static_cast<int32_t>(ValueToFloat(pThis, argOne.get())); | |
4698 } | |
4699 FX_GUID guid; | |
4700 FX_GUID_CreateV4(&guid); | |
4701 | |
4702 CFX_ByteString bsUId; | |
4703 FX_GUID_ToString(&guid, bsUId, iNum); | |
4704 args.GetReturnValue()->SetString(bsUId.AsStringC()); | |
4718 } | 4705 } |
4719 | 4706 |
4720 // static | 4707 // static |
4721 void CXFA_FM2JSContext::Upper(CFXJSE_Value* pThis, | 4708 void CXFA_FM2JSContext::Upper(CFXJSE_Value* pThis, |
4722 const CFX_ByteStringC& szFuncName, | 4709 const CFX_ByteStringC& szFuncName, |
4723 CFXJSE_Arguments& args) { | 4710 CFXJSE_Arguments& args) { |
4724 int32_t argc = args.GetLength(); | 4711 int32_t argc = args.GetLength(); |
4725 if ((argc > 0) && (argc < 3)) { | 4712 if (argc < 1 || argc > 2) { |
4726 CFX_ByteString argString; | |
4727 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); | |
4728 if (ValueIsNull(pThis, argOne.get())) { | |
4729 args.GetReturnValue()->SetNull(); | |
4730 } else { | |
4731 ValueToUTF8String(argOne.get(), argString); | |
4732 CFX_WideTextBuf upperStringBuf; | |
4733 CFX_WideString wsArgString = | |
4734 CFX_WideString::FromUTF8(argString.AsStringC()); | |
4735 const FX_WCHAR* pData = wsArgString.c_str(); | |
4736 int32_t iLen = wsArgString.GetLength(); | |
4737 int32_t i = 0; | |
4738 int32_t ch = 0; | |
4739 while (i < iLen) { | |
4740 ch = pData[i]; | |
4741 if (ch >= 0x61 && ch <= 0x7A) { | |
4742 ch -= 32; | |
4743 } else if (ch >= 0xE0 && ch <= 0xFE) { | |
4744 ch -= 32; | |
4745 } else if (ch == 0x101 || ch == 0x103 || ch == 0x105) { | |
4746 ch -= 1; | |
4747 } | |
4748 upperStringBuf.AppendChar(ch); | |
4749 ++i; | |
4750 } | |
4751 upperStringBuf.AppendChar(0); | |
4752 args.GetReturnValue()->SetString( | |
4753 FX_UTF8Encode(upperStringBuf.GetBuffer(), upperStringBuf.GetLength()) | |
4754 .AsStringC()); | |
4755 } | |
4756 } else { | |
4757 ToJSContext(pThis, nullptr) | 4713 ToJSContext(pThis, nullptr) |
4758 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Upper"); | 4714 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Upper"); |
4715 return; | |
4759 } | 4716 } |
4717 | |
4718 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); | |
4719 if (ValueIsNull(pThis, argOne.get())) { | |
4720 args.GetReturnValue()->SetNull(); | |
4721 return; | |
4722 } | |
4723 | |
4724 CFX_ByteString argString; | |
4725 ValueToUTF8String(argOne.get(), argString); | |
4726 | |
4727 CFX_WideTextBuf upperStringBuf; | |
4728 CFX_WideString wsArgString = CFX_WideString::FromUTF8(argString.AsStringC()); | |
4729 const FX_WCHAR* pData = wsArgString.c_str(); | |
4730 int32_t i = 0; | |
4731 while (i < wsArgString.GetLength()) { | |
4732 int32_t ch = pData[i]; | |
4733 if ((ch >= 0x61 && ch <= 0x7A) || (ch >= 0xE0 && ch <= 0xFE)) | |
4734 ch -= 32; | |
4735 else if (ch == 0x101 || ch == 0x103 || ch == 0x105) | |
4736 ch -= 1; | |
4737 | |
4738 upperStringBuf.AppendChar(ch); | |
4739 ++i; | |
4740 } | |
4741 upperStringBuf.AppendChar(0); | |
4742 | |
4743 args.GetReturnValue()->SetString( | |
4744 FX_UTF8Encode(upperStringBuf.GetBuffer(), upperStringBuf.GetLength()) | |
4745 .AsStringC()); | |
4760 } | 4746 } |
4761 | 4747 |
4762 // static | 4748 // static |
4763 void CXFA_FM2JSContext::WordNum(CFXJSE_Value* pThis, | 4749 void CXFA_FM2JSContext::WordNum(CFXJSE_Value* pThis, |
4764 const CFX_ByteStringC& szFuncName, | 4750 const CFX_ByteStringC& szFuncName, |
4765 CFXJSE_Arguments& args) { | 4751 CFXJSE_Arguments& args) { |
4766 int32_t argc = args.GetLength(); | 4752 int32_t argc = args.GetLength(); |
4767 if ((argc > 0) && (argc < 4)) { | 4753 if (argc < 1 || argc > 3) { |
4768 FX_BOOL bFlags = FALSE; | |
4769 FX_FLOAT fNumber = 0.0f; | |
4770 int32_t iIdentifier = 0; | |
4771 CFX_ByteString localeString; | |
4772 std::unique_ptr<CFXJSE_Value> numberValue = GetSimpleValue(pThis, args, 0); | |
4773 if (CFXJSE_Value::IsNull(numberValue.get())) { | |
4774 bFlags = TRUE; | |
4775 } else { | |
4776 fNumber = ValueToFloat(pThis, numberValue.get()); | |
4777 } | |
4778 if (argc > 1) { | |
4779 std::unique_ptr<CFXJSE_Value> identifierValue = | |
4780 GetSimpleValue(pThis, args, 1); | |
4781 if (CFXJSE_Value::IsNull(identifierValue.get())) { | |
4782 bFlags = TRUE; | |
4783 } else { | |
4784 iIdentifier = (int32_t)ValueToFloat(pThis, identifierValue.get()); | |
4785 } | |
4786 } | |
4787 if (argc > 2) { | |
4788 std::unique_ptr<CFXJSE_Value> localeValue = | |
4789 GetSimpleValue(pThis, args, 2); | |
4790 if (CFXJSE_Value::IsNull(localeValue.get())) { | |
4791 bFlags = TRUE; | |
4792 } else { | |
4793 ValueToUTF8String(localeValue.get(), localeString); | |
4794 } | |
4795 } | |
4796 if (!bFlags) { | |
4797 if ((fNumber < 0) || (fNumber > 922337203685477550)) { | |
4798 args.GetReturnValue()->SetString("*"); | |
4799 } else { | |
4800 CFX_ByteTextBuf resultBuf; | |
4801 CFX_ByteString numberString; | |
4802 numberString.Format("%.2f", fNumber); | |
4803 WordUS(numberString.AsStringC(), iIdentifier, resultBuf); | |
4804 args.GetReturnValue()->SetString(resultBuf.AsStringC()); | |
4805 } | |
4806 } else { | |
4807 args.GetReturnValue()->SetNull(); | |
4808 } | |
4809 } else { | |
4810 ToJSContext(pThis, nullptr) | 4754 ToJSContext(pThis, nullptr) |
4811 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"WordNum"); | 4755 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"WordNum"); |
4756 return; | |
4812 } | 4757 } |
4758 | |
4759 std::unique_ptr<CFXJSE_Value> numberValue = GetSimpleValue(pThis, args, 0); | |
4760 if (CFXJSE_Value::IsNull(numberValue.get())) { | |
4761 args.GetReturnValue()->SetNull(); | |
4762 return; | |
4763 } | |
4764 FX_FLOAT fNumber = ValueToFloat(pThis, numberValue.get()); | |
4765 | |
4766 int32_t iIdentifier = 0; | |
4767 if (argc > 1) { | |
4768 std::unique_ptr<CFXJSE_Value> identifierValue = | |
4769 GetSimpleValue(pThis, args, 1); | |
4770 if (CFXJSE_Value::IsNull(identifierValue.get())) { | |
4771 args.GetReturnValue()->SetNull(); | |
4772 return; | |
4773 } | |
4774 iIdentifier = | |
4775 static_cast<int32_t>(ValueToFloat(pThis, identifierValue.get())); | |
4776 } | |
4777 | |
4778 CFX_ByteString localeString; | |
4779 if (argc > 2) { | |
4780 std::unique_ptr<CFXJSE_Value> localeValue = GetSimpleValue(pThis, args, 2); | |
4781 if (CFXJSE_Value::IsNull(localeValue.get())) { | |
4782 args.GetReturnValue()->SetNull(); | |
4783 return; | |
4784 } | |
4785 ValueToUTF8String(localeValue.get(), localeString); | |
4786 } | |
4787 | |
4788 if (fNumber < 0 || fNumber > 922337203685477550) { | |
Tom Sepez
2016/06/08 17:24:08
nit 0.0f and 922337203685477550.0f
dsinclair
2016/06/08 19:56:25
Done.
| |
4789 args.GetReturnValue()->SetString("*"); | |
4790 return; | |
4791 } | |
4792 | |
4793 CFX_ByteString numberString; | |
4794 numberString.Format("%.2f", fNumber); | |
4795 | |
4796 CFX_ByteTextBuf resultBuf; | |
4797 WordUS(numberString.AsStringC(), iIdentifier, resultBuf); | |
4798 args.GetReturnValue()->SetString(resultBuf.AsStringC()); | |
4813 } | 4799 } |
4814 | 4800 |
4815 // static | 4801 // static |
4816 void CXFA_FM2JSContext::TrillionUS(const CFX_ByteStringC& szData, | 4802 void CXFA_FM2JSContext::TrillionUS(const CFX_ByteStringC& szData, |
4817 CFX_ByteTextBuf& strBuf) { | 4803 CFX_ByteTextBuf& strBuf) { |
4818 CFX_ByteStringC pUnits[] = {"zero", "one", "two", "three", "four", | 4804 CFX_ByteStringC pUnits[] = {"zero", "one", "two", "three", "four", |
4819 "five", "six", "seven", "eight", "nine"}; | 4805 "five", "six", "seven", "eight", "nine"}; |
4820 CFX_ByteStringC pCapUnits[] = {"Zero", "One", "Two", "Three", "Four", | 4806 CFX_ByteStringC pCapUnits[] = {"Zero", "One", "Two", "Three", "Four", |
4821 "Five", "Six", "Seven", "Eight", "Nine"}; | 4807 "Five", "Six", "Seven", "Eight", "Nine"}; |
4822 CFX_ByteStringC pTens[] = {"Ten", "Eleven", "Twelve", "Thirteen", | 4808 CFX_ByteStringC pTens[] = {"Ten", "Eleven", "Twelve", "Thirteen", |
(...skipping 1811 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6634 CFX_WideString wsFormat; | 6620 CFX_WideString wsFormat; |
6635 pAppProvider->LoadString(iStringID, wsFormat); | 6621 pAppProvider->LoadString(iStringID, wsFormat); |
6636 CFX_WideString wsMessage; | 6622 CFX_WideString wsMessage; |
6637 va_list arg_ptr; | 6623 va_list arg_ptr; |
6638 va_start(arg_ptr, iStringID); | 6624 va_start(arg_ptr, iStringID); |
6639 wsMessage.FormatV(wsFormat.c_str(), arg_ptr); | 6625 wsMessage.FormatV(wsFormat.c_str(), arg_ptr); |
6640 va_end(arg_ptr); | 6626 va_end(arg_ptr); |
6641 FXJSE_ThrowMessage( | 6627 FXJSE_ThrowMessage( |
6642 FX_UTF8Encode(wsMessage.c_str(), wsMessage.GetLength()).AsStringC()); | 6628 FX_UTF8Encode(wsMessage.c_str(), wsMessage.GetLength()).AsStringC()); |
6643 } | 6629 } |
OLD | NEW |