// --track.c--------------------------------------------------------------------
//
// Gateway message tracking sample application.
//
// Copyright (C) Microsoft Corp. 1986-1996. All Rights Reserved.
// -----------------------------------------------------------------------------
#include "edk.h"
#define MAX_INPUT_SIZ 1024
#define MAX_RECIPIENTS 7
PVOID pvSession = NULL;
UINT nEventType = 0;
SYSTEMTIME stEvent = {0};
TCHAR szGatewayName[MAX_INPUT_SIZ+1] = {0};
TCHAR szPartnerName[MAX_INPUT_SIZ+1] = {0};
TCHAR szMtsID[MAX_INPUT_SIZ+1] = {0};
TCHAR szSubjectMtsID[MAX_INPUT_SIZ+1] = {0};
TCHAR szRemoteID[MAX_INPUT_SIZ+1] = {0};
TCHAR szOriginatorName[MAX_INPUT_SIZ+1] = {0};
INT nPriority = 0;
INT nLength = 0;
INT nSeconds = 0;
INT nCost = 0;
INT cRecipients = 0;
TCHAR szRecip1[MAX_INPUT_SIZ+1] = {0};
TCHAR szRecip2[MAX_INPUT_SIZ+1] = {0};
TCHAR szRecip3[MAX_INPUT_SIZ+1] = {0};
TCHAR szRecip4[MAX_INPUT_SIZ+1] = {0};
TCHAR szRecip5[MAX_INPUT_SIZ+1] = {0};
TCHAR szRecip6[MAX_INPUT_SIZ+1] = {0};
TCHAR szRecip7[MAX_INPUT_SIZ+1] = {0};
LPTSTR lpszRecipients[MAX_RECIPIENTS] = {0};
static BOOL fInitializedMAPI = FALSE;
#include "track.chk"
//
// Names of Command Line Arguments
//
#define ARG_SERVER"SERVER"
#define ARG_HELP1"?"
#define ARG_HELP2"HELP"
//
// Table of Command Line Switches for _HrExpandCommandLineArgument()
//
static char * rgpszArgArray[] = {
ARG_SERVER,
ARG_HELP1,
ARG_HELP2,
};
#define ARGARRAYSIZE (sizeof(rgpszArgArray)/sizeof(rgpszArgArray[0]))
//
// Variables For Command Line Arguments
//
char szServer[MAX_PATH+1]= {0};
BOOL fDisplayedHelp= FALSE;
//
// Functions
//
//$--ShowUsage------------------------------------------------------------------
// Show usage information.
// -----------------------------------------------------------------------------
static VOID ShowUsage(void)// RETURNS: nothing
{
DEBUGPRIVATE("ShowUsage()\n");
printf("USAGE: TRACK [Flags]\n\n");
printf(" [Flags] Enter TRACK /? for details\n");
fDisplayedHelp = TRUE;
}
//$--ShowHelp-------------------------------------------------------------------
// Show help information.
// -----------------------------------------------------------------------------
static VOID ShowHelp(void)// RETURNS: nothing
{
DEBUGPRIVATE("ShowHelp()\n");
printf("Message Tracking sample.\n\n");
printf("USAGE: TRACK [Flags]\n\n");
printf(" Required Flags\n");
printf(" /SERVER= Server computer name\n");
printf("\n");
printf(" Optional Flags\n");
printf(" /HELP or /? Display help\n");
fDisplayedHelp = TRUE;
}
//$--HrConfig-------------------------------------------------------------------
// Read configuration from command line.
// -----------------------------------------------------------------------------
HRESULT HrConfig( // RETURNS: return code
IN int argc, // number of arguments on command line
IN char *argv[]) // array of command line arguments
{
HRESULThr= NOERROR;
HRESULThrT= NOERROR;
char *pszArgument= NULL;
char *pszValue= NULL;
inti= 0;
DEBUGPRIVATE("HrConfig()\n");
// If there are no command line arguments then show a usage message.
if (argc < 2)
{
ShowUsage();
hr = E_FAIL;
goto cleanup;
}
// Do an initial check for /? or /HELP. If found, show a help message
// and don't do any other parsing.
for (i = 1; i < argc; i++)
{
hr = _HrExpandCommandLineArgument(
argv[i], rgpszArgArray, ARGARRAYSIZE, NULL, &pszArgument, &pszValue);
if (SUCCEEDED(hr) && pszArgument &&
(!_stricmp(pszArgument,ARG_HELP1) ||
!_stricmp(pszArgument,ARG_HELP2)))
{
ShowHelp();
hr = E_FAIL;
goto cleanup;
}
}
// Loop through and parse all the command line arguments.
for (i = 1; i < argc; i++)
{
hrT = _HrExpandCommandLineArgument(
argv[i], rgpszArgArray, ARGARRAYSIZE, NULL, &pszArgument, &pszValue);
if (FAILED(hrT))
{
hr = hrT;
if (hr == EDK_E_NOT_FOUND)
{
fprintf(stderr, "ERROR: unknown command line flag: %s\n",
argv[i]);
continue;
}
else
{
fprintf(stderr, "ERROR: unable to parse command line.\n");
goto cleanup;
}
}
// Parse flag arguments that don't take a value.
else if (pszArgument != NULL && pszValue == NULL)
{
// Other flag (must take a value).
fprintf(stderr, "ERROR: flag /%s requires a value\n",
pszArgument);
hr = HR_LOG(E_FAIL);
}
// Parse flag arguments that take a value.
else if (pszArgument != NULL && pszValue != NULL)
{
if (!_stricmp(pszArgument,ARG_SERVER))
{
strncpy(szServer, pszValue, MAX_PATH);
}
// Other flag (must not take a value).
else
{
fprintf(stderr, "ERROR: flag /%s does not take a value\n",
pszArgument);
hr = HR_LOG(E_FAIL);
}
}
// Catch unknown arguments.
else
{
fprintf(stderr, "ERROR: unknown argument %s\n", argv[i]);
hr = HR_LOG(E_FAIL);
}
}
// Make sure we have all the info we need.
if (SUCCEEDED(hr))
{
if (szServer[0] == 0)
{
fprintf(stderr, "ERROR: please specify /%s\n", ARG_SERVER);
hr = HR_LOG(E_FAIL);
}
else
{
DWORD dwService = 0;
DWORD dwCurrentState = 0;
hr = HrGetExchangeServiceStatus(
szServer,
EXCHANGE_SA,
&dwCurrentState);
if(FAILED(hr))
{
fprintf(
stderr,
"ERROR: please start Exchange system attendant on %s\n",
szServer);
hr = HR_LOG(E_FAIL);
}
}
}
cleanup:
RETURN(hr);
}
//$--HrDoEnterString------------------------------------------------------------
// Enter a string.
// -----------------------------------------------------------------------------
HRESULT HrDoEnterString( // RETURNS: return code
IN LPTSTR lpszPrompt, // prompt
OUT LPTSTR lpszString) // string buffer
{
HRESULT hr = NOERROR;
TCHAR szInput[MAX_INPUT_SIZ+1] = {0};
hr = CHK_HrDoEnterString(
lpszPrompt,
lpszString);
if(FAILED(hr))
RETURN(hr);
lpszString[0] = 0;
printf("\n%s: ", (lpszPrompt != NULL ? lpszPrompt : ""));
if(gets(szInput) == NULL)
{
hr = HR_LOG(E_FAIL);
printf("\nERROR: gets() failed\n");
}
else
{
strncpy(lpszString, szInput, MAX_INPUT_SIZ);
lpszString[MAX_INPUT_SIZ] = 0;
}
RETURN(hr);
}
//$--HrDoEnterNumber------------------------------------------------------------
// Enter a number.
// -----------------------------------------------------------------------------
HRESULT HrDoEnterNumber( // RETURNS: return code
IN LPTSTR lpszPrompt, // prompt
IN BOOL fAllowNegative, // TRUE=allow negative number
OUT LONG *lplNumber) // number
{
HRESULT hr = NOERROR;
TCHAR szInput[MAX_INPUT_SIZ+1] = {0};
LONG lNumber = 0;
LONG cMatch = 0;
hr = CHK_HrDoEnterNumber(
lpszPrompt,
fAllowNegative,
lplNumber);
if(FAILED(hr))
RETURN(hr);
*lplNumber = 0;
printf("\n%s: ", (lpszPrompt != NULL ? lpszPrompt : ""));
if(gets(szInput) == NULL)
{
hr = HR_LOG(E_FAIL);
printf("\nERROR: gets() failed\n");
}
else
{
cMatch = sscanf(szInput, "%ld", &lNumber);
if (cMatch == 0 || cMatch == EOF)
{
hr = HR_LOG(E_FAIL);
goto cleanup;
}
if (!fAllowNegative && lNumber < 0)
{
printf("ERROR: negative number not allowed\n");
hr = HR_LOG(E_FAIL);
goto cleanup;
}
*lplNumber = lNumber;
}
cleanup:
RETURN(hr);
}
//$--DoEnterCommand-------------------------------------------------------------
// Enter a command.
// -----------------------------------------------------------------------------
void DoEnterCommand(void)
{
ULONG ulInput = 0;
TCHAR szInput[MAX_INPUT_SIZ+1] = {0};
ULONG i = 0;
nEventType = 0;
ZeroMemory(&stEvent, sizeof(SYSTEMTIME));
ZeroMemory(szGatewayName ,MAX_INPUT_SIZ+1);
ZeroMemory(szPartnerName ,MAX_INPUT_SIZ+1);
ZeroMemory(szMtsID, MAX_INPUT_SIZ+1);
ZeroMemory(szSubjectMtsID, MAX_INPUT_SIZ+1);
ZeroMemory(szRemoteID, MAX_INPUT_SIZ+1);
ZeroMemory(szOriginatorName, MAX_INPUT_SIZ+1);
nPriority = 0;
nLength = 0;
nSeconds = 0;
nCost = 0;
cRecipients = 0;
ZeroMemory(szRecip1, MAX_INPUT_SIZ+1);
ZeroMemory(szRecip2, MAX_INPUT_SIZ+1);
ZeroMemory(szRecip3, MAX_INPUT_SIZ+1);
ZeroMemory(szRecip4, MAX_INPUT_SIZ+1);
ZeroMemory(szRecip5, MAX_INPUT_SIZ+1);
ZeroMemory(szRecip6, MAX_INPUT_SIZ+1);
ZeroMemory(szRecip7, MAX_INPUT_SIZ+1);
for(;;)
{
ULONG ulChoice = 0;
printf("\nMENU:\n");
printf("\t 1. event type [%u]\n", nEventType);
printf("\t 2. gateway name [%s]\n", szGatewayName);
printf("\t 3. partner name [%s]\n", szPartnerName);
printf("\t 4. MTS-ID [%s]\n", szMtsID);
printf("\t 5. subject MTS-ID [%s]\n", szSubjectMtsID);
printf("\t 6. Remote-ID [%s]\n", szRemoteID);
printf("\t 7. originator name [%s]\n", szOriginatorName);
printf("\t 8. priority [%u]\n", nPriority);
printf("\t 9. length [%u]\n", nLength);
printf("\t10. seconds [%u]\n", nSeconds);
printf("\t11. cost [%u]\n", nCost);
printf("\t12. #recipients [%u]\n", cRecipients);
printf("\t13. recipient #1 [%s]\n", szRecip1);
printf("\t14. recipient #2 [%s]\n", szRecip2);
printf("\t15. recipient #3 [%s]\n", szRecip3);
printf("\t16. recipient #4 [%s]\n", szRecip4);
printf("\t17. recipient #5 [%s]\n", szRecip5);
printf("\t18. recipient #6 [%s]\n", szRecip6);
printf("\t19. recipient #7 [%s]\n", szRecip7);
printf("\t 0. Exit\n");
if(FAILED(HrDoEnterNumber("SELECTION", TRUE, &ulChoice)))
{
continue;
}
switch(ulChoice)
{
case 1:
ulInput = 0;
if(FAILED(HrDoEnterNumber("event type", FALSE, &ulInput)))
{
continue;
}
nEventType = ulInput;
break;
case 2:
szInput[0] = 0;
if(FAILED(HrDoEnterString("gateway name", szInput)))
{
continue;
}
strncpy(szGatewayName, szInput, MAX_INPUT_SIZ);
szGatewayName[MAX_INPUT_SIZ] = 0;
break;
case 3:
szInput[0] = 0;
if(FAILED(HrDoEnterString("partner name", szInput)))
{
continue;
}
strncpy(szPartnerName, szInput, MAX_INPUT_SIZ);
szPartnerName[MAX_INPUT_SIZ] = 0;
break;
case 4:
szInput[0] = 0;
if(FAILED(HrDoEnterString("MTS-ID", szInput)))
{
continue;
}
strncpy(szMtsID, szInput, MAX_INPUT_SIZ);
szMtsID[MAX_INPUT_SIZ] = 0;
break;
case 5:
szInput[0] = 0;
if(FAILED(HrDoEnterString("Subject MTS-ID", szInput)))
{
continue;
}
strncpy(szSubjectMtsID, szInput, MAX_INPUT_SIZ);
szSubjectMtsID[MAX_INPUT_SIZ] = 0;
break;
case 6:
szInput[0] = 0;
if(FAILED(HrDoEnterString("Remote-ID", szInput)))
{
continue;
}
strncpy(szRemoteID, szInput, MAX_INPUT_SIZ);
szRemoteID[MAX_INPUT_SIZ] = 0;
break;
case 7:
szInput[0] = 0;
if(FAILED(HrDoEnterString("originator name", szInput)))
{
continue;
}
strncpy(szOriginatorName, szInput, MAX_INPUT_SIZ);
szOriginatorName[MAX_INPUT_SIZ] = 0;
break;
case 8:
ulInput = 0;
if(FAILED(HrDoEnterNumber("priority", FALSE, &ulInput)))
{
continue;
}
nPriority = ulInput;
break;
case 9:
ulInput = 0;
if(FAILED(HrDoEnterNumber("length", FALSE, &ulInput)))
{
continue;
}
nLength = ulInput;
break;
case 10:
ulInput = 0;
if(FAILED(HrDoEnterNumber("seconds", FALSE, &ulInput)))
{
continue;
}
nSeconds = ulInput;
break;
case 11:
ulInput = 0;
if(FAILED(HrDoEnterNumber("cost", FALSE, &ulInput)))
{
continue;
}
nCost = ulInput;
break;
case 12:
ulInput = 0;
if(FAILED(HrDoEnterNumber("#recipients", FALSE, &ulInput)))
{
continue;
}
cRecipients = ulInput;
break;
case 13:
szInput[0] = 0;
if(FAILED(HrDoEnterString("recip1", szInput)))
{
continue;
}
strncpy(szRecip1, szInput, MAX_INPUT_SIZ);
szRecip1[MAX_INPUT_SIZ] = 0;
break;
case 14:
szInput[0] = 0;
if(FAILED(HrDoEnterString("recip2", szInput)))
{
continue;
}
strncpy(szRecip2, szInput, MAX_INPUT_SIZ);
szRecip2[MAX_INPUT_SIZ] = 0;
break;
case 15:
szInput[0] = 0;
if(FAILED(HrDoEnterString("recip3", szInput)))
{
continue;
}
strncpy(szRecip3, szInput, MAX_INPUT_SIZ);
szRecip3[MAX_INPUT_SIZ] = 0;
break;
case 16:
szInput[0] = 0;
if(FAILED(HrDoEnterString("recip4", szInput)))
{
continue;
}
strncpy(szRecip4, szInput, MAX_INPUT_SIZ);
szRecip4[MAX_INPUT_SIZ] = 0;
break;
case 17:
szInput[0] = 0;
if(FAILED(HrDoEnterString("recip5", szInput)))
{
continue;
}
strncpy(szRecip5, szInput, MAX_INPUT_SIZ);
szRecip5[MAX_INPUT_SIZ] = 0;
break;
case 18:
szInput[0] = 0;
if(FAILED(HrDoEnterString("recip6", szInput)))
{
continue;
}
strncpy(szRecip6, szInput, MAX_INPUT_SIZ);
szRecip6[MAX_INPUT_SIZ] = 0;
break;
case 19:
szInput[0] = 0;
if(FAILED(HrDoEnterString("recip7", szInput)))
{
continue;
}
strncpy(szRecip7, szInput, MAX_INPUT_SIZ);
szRecip7[MAX_INPUT_SIZ] = 0;
break;
case 0:
goto cleanup;
default:
printf("ERROR: unknown menu selection\n");
break;
}
}
cleanup:
return;
}
//$--DoRunCommand---------------------------------------------------------------
// Run a command.
// -----------------------------------------------------------------------------
void DoRunCommand(void)
{
HRESULT hr = NOERROR;
printf("running command....\n");
ZeroMemory(&stEvent, sizeof(SYSTEMTIME));
GetSystemTime(&stEvent);
hr = HrTrackWriteLog(
pvSession,
nEventType,
stEvent,
szGatewayName,
szPartnerName,
szMtsID,
szSubjectMtsID,
szRemoteID,
szOriginatorName,
nPriority,
nLength,
nSeconds,
nCost,
cRecipients,
((cRecipients == 0) ? NULL : ((LPTSTR *)&lpszRecipients)));
if(FAILED(hr))
{
printf("ERROR: tracking write failed\n");
goto cleanup;
}
printf("finished command....\n");
cleanup:
return;
}
//$--main-----------------------------------------------------------------------
// Gateway message tracking sample application entry point.
// -----------------------------------------------------------------------------
int main(int argc, char *argv[])
{
HRESULT hr = NOERROR;
DEBUGPUBLIC("main()\n");
//
// Initialize MAPI
//
hr = MAPIInitialize(NULL);
if(FAILED(hr))
{
printf("ERROR: MAPI initialize failed\n");
goto cleanup;
}
fInitializedMAPI = TRUE;
//
// Configure
//
hr = HrConfig(argc, argv);
if(FAILED(hr))
{
goto cleanup;
}
//
// Initialize gateway message tracking
//
hr = HrTrackInitLog(
szServer,
&pvSession);
if(FAILED(hr))
{
printf("ERROR: tracking initialize failed\n");
goto cleanup;
}
lpszRecipients[0] = (LPTSTR)szRecip1;
lpszRecipients[1] = (LPTSTR)szRecip2;
lpszRecipients[2] = (LPTSTR)szRecip3;
lpszRecipients[3] = (LPTSTR)szRecip4;
lpszRecipients[4] = (LPTSTR)szRecip5;
lpszRecipients[5] = (LPTSTR)szRecip6;
lpszRecipients[6] = (LPTSTR)szRecip7;
printf("\n");
printf("Processing commands.\n");
for(;;)
{
ULONG ulChoice = 0;
printf("\nMENU:\n");
printf("\t 1. Enter command\n");
printf("\t 2. Run command\n");
printf("\t 0. Exit\n");
if(FAILED(HrDoEnterNumber("SELECTION", TRUE, &ulChoice)))
{
continue;
}
switch(ulChoice)
{
case 1:
DoEnterCommand();
break;
case 2:
DoRunCommand();
break;
case 0:
goto cleanup;
break;
default:
printf("ERROR: unknown menu selection\n");
break;
}
}
cleanup:
//
// Uninitialize gateway message tracking
//
if(pvSession != NULL)
{
hr = HrTrackUninitLog(&pvSession);
if(FAILED(hr))
{
printf("ERROR: tracking uninitialize failed\n");
}
}
if(fInitializedMAPI == TRUE)
{
MAPIUninitialize();
fInitializedMAPI = FALSE;
}
// return exit code
return _nEcFromHr(hr);
}