|
|
// --------------------------------------------------------------------------------
// AddressX.cpp
// Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
// --------------------------------------------------------------------------------
#include "pch.hxx"
#include "AddressX.h"
#include "dllmain.h"
#include "internat.h"
#include "mimeapi.h"
#include "demand.h"
// --------------------------------------------------------------------------------
// EmptyAddressTokenW - Makes sure the pToken is empty
// --------------------------------------------------------------------------------
void EmptyAddressTokenW(LPADDRESSTOKENW pToken) { if (pToken->psz) *pToken->psz = L'\0'; pToken->cch = 0; }
// --------------------------------------------------------------------------------
// FreeAddressTokenW
// --------------------------------------------------------------------------------
void FreeAddressTokenW(LPADDRESSTOKENW pToken) { if (pToken->psz && pToken->psz != (LPWSTR)pToken->rgbScratch) g_pMalloc->Free(pToken->psz); ZeroMemory(pToken, sizeof(ADDRESSTOKENW)); }
// --------------------------------------------------------------------------------
// HrSetAddressTokenW
// --------------------------------------------------------------------------------
HRESULT HrSetAddressTokenW(LPCWSTR psz, ULONG cch, LPADDRESSTOKENW pToken) { // Locals
HRESULT hr=S_OK; ULONG cbAlloc; LPWSTR pszNew;
// Invalid Arg
Assert(psz && psz[cch] == L'\0' && pToken);
// cbAlloc is big enough
if ((cch + 1) * sizeof(WCHAR) > pToken->cbAlloc) { // Use Static
if (NULL == pToken->psz && ((cch + 1) * sizeof(WCHAR)) < sizeof(pToken->rgbScratch)) { pToken->psz = (LPWSTR)pToken->rgbScratch; pToken->cbAlloc = sizeof(pToken->rgbScratch); }
// Otherwise
else { // If currently set to scratch, NULL it
if (pToken->psz == (LPWSTR)pToken->rgbScratch) { Assert(pToken->cbAlloc == sizeof(pToken->rgbScratch)); pToken->psz = NULL; }
// Compute Size of new blob
cbAlloc = ((cch + 1) * sizeof(WCHAR));
// Realloc New Blob
CHECKALLOC(pszNew = (LPWSTR)g_pMalloc->Realloc((LPVOID)pToken->psz, cbAlloc));
// Save
pToken->psz = pszNew; pToken->cbAlloc = cbAlloc; } }
// Copy the String
CopyMemory((LPBYTE)pToken->psz, (LPBYTE)psz, ((cch + 1) * sizeof(WCHAR)));
// Save the Size
pToken->cch = cch;
exit: // Done
return hr; }
// --------------------------------------------------------------------------------
// MimeAddressFree
// --------------------------------------------------------------------------------
void MimeAddressFree(LPMIMEADDRESS pAddress) { Assert(pAddress); FreeAddressTokenW(&pAddress->rFriendly); FreeAddressTokenW(&pAddress->rEmail); SafeMemFree(pAddress->tbSigning.pBlobData); SafeMemFree(pAddress->tbEncryption.pBlobData); ZeroMemory(pAddress, sizeof(MIMEADDRESS)); }
// --------------------------------------------------------------------------------
// HrCopyAddressData
// --------------------------------------------------------------------------------
HRESULT HrMimeAddressCopy(LPMIMEADDRESS pSource, LPMIMEADDRESS pDest) { // Locals
HRESULT hr=S_OK;
// Friendly
if (!FIsEmptyW(pSource->rFriendly.psz)) { CHECKHR(hr = HrSetAddressTokenW(pSource->rFriendly.psz, pSource->rFriendly.cch, &pDest->rFriendly)); }
// Email
if (!FIsEmptyW(pSource->rEmail.psz)) { CHECKHR(hr = HrSetAddressTokenW(pSource->rEmail.psz, pSource->rEmail.cch, &pDest->rEmail)); }
// Copy Signature Blob
if (pSource->tbSigning.pBlobData) { CHECKHR(hr = HrCopyBlob(&pSource->tbSigning, &pDest->tbSigning)); }
// Copy Encryption Blob
if (pSource->tbEncryption.pBlobData) { CHECKHR(hr = HrCopyBlob(&pSource->tbEncryption, &pDest->tbEncryption)); }
// Save Other Stuff
pDest->pCharset = pSource->pCharset; pDest->dwCookie = pSource->dwCookie; pDest->certstate = pSource->certstate; pDest->dwAdrType = pSource->dwAdrType;
exit: // Done
return hr; }
// --------------------------------------------------------------------------------
// HrCopyAddressProps
// --------------------------------------------------------------------------------
HRESULT HrCopyAddressProps(LPADDRESSPROPS pSource, LPADDRESSPROPS pDest) { // Locals
HRESULT hr=S_OK;
// IAP_HADDRESS
if (ISFLAGSET(pSource->dwProps, IAP_HANDLE)) { pDest->hAddress = pSource->hAddress; FLAGSET(pDest->dwProps, IAP_HANDLE); }
// IAP_ENCODING
if (ISFLAGSET(pSource->dwProps, IAP_ENCODING)) { pDest->ietFriendly = pSource->ietFriendly; FLAGSET(pDest->dwProps, IAP_ENCODING); }
// IAP_HCHARSET
if (ISFLAGSET(pSource->dwProps, IAP_CHARSET)) { pDest->hCharset = pSource->hCharset; FLAGSET(pDest->dwProps, IAP_CHARSET); }
// IAP_ADRTYPE
if (ISFLAGSET(pSource->dwProps, IAP_ADRTYPE)) { pDest->dwAdrType = pSource->dwAdrType; FLAGSET(pDest->dwProps, IAP_ADRTYPE); }
// IAP_CERTSTATE
if (ISFLAGSET(pSource->dwProps, IAP_CERTSTATE)) { pDest->certstate = pSource->certstate; FLAGSET(pDest->dwProps, IAP_CERTSTATE); }
// IAP_COOKIE
if (ISFLAGSET(pSource->dwProps, IAP_COOKIE)) { pDest->dwCookie = pSource->dwCookie; FLAGSET(pDest->dwProps, IAP_COOKIE); }
// IAP_FRIENDLYW
if (ISFLAGSET(pSource->dwProps, IAP_FRIENDLYW)) { // Free pDest Current
if (ISFLAGSET(pDest->dwProps, IAP_FRIENDLYW)) { SafeMemFree(pDest->pszFriendlyW); FLAGCLEAR(pDest->dwProps, IAP_FRIENDLYW); }
// Dup
CHECKALLOC(pDest->pszFriendlyW = PszDupW(pSource->pszFriendlyW));
// Set the Falg
FLAGSET(pDest->dwProps, IAP_FRIENDLYW); }
// IAP_FRIENDLY
if (ISFLAGSET(pSource->dwProps, IAP_FRIENDLY)) { // Free pDest Current
if (ISFLAGSET(pDest->dwProps, IAP_FRIENDLY)) { SafeMemFree(pDest->pszFriendly); FLAGCLEAR(pDest->dwProps, IAP_FRIENDLY); }
// Dup
CHECKALLOC(pDest->pszFriendly = PszDupA(pSource->pszFriendly));
// Set the Falg
FLAGSET(pDest->dwProps, IAP_FRIENDLY); }
// IAP_EMAIL
if (ISFLAGSET(pSource->dwProps, IAP_EMAIL)) { // Free pDest Current
if (ISFLAGSET(pDest->dwProps, IAP_EMAIL)) { SafeMemFree(pDest->pszEmail); FLAGCLEAR(pDest->dwProps, IAP_EMAIL); }
// Dup
CHECKALLOC(pDest->pszEmail = PszDupA(pSource->pszEmail));
// Set the Falg
FLAGSET(pDest->dwProps, IAP_EMAIL); }
// IAP_SIGNING_PRINT
if (ISFLAGSET(pSource->dwProps, IAP_SIGNING_PRINT)) { // Free pDest Current
if (ISFLAGSET(pDest->dwProps, IAP_SIGNING_PRINT)) { SafeMemFree(pDest->tbSigning.pBlobData); pDest->tbSigning.cbSize = 0; FLAGCLEAR(pDest->dwProps, IAP_SIGNING_PRINT); }
// Dup
CHECKHR(hr = HrCopyBlob(&pSource->tbSigning, &pDest->tbSigning));
// Set the Falg
FLAGSET(pDest->dwProps, IAP_SIGNING_PRINT); }
// IAP_ENCRYPTION_PRINT
if (ISFLAGSET(pSource->dwProps, IAP_ENCRYPTION_PRINT)) { // Free pDest Current
if (ISFLAGSET(pDest->dwProps, IAP_ENCRYPTION_PRINT)) { SafeMemFree(pDest->tbEncryption.pBlobData); pDest->tbEncryption.cbSize = 0; FLAGCLEAR(pDest->dwProps, IAP_ENCRYPTION_PRINT); }
// Dup
CHECKHR(hr = HrCopyBlob(&pSource->tbEncryption, &pDest->tbEncryption));
// Set the Falg
FLAGSET(pDest->dwProps, IAP_ENCRYPTION_PRINT); }
exit: // Done
return hr; }
|