Mercurial > projects > dwt-addons
diff dwtx/dwtxhelper/mangoicu/UDomainName.d @ 92:f05207c07a98
changed filetype to unix
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Mon, 07 Jul 2008 15:54:03 +0200 |
parents | 11e8159caf7a |
children |
line wrap: on
line diff
--- a/dwtx/dwtxhelper/mangoicu/UDomainName.d Mon Jul 07 15:53:07 2008 +0200 +++ b/dwtx/dwtxhelper/mangoicu/UDomainName.d Mon Jul 07 15:54:03 2008 +0200 @@ -1,322 +1,322 @@ -/******************************************************************************* - - @file UDomainName.d - - Copyright (c) 2004 Kris Bell - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for damages - of any kind arising from the use of this software. - - Permission is hereby granted to anyone to use this software for any - purpose, including commercial applications, and to alter it and/or - redistribute it freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must - not claim that you wrote the original software. If you use this - software in a product, an acknowledgment within documentation of - said product would be appreciated but is not required. - - 2. Altered source versions must be plainly marked as such, and must - not be misrepresented as being the original software. - - 3. This notice may not be removed or altered from any distribution - of the source. - - 4. Derivative works are permitted, but they must carry this notice - in full and credit the original source. - - - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - - @version Initial version, November 2004 - @author Kris - - Note that this package and documentation is built around the ICU - project (http://oss.software.ibm.com/icu/). Below is the license - statement as specified by that software: - - - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - - ICU License - ICU 1.8.1 and later - - COPYRIGHT AND PERMISSION NOTICE - - Copyright (c) 1995-2003 International Business Machines Corporation and - others. - - All rights reserved. - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, and/or sell copies of the Software, and to permit persons - to whom the Software is furnished to do so, provided that the above - copyright notice(s) and this permission notice appear in all copies of - the Software and that both the above copyright notice(s) and this - permission notice appear in supporting documentation. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT - OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL - INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING - FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION - WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - Except as contained in this notice, the name of a copyright holder - shall not be used in advertising or otherwise to promote the sale, use - or other dealings in this Software without prior written authorization - of the copyright holder. - - ---------------------------------------------------------------------- - - All trademarks and registered trademarks mentioned herein are the - property of their respective owners. - -*******************************************************************************/ - -module dwtx.dwtxhelper.mangoicu.UDomainName; - -private import dwtx.dwtxhelper.mangoicu.ICU, - dwtx.dwtxhelper.mangoicu.UString; - -/******************************************************************************* - - UIDNA API implements the IDNA protocol as defined in the - IDNA RFC (http://www.ietf.org/rfc/rfc3490.txt). - - The RFC defines 2 operations: toAscii and toUnicode. Domain - labels containing non-ASCII code points are required to be - processed by toAscii operation before passing it to resolver - libraries. Domain names that are obtained from resolver - libraries are required to be processed by toUnicode operation - before displaying the domain name to the user. IDNA requires - that implementations process input strings with Nameprep - (http://www.ietf.org/rfc/rfc3491.txt), which is a profile of - Stringprep (http://www.ietf.org/rfc/rfc3454.txt), and then with - Punycode (http://www.ietf.org/rfc/rfc3492.txt). Implementations - of IDNA MUST fully implement Nameprep and Punycode; neither - Nameprep nor Punycode are optional. - - The input and output of toAscii() and ToUnicode() operations are - Unicode and are designed to be chainable, i.e., applying toAscii() - or toUnicode() operations multiple times to an input string will - yield the same result as applying the operation once. - - See <A HREF="http://oss.software.ibm.com/icu/apiref/uidna_8h.html"> - this page</A> for full details. - -*******************************************************************************/ - -class UDomainName : ICU -{ - private UStringView text; - private Handle handle; - - enum Options - { - Strict, - Lenient, - Std3 - } - - - /*********************************************************************** - - - ***********************************************************************/ - - this (UStringView text) - { - this.text = text; - } - - /*********************************************************************** - - This function implements the ToASCII operation as - defined in the IDNA RFC. - - This operation is done on single labels before sending - it to something that expects ASCII names. A label is an - individual part of a domain name. Labels are usually - separated by dots; e.g." "www.example.com" is composed - of 3 labels "www","example", and "com". - - ***********************************************************************/ - - void toAscii (UString dst, Options o = Options.Strict) - { - uint fmt (wchar* p, uint len, inout UErrorCode e) - { - return uidna_toASCII (text.get.ptr, text.len, p, len, o, null, e); - } - - dst.format (&fmt, "failed to convert IDN to ASCII"); - } - - /*********************************************************************** - - This function implements the ToUnicode operation as - defined in the IDNA RFC. - - This operation is done on single labels before sending - it to something that expects Unicode names. A label is - an individual part of a domain name. Labels are usually - separated by dots; for e.g." "www.example.com" is composed - of 3 labels "www","example", and "com". - - ***********************************************************************/ - - void toUnicode (UString dst, Options o = Options.Strict) - { - uint fmt (wchar* p, uint len, inout UErrorCode e) - { - return uidna_toUnicode (text.get.ptr, text.len, p, len, o, null, e); - } - - dst.format (&fmt, "failed to convert IDN to Unicode"); - } - - /*********************************************************************** - - Convenience function that implements the IDNToASCII - operation as defined in the IDNA RFC. - - This operation is done on complete domain names, e.g: - "www.example.com". It is important to note that this - operation can fail. If it fails, then the input domain - name cannot be used as an Internationalized Domain Name - and the application should have methods defined to deal - with the failure. - - Note: IDNA RFC specifies that a conformant application - should divide a domain name into separate labels, decide - whether to apply allowUnassigned and useSTD3ASCIIRules - on each, and then convert. This function does not offer - that level of granularity. The options once set will apply - to all labels in the domain name - - ***********************************************************************/ - - void IdnToAscii (UString dst, Options o = Options.Strict) - { - uint fmt (wchar* p, uint len, inout UErrorCode e) - { - return uidna_IDNToASCII (text.get.ptr, text.len, p, len, o, null, e); - } - - dst.format (&fmt, "failed to convert IDN to ASCII"); - } - - /*********************************************************************** - - Convenience function that implements the IDNToUnicode - operation as defined in the IDNA RFC. - - This operation is done on complete domain names, e.g: - "www.example.com". - - Note: IDNA RFC specifies that a conformant application - should divide a domain name into separate labels, decide - whether to apply allowUnassigned and useSTD3ASCIIRules - on each, and then convert. This function does not offer - that level of granularity. The options once set will apply - to all labels in the domain name - - ***********************************************************************/ - - void IdnToUnicode (UString dst, Options o = Options.Strict) - { - uint fmt (wchar* p, uint len, inout UErrorCode e) - { - return uidna_IDNToUnicode (text.get.ptr, text.len, p, len, o, null, e); - } - - dst.format (&fmt, "failed to convert IDN to Unicode"); - } - - /*********************************************************************** - - Compare two IDN strings for equivalence. - - This function splits the domain names into labels and - compares them. According to IDN RFC, whenever two labels - are compared, they are considered equal if and only if - their ASCII forms (obtained by applying toASCII) match - using an case-insensitive ASCII comparison. Two domain - names are considered a match if and only if all labels - match regardless of whether label separators match - - ***********************************************************************/ - - int compare (UString other, Options o = Options.Strict) - { - UErrorCode e; - int i = uidna_compare (text.get.ptr, text.len, other.get.ptr, other.len, o, e); - testError (e, "failed to compare IDN strings"); - return i; - } - - - /*********************************************************************** - - Bind the ICU functions from a shared library. This is - complicated by the issues regarding D and DLLs on the - Windows platform - - ***********************************************************************/ - - private static void* library; - - /*********************************************************************** - - ***********************************************************************/ - - private static extern (C) - { - uint function (wchar*, uint, wchar*, uint, uint, void*, inout UErrorCode) uidna_toASCII; - uint function (wchar*, uint, wchar*, uint, uint, void*, inout UErrorCode) uidna_toUnicode; - uint function (wchar*, uint, wchar*, uint, uint, void*, inout UErrorCode) uidna_IDNToASCII; - uint function (wchar*, uint, wchar*, uint, uint, void*, inout UErrorCode) uidna_IDNToUnicode; - int function (wchar*, uint, wchar*, uint, uint, inout UErrorCode) uidna_compare; - } - - /*********************************************************************** - - ***********************************************************************/ - - static FunctionLoader.Bind[] targets = - [ - {cast(void**) &uidna_toASCII, "uidna_toASCII"}, - {cast(void**) &uidna_toUnicode, "uidna_toUnicode"}, - {cast(void**) &uidna_IDNToASCII, "uidna_IDNToASCII"}, - {cast(void**) &uidna_IDNToUnicode, "uidna_IDNToUnicode"}, - {cast(void**) &uidna_compare, "uidna_compare"}, - ]; - - /*********************************************************************** - - ***********************************************************************/ - - static this () - { - library = FunctionLoader.bind (icuuc, targets); - } - - /*********************************************************************** - - ***********************************************************************/ - - static ~this () - { - FunctionLoader.unbind (library); - } -} - +/******************************************************************************* + + @file UDomainName.d + + Copyright (c) 2004 Kris Bell + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for damages + of any kind arising from the use of this software. + + Permission is hereby granted to anyone to use this software for any + purpose, including commercial applications, and to alter it and/or + redistribute it freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must + not claim that you wrote the original software. If you use this + software in a product, an acknowledgment within documentation of + said product would be appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + + 3. This notice may not be removed or altered from any distribution + of the source. + + 4. Derivative works are permitted, but they must carry this notice + in full and credit the original source. + + + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + @version Initial version, November 2004 + @author Kris + + Note that this package and documentation is built around the ICU + project (http://oss.software.ibm.com/icu/). Below is the license + statement as specified by that software: + + + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + ICU License - ICU 1.8.1 and later + + COPYRIGHT AND PERMISSION NOTICE + + Copyright (c) 1995-2003 International Business Machines Corporation and + others. + + All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, and/or sell copies of the Software, and to permit persons + to whom the Software is furnished to do so, provided that the above + copyright notice(s) and this permission notice appear in all copies of + the Software and that both the above copyright notice(s) and this + permission notice appear in supporting documentation. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL + INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING + FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, + NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION + WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + Except as contained in this notice, the name of a copyright holder + shall not be used in advertising or otherwise to promote the sale, use + or other dealings in this Software without prior written authorization + of the copyright holder. + + ---------------------------------------------------------------------- + + All trademarks and registered trademarks mentioned herein are the + property of their respective owners. + +*******************************************************************************/ + +module dwtx.dwtxhelper.mangoicu.UDomainName; + +private import dwtx.dwtxhelper.mangoicu.ICU, + dwtx.dwtxhelper.mangoicu.UString; + +/******************************************************************************* + + UIDNA API implements the IDNA protocol as defined in the + IDNA RFC (http://www.ietf.org/rfc/rfc3490.txt). + + The RFC defines 2 operations: toAscii and toUnicode. Domain + labels containing non-ASCII code points are required to be + processed by toAscii operation before passing it to resolver + libraries. Domain names that are obtained from resolver + libraries are required to be processed by toUnicode operation + before displaying the domain name to the user. IDNA requires + that implementations process input strings with Nameprep + (http://www.ietf.org/rfc/rfc3491.txt), which is a profile of + Stringprep (http://www.ietf.org/rfc/rfc3454.txt), and then with + Punycode (http://www.ietf.org/rfc/rfc3492.txt). Implementations + of IDNA MUST fully implement Nameprep and Punycode; neither + Nameprep nor Punycode are optional. + + The input and output of toAscii() and ToUnicode() operations are + Unicode and are designed to be chainable, i.e., applying toAscii() + or toUnicode() operations multiple times to an input string will + yield the same result as applying the operation once. + + See <A HREF="http://oss.software.ibm.com/icu/apiref/uidna_8h.html"> + this page</A> for full details. + +*******************************************************************************/ + +class UDomainName : ICU +{ + private UStringView text; + private Handle handle; + + enum Options + { + Strict, + Lenient, + Std3 + } + + + /*********************************************************************** + + + ***********************************************************************/ + + this (UStringView text) + { + this.text = text; + } + + /*********************************************************************** + + This function implements the ToASCII operation as + defined in the IDNA RFC. + + This operation is done on single labels before sending + it to something that expects ASCII names. A label is an + individual part of a domain name. Labels are usually + separated by dots; e.g." "www.example.com" is composed + of 3 labels "www","example", and "com". + + ***********************************************************************/ + + void toAscii (UString dst, Options o = Options.Strict) + { + uint fmt (wchar* p, uint len, inout UErrorCode e) + { + return uidna_toASCII (text.get.ptr, text.len, p, len, o, null, e); + } + + dst.format (&fmt, "failed to convert IDN to ASCII"); + } + + /*********************************************************************** + + This function implements the ToUnicode operation as + defined in the IDNA RFC. + + This operation is done on single labels before sending + it to something that expects Unicode names. A label is + an individual part of a domain name. Labels are usually + separated by dots; for e.g." "www.example.com" is composed + of 3 labels "www","example", and "com". + + ***********************************************************************/ + + void toUnicode (UString dst, Options o = Options.Strict) + { + uint fmt (wchar* p, uint len, inout UErrorCode e) + { + return uidna_toUnicode (text.get.ptr, text.len, p, len, o, null, e); + } + + dst.format (&fmt, "failed to convert IDN to Unicode"); + } + + /*********************************************************************** + + Convenience function that implements the IDNToASCII + operation as defined in the IDNA RFC. + + This operation is done on complete domain names, e.g: + "www.example.com". It is important to note that this + operation can fail. If it fails, then the input domain + name cannot be used as an Internationalized Domain Name + and the application should have methods defined to deal + with the failure. + + Note: IDNA RFC specifies that a conformant application + should divide a domain name into separate labels, decide + whether to apply allowUnassigned and useSTD3ASCIIRules + on each, and then convert. This function does not offer + that level of granularity. The options once set will apply + to all labels in the domain name + + ***********************************************************************/ + + void IdnToAscii (UString dst, Options o = Options.Strict) + { + uint fmt (wchar* p, uint len, inout UErrorCode e) + { + return uidna_IDNToASCII (text.get.ptr, text.len, p, len, o, null, e); + } + + dst.format (&fmt, "failed to convert IDN to ASCII"); + } + + /*********************************************************************** + + Convenience function that implements the IDNToUnicode + operation as defined in the IDNA RFC. + + This operation is done on complete domain names, e.g: + "www.example.com". + + Note: IDNA RFC specifies that a conformant application + should divide a domain name into separate labels, decide + whether to apply allowUnassigned and useSTD3ASCIIRules + on each, and then convert. This function does not offer + that level of granularity. The options once set will apply + to all labels in the domain name + + ***********************************************************************/ + + void IdnToUnicode (UString dst, Options o = Options.Strict) + { + uint fmt (wchar* p, uint len, inout UErrorCode e) + { + return uidna_IDNToUnicode (text.get.ptr, text.len, p, len, o, null, e); + } + + dst.format (&fmt, "failed to convert IDN to Unicode"); + } + + /*********************************************************************** + + Compare two IDN strings for equivalence. + + This function splits the domain names into labels and + compares them. According to IDN RFC, whenever two labels + are compared, they are considered equal if and only if + their ASCII forms (obtained by applying toASCII) match + using an case-insensitive ASCII comparison. Two domain + names are considered a match if and only if all labels + match regardless of whether label separators match + + ***********************************************************************/ + + int compare (UString other, Options o = Options.Strict) + { + UErrorCode e; + int i = uidna_compare (text.get.ptr, text.len, other.get.ptr, other.len, o, e); + testError (e, "failed to compare IDN strings"); + return i; + } + + + /*********************************************************************** + + Bind the ICU functions from a shared library. This is + complicated by the issues regarding D and DLLs on the + Windows platform + + ***********************************************************************/ + + private static void* library; + + /*********************************************************************** + + ***********************************************************************/ + + private static extern (C) + { + uint function (wchar*, uint, wchar*, uint, uint, void*, inout UErrorCode) uidna_toASCII; + uint function (wchar*, uint, wchar*, uint, uint, void*, inout UErrorCode) uidna_toUnicode; + uint function (wchar*, uint, wchar*, uint, uint, void*, inout UErrorCode) uidna_IDNToASCII; + uint function (wchar*, uint, wchar*, uint, uint, void*, inout UErrorCode) uidna_IDNToUnicode; + int function (wchar*, uint, wchar*, uint, uint, inout UErrorCode) uidna_compare; + } + + /*********************************************************************** + + ***********************************************************************/ + + static FunctionLoader.Bind[] targets = + [ + {cast(void**) &uidna_toASCII, "uidna_toASCII"}, + {cast(void**) &uidna_toUnicode, "uidna_toUnicode"}, + {cast(void**) &uidna_IDNToASCII, "uidna_IDNToASCII"}, + {cast(void**) &uidna_IDNToUnicode, "uidna_IDNToUnicode"}, + {cast(void**) &uidna_compare, "uidna_compare"}, + ]; + + /*********************************************************************** + + ***********************************************************************/ + + static this () + { + library = FunctionLoader.bind (icuuc, targets); + } + + /*********************************************************************** + + ***********************************************************************/ + + static ~this () + { + FunctionLoader.unbind (library); + } +} +