#ifndef __AWSECX_H__
#define __AWSECX_H__

#ifdef __cplusplus
extern "C" {
#endif


#define MINKEYBUFSIZE    1024  // dictated by comments in awsec.h

#define SECTYPE_NONE     0
#define SECTYPE_KEY      1
#define SECTYPE_PASSWORD 2

#define CB_QUERYREPLACE    0
#define CB_INFORMDUPLICATE 1
typedef BOOL (CALLBACK QUERYREPLACEKEYCB)(HWND hWndParent, LPTSTR pKeyOwner,
 UINT context) ;

typedef WORD (CALLBACK *RESOLVEGETKEYCB)(LPMAPISESSION pSession,
 LPARAM lParamfpx, WORD context, LPBYTE pKey,
 LPWORD pcbKey);

typedef struct {
    LPBYTE    pKey ;
    WORD      cbKey;
    LPTSTR    pName;
    LPENTRYID pEntryID;
    LONG      cbEntryID;
} SECKEYREC, *LPSECKEYREC ;

BOOL GetPABStrings(LPMAPISESSION pSession, LPTSTR *ppFName, LPTSTR *ppEAddress);
BOOL GetLoginName(LPMAPISESSION pSession, LPTSTR *ppLoginName);
BOOL GetLoginNameXP (LPTSTR lpszFriendly, LPTSTR lpszEmail, LPTSTR *ppLoginName);
WORD GetCurrentUserAddress(LPMAPISESSION pSession, LPTSTR *ppAddress,
 LPWORD pNChars);

BOOL SetNoneSecurityProps(LPMAPIPROP pMsg, LPTSTR pPwdEncrypt, BOOL bDigSig,
 DWORD dwhSecurity);
BOOL SetKeySecurityProps(LPMAPIPROP pMsg, LPTSTR pPwdEncrypt, BOOL bDigSig,
 DWORD dwhSecurity);
BOOL SetPwdSecurityProps(LPMAPIPROP pMsg, LPTSTR pPwdEncrypt, LPTSTR pPassword,
 BOOL bDigSig, DWORD dwhSecurity);

BOOL GetSecurityProps(LPMAPIPROP pMsg, LPTSTR pPwdDecrypt, LPWORD pSecType,
 LPBOOL pDigSig, LPTSTR *ppSecPwd, LPTSTR *ppSimplePwd);

BOOL SetResolveGetKeyCB(DWORD hSec, RESOLVEGETKEYCB fpxResolve, LPARAM lParamfpx);
BOOL SetMapiSession(DWORD hSec, LPMAPISESSION pSession);
BOOL SetAddressBook(DWORD hSec, LPADRBOOK lpAB);

WORD ImportPrivateKeysEx(LPSTR userid, LPSOSSESSION lpSess,
 ReadCB FAR *readCB, DWORD readHand, LPSTR password);

WORD AddPublicKeysEx(LPSOSSESSION lpSess, LPSECKEYREC pKeys, int iNumKeys,
 LPMAPISESSION pSession, QUERYREPLACEKEYCB fpxCB, HWND hWndParent);

WORD DelPublicKeysEx(LPSOSSESSION lpSess, LPSECKEYREC pKeys, int iNumKeys,
 LPMAPISESSION pSession);

WORD GetPublicKeyEx(LPSOSSESSION lpSess, LPTSTR pOwner, BYTE FAR *key,
 LPWORD pcbKey);

WORD GetUsersPublicKeyEx(LPSOSSESSION lpSess, BYTE FAR *key, LPWORD pcbKey);

// Convenient utilities.
BOOL GetFaxABEntryID(LPADRBOOK pAB, LPENTRYID *ppEntryID, LPULONG pcbEntryID);

BOOL MakeTargetName(LPTSTR pFName, LPTSTR pEAddress, LPTSTR *ppTargetName);

BOOL AddKeyEntryToPAB(LPADRBOOK pAB, LPABCONT pPAB,
  LPTSTR pFName, LPTSTR pEAddress, LPBYTE pKey, WORD cbKey,
  LPSPropValue *ppRetEntryID);

// Additional return codes.
#define SEC_INVSECHANDLE    20    // security handle has become invalid.
#define SEC_LOSTKEYS        21    // this operation has caused loss of keys.
#define SEC_REGFAILURE      22    // registry failure keeps operation from succeeding.
#define SEC_BUFTOOSMALL     23    // supplied buffer was to small to hold return.
#define SEC_NOMATCHINGOWNER 24    // Could not find key owner matching the target.
#define SEC_DUPLICATEOWNERS 25    // More could not resolve key ownership.
#define SEC_MAPIERROR       26    // Unexpected mapi error returned.

// Programmer error:
#define SEC_NOMAPISESSION   50    // Mapi Session not set, opperation requires one

#define SEC_FAILURE        100


#ifdef __cplusplus
} /* extern "C" */
#endif

#endif /* __AWSECX_H__ */