Пример #1
0
 public ProviderManifest(byte[] serializedManifest, ManifestEnvelope.ManifestFormats format, byte majorVersion, byte minorVersion)
 {
     this.serializedManifest = serializedManifest;
     this.majorVersion = majorVersion;
     this.minorVersion = minorVersion;
     this.format = format;
 }
Пример #2
0
 void IFastSerializable.FromStream(Deserializer deserializer)
 {
     deserializer.Read(out majorVersion);
     deserializer.Read(out minorVersion);
     format = (ManifestEnvelope.ManifestFormats) deserializer.ReadInt();
     int count = deserializer.ReadInt();
     serializedManifest = new byte[count];
     for (int i = 0; i < count; i++)
         serializedManifest[i] = deserializer.ReadByte();
     Init();
 }
Пример #3
0
        internal unsafe ProviderManifest AddChunk(TraceEvent data)
        {
            if (provider != null)
                return null;

            // TODO
            if (data.EventDataLength <= sizeof(ManifestEnvelope) || data.GetByteAt(3) != 0x5B)  // magic number
                return null;

            ushort totalChunks = (ushort)data.GetInt16At(4);
            ushort chunkNum = (ushort)data.GetInt16At(6);
            if (chunkNum >= totalChunks || totalChunks == 0)
                return null;

            if (Chunks == null)
            {
                format = (ManifestEnvelope.ManifestFormats)data.GetByteAt(0);
                majorVersion = (byte)data.GetByteAt(1);
                minorVersion = (byte)data.GetByteAt(2);
                ChunksLeft = totalChunks;
                Chunks = new byte[ChunksLeft][];
            }
            else
            {
                // Chunks have to agree with the format and version information.
                if (format != (ManifestEnvelope.ManifestFormats)data.GetByteAt(0) ||
                    majorVersion != data.GetByteAt(1) || minorVersion == data.GetByteAt(2))
                    return null;
            }

            if (Chunks[chunkNum] != null)
                return null;

            byte[] chunk = new byte[data.EventDataLength - 8];
            Chunks[chunkNum] = data.EventData(chunk, 0, 8, chunk.Length);
            --ChunksLeft;
            if (ChunksLeft > 0)
                return null;

            // OK we have a complete set of chunks
            byte[] serializedData = Chunks[0];
            if (Chunks.Length > 1)
            {
                int totalLength = 0;
                for (int i = 0; i < Chunks.Length; i++)
                    totalLength += Chunks[i].Length;

                // Concatinate all the arrays.
                serializedData = new byte[totalLength];
                int pos = 0;
                for (int i = 0; i < Chunks.Length; i++)
                {
                    Array.Copy(Chunks[i], 0, serializedData, pos, Chunks[i].Length);
                    pos += Chunks[i].Length;
                }
            }
            Chunks = null;
            // string str = Encoding.UTF8.GetString(serializedData);
            provider = new ProviderManifest(serializedData, format, majorVersion, minorVersion);
            return provider;
        }
            internal unsafe ProviderManifest AddChunk(TraceEvent data)
            {
                //SLAB update
                //removed check to allow recomputing new manifest on any new incoming chunk 
                //if (provider != null)
                //    return null;

                // TODO 
                if (data.EventDataLength <= sizeof(ManifestEnvelope) || data.GetByteAt(3) != 0x5B)  // magic number 
                    return null;

                ushort totalChunks = (ushort)data.GetInt16At(4);
                ushort chunkNum = (ushort)data.GetInt16At(6);
                if (chunkNum >= totalChunks || totalChunks == 0)
                    return null;

                // SLAB update
                if (Chunks == null || (lastChunkReceptionTime.HasValue && lastChunkReceptionTime.Value.Add(ChunkReceptionStalePeriod) < DateTime.Now))
                {
                    format = (ManifestEnvelope.ManifestFormats)data.GetByteAt(0);
                    majorVersion = (byte)data.GetByteAt(1);
                    minorVersion = (byte)data.GetByteAt(2);
                    ChunksLeft = totalChunks;
                    Chunks = new byte[ChunksLeft][];
                }
                else
                {
                    // Chunks have to agree with the format and version information. 
                    if (format != (ManifestEnvelope.ManifestFormats)data.GetByteAt(0) ||
                        majorVersion != data.GetByteAt(1) || minorVersion != data.GetByteAt(2))
                        return null;
                }

                if (Chunks[chunkNum] != null)
                    return null;

                byte[] chunk = new byte[data.EventDataLength - 8];
                Chunks[chunkNum] = data.EventData(chunk, 0, 8, chunk.Length);
                --ChunksLeft;
                lastChunkReceptionTime = DateTime.Now;  // SLAB update

                if (ChunksLeft > 0)
                    return null;

                // OK we have a complete set of chunks
                byte[] serializedData = Chunks[0];
                if (Chunks.Length > 1)
                {
                    int totalLength = 0;
                    for (int i = 0; i < Chunks.Length; i++)
                        totalLength += Chunks[i].Length;

                    // Concatinate all the arrays. 
                    serializedData = new byte[totalLength];
                    int pos = 0;
                    for (int i = 0; i < Chunks.Length; i++)
                    {
                        Array.Copy(Chunks[i], 0, serializedData, pos, Chunks[i].Length);
                        pos += Chunks[i].Length;
                    }
                }
                Chunks = null;
                lastChunkReceptionTime = null;  // SLAB update
                // string str = Encoding.UTF8.GetString(serializedData);
                provider = new ProviderManifest(serializedData, format, majorVersion, minorVersion);
                provider.ISDynamic = true;
                return provider;
            }
Пример #5
0
 public ProviderManifest(byte[] serializedManifest, ManifestEnvelope.ManifestFormats format, byte majorVersion, byte minorVersion)
 {
     this.serializedManifest = serializedManifest;
 }
Пример #6
0
        internal unsafe ProviderManifest AddChunk(TraceEvent data)
        {
            if (provider != null)
            {
                return(null);
            }

            if (data.EventDataLength <= sizeof(ManifestEnvelope) || data.GetByteAt(3) != 0x5B)  // magic number
            {
                return(null);
            }

            ushort totalChunks = (ushort)data.GetInt16At(4);
            ushort chunkNum    = (ushort)data.GetInt16At(6);

            if (chunkNum >= totalChunks || totalChunks == 0)
            {
                return(null);
            }

            if (Chunks == null)
            {
                format       = (ManifestEnvelope.ManifestFormats)data.GetByteAt(0);
                majorVersion = (byte)data.GetByteAt(1);
                minorVersion = (byte)data.GetByteAt(2);
                ChunksLeft   = totalChunks;
                Chunks       = new byte[ChunksLeft][];
            }
            else
            {
                // Chunks have to agree with the format and version information.
                if (format != (ManifestEnvelope.ManifestFormats)data.GetByteAt(0) ||
                    majorVersion != data.GetByteAt(1) || minorVersion == data.GetByteAt(2))
                {
                    return(null);
                }
            }

            if (Chunks[chunkNum] != null)
            {
                return(null);
            }

            byte[] chunk = new byte[data.EventDataLength - 8];
            Chunks[chunkNum] = data.EventData(chunk, 0, 8, chunk.Length);
            --ChunksLeft;
            if (ChunksLeft > 0)
            {
                return(null);
            }

            // OK we have a complete set of chunks
            byte[] serializedData = Chunks[0];
            if (Chunks.Length > 1)
            {
                int totalLength = 0;
                for (int i = 0; i < Chunks.Length; i++)
                {
                    totalLength += Chunks[i].Length;
                }

                // Concatinate all the arrays.
                serializedData = new byte[totalLength];
                int pos = 0;
                for (int i = 0; i < Chunks.Length; i++)
                {
                    Array.Copy(Chunks[i], 0, serializedData, pos, Chunks[i].Length);
                    pos += Chunks[i].Length;
                }
            }
            Chunks = null;
            // string str = Encoding.UTF8.GetString(serializedData);
            provider = new ProviderManifest(serializedData, format, majorVersion, minorVersion);
            return(provider);
        }
Пример #7
0
        internal unsafe byte[] AddChunk(byte[] data)
        {
            int dataLen = data.Length;

            if (dataLen <= sizeof(ManifestEnvelope) || data[3] != MagicNumber)  // magic number
            {
                goto Fail;
            }

            ushort totalChunks = BitConverter.ToUInt16(data, 4);
            ushort chunkNum    = BitConverter.ToUInt16(data, 6);

            if (chunkNum >= totalChunks || totalChunks == 0)
            {
                goto Fail;
            }

            if (Chunks == null)
            {
                // To allow for resyncing at 0, otherwise we fail aggressively.
                if (chunkNum != 0)
                {
                    goto Fail;
                }

                format       = (ManifestEnvelope.ManifestFormats)data[0];
                majorVersion = (byte)data[1];
                minorVersion = (byte)data[2];
                ChunksLeft   = totalChunks;
                Chunks       = new byte[ChunksLeft][];
            }
            else
            {
                // Chunks have to agree with the format and version information.
                if (format != (ManifestEnvelope.ManifestFormats)data[0] ||
                    majorVersion != data[1] || minorVersion != data[2])
                {
                    goto Fail;
                }
            }

            if (Chunks.Length <= chunkNum || Chunks[chunkNum] != null)
            {
                goto Fail;
            }

            byte[] chunk = new byte[dataLen - HeaderSizeInBytes];
            Buffer.BlockCopy(data, HeaderSizeInBytes, chunk, 0, chunk.Length);
            Chunks[chunkNum] = chunk;
            --ChunksLeft;
            if (ChunksLeft > 0)
            {
                return(null);
            }

            // OK we have a complete set of chunks
            byte[] serializedData = null;
            if (Chunks.Length > 1)
            {
                int totalLength = 0;
                for (int i = 0; i < Chunks.Length; i++)
                {
                    totalLength += Chunks[i].Length;
                }

                // Concatenate all the arrays.
                serializedData = new byte[totalLength];
                int pos = 0;
                for (int i = 0; i < Chunks.Length; i++)
                {
                    Array.Copy(Chunks[i], 0, serializedData, pos, Chunks[i].Length);
                    pos += Chunks[i].Length;
                }
            }
            else
            {
                serializedData = Chunks[0];
            }

            Chunks = null;
            return(serializedData);

Fail:
            Chunks = null;
            return(null);
        }