⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pgpfilteredset.c

📁 PGP8.0源码 请认真阅读您的文件包然后写出其具体功能
💻 C
字号:
/*____________________________________________________________________________
	Copyright (C) 2002 PGP Corporation
	All rights reserved.

	$Id: pgpFilteredSet.c,v 1.12 2002/08/06 20:11:00 dallen Exp $
____________________________________________________________________________*/
/*
 * pgpFilteredSet.c -- Filtered variant of key sets
 */
#include "pgpConfig.h"

#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif

#include <string.h>
#include <ctype.h>

#include "pgpKeyPriv.h"
#include "pgpDebug.h"
#include "pgpErrors.h"
#include "pgpTypes.h"
#include "pgpMem.h"
#include "pgpContext.h"


/* Private data for KeySet of type filter */
typedef struct FilteredSetPriv
{
	PGPKeySetRef	origSet;
	PGPFilterRef	filter;
} FilteredSetPriv;


	static PGPBoolean
sFilteredSetIsMember(
	PGPKeySetRef	keys,
	PGPKeyDBObjRef	obj )
{
	FilteredSetPriv *	priv = (FilteredSetPriv *) keys->priv;

	pgpa((
		pgpaPGPKeySetValid( keys ),
		pgpaAddrValid( priv, FilteredSetPriv )));

	return priv->origSet->isMember( priv->origSet, obj )
		&& pgpKeyDBObjMatchesFilter( priv->filter, obj );
}	

	static PGPBoolean
sFilteredSetIsEmpty(
	PGPKeySetRef	keys )
{
	FilteredSetPriv *	priv = (FilteredSetPriv *) keys->priv;
	PGPKeyDB *			kdb;
	PGPKeyDBObjRef		key;

	pgpa((
		pgpaPGPKeySetValid( keys ),
		pgpaAddrValid( priv, FilteredSetPriv )));

	if( priv->origSet->isEmpty( priv->origSet ) )
		return TRUE;

	kdb = priv->origSet->keyDB;
	for (key = kdb->firstKeyInDB; key; key = key->next)
	{
		pgpa(pgpaPGPKeyValid(key));
		if( sFilteredSetIsMember( keys, key ) )
			return FALSE;
	}

	return TRUE;
}	

	static void
sFilteredSetDestroy(
	PGPKeySet *		keys )
{
	PGPContextRef		context = PGPPeekKeySetContext( keys );
	FilteredSetPriv *	priv = (FilteredSetPriv *)keys->priv;

	if( IsntNull( priv ) )
	{
		pgpa((
			pgpaAddrValid( keys, PGPKeySet ),
			pgpaAddrValid( priv, FilteredSetPriv )));

		PGPFreeKeySet( priv->origSet );
		PGPFreeFilter( priv->filter );
		pgpContextMemFree( context, priv);
	}
}


/*
 * Create a filtered KeySet based on the specified original.  
 */
	PGPError
PGPFilterKeySet (
	PGPKeySetRef		origSet,
	PGPFilterRef		filter,
	PGPKeySetRef *		outSet )
{
	PGPContextRef		context	= PGPPeekKeySetContext( origSet );
	PGPError			err		= kPGPError_NoErr;
	FilteredSetPriv *	priv	= NULL;
	PGPKeySetRef		newSet	= kInvalidPGPKeySetRef;

	PGPValidatePtr( outSet );
	*outSet	= kInvalidPGPKeySetRef;
	PGPValidateKeySet( origSet );
	PGPValidateFilter( filter );

	pgpEnterPGPErrorFunction();

	priv = (FilteredSetPriv *)pgpContextMemAlloc( context,
												  sizeof( *priv ),
												  kPGPMemoryMgrFlags_Clear );
	if (priv == NULL)
		return kPGPError_OutOfMemory;

	err = pgpNewKeySetInternal( origSet->keyDB, &newSet );
	if ( IsPGPError( err ) )
	{
		pgpContextMemFree( context, priv );
		return err;
	}

	priv->origSet		= origSet;
	PGPIncKeySetRefCount(origSet);

	priv->filter		= filter;
	PGPIncFilterRefCount(filter);

	newSet->priv		= priv;
	newSet->isMember	= sFilteredSetIsMember;
	newSet->isEmpty		= sFilteredSetIsEmpty;
	newSet->makeUnion	= NULL;
	newSet->destroy		= sFilteredSetDestroy;

	*outSet = newSet;
	pgpAssertErrWithPtr( err, *outSet );
	return err;
}


/*__Editor_settings____

	Local Variables:
	tab-width: 4
	End:
	vi: ts=4 sw=4
	vim: si
_____________________*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -