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; }
// // 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); }
// // 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; }
// // 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; }