Пример #1
0
        internal static MKAFile ConvertToSharedClass(FileClass v)
        {
            var toret = new MKAFile()
            {
                ApplicationName = v.ApplicationName,
                Description     = v.Description,
                Objects         = new Dictionary <string, MKAObjectData>()
            };

            foreach (var d in v.Objects)
            {
                toret.Objects.Add(d.Key, ConvertToSharedObjectData(d.Value));
            }

            return(toret);
        }
Пример #2
0
        public static FileClass Parse(Stream mkad, bool CollectGC = true)
        {
            if (mkad.Length < 18)
            {
                throw new Exception("Invalid format");
            }

            mkad.Position = 0;

            #region ReadFileStaticHeader

            byte[] mkadfilestaticheader1 = new byte[DefaultStaticFileHeader.Length];
            mkad.Read(mkadfilestaticheader1, 0, DefaultStaticFileHeader.Length);
            if (!mkadfilestaticheader1.SequenceEqual(DefaultStaticFileHeader))
            {
                throw new Exception("Invalid format");
            }

            byte[] mkadfileversion = new byte[1];
            mkad.Read(mkadfileversion, 0, 1);
            if (mkadfileversion[0] != 0x01)
            {
                throw new Exception("Not mkafile v0.1Beta File");
            }

            #endregion ReadFileStaticHeader

            var fc = new FileClass();

            #region ReadAppNameHeader

            byte[] size_byte_raw = new byte[1];
            mkad.Read(size_byte_raw, 0, 1);

            ushort size          = Convert.ToUInt16(size_byte_raw[0]);
            byte[] data_byte_raw = new byte[size];
            mkad.Read(data_byte_raw, 0, size);

            fc.ApplicationName = Encoding.ASCII.GetString(data_byte_raw);

            #endregion ReadAppNameHeader

            #region ReadDescriptionHeader

            size_byte_raw = new byte[2];
            mkad.Read(size_byte_raw, 0, 2);

            size          = BitConverter.ToUInt16(size_byte_raw, 0);
            data_byte_raw = new byte[size];
            mkad.Read(data_byte_raw, 0, size);

            fc.Description = Encoding.ASCII.GetString(data_byte_raw);

            #endregion ReadDescriptionHeader

            int ObjectMinSize = 7;

            Dictionary <string, ObjectData> FoundData = new Dictionary <string, ObjectData>();
            while (mkad.Length - mkad.Position > ObjectMinSize)
            {
                #region GetObjectName

                byte[] oname_size_raw = new byte[4];
                mkad.Read(oname_size_raw, 0, 4);
                int oname_size = BitConverter.ToInt32(oname_size_raw, 0);
                if (oname_size < 1)
                {
                    throw new Exception("Invalid Object Size");
                }

                byte[] oname_raw = new byte[oname_size];
                mkad.Read(oname_raw, 0, oname_size);
                string ObjectName = Encoding.UTF8.GetString(oname_raw);

                #endregion GetObjectName

                #region GetObject

                byte[] otype = new byte[1];
                mkad.Read(otype, 0, 1);

                var od = new ObjectData()
                {
                    DataType = GetDataType(otype[0]),
                    IsNull   = false,
                };
                byte[] rawdata = null;

                switch (od.DataType)
                {
                case DataTypes.empty:
                    byte[] aotype = new byte[1];
                    mkad.Read(aotype, 0, 1);
                    od.DataType = GetDataType(aotype[0]);
                    od.IsNull   = true;
                    break;

                case DataTypes.boolean:
                    rawdata = new byte[1];
                    mkad.Read(rawdata, 0, 1);
                    if (rawdata[0] != 0x00 && rawdata[1] != 0x01)
                    {
                        throw new Exception("Invalid Data Exception");
                    }
                    break;

                case DataTypes.int32:
                case DataTypes.uint32:
                    rawdata = new byte[4];
                    mkad.Read(rawdata, 0, 4);
                    break;

                case DataTypes.int64:
                case DataTypes.uint64:
                    rawdata = new byte[8];
                    mkad.Read(rawdata, 0, 8);
                    break;

                case DataTypes.binary:
                case DataTypes.utf8:
                    byte[] obj_len = new byte[4];
                    mkad.Read(obj_len, 0, 4);
                    int objsize = BitConverter.ToInt32(obj_len, 0);
                    if (objsize < 1)
                    {
                        throw new Exception("Invalid Object Size");
                    }
                    rawdata = new byte[objsize];
                    mkad.Read(rawdata, 0, objsize);
                    break;

                default: throw new Exception("Not supported data type");
                }

                od.RawData = rawdata;
                FoundData.Add(ObjectName, od);

                #endregion GetObject
            }
            fc.Objects = FoundData;

            if (CollectGC)
            {
                GC.Collect();
            }

            return(fc);
        }
Пример #3
0
        public static void CreateStreamed(FileClass fc, Stream s, bool CollectGC = true)
        {
            s.Position = 0;

            s.Write(DefaultStaticFileHeader, 0, DefaultStaticFileHeader.Length);
            s.Write(new byte[] { 0x01 }, 0, 1);

            byte[] appname_byte = Encoding.ASCII.GetBytes(fc.ApplicationName);
            byte[] desc_byte    = Encoding.ASCII.GetBytes(fc.Description);

            byte[] appnamelen_byte = { Convert.ToByte((ushort)appname_byte.Length) };
            byte[] desclen_byte    = BitConverter.GetBytes((ushort)desc_byte.Length);

            s.Write(appnamelen_byte, 0, 1);
            s.Write(appname_byte, 0, appname_byte.Length);
            s.Write(desclen_byte, 0, 2);
            s.Write(desc_byte, 0, desc_byte.Length);

            foreach (var d in fc.Objects)
            {
                byte[] vname_byte    = Encoding.UTF8.GetBytes(d.Key);
                byte[] vnamelen_byte = BitConverter.GetBytes(vname_byte.Length);
                s.Write(vnamelen_byte, 0, 4);
                s.Write(vname_byte, 0, vname_byte.Length);

                var ii = d.Value;

                DataTypes writedt = ii.IsNull ? DataTypes.empty : ii.DataType;

                byte[] vtype_byte = { GetDataType(writedt) };
                s.Write(vtype_byte, 0, 1);
                switch (writedt)
                {
                case DataTypes.empty:
                    byte[] avtype = { GetDataType(ii.DataType) };
                    s.Write(avtype, 0, 1);
                    break;

                case DataTypes.boolean:
                    s.Write(ii.RawData, 0, 1);
                    break;

                case DataTypes.int32:
                case DataTypes.uint32:
                    s.Write(ii.RawData, 0, 4);
                    break;

                case DataTypes.int64:
                case DataTypes.uint64:
                    s.Write(ii.RawData, 0, 8);
                    break;

                case DataTypes.binary:
                case DataTypes.utf8:
                    byte[] olen_byte = BitConverter.GetBytes(ii.RawData.Length);
                    s.Write(olen_byte, 0, 4);
                    s.Write(ii.RawData, 0, ii.RawData.Length);
                    break;

                default:
                    throw new Exception("Unknown Error");
                }
            }

            s.Flush();
            if (CollectGC)
            {
                GC.Collect();
            }
        }