public unsafe uint ReadSegments(nsWriteSegmentFun aWriter, IntPtr aClosure, uint aCount)
 {
     int count = (int)Math.Min(aCount, Available());
     if (count == 0) return 0;
     if (Buffer == IntPtr.Zero) return 0;
     int writeCount;
     aWriter(this, aClosure, new IntPtr(CurrentPointer), (int)Position, count, out writeCount);
     MovePointer((uint)count);
     return (uint)writeCount;
 }
示例#2
0
		UInt32 nsIInputStream.ReadSegments(nsWriteSegmentFun aWriter, IntPtr aClosure, UInt32 aCount)
		{
			if (ReferenceEquals(m_BaseStream, null) || !m_BaseStream.CanRead)
			{
				return 0;
			}

			// Get maximum buffer size - the segment size.
			UInt32 segmentSize = GetBufferSize(aCount);
			var segment = new Byte[segmentSize];
			// Read data available for first segment
			Int32 segmentBytesCount = m_BaseStream.Read(segment, 0, segment.Length);
			if (segmentBytesCount > 0)
			{
				// Allocate memory for first and all subsequent segments
				IntPtr segmentPtr = Xpcom.NS_Alloc(segmentSize);
				try
				{
					UInt32 totalBytesConsumed = 0;
					do
					{
						// Write available data to current segment
						Marshal.Copy(segment, 0, segmentPtr, segmentBytesCount);
						UInt32 segmentBytesConsumed = 0;
						UInt32 writeCount = 0;
						// Deliver data from current segment to consumer
						while ((segmentBytesConsumed < segmentBytesCount) && (aWriter(this, aClosure, segmentPtr, totalBytesConsumed, (UInt32)segmentBytesCount, ref writeCount) == nsResult.NS_OK))
						{
							segmentBytesConsumed += writeCount;
							totalBytesConsumed += writeCount;
							writeCount = 0;
						}

						// Get data for next segment
						if (totalBytesConsumed < aCount)
						{
							segmentBytesCount = m_BaseStream.Read(segment, 0, segment.Length);
						}
					}
					while ((totalBytesConsumed < aCount) && (segmentBytesCount > 0));

					return totalBytesConsumed;
				}
				finally
				{
					Xpcom.NS_Free(segmentPtr);
				}
			}

			return 0;
		}
示例#3
0
        public unsafe uint ReadSegments(nsWriteSegmentFun aWriter, IntPtr aClosure, uint aCount)
        {
            int count = (int)Math.Min(aCount, Available());

            if (count == 0)
            {
                return(0);
            }
            if (Buffer == IntPtr.Zero)
            {
                return(0);
            }
            int writeCount;

            aWriter(this, aClosure, new IntPtr(CurrentPointer), (int)Position, count, out writeCount);
            MovePointer((uint)count);
            return((uint)writeCount);
        }
        public unsafe uint ReadSegments(nsWriteSegmentFun aWriter, IntPtr aClosure, uint aCount)
        {
            int length     = (int)Math.Min(aCount, Available());
            int writeCount = 0;

            if (length > 0)
            {
                nsWriteSegmentFun fun = aWriter;

                fixed(byte *data = &_data[_position])
                {
                    fun(this, aClosure, (IntPtr)data, _position, length, out writeCount);
                }

                _position += writeCount;
            }

            return((uint)writeCount);
        }
		public unsafe uint ReadSegments( nsWriteSegmentFun aWriter, IntPtr aClosure, uint aCount )
		{
			int length = ( int ) Math.Min( aCount, Available() );
			int writeCount = 0;

			if ( length > 0 )
			{
				nsWriteSegmentFun fun = aWriter;

				fixed (byte* data = &_data[_position])
				{
					fun(this, aClosure, (IntPtr)data, _position, length, out writeCount);
				}

				_position += writeCount;
			}

			return ( uint ) writeCount;
		}
示例#6
0
        public uint ReadSegments(nsWriteSegmentFun aWriter, IntPtr aClosure, uint aCount)
        {
#warning implement it
            return(0);
        }
		public uint ReadSegments( nsWriteSegmentFun aWriter, IntPtr aClosure, uint aCount )
		{
			return 0;
		}
示例#8
0
 public uint ReadSegments(nsWriteSegmentFun aWriter, IntPtr aClosure, uint aCount)
 {
     return(0);
 }