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

📄 newanddeletewin32.cpp

📁 可以实现对邮件的加密解密以及签名
💻 CPP
字号:
/*____________________________________________________________________________
		Copyright (C) 2002 PGP Corporation
        All rights reserved.

        $Id: NewAndDeleteWin32.cpp,v 1.6 2002/08/06 20:10:46 dallen Exp $
____________________________________________________________________________*/

#include "pgpClassesConfig.h"

#include "pgpMem.h"
#include "PGPMemoryMgr.h"

#include "NewAndDelete.h"

_USING_PGP

_UNNAMED_BEGIN

// Class CPGPMemoryMgr

class CPGPMemoryMgr
{
public:
	static void	UpRef();
	static void	DownRef();

	static void *	NewData(PGPSize size)
	{
		return PGPNewData(mManager, size, NULL);
	}

	static void *	NewSecureData(PGPSize size)
	{
		return PGPNewSecureData(mManager, size, kPGPMemoryMgrFlags_Clear);
	}

	static void		FreeData(void *p)
	{
		PGPFreeData(p);
	}

private:
	static PGPMemoryMgrRef	mManager;
	static PGPUInt32		mRefCount;

	static void	CreateManager();
	static void	DestroyManager();
};

// Class CPGPMemoryMgr member functions

void 
CPGPMemoryMgr::UpRef()
{
	if (++mRefCount == 1)
		CreateManager();
}

void 
CPGPMemoryMgr::DownRef()
{
	if ((mRefCount > 0) && (--mRefCount == 0))
		DestroyManager();
}

void 
CPGPMemoryMgr::CreateManager()
{
	pgpAssert(!PGPMemoryMgrRefIsValid(mManager));

	PGPError	pgpErr	= PGPNewMemoryMgr(NULL, &mManager);
	THROW_IF_PGPERROR(pgpErr);

	mRefCount++;
}

void 
CPGPMemoryMgr::DestroyManager()
{
	pgpAssert(PGPMemoryMgrRefIsValid(mManager));

	PGPFreeMemoryMgr(mManager);
	mManager = kInvalidPGPMemoryMgrRef;
}

// Statics

PGPMemoryMgrRef	CPGPMemoryMgr::mManager		= kInvalidPGPMemoryMgrRef;
PGPUInt32		CPGPMemoryMgr::mRefCount	= 0;

// It would be better to have static con/des up and down ref the memory
// manager, but this causes screwups in DLLs because DllMain-time is
// restrictive on what you can and cannot do. Just create and dispose of
// the PFL imp factory or some other piece of memory in your app/dll
// init/cleanup functions and the memory manager won't be recreated and
// redestroyed (which happens when you cycle between 0 and 1 total allocs).

_UNNAMED_END


// Operator new and delete helper functions

void * 
NewAndDelete::NewHelper(size_t size, MemoryType memType, PGPBoolean throws)
{
	if (size == 0)
		size = 1;	// required by standard!

	CPGPMemoryMgr::UpRef();

	void	*p	= NULL;

	if (memType == kSecureMemType)
		p = CPGPMemoryMgr::NewSecureData(size);
	else
		p = CPGPMemoryMgr::NewData(size);

	if (IsNull(p))
	{
		if (throws)
			THROW_PGPERROR(kPGPError_OutOfMemory);
	}
	else
	{
	#if PGP_DEBUG
		pgpDebugWhackMemory(p, size);
	#endif	// PGP_DEBUG
	}

	return p;
};

void 
NewAndDelete::DeleteHelper(void *p)
{
	if (IsntNull(p))
		CPGPMemoryMgr::FreeData(p);

	CPGPMemoryMgr::DownRef();
}

⌨️ 快捷键说明

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