コード例 #1
0
ファイル: Security.cpp プロジェクト: lemonxiao0/peerproject
void CSecurity::Serialize(CArchive& ar)
{
	int nVersion = SECURITY_SER_VERSION;

	if ( ar.IsStoring() )
	{
		ar << nVersion;
		ar << m_bDenyPolicy;

		ar.WriteCount( GetCount() );

		for ( POSITION pos = GetIterator() ; pos ; )
		{
			GetNext( pos )->Serialize( ar, nVersion );
		}

		// Unimplemented
		//for ( CAddressRuleMap::const_iterator i = m_pIPRules.begin() ; i != m_pIPRules.end() ; ++i )
		//{
		//	(*i).second->Serialize( ar, nVersion );
		//}
	}
	else // Loading
	{
		Clear();

		ar >> nVersion;
		ar >> m_bDenyPolicy;

		const DWORD tNow = static_cast< DWORD >( time( NULL ) );

		for ( DWORD_PTR nCount = ar.ReadCount() ; nCount > 0 ; nCount-- )
		{
			CSecureRule* pRule = new CSecureRule( FALSE );
			pRule->Serialize( ar, nVersion );

			if ( pRule->IsExpired( tNow, TRUE ) )
			{
				delete pRule;
				continue;
			}

			// Special handling for single-IP security rules
			if ( pRule->m_nType == CSecureRule::srAddress &&
				 pRule->m_nAction == CSecureRule::srDeny &&
				*(DWORD*)pRule->m_nMask == 0xffffffff )
			{
				SetAddressMap( *(DWORD*)pRule->m_nIP, SetRuleIndex( pRule ) );
				continue;
			}

			if ( pRule->m_nType == CSecureRule::srContentHash &&
				 pRule->m_nAction == CSecureRule::srDeny )
			{
				SetHashMap( pRule->GetContentWords(), SetRuleIndex( pRule ) );
				continue;
			}

			if ( pRule->m_nType == CSecureRule::srExternal )
				ListLoader.AddList( pRule );

			m_pRules.AddTail( pRule );
		}
	}
}