Пример #1
0
            /// <exception cref="TjsException"></exception>
            protected internal override int Process(Variant result, Variant[] param, Dispatch2
                                                    objthis)
            {
                ArrayNI ni = (ArrayNI)objthis.GetNativeInstance(ArrayClass.ClassID);

                if (ni == null)
                {
                    return(Error.E_NATIVECLASSCRASH);
                }
                if (param.Length < 1)
                {
                    return(Error.E_BADPARAMCOUNT);
                }
                ((ArrayObject)objthis).Clear(ni);
                AList <Dispatch2> stack = new AList <Dispatch2>();
                VariantClosure    clo   = param[0].AsObjectClosure();

                if (clo.mObjThis != null)
                {
                    ni.AssignStructure(clo.mObjThis, stack);
                }
                else
                {
                    if (clo.mObject != null)
                    {
                        ni.AssignStructure(clo.mObject, stack);
                    }
                    else
                    {
                        throw new TjsException(Error.NullAccess);
                    }
                }
                return(Error.S_OK);
            }
Пример #2
0
            /// <exception cref="VariantException"></exception>
            public override int Set(Variant param, Dispatch2 objthis)
            {
                ArrayNI ni = (ArrayNI)objthis.GetNativeInstance(ArrayClass.ClassID);

                // インスタンス所得
                if (ni == null)
                {
                    return(Error.E_NATIVECLASSCRASH);
                }
                int resize = param.AsInteger();
                int count  = ni.mItems.Count;

                if (count < resize)
                {
                    int addcount = resize - count;
                    ni.mItems.EnsureCapacity(count);
                    for (int i = 0; i < addcount; i++)
                    {
                        ni.mItems.AddItem(new Variant());
                    }
                }
                else
                {
                    if (count > resize)
                    {
                        for (int i = count - 1; i >= resize; i--)
                        {
                            ni.mItems.Remove(i);
                        }
                    }
                }
                return(Error.S_OK);
            }
Пример #3
0
            /// <exception cref="VariantException"></exception>
            protected internal override int Process(Variant result, Variant[] param, Dispatch2
                                                    objthis)
            {
                ArrayNI ni = (ArrayNI)objthis.GetNativeInstance(ArrayClass.ClassID);

                if (ni == null)
                {
                    return(Error.E_NATIVECLASSCRASH);
                }
                if (param.Length < 1)
                {
                    return(Error.E_BADPARAMCOUNT);
                }
                bool eraseall;

                if (param.Length >= 2)
                {
                    eraseall = param[1].AsBoolean();
                }
                else
                {
                    eraseall = true;
                }
                Variant val   = param[0];
                int     count = ((ArrayObject)objthis).Remove(ni, val, eraseall);

                if (result != null)
                {
                    result.Set(count);
                }
                return(Error.S_OK);
            }
Пример #4
0
            /// <exception cref="TjsException"></exception>
            protected internal override int Process(Variant result, Variant[] param, Dispatch2
                                                    objthis)
            {
                ArrayNI ni = (ArrayNI)objthis.GetNativeInstance(ArrayClass.ClassID);

                if (ni == null)
                {
                    return(Error.E_NATIVECLASSCRASH);
                }
                if (ni.mItems.IsEmpty())
                {
                    if (result != null)
                    {
                        result.Clear();
                    }
                }
                else
                {
                    if (result != null)
                    {
                        result.Set(ni.mItems[0]);
                    }
                    ((ArrayObject)objthis).Erase(ni, 0);
                }
                return(Error.S_OK);
            }
Пример #5
0
 /// <exception cref="VariantException"></exception>
 /// <exception cref="TjsException"></exception>
 public virtual bool Callback(string name, int flags, Variant value)
 {
     if ((flags & Interface.HIDDENMEMBER) != 0)
     {
         return(true);
     }
     if (mCalled)
     {
         mStream.Write(",\n");
     }
     mCalled = true;
     mStream.Write(mIndentStr);
     mStream.Write("\"");
     mStream.Write(LexBase.EscapeC(name));
     mStream.Write("\" => ");
     if (value.IsObject())
     {
         // object
         VariantClosure clo = value.AsObjectClosure();
         ArrayNI.SaveStructuredDataForObject(clo.SelectObject(), mStack, mStream, mIndentStr
                                             );
     }
     else
     {
         mStream.Write(Utils.VariantToExpressionString(value));
     }
     return(true);
 }
Пример #6
0
        /// <exception cref="VariantException"></exception>
        /// <exception cref="TjsException"></exception>
        public virtual void Assign(Dispatch2 dsp)
        {
            // copy members from "dsp" to "Owner"
            // determin dsp's object type
            //Holder<ArrayNI> arrayni = new Holder<ArrayNI>(null);
            ArrayNI array = (ArrayNI)dsp.GetNativeInstance(ArrayClass.ClassID);

            if (array != null)
            {
                // copy from array
                mItems.Clear();
                int count = array.mItems.Count;
                for (int i = 0; i < count; i++)
                {
                    mItems.AddItem(new Variant(array.mItems[i]));
                }
            }
            else
            {
                //mItems.addAll( array.mItems );
                // convert from dictionary or others
                mItems.Clear();
                ArrayNI.DictionaryEnumCallback callback = new ArrayNI.DictionaryEnumCallback(mItems
                                                                                             );
                dsp.EnumMembers(Interface.IGNOREPROP, callback, dsp);
            }
        }
Пример #7
0
        // class instance matching by index number
        /// <exception cref="VariantException"></exception>
        /// <exception cref="TjsException"></exception>
        public override int IsInstanceOfByNum(int flag, int num, string className, Dispatch2
                                              objthis)
        {
            if (!GetValidity())
            {
                return(Error.E_INVALIDOBJECT);
            }
            ArrayNI ni = (ArrayNI)objthis.GetNativeInstance(ArrayClass.ClassID);

            if (ni == null)
            {
                return(Error.E_NATIVECLASSCRASH);
            }
            int membercount = ni.mItems.Count;

            if (num < 0)
            {
                num = membercount + num;
            }
            if ((flag & Interface.MEMBERMUSTEXIST) != 0 && (num < 0 || membercount <= num))
            {
                return(Error.E_MEMBERNOTFOUND);
            }
            Variant val = new Variant((membercount <= num || num < 0) ? VoidValue : ni.mItems
                                      [num]);

            return(DefaultIsInstanceOf(flag, val, className, objthis));
        }
Пример #8
0
        /// <exception cref="TjsException"></exception>
        public static int CopyArrayElementTo(Dispatch2 dsp, Variant[] dest, int dest_offset
                                             , int start, int count)
        {
            // copy array elements to specified variant array.
            // returns copied element count.
            ArrayNI ni = (ArrayNI)dsp.GetNativeInstance(ClassID);

            if (ni == null)
            {
                throw new TjsException(Error.SpecifyArray);
            }
            if (count < 0)
            {
                count = ni.mItems.Count;
            }
            if (start >= ni.mItems.Count)
            {
                return(0);
            }
            int limit = start + count;
            int d     = dest_offset;

            for (int i = start; i < limit; i++)
            {
                dest[d] = ni.mItems[i];
                d++;
            }
            return(limit - start);
        }
Пример #9
0
            /// <exception cref="VariantException"></exception>
            protected internal override int Process(Variant result, Variant[] param, Dispatch2
                                                    objthis)
            {
                ArrayNI ni = (ArrayNI)objthis.GetNativeInstance(ArrayClass.ClassID);

                ((ArrayObject)objthis).Clear(ni);
                return(Error.S_OK);
            }
Пример #10
0
            /// <exception cref="VariantException"></exception>
            protected internal override int Process(Variant result, Variant[] param, Dispatch2
                                                    objthis)
            {
                ArrayNI ni = (ArrayNI)objthis.GetNativeInstance(ArrayClass.ClassID);

                if (ni == null)
                {
                    return(Error.E_NATIVECLASSCRASH);
                }
                if (param.Length < 1)
                {
                    return(Error.E_BADPARAMCOUNT);
                }
                if (result != null)
                {
                    Variant val   = param[0];
                    int     start = 0;
                    if (param.Length >= 2)
                    {
                        start = param[1].AsInteger();
                    }
                    if (start < 0)
                    {
                        start += ni.mItems.Count;
                    }
                    if (start < 0)
                    {
                        start = 0;
                    }
                    if (start >= ni.mItems.Count)
                    {
                        result.Set(-1);
                        return(Error.S_OK);
                    }
                    int count = ni.mItems.Count;
                    int i;
                    for (i = start; i < count; i++)
                    {
                        Variant v = ni.mItems[i];
                        if (val.DiscernCompareInternal(v))
                        {
                            break;
                        }
                    }
                    if (i == count)
                    {
                        result.Set(-1);
                    }
                    else
                    {
                        result.Set(i);
                    }
                }
                return(Error.S_OK);
            }
Пример #11
0
        /// <exception cref="TjsException"></exception>
        public static int GetArrayElementCount(Dispatch2 dsp)
        {
            // returns array element count
            ArrayNI ni = (ArrayNI)dsp.GetNativeInstance(ClassID);

            if (ni == null)
            {
                throw new TjsException(Error.SpecifyArray);
            }
            return(ni.mItems.Count);
        }
Пример #12
0
        /// <exception cref="TjsException"></exception>
        protected internal override void FinalizeObject()
        {
            ArrayNI ni = (ArrayNI)GetNativeInstance(ArrayClass.ClassID);

            if (ni == null)
            {
                throw new TjsException(Error.NativeClassCrash);
            }
            Clear(ni);
            base.FinalizeObject();
        }
Пример #13
0
            /// <exception cref="VariantException"></exception>
            protected internal override int Process(Variant result, Variant[] param, Dispatch2
                                                    objthis)
            {
                ArrayNI ni = (ArrayNI)objthis.GetNativeInstance(ArrayClass.ClassID);

                if (ni == null)
                {
                    return(Error.E_NATIVECLASSCRASH);
                }
                Collections.Reverse(ni.mItems);
                return(Error.S_OK);
            }
Пример #14
0
        public virtual void Clear(ArrayNI ni)
        {
            // clear members
            int count = ni.mItems.Count;

            for (int i = 0; i < count; i++)
            {
                Variant v = ni.mItems[i];
                v.Clear();
            }
            ni.mItems.Clear();
        }
Пример #15
0
            public override int Get(Variant result, Dispatch2 objthis)
            {
                ArrayNI ni = (ArrayNI)objthis.GetNativeInstance(ArrayClass.ClassID);

                if (ni == null)
                {
                    return(Error.E_NATIVECLASSCRASH);
                }
                if (result != null)
                {
                    result.Set(ni.mItems.Count);
                }
                return(Error.S_OK);
            }
Пример #16
0
            /// <exception cref="TjsException"></exception>
            protected internal override int Process(Variant result, Variant[] param, Dispatch2
                                                    objthis)
            {
                ArrayNI ni = (ArrayNI)objthis.GetNativeInstance(ArrayClass.ClassID);

                if (ni == null)
                {
                    return(Error.E_NATIVECLASSCRASH);
                }
                ((ArrayObject)objthis).Insert(ni, param, 0);
                if (result != null)
                {
                    result.Set(ni.mItems.Count);
                }
                return(Error.S_OK);
            }
Пример #17
0
 /// <exception cref="TjsException"></exception>
 public virtual void Erase(ArrayNI ni, int num)
 {
     if (num < 0)
     {
         num += ni.mItems.Count;
     }
     if (num < 0)
     {
         throw new TjsException(Error.RangeError);
     }
     if (num >= ni.mItems.Count)
     {
         throw new TjsException(Error.RangeError);
     }
     ni.mItems.Remove(num);
 }
Пример #18
0
            /// <exception cref="VariantException"></exception>
            protected internal override int Process(Variant result, Variant[] param, Dispatch2
                                                    objthis)
            {
                ArrayNI ni = (ArrayNI)objthis.GetNativeInstance(ArrayClass.ClassID);

                if (ni == null)
                {
                    return(Error.E_NATIVECLASSCRASH);
                }
                if (param.Length < 1)
                {
                    return(Error.E_BADPARAMCOUNT);
                }
                string delimiter  = param[0].AsString();
                bool   purgeempty = false;

                if (param.Length >= 3 && param[2].IsVoid() != true)
                {
                    purgeempty = param[2].AsBoolean();
                }
                bool          first  = true;
                StringBuilder builer = new StringBuilder(1024);
                int           count  = ni.mItems.Count;

                for (int i = 0; i < count; i++)
                {
                    Variant v = ni.mItems[i];
                    if (purgeempty && v.IsVoid())
                    {
                    }
                    else
                    {
                        if (!first)
                        {
                            builer.Append(delimiter);
                        }
                        first = false;
                        builer.Append(v.AsString());
                    }
                }
                if (result != null)
                {
                    result.Set(builer.ToString());
                }
                return(Error.S_OK);
            }
Пример #19
0
            /// <exception cref="TjsException"></exception>
            protected internal override int Process(Variant result, Variant[] param, Dispatch2
                                                    objthis)
            {
                ArrayNI ni = (ArrayNI)objthis.GetNativeInstance(ArrayClass.ClassID);

                if (ni == null)
                {
                    return(Error.E_NATIVECLASSCRASH);
                }
                if (param.Length < 1)
                {
                    return(Error.E_BADPARAMCOUNT);
                }
                string name = param[0].AsString();
                string mode = null;

                if (param.Length >= 2 && param[1].IsVoid() == false)
                {
                    mode = param[1].AsString();
                }
                TextWriteStreamInterface stream = Tjs.mStorage.CreateTextWriteStream(name, mode);

                try
                {
                    Iterator <Variant> i = ni.mItems.Iterator();
                    while (i.HasNext())
                    {
                        Variant o = i.Next();
                        if (o != null && (o.IsString() || o.IsNumber()))
                        {
                            stream.Write(o.AsString());
                        }
                        stream.Write("\n");
                    }
                }
                finally
                {
                    stream.Destruct();
                }
                if (result != null)
                {
                    result.Set(new Variant(objthis, objthis));
                }
                return(Error.S_OK);
            }
Пример #20
0
        /// <exception cref="TjsException"></exception>
        public virtual void Insert(ArrayNI ni, Variant val, int num)
        {
            if (num < 0)
            {
                num += ni.mItems.Count;
            }
            if (num < 0)
            {
                throw new TjsException(Error.RangeError);
            }
            int count = ni.mItems.Count;

            if (num > count)
            {
                throw new TjsException(Error.RangeError);
            }
            ni.mItems.Add(num, new Variant(val));
        }
Пример #21
0
            protected internal override int Process(Variant result, Variant[] param, Dispatch2
                                                    objthis)
            {
                ArrayNI _this = (ArrayNI)objthis.GetNativeInstance(ArrayClass.ClassID
                                                                   );

                if (_this == null)
                {
                    return(Error.E_NATIVECLASSCRASH);
                }
                int hr = _this.Construct(param, objthis);

                if (hr < 0)
                {
                    return(hr);
                }
                return(Error.S_OK);
            }
Пример #22
0
            /// <exception cref="TjsException"></exception>
            protected internal override int Process(Variant result, Variant[] param, Dispatch2
                                                    objthis)
            {
                ArrayNI ni = (ArrayNI)objthis.GetNativeInstance(ArrayClass.ClassID);

                if (ni == null)
                {
                    return(Error.E_NATIVECLASSCRASH);
                }
                if (param.Length < 2)
                {
                    return(Error.E_BADPARAMCOUNT);
                }
                int num = param[0].AsInteger();

                ((ArrayObject)objthis).Insert(ni, param[1], num);
                return(Error.S_OK);
            }
Пример #23
0
            /// <exception cref="VariantException"></exception>
            protected internal override int Process(Variant result, Variant[] param, Dispatch2
                                                    objthis)
            {
                ArrayNI ni = (ArrayNI)objthis.GetNativeInstance(ArrayClass.ClassID);

                if (ni == null)
                {
                    return(Error.E_NATIVECLASSCRASH);
                }
                if (param.Length < 1)
                {
                    return(Error.E_BADPARAMCOUNT);
                }
                ((ArrayObject)objthis).Add(ni, param[0]);
                if (result != null)
                {
                    result.Set(ni.mItems.Count - 1);
                }
                return(Error.S_OK);
            }
Пример #24
0
        /// <exception cref="VariantException"></exception>
        /// <exception cref="TjsException"></exception>
        public virtual void Assign(Dispatch2 dsp, bool clear)
        {
            // copy members from "dsp" to "Owner"
            // determin dsp's object type
            ArrayNI      arrayni = null;
            CustomObject owner   = mOwner.Get();

            if (dsp != null && (arrayni = (ArrayNI)dsp.GetNativeInstance(ArrayClass.ClassID))
                != null)
            {
                // convert from array
                if (clear)
                {
                    owner.Clear();
                }
                int count = arrayni.mItems.Count;
                for (int i = 0; i < count; i++)
                {
                    Variant v    = arrayni.mItems[i];
                    string  name = v.AsString();
                    i++;
                    if (i >= count)
                    {
                        break;
                    }
                    Variant v2 = arrayni.mItems[i];
                    owner.PropSet(Interface.MEMBERENSURE | Interface.IGNOREPROP, name, v2, owner);
                }
            }
            else
            {
                // otherwise
                if (clear)
                {
                    owner.Clear();
                }
                DictionaryNI.AssignCallback callback = new DictionaryNI.AssignCallback(owner);
                dsp.EnumMembers(Interface.IGNOREPROP, callback, dsp);
            }
        }
Пример #25
0
            /// <exception cref="TjsException"></exception>
            protected internal override int Process(Variant result, Variant[] param, Dispatch2
                                                    objthis)
            {
                ArrayNI ni = (ArrayNI)objthis.GetNativeInstance(ArrayClass.ClassID);

                if (ni == null)
                {
                    return(Error.E_NATIVECLASSCRASH);
                }
                if (param.Length < 1)
                {
                    return(Error.E_BADPARAMCOUNT);
                }
                string name = param[0].AsString();
                string mode = null;

                if (param.Length >= 2 && param[1].IsVoid() == false)
                {
                    mode = param[1].AsString();
                }
                TextWriteStreamInterface stream = Tjs.mStorage.CreateTextWriteStream(name, mode);

                try
                {
                    AList <Dispatch2> stack = new AList <Dispatch2>();
                    stack.AddItem(objthis);
                    ni.SaveStructuredData(stack, stream, string.Empty);
                }
                finally
                {
                    stream.Destruct();
                }
                if (result != null)
                {
                    result.Set(new Variant(objthis, objthis));
                }
                return(Error.S_OK);
            }
Пример #26
0
        // delete member by index number
        /// <exception cref="VariantException"></exception>
        /// <exception cref="TjsException"></exception>
        public override int DeleteMemberByNum(int flag, int num, Dispatch2 objthis)
        {
            if (!GetValidity())
            {
                return(Error.E_INVALIDOBJECT);
            }
            ArrayNI ni = (ArrayNI)objthis.GetNativeInstance(ArrayClass.ClassID);

            if (ni == null)
            {
                return(Error.E_NATIVECLASSCRASH);
            }
            if (num < 0)
            {
                num += ni.mItems.Count;
            }
            if (num < 0 || num >= ni.mItems.Count)
            {
                return(Error.E_MEMBERNOTFOUND);
            }
            ni.mItems.Remove(num);
            return(Error.S_OK);
        }
Пример #27
0
        // operation with member by index number
        /// <exception cref="VariantException"></exception>
        /// <exception cref="TjsException"></exception>
        public override int OperationByNum(int flag, int num, Variant result, Variant param
                                           , Dispatch2 objthis)
        {
            if (!GetValidity())
            {
                return(Error.E_INVALIDOBJECT);
            }
            ArrayNI ni = (ArrayNI)objthis.GetNativeInstance(ArrayClass.ClassID);

            if (ni == null)
            {
                return(Error.E_NATIVECLASSCRASH);
            }
            if (num < 0)
            {
                num += ni.mItems.Count;
            }
            if (num >= ni.mItems.Count)
            {
                if ((flag & Interface.MEMBERMUSTEXIST) != 0)
                {
                    return(Error.E_MEMBERNOTFOUND);
                }
                //ni.mItems.resize(num+1);
                for (int i = ni.mItems.Count; i <= num; i++)
                {
                    ni.mItems.AddItem(new Variant());
                }
            }
            if (num < 0)
            {
                return(Error.E_MEMBERNOTFOUND);
            }
            Variant val = ni.mItems[num];

            return(DefaultOperation(flag, val, result, param, objthis));
        }
Пример #28
0
        /// <exception cref="TjsException"></exception>
        public virtual void Insert(ArrayNI ni, Variant[] val, int num)
        {
            if (num < 0)
            {
                num += ni.mItems.Count;
            }
            if (num < 0)
            {
                throw new TjsException(Error.RangeError);
            }
            int count = ni.mItems.Count;

            if (num > count)
            {
                throw new TjsException(Error.RangeError);
            }
            int end = val.Length;

            ni.mItems.EnsureCapacity(count + end);
            for (int i = 0; i < end; i++)
            {
                ni.mItems.Add(num + i, new Variant(val[i]));
            }
        }
Пример #29
0
        public virtual int Remove(ArrayNI ni, Variant @ref, bool removeall)
        {
            int       count      = 0;
            IntVector todelete   = new IntVector();
            int       arrayCount = ni.mItems.Count;

            for (int i = 0; i < arrayCount; i++)
            {
                Variant v = ni.mItems[i];
                if (@ref.DiscernCompareInternal(v))
                {
                    count++;
                    todelete.Add(i);
                    if (!removeall)
                    {
                        break;
                    }
                }
            }
            // list objects up
            int delCount = todelete.Size();

            for (int i_1 = 0; i_1 < delCount; i_1++)
            {
                int     pos = todelete.Get(i_1);
                Variant v   = ni.mItems[pos];
                v.Clear();
            }
            // remove items found
            for (int i_2 = delCount - 1; i_2 >= 0; i_2--)
            {
                ni.mItems.Remove(todelete.Get(i_2));
            }
            todelete = null;
            return(count);
        }
Пример #30
0
            /// <exception cref="VariantException"></exception>
            protected internal override int Process(Variant result, Variant[] param, Dispatch2
                                                    objthis)
            {
                ArrayNI ni = (ArrayNI)objthis.GetNativeInstance(ArrayClass.ClassID);

                if (ni == null)
                {
                    return(Error.E_NATIVECLASSCRASH);
                }
                int            method  = '+';
                VariantClosure closure = null;

                if (param.Length >= 1 && param[0].IsVoid() != true)
                {
                    if (param[0].IsObject())
                    {
                        closure = param[0].AsObjectClosure();
                        method  = (char)0;
                    }
                    else
                    {
                        string me = param[0].AsString();
                        method = me[0];
                        switch (method)
                        {
                        case '+':
                        case '-':
                        case '0':
                        case '9':
                        case 'a':
                        case 'z':
                        {
                            break;
                        }

                        default:
                        {
                            method = '+';
                            break;
                        }
                        }
                    }
                }
                switch (method)
                {
                case '+':
                {
                    ni.mItems.Sort(new ArrayClass.ArraySortCompare_NormalAscending());
                    break;
                }

                case '-':
                {
                    ni.mItems.Sort(new ArrayClass.ArraySortCompare_NormalDescending());
                    break;
                }

                case '0':
                {
                    ni.mItems.Sort(new ArrayClass.ArraySortCompare_NumericAscending());
                    break;
                }

                case '9':
                {
                    ni.mItems.Sort(new ArrayClass.ArraySortCompare_NumericDescending());
                    break;
                }

                case 'a':
                {
                    ni.mItems.Sort(new ArrayClass.ArraySortCompare_StringAscending());
                    break;
                }

                case 'z':
                {
                    ni.mItems.Sort(new ArrayClass.ArraySortCompare_StringDescending());
                    break;
                }

                case 0:
                {
                    ni.mItems.Sort(new ArrayClass.ArraySortCompare_Functional(closure));
                    break;
                }
                }
                return(Error.S_OK);
            }