private static unsafe Status EntryFixup(Entry entry, EntryBuffer* bufferPtr, byte[] buffer)
 {
     bufferPtr._OffsetExtension = (bufferPtr._OffsetExtension == IntPtr.Zero) ? IntPtr.Zero : ((IntPtr) ((long) ((((void*) bufferPtr._OffsetExtension) - bufferPtr) / 1)));
     bufferPtr._OffsetFileName = (bufferPtr._OffsetFileName == IntPtr.Zero) ? IntPtr.Zero : ((IntPtr) ((long) ((((void*) bufferPtr._OffsetFileName) - bufferPtr) / 1)));
     bufferPtr._OffsetHeaderInfo = (bufferPtr._OffsetHeaderInfo == IntPtr.Zero) ? IntPtr.Zero : ((IntPtr) ((long) ((((void*) bufferPtr._OffsetHeaderInfo) - bufferPtr) / 1)));
     bufferPtr._OffsetSourceUrlName = (bufferPtr._OffsetSourceUrlName == IntPtr.Zero) ? IntPtr.Zero : ((IntPtr) ((long) ((((void*) bufferPtr._OffsetSourceUrlName) - bufferPtr) / 1)));
     entry.Info = bufferPtr[0];
     entry.OriginalUrl = GetEntryBufferString((void*) bufferPtr, (int) bufferPtr._OffsetSourceUrlName);
     entry.Filename = GetEntryBufferString((void*) bufferPtr, (int) bufferPtr._OffsetFileName);
     entry.FileExt = GetEntryBufferString((void*) bufferPtr, (int) bufferPtr._OffsetExtension);
     return GetEntryHeaders(entry, bufferPtr, buffer);
 }
 private static unsafe Status GetEntryHeaders(Entry entry, EntryBuffer* bufferPtr, byte[] buffer)
 {
     entry.Error = Status.Success;
     entry.MetaInfo = null;
     if (((bufferPtr._OffsetHeaderInfo == IntPtr.Zero) || (bufferPtr.HeaderInfoChars == 0)) || ((bufferPtr.EntryType & EntryType.UrlHistory) != 0))
     {
         return Status.Success;
     }
     int num = bufferPtr.HeaderInfoChars + (((int) bufferPtr._OffsetHeaderInfo) / 2);
     if ((num * 2) > entry.MaxBufferBytes)
     {
         num = entry.MaxBufferBytes / 2;
     }
     while (*(((ushort*) (bufferPtr + ((num - 1) * 2)))) == 0)
     {
         num--;
     }
     entry.MetaInfo = Encoding.Unicode.GetString(buffer, (int) bufferPtr._OffsetHeaderInfo, (num - (((int) bufferPtr._OffsetHeaderInfo) / 2)) * 2);
     return entry.Error;
 }
예제 #3
0
        //
        // Does the fixup of the returned buffer by converting internal pointer to offsets
        // it also does copying of non-string values from unmanaged buffer to Entry.Buffer members
        //
        unsafe private static Status EntryFixup(Entry entry, EntryBuffer* bufferPtr, byte[] buffer) {
            unchecked {
                bufferPtr->_OffsetExtension     = bufferPtr->_OffsetExtension == IntPtr.Zero? IntPtr.Zero: (IntPtr)((byte*)bufferPtr->_OffsetExtension - (byte*)bufferPtr);
                bufferPtr->_OffsetFileName      = bufferPtr->_OffsetFileName == IntPtr.Zero? IntPtr.Zero: (IntPtr)((byte*)bufferPtr->_OffsetFileName - (byte*)bufferPtr);
                bufferPtr->_OffsetHeaderInfo    = bufferPtr->_OffsetHeaderInfo == IntPtr.Zero? IntPtr.Zero: (IntPtr)((byte*)bufferPtr->_OffsetHeaderInfo - (byte*)bufferPtr);
                bufferPtr->_OffsetSourceUrlName = bufferPtr->_OffsetSourceUrlName == IntPtr.Zero? IntPtr.Zero: (IntPtr)((byte*)bufferPtr->_OffsetSourceUrlName - (byte*)bufferPtr);

                // Get a managed EntryBuffer copy out of byte[]
                entry.Info = *bufferPtr;
                entry.OriginalUrl   = GetEntryBufferString(bufferPtr, (int)(bufferPtr->_OffsetSourceUrlName));
                entry.Filename      = GetEntryBufferString(bufferPtr, (int)(bufferPtr->_OffsetFileName));
                entry.FileExt       = GetEntryBufferString(bufferPtr, (int)(bufferPtr->_OffsetExtension));
            }
            return GetEntryHeaders(entry, bufferPtr, buffer);
        }
예제 #4
0
        //
        // Gets the headers and optionally other meta data out of a cached entry
        //
        // Whenever an empty line found in the buffer, the resulting array of
        // collections will grow in size
        //
        private static unsafe Status GetEntryHeaders(Entry entry, EntryBuffer* bufferPtr, byte[] buffer) {
            entry.Error = Status.Success;
            entry.MetaInfo = null;

            //
            if (bufferPtr->_OffsetHeaderInfo == IntPtr.Zero || bufferPtr->HeaderInfoChars == 0 || (bufferPtr->EntryType & EntryType.UrlHistory) != 0) {
                return Status.Success;
            }

            int bufferCharLength = bufferPtr->HeaderInfoChars + ((int)(bufferPtr->_OffsetHeaderInfo))/c_CharSz;
            if (bufferCharLength*c_CharSz > entry.MaxBufferBytes) {
                // WinInet bug? They may report offset+HeaderInfoChars as a greater value than MaxBufferBytes as total buffer size.
                // Actually, the last one seems to be accurate based on the data we have provided for Commit.
                bufferCharLength = entry.MaxBufferBytes/c_CharSz;
            }
            //WinInet may put terminating nulls at the end of the buffer, remove them.
            while (((char*)bufferPtr)[bufferCharLength-1] == 0)
                {--bufferCharLength;}
            entry.MetaInfo = Encoding.Unicode.GetString(buffer, (int)bufferPtr->_OffsetHeaderInfo, (bufferCharLength-(int)bufferPtr->_OffsetHeaderInfo/2)*2);
            return entry.Error;
        }
예제 #5
0
        //
        // Gets the headers and optionally other meta data out of a cached entry
        //
        // Whenever an empty line found in the buffer, the resulting array of
        // collections will grow in size
        //
        private static unsafe Status GetEntryHeaders(Entry entry, EntryBuffer* bufferPtr, byte[] buffer) {
            entry.Error = Status.Success;
            entry.MetaInfo = null;

            //
            if (bufferPtr->_OffsetHeaderInfo == IntPtr.Zero || bufferPtr->HeaderInfoChars == 0 || (bufferPtr->EntryType & EntryType.UrlHistory) != 0) {
                return Status.Success;
            }

            int bufferCharLength = bufferPtr->HeaderInfoChars + ((int)(bufferPtr->_OffsetHeaderInfo))/c_CharSz;
            if (bufferCharLength*c_CharSz > entry.MaxBufferBytes) {
                // WinInet 

                bufferCharLength = entry.MaxBufferBytes/c_CharSz;
            }
            //WinInet may put terminating nulls at the end of the buffer, remove them.
            while (((char*)bufferPtr)[bufferCharLength-1] == 0)
                {--bufferCharLength;}
            entry.MetaInfo = Encoding.Unicode.GetString(buffer, (int)bufferPtr->_OffsetHeaderInfo, (bufferCharLength-(int)bufferPtr->_OffsetHeaderInfo/2)*2);
            return entry.Error;
        }