You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
2.4 KiB
117 lines
2.4 KiB
/*++
|
|
|
|
Copyright (c) 1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
tapi.c
|
|
|
|
Abstract:
|
|
|
|
This file implements common TAPI functionality
|
|
|
|
Author:
|
|
|
|
Mooly Beery (moolyb) 04-Jan-2001
|
|
|
|
Environment:
|
|
|
|
User Mode
|
|
|
|
--*/
|
|
|
|
#include <windows.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <tchar.h>
|
|
#include <WinSpool.h>
|
|
|
|
#include <faxutil.h>
|
|
#include <faxreg.h>
|
|
|
|
BOOL
|
|
GetCallerIDFromCall(
|
|
HCALL hCall,
|
|
LPTSTR lptstrCallerID,
|
|
DWORD dwCallerIDSize
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
This function will attempt to retrieve Caller ID data
|
|
from the specified call handle.
|
|
|
|
Arguments:
|
|
hCall - TAPI call handle
|
|
lptstrCallerID - pointer to buffer for Caller ID string
|
|
dwCallerIDSize - size of the string pointed to by lptstrCallerID in TCHARs
|
|
|
|
Return Values:
|
|
TRUE for success
|
|
FALSE for failure
|
|
--*/
|
|
{
|
|
BOOL success = FALSE;
|
|
LONG tapiStatus;
|
|
DWORD dwCallInfoSize = sizeof(LINECALLINFO) + 2048;
|
|
LINECALLINFO *pci = NULL;
|
|
DEBUG_FUNCTION_NAME(TEXT("GetCallerIDFromCall"));
|
|
|
|
Retry:
|
|
pci = (LINECALLINFO *)MemAlloc(dwCallInfoSize);
|
|
if(pci == NULL)
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("faled to allocate LINECALLINFO structure"));
|
|
goto Cleanup;
|
|
}
|
|
|
|
ZeroMemory(pci, dwCallInfoSize);
|
|
pci->dwTotalSize = dwCallInfoSize;
|
|
|
|
tapiStatus = lineGetCallInfo(hCall, pci);
|
|
|
|
if(tapiStatus == LINEERR_STRUCTURETOOSMALL)
|
|
{
|
|
dwCallInfoSize = pci->dwNeededSize;
|
|
MemFree(pci);
|
|
goto Retry;
|
|
}
|
|
|
|
if(tapiStatus != 0)
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("lineGetCallInfo() failed for offered call (error %x)"),
|
|
tapiStatus);
|
|
goto Cleanup;
|
|
};
|
|
|
|
// make sure we have enough space for caller ID and terminator
|
|
if(pci->dwCallerIDSize + sizeof(TCHAR) > (dwCallerIDSize * sizeof(TCHAR)))
|
|
{
|
|
SetLastError(ERROR_INSUFFICIENT_BUFFER);
|
|
goto Cleanup;
|
|
}
|
|
|
|
if(pci->dwCallerIDSize != 0)
|
|
{
|
|
memcpy((BYTE *)lptstrCallerID, (BYTE *)pci + pci->dwCallerIDOffset, pci->dwCallerIDSize);
|
|
}
|
|
|
|
// make sure it is zero terminated
|
|
lptstrCallerID[(pci->dwCallerIDSize / sizeof(TCHAR))] = TEXT('\0');
|
|
|
|
success = TRUE;
|
|
|
|
|
|
Cleanup:
|
|
if(pci)
|
|
{
|
|
MemFree(pci);
|
|
}
|
|
|
|
return success;
|
|
}
|
|
|