|
|
//-----------------------------------------------------------------------------
//
//
// File: aqutil.h
//
// Description:
// General AQueue utility functions... like IMailMsg Usage Count
// manipulation, queue mapping functions, and domain name table iterator
// functions.
//
// Author: Mike Swafford (MikeSwa)
//
// History:
// 7/20/98 - MikeSwa Created
// 7/29/98 - MikeSwa Modified (added CalcMsgsPendingRetryIteratorFn)
//
// Copyright (C) 1998 Microsoft Corporation
//
//-----------------------------------------------------------------------------
#ifndef __AQUTIL_H__
#define __AQUTIL_H__
#include "aqincs.h"
#include "msgref.h"
#include "refstr.h"
//Functions to manipulate IMailMsg usage count
HRESULT HrIncrementIMailMsgUsageCount(IUnknown *pIUnknown); HRESULT HrReleaseIMailMsgUsageCount(IUnknown *pIUnknown); HRESULT HrDeleteIMailMsg(IUnknown *pIUnknown); //deletes and releases usage count
HRESULT HrWalkMailMsgQueueForShutdown(IN IMailMsgProperties *pIMailMsgProperties, IN PVOID pvContext, OUT BOOL *pfContinue, OUT BOOL *pfDelete);
BOOL fMailMsgShutdownCompletion(PVOID pvContext, DWORD dwStatus);
HRESULT HrWalkMsgRefQueueForShutdown(IN CMsgRef *pmsgref, IN PVOID pvContext, OUT BOOL *pfContinue, OUT BOOL *pfDelete);
BOOL fMsgRefShutdownCompletion(PVOID pvContext, DWORD dwStatus);
//Domain Name Table iterator function used to count perf counters
VOID CalcDMTPerfCountersIteratorFn(PVOID pvContext, PVOID pvData, BOOL fWildcard, BOOL *pfContinue, BOOL *pfDelete);
//Functions to manipulate DWORD's bits in a thread safe manner
DWORD dwInterlockedSetBits(DWORD *pdwTarget, DWORD dwFlagMask); DWORD dwInterlockedUnsetBits(DWORD *pdwTarget, DWORD dwFlagMask);
HRESULT HrWalkPreLocalQueueForDSN(IN CMsgRef *pmsgref, IN PVOID pvContext, OUT BOOL *pfContinue, OUT BOOL *pfDelete);
//Used to reget the message type in various retry situations
HRESULT HrReGetMessageType(IN IMailMsgProperties *pIMailMsgProperties, IN IMessageRouter *pIMessageRouter, IN OUT DWORD *pdwMessageType);
#define UNIQUEUE_FILENAME_BUFFER_SIZE 35
//Creates a unique filename
void GetUniqueFileName(IN FILETIME *pft, IN LPSTR szFileBuffer, IN LPSTR szExtension);
//Ultility function to link all domains together (primarly to NDR an entire message)
HRESULT HrLinkAllDomains(IN IMailMsgProperties *pIMailMsgProperties);
//Parses a GUID from a string... returns TRUE on success
BOOL fAQParseGuidString(LPSTR szGuid, DWORD cbGuid, GUID *pguid);
inline DWORD dwInterlockedAddSubtractDWORD(DWORD *pdwValue, DWORD dwNew, BOOL fAdd) { return InterlockedExchangeAdd((PLONG) pdwValue, fAdd ? ((LONG) dwNew) : (-1 * ((LONG) dwNew))); };
void InterlockedAddSubtractULARGE(ULARGE_INTEGER *puliValue, ULARGE_INTEGER *puliNew, BOOL fAdd);
//Functions to do simple spin lock manipulations
inline BOOL fTrySpinLock(DWORD *pdwLock, DWORD dwLockBit) { return (!(dwLockBit & dwInterlockedSetBits(pdwLock, dwLockBit))); }
inline void ReleaseSpinLock(DWORD *pdwLock, DWORD dwLockBit) { _ASSERT(*pdwLock & dwLockBit); dwInterlockedUnsetBits(pdwLock, dwLockBit); }
//
// Same as above but checks content handle. We force a rendering of the
// message
//
HRESULT HrValidateMessageContent(IMailMsgProperties *pIMailMsgProperties);
#endif //__AQUTIL_H__
|