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

📄 usesopenssl.cpp

📁 强大易用的邮件收发客户端
💻 CPP
字号:
#include "stdafx.h"
#include "UsesOpenSSL.h"

#include <openssl/err.h>
#include <openssl/ssl.h>   


#pragma comment(lib, "ssleay32.lib")
#pragma comment(lib, "libeay32.lib")

static HANDLE *s_pLocks = 0;

enum Threading 
{
   SingleThread,
   MultiThread,
   Unset
} s_threading = Unset;

///////////////////////////////////////////////////////////////////////////////
// Static helper functions...
///////////////////////////////////////////////////////////////////////////////

static void LockingCallback(
   int mode, 
   int type, 
   const char *file, 
   int line);

static bool ThreadingSetup();

static void ThreadingCleanup();

///////////////////////////////////////////////////////////////////////////////
// CUsesOpenSSL
///////////////////////////////////////////////////////////////////////////////

CUsesOpenSSL::CUsesOpenSSL(
   bool multiThreadedUse)
   : m_weOwnLocks(multiThreadedUse ?  ThreadingSetup() : false)
{
   SSL_load_error_strings();
	
   SSL_library_init();
}
      
CUsesOpenSSL::~CUsesOpenSSL()
{
   if (m_weOwnLocks)
   {
      ThreadingCleanup();
   }
   
   ERR_free_strings();
}

///////////////////////////////////////////////////////////////////////////////
// Static helper functions...
///////////////////////////////////////////////////////////////////////////////

static bool ThreadingSetup()
{
   bool ok = false;

   if (!s_pLocks)
   {
   	s_pLocks = (HANDLE *)malloc(CRYPTO_num_locks() * sizeof(HANDLE));

      for (int i = 0; i < CRYPTO_num_locks(); i++)
	   {
         s_pLocks[i] = ::CreateMutex(
            0,                         // Security attributes
            FALSE,                     // Initially owned
            0);                        // name
      }

	   CRYPTO_set_locking_callback(LockingCallback);

      ok = true;
   }
   
   return ok;
}

static void ThreadingCleanup()
{
   if (s_pLocks)
   {
	   CRYPTO_set_locking_callback(0);

	   for (int i = 0; i < CRYPTO_num_locks(); i++)
      {
		   CloseHandle(s_pLocks[i]);
      }

	   free(s_pLocks);

      s_pLocks = 0;
   }
}

static void LockingCallback(
   int mode, 
   int type, 
   const char *file, 
   int line)
{
	if (mode & CRYPTO_LOCK)
   {
      ::WaitForSingleObject(s_pLocks[type],INFINITE);
   }
	else
	{
      ::ReleaseMutex(s_pLocks[type]);
	}
}

///////////////////////////////////////////////////////////////////////////////
// End of file
///////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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