/// <summary> /// Extend the XPath2 FunctionTable with 'base64decode' function to decode a base64 string to a string. /// </summary> /// <param name="functionTable">The function table.</param> public static void AddBase64Decode(this FunctionTable functionTable) { string Base64DecodeDelegate(XPath2Context context, IContextProvider provider, object[] args) { bool fixPadding = true; Encoding encoding = Encoding.UTF8; string value = CoreFuncs.CastToStringExactOne(context, args[0]); if (args.Length == 2) { try { // first try to cast to bool fixPadding = CoreFuncs.GetBooleanValue(args[1]); } catch (Exception) { // else parse as encoding encoding = ParseEncodingFromArg(context, args[1]); } } if (args.Length == 3) { encoding = ParseEncodingFromArg(context, args[1]); fixPadding = CoreFuncs.GetBooleanValue(args[2]); } if (fixPadding) { value = value.Trim('='); int mod = value.Length % 4; if (mod != 0) { value = string.Concat(value, new string('=', 4 - mod)); } } try { return(encoding.GetString(Convert.FromBase64String(value))); } catch (Exception ex) { throw new XPath2Exception("InvalidFormat", ex.Message); } } // base64decode with default UTF-8 encoding functionTable.Add(XmlReservedNs.NsXQueryFunc, "base64decode", 1, XPath2ResultType.String, Base64DecodeDelegate); // base64decode with specified encoding (string) or fixPadding (bool) functionTable.Add(XmlReservedNs.NsXQueryFunc, "base64decode", 2, XPath2ResultType.String, Base64DecodeDelegate); // base64decode with specified encoding (string) and fixPadding (bool) functionTable.Add(XmlReservedNs.NsXQueryFunc, "base64decode", 3, XPath2ResultType.String, Base64DecodeDelegate); }
private IEnumerable <XPathItem> CreateEnumerator(object[] dataPool, AbstractNode expr, XPath2NodeIterator baseIter) { XPath2NodeIterator iter = baseIter.Clone(); ValueNode numexpr = expr as ValueNode; if (numexpr != null && numexpr.Content is Integer) { Integer pos = (Integer)numexpr.Content; foreach (XPathItem item in iter) { if (pos == 1) { yield return(item); break; } else { pos--; } } } else { ContextProvider provider = new ContextProvider(iter); object res = Undefined.Value; while (iter.MoveNext()) { if (m_contextSensitive || res == Undefined.Value) { res = expr.Execute(provider, dataPool); } if (res == Undefined.Value) { if (!m_contextSensitive) { break; } continue; } XPath2NodeIterator iter2 = res as XPath2NodeIterator; XPathItem item; if (iter2 != null) { iter2 = iter2.Clone(); if (!iter2.MoveNext()) { continue; } item = iter2.Current.Clone(); if (!item.IsNode && iter2.MoveNext()) { throw new XPath2Exception("FORG0006", Resources.FORG0006, "fn:boolean()", new SequenceType(XmlTypeCode.AnyAtomicType, XmlTypeCardinality.OneOrMore)); } } else { item = res as XPathItem; if (item == null) { item = new XPath2Item(res); } } if (item.IsNode) { yield return(iter.Current); } else { if (ValueProxy.IsNumeric(item.ValueType)) { if (CoreFuncs.OperatorEq(iter.CurrentPosition + 1, item.GetTypedValue()) == CoreFuncs.True) { yield return(iter.Current); if (!m_contextSensitive) { break; } } } else if (CoreFuncs.GetBooleanValue(item)) { yield return(iter.Current); } } } } }