summaryrefslogtreecommitdiff
path: root/filters.cpp
diff options
context:
space:
mode:
authorweidai <weidai@57ff6487-cd31-0410-9ec3-f628ee90f5f0>2006-07-30 17:15:01 +0000
committerweidai <weidai@57ff6487-cd31-0410-9ec3-f628ee90f5f0>2006-07-30 17:15:01 +0000
commit7d853c5eae67c4339ade52fc1bbd46513f1724b8 (patch)
treeb2ed0b84682ae41c47d38ed59b8b7efbc8905c19 /filters.cpp
parent6517f9f14413828a88d939c789bb0335b44a9848 (diff)
downloadcryptopp-7d853c5eae67c4339ade52fc1bbd46513f1724b8.tar.gz
change DLL integrity self-test to allow DLL to be Authenticode signed
git-svn-id: svn://svn.code.sf.net/p/cryptopp/code/trunk/c5@233 57ff6487-cd31-0410-9ec3-f628ee90f5f0
Diffstat (limited to 'filters.cpp')
-rw-r--r--filters.cpp100
1 files changed, 70 insertions, 30 deletions
diff --git a/filters.cpp b/filters.cpp
index f2d78d1..8d22555 100644
--- a/filters.cpp
+++ b/filters.cpp
@@ -141,46 +141,86 @@ bool Filter::OutputMessageSeriesEnd(int outputSite, int propagation, bool blocki
// *************************************************************
-size_t MeterFilter::Put2(const byte *begin, size_t length, int messageEnd, bool blocking)
+void MeterFilter::ResetMeter()
{
- if (m_transparent)
- {
- FILTER_BEGIN;
- m_currentMessageBytes += length;
- m_totalBytes += length;
-
- if (messageEnd)
- {
- m_currentMessageBytes = 0;
- m_currentSeriesMessages++;
- m_totalMessages++;
- }
+ m_currentMessageBytes = m_totalBytes = m_currentSeriesMessages = m_totalMessages = m_totalMessageSeries = 0;
+ m_rangesToSkip.clear();
+}
- FILTER_OUTPUT(1, begin, length, messageEnd);
- FILTER_END_NO_MESSAGE_END;
- }
- return 0;
+void MeterFilter::AddRangeToSkip(unsigned int message, lword position, lword size, bool sortNow)
+{
+ MessageRange r = {message, position, size};
+ m_rangesToSkip.push_back(r);
+ if (sortNow)
+ std::sort(m_rangesToSkip.begin(), m_rangesToSkip.end());
}
-size_t MeterFilter::PutModifiable2(byte *begin, size_t length, int messageEnd, bool blocking)
+size_t MeterFilter::PutMaybeModifiable(byte *begin, size_t length, int messageEnd, bool blocking, bool modifiable)
{
- if (m_transparent)
+ if (!m_transparent)
+ return 0;
+
+ size_t t;
+ FILTER_BEGIN;
+
+ m_begin = begin;
+ m_length = length;
+
+ while (m_length > 0 || messageEnd)
{
- FILTER_BEGIN;
- m_currentMessageBytes += length;
- m_totalBytes += length;
+ if (!m_rangesToSkip.empty() && m_rangesToSkip.front().message == m_totalMessages && m_currentMessageBytes + m_length > m_rangesToSkip.front().position)
+ {
+ FILTER_OUTPUT_MAYBE_MODIFIABLE(1, m_begin, t = (size_t)SaturatingSubtract(m_rangesToSkip.front().position, m_currentMessageBytes), false, modifiable);
+
+ assert(t < m_length);
+ m_begin += t;
+ m_length -= t;
+ m_currentMessageBytes += t;
+ m_totalBytes += t;
- if (messageEnd)
+ if (m_currentMessageBytes + m_length < m_rangesToSkip.front().position + m_rangesToSkip.front().size)
+ t = m_length;
+ else
+ {
+ t = (size_t)SaturatingSubtract(m_rangesToSkip.front().position + m_rangesToSkip.front().size, m_currentMessageBytes);
+ assert(t <= m_length);
+ m_rangesToSkip.pop_front();
+ }
+
+ m_begin += t;
+ m_length -= t;
+ m_currentMessageBytes += t;
+ m_totalBytes += t;
+ }
+ else
{
- m_currentMessageBytes = 0;
- m_currentSeriesMessages++;
- m_totalMessages++;
+ FILTER_OUTPUT_MAYBE_MODIFIABLE(2, m_begin, m_length, messageEnd, modifiable);
+
+ m_currentMessageBytes += m_length;
+ m_totalBytes += m_length;
+ m_length = 0;
+
+ if (messageEnd)
+ {
+ m_currentMessageBytes = 0;
+ m_currentSeriesMessages++;
+ m_totalMessages++;
+ messageEnd = false;
+ }
}
-
- FILTER_OUTPUT_MODIFIABLE(1, begin, length, messageEnd);
- FILTER_END_NO_MESSAGE_END;
}
- return 0;
+
+ FILTER_END_NO_MESSAGE_END;
+}
+
+size_t MeterFilter::Put2(const byte *begin, size_t length, int messageEnd, bool blocking)
+{
+ return PutMaybeModifiable(const_cast<byte *>(begin), length, messageEnd, blocking, false);
+}
+
+size_t MeterFilter::PutModifiable2(byte *begin, size_t length, int messageEnd, bool blocking)
+{
+ return PutMaybeModifiable(begin, length, messageEnd, blocking, true);
}
bool MeterFilter::IsolatedMessageSeriesEnd(bool blocking)