Exemple #1
0
        public uint ExportSize(object srcObj, bool bHavMag, Type objType)
        {
            if (srcObj == null)
            {
                return(0);
            }
            Type t = objType;

            FieldInfo[] fiarr = t.GetFields();
            if (fiarr == null)
            {
                return(0);
            }
            uint nExportSize = 0;

            if (bHavMag)
            {
                nExportSize += 4;
            }
            uint nCount = (uint)fiarr.GetLength(0);

            for (uint i = 0; i < nCount; i++)
            {
                object poValue = fiarr[i].GetValue(srcObj);
                Type   itt     = fiarr[i].FieldType;
                if (!itt.IsPublic)
                {
                    continue;
                }
                //一般Reserved只放在第一个成员,为加速优化
                if (i == 0)
                {
                    if (itt == typeof(Reserved))
                    {
                        continue;
                    }
                }
                nExportSize += 4;
                if (poValue == null)
                {
                    continue;
                }
                if (itt == typeof(string))
                {
                    UniStruct.UniSZ pValue = new UniStruct.UniSZ((string)poValue);
                    nExportSize += pValue.Size();
                }
                else if (itt == typeof(uint) || itt == typeof(uint?) || itt.IsEnum || (itt.IsSerializable && !itt.IsArray))
                {
                    nExportSize += 4;
                }
                else
                {
                    uint nSize = 0;
                    if (itt.IsArray)
                    {
                        CUniStructArrayCS cacs     = new CUniStructArrayCS();
                        object            poValue2 = fiarr[i].GetValue(srcObj);
                        nSize = cacs.ExportSize(poValue2, itt);
                    }
                    else
                    {
                        nSize = ExportSize(poValue, true, itt);
                    }

                    nExportSize += nSize;
                }
            }
            return((uint)nExportSize);
        }
Exemple #2
0
        public uint Export(object srcObj, bool bHavMag, ref byte[] pOut, uint _nIndex, Type objType)
        {
            if (srcObj == null || pOut == null || pOut.Length < _nIndex + 4)
            {
                return(0);
            }
            Type t = objType;

            string[] sfiarr = UniWebLib.Struct_ST.GetStructMember(t.Name);

            if (sfiarr == null)
            {
                return(0);
            }
            uint nIndex = _nIndex;

            if (bHavMag)
            {
                uint2byte((uint)UNISMAG.UNISTRUCT, ref pOut, nIndex); nIndex += 4;
            }
            uint nCount = (uint)sfiarr.Length - 1;

            for (uint i = 0; i < nCount; i++)
            {
                FieldInfo fino = t.GetField(sfiarr[i]);
                if (fino == null)
                {
                    continue;
                }

                object poValue = fino.GetValue(srcObj);
                Type   itt     = fino.FieldType;
                if (!itt.IsPublic)
                {
                    continue;
                }
                //一般Reserved只放在第一个成员,为加速优化
                if (i == 0)
                {
                    if (itt == typeof(Reserved))
                    {
                        continue;
                    }
                }
                if (itt == typeof(string))
                {
                    if (pOut.Length < nIndex + 4)
                    {
                        return(0);
                    }

                    //对进行Html编码
                    string szValue         = (string)poValue;
                    string szFieldNameTemp = sfiarr[i];
                    //todo
                    if (!string.IsNullOrEmpty(szValue) && (!(szFieldNameTemp == "szPassword" || szFieldNameTemp == "szPasswd" || szFieldNameTemp == "szNewPw" || szFieldNameTemp == "szOldPw" || szFieldNameTemp == "szCurAdminPw")))
                    {
                        szValue = szValue.Replace("'", "‘");
                        //  szValue = szValue.Replace(";", ";");
                        szValue = szValue.Replace(",", ",");
                        szValue = szValue.Replace("?", "?");
                        szValue = szValue.Replace("<", "<");
                        szValue = szValue.Replace(">", ">");
                        szValue = szValue.Replace("(", "(");
                        szValue = szValue.Replace(")", ")");
                        //  szValue = szValue.Replace("@", "@");
                        szValue = szValue.Replace("=", "=");
                        szValue = szValue.Replace("+", "+");
                        szValue = szValue.Replace("*", "*");
                        szValue = szValue.Replace("&", "&");
                        szValue = szValue.Replace("#", "#");
                        szValue = szValue.Replace("%", "%");
                        szValue = szValue.Replace("--", "——");
                        poValue = szValue;
                    }


                    if (poValue != null && (string)poValue != "[NULL]")
                    {
                        UniStruct.UniSZ pValue = new UniStruct.UniSZ((string)poValue);
                        uint2byte((uint)pValue.m_dwType, ref pOut, nIndex); nIndex += 4;
                        if (pOut.Length < nIndex + pValue.Size())
                        {
                            return(0);
                        }
                        Array.Copy(pValue.Get(), 0, pOut, nIndex, pValue.Size());
                        nIndex += pValue.Size();
                    }
                    else
                    {
                        uint2byte((uint)UTFLAG.DEFUNISZTYPE, ref pOut, nIndex); nIndex += 4;
                    }
                }
                else if (itt == typeof(uint) || itt == typeof(uint?) || itt.IsEnum || (itt.IsSerializable && !itt.IsArray))
                {
                    if (pOut.Length < nIndex + 4)
                    {
                        return(0);
                    }
                    //if (poValue != null && ((uint)poValue != uint.MaxValue))
                    if (poValue != null)
                    {
                        UniStruct.UniDW pValue = new UniStruct.UniDW((uint)poValue);
                        uint2byte((uint)pValue.m_dwType, ref pOut, nIndex); nIndex += 4;

                        if (pOut.Length < nIndex + 4)
                        {
                            return(0);
                        }
                        uint2byte((uint)pValue.m_dwValue, ref pOut, nIndex); nIndex += 4;
                    }
                    else
                    {
                        uint2byte((uint)UTFLAG.DEFUNIDWTYPE, ref pOut, nIndex); nIndex += 4;
                    }
                }
                else
                {
                    uint nSize = 0;
                    if (itt.IsArray)
                    {
                        CUniStructArrayCS cacs     = new CUniStructArrayCS();
                        object            poValue2 = fino.GetValue(srcObj);
                        byte[]            bytes    = cacs.Export(poValue2, itt);
                        nSize = (uint)bytes.Length;
                        Array.Copy(bytes, 0, pOut, nIndex + 4, nSize);
                    }
                    else
                    {
                        nSize = Export(poValue, true, ref pOut, nIndex + 4, itt);
                    }
                    uint2byte(nSize | (uint)UTFLAG.UTSTREAM | (uint)UTFLAG.UTVALID | (uint)UTFLAG.UTFILL, ref pOut, nIndex); nIndex += 4;
                    nIndex += nSize;
                }
            }
            return(nIndex - _nIndex);
        }
Exemple #3
0
        public uint Import(out object destObj, byte[] pBuffer, uint _nIndex, bool bHavMag, Type objType)
        {
            destObj = Activator.CreateInstance(objType);
            uint nIndex = _nIndex;

            try
            {
                if (pBuffer == null)
                {
                    throw(new Exception("0"));
                }
                Type     t      = objType;
                string[] sfiarr = UniWebLib.Struct_ST.GetStructMember(t.Name);

                if (sfiarr == null)
                {
                    FieldInfo[] ttfiarr = objType.GetFields();
                    sfiarr = new string[ttfiarr.Length];
                    for (int fi = 0; fi < ttfiarr.Length; fi++)
                    {
                        sfiarr[fi] = ttfiarr[fi].Name;
                    }
                    //throw (new Exception("1," + t.Name));
                }
                if (bHavMag)
                {
                    if (pBuffer.Length < nIndex + 4)
                    {
                        throw(new Exception("2"));
                    }
                    uint nValue = byte2uint(pBuffer, nIndex); nIndex += 4;
                    if (nValue != (uint)UNISMAG.UNISTRUCT)
                    {
                        throw(new Exception("3,nIndex=" + nIndex));
                    }
                }
                uint nCount = (uint)sfiarr.Length;
                for (uint i = 0; i < nCount; i++)
                {
                    if (sfiarr[i] == "")
                    {
                        continue;
                    }

                    FieldInfo fino = t.GetField(sfiarr[i]);
                    if (fino == null)
                    {
                        continue;
                    }

                    Type itt = fino.FieldType;

                    if (!itt.IsPublic)
                    {
                        continue;
                    }
                    //一般Reserved只放在第一个成员,为加速优化
                    if (i == 0)
                    {
                        if (itt == typeof(Reserved))
                        {
                            continue;
                        }
                    }

                    if (pBuffer.Length < nIndex + 4)
                    {
                        throw(new Exception("4"));
                    }
                    UTFLAG dwFType = (UTFLAG)byte2uint(pBuffer, nIndex); nIndex += 4;

                    //Logger.Trace("Type="+itt.ToString()+",Name="+fino.Name+",dwFType="+dwFType.ToString("x"));
                    if (itt == typeof(string))
                    {
                        if (((uint)dwFType & (uint)UTFLAG.UTSTREAM) == 0)
                        {
                            throw (new Exception("5," + objType.Name + "." + fino.Name + "(i=" + i.ToString() + ":nIndex=" + nIndex.ToString() + ")类型错误:dwFType=" + dwFType.ToString("x")));
                        }

                        uint nSize = (uint)(dwFType & (UTFLAG)UTMASK.UTSIZEMASK);;
                        if ((dwFType & UTFLAG.UTFILL) == 0)
                        {
                            nSize = 0;
                        }
                        if (pBuffer.Length < nIndex + nSize)
                        {
                            throw(new Exception("6,pBuffer.Length=" + pBuffer.Length + ",nIndex=" + nIndex + ",dwFType=" + dwFType));
                        }
                        if (((dwFType & UTFLAG.UTFILL) != 0) &&
                            ((dwFType & UTFLAG.UTLOCK) == 0)
                            )
                        {
                            UniStruct.UniSZ newValue = new UniStruct.UniSZ();
                            newValue.Set(pBuffer, nIndex, nSize); nIndex += nSize;
                            //todo
                            //对html进行解码
                            //  string newValueTemp = newValue.ToString();
                            // newValueTemp = System.Web.HttpContext.Current.Server.HtmlDecode(newValueTemp);
                            // fino.SetValueDirect(__makeref(destObj), newValueTemp);

                            fino.SetValueDirect(__makeref(destObj), newValue.ToString());
                        }
                        else
                        {
                            if (((dwFType & UTFLAG.UTFILL) != 0) &&
                                ((dwFType & UTFLAG.UTLOCK) == 0))
                            {
                                nIndex += nSize;
                            }
                        }
                    }
                    else if (itt == typeof(uint) || itt == typeof(uint?) || itt.IsEnum || (itt.IsSerializable && !itt.IsArray))
                    {
                        if (((dwFType & UTFLAG.UTFILL) != 0) &&
                            ((dwFType & UTFLAG.UTLOCK) == 0)
                            )
                        {
                            if (pBuffer.Length < nIndex + 4)
                            {
                                throw(new Exception("8"));
                            }
                            uint nValue = byte2uint(pBuffer, nIndex); nIndex += 4;
                            if (itt.IsEnum)
                            {
                                Object enumobj = System.Enum.ToObject(itt, nValue);
                                fino.SetValueDirect(__makeref(destObj), enumobj);
                            }
                            else
                            {
                                fino.SetValueDirect(__makeref(destObj), nValue);
                            }
                        }
                        else
                        {
                            if (((dwFType & UTFLAG.UTFILL) != 0) &&
                                ((dwFType & UTFLAG.UTLOCK) == 0))
                            {
                                nIndex += 4;
                            }
                        }
                    }
                    else
                    {
                        object subobj;
                        uint   nSize = (uint)(dwFType & (UTFLAG)UTMASK.UTSIZEMASK);
                        if (nSize > 0)
                        {
                            if (itt.IsArray)
                            {
                                CUniStructArrayCS CSUSA = new CUniStructArrayCS();
                                if (CSUSA.Import(out subobj, pBuffer, nIndex, itt) != nSize)
                                {
                                    //
                                }
                            }
                            else
                            {
                                if (Import(out subobj, pBuffer, nIndex, true, itt) != nSize)
                                {
                                    //
                                }
                            }
                            fino.SetValueDirect(__makeref(destObj), subobj);
                        }
                        nIndex += nSize;
                    }
                }
            }
            catch (Exception e)
            {
                Logger.Trace("UniStruct.Import faild:" + e.Message + "," + e.ToString());
                return(0);
            }
            return((uint)nIndex - _nIndex);
        }