Пример #1
0
        /// <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);
        }
Пример #2
0
        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);
                        }
                    }
                }
            }
        }