windows-nt/Source/XPSP1/NT/printscan/fax/exchange/ab/faxab.h
2020-09-26 16:20:57 +08:00

527 lines
19 KiB
C

/*
- FAXAB . H
-
* Purpose:
* Header file for the Microsoft At Work Fax Address Book.
*
* Yoram Yaacovi, 1/94
*/
/*
* Windows headers
*/
#ifdef WIN95
#undef TAPI_CURRENT_VERSION
#define TAPI_CURRENT_VERSION 0x00010004
#endif
#ifdef WIN32
#define INC_OLE2 /* Get the OLE2 stuff */
#define INC_RPC /* harmless on Daytona; Chicago needs it */
#endif
#include <windows.h>
#include <windowsx.h>
#include <limits.h>
#include <memory.h>
#include <commdlg.h>
#include <string.h>
#include <mbstring.h>
#define itoa _itoa // MSVCNT libs export _itoa, not itoa.
/*
* MAPI headers
*/
#include <mapiwin.h>
#include <mapidefs.h>
#include <mapicode.h>
#include <mapitags.h>
#include <mapiguid.h>
#include <mapispi.h>
#include <mapiutil.h>
#include <mapival.h>
/*
* TAPI headers
*/
#include <tapi.h>
/*
* At Work Fax common headers
*/
#include <awfaxab.rh>
#include <awrc32.h>
#include <property.h> // At Work Fax MAPI properties
//#include <uiutil.h> // At Work Fax UI (awfxcg32.dll) exports
//#include <mem.h> // At Work Fax UI (awfxcg32.dll) memory handling
#include <debug.h> // At Work Fax UI (awfxcg32.dll) debug macros and functions
#include <entryid.h> // At Work Fax various entry IDs
/*
* Macros
*/
#define SIZEOF(x) sizeof(x)
#define ARRAYSIZE(x) (sizeof(x)/sizeof(x[0]))
/*********************************************
**** Common address book objects members ****
*********************************************/
/*
* IUnknown base members
*/
#define FAB_IUnknown \
LONG lcInit; \
HRESULT hResult; \
UINT idsLastError; \
HINSTANCE hLibrary; \
LPALLOCATEBUFFER lpAllocBuff; \
LPALLOCATEMORE lpAllocMore; \
LPFREEBUFFER lpFreeBuff; \
LPMALLOC lpMalloc; \
CRITICAL_SECTION cs
#define FAB_IUnkWithLogon \
FAB_IUnknown; \
LPABLOGON lpABLogon
#define FAB_Wrapped \
FAB_IUnkWithLogon; \
LPMAPIPROP lpPropData
/*
* At Work Fax AB headers
*/
#include "wrap.h"
#include "tblwrap.h"
#include "abp.h"
#include "abeid.h"
#include "abcont.h"
#include "abctbl.h"
#include "root.h"
#include "status.h"
#include "abuser.h"
#include "oouser.h"
#include "tid.h"
#include "ootid.h"
/**** Constants ***/
#define STRING_MAX 256 // Maximum size of string in the
// resource file string table or in the .ini file
#define SEL_STRING_MAX 50 // Maximum size of string for drop-down box selections
// Maximum sizes for various properties
#define MAX_DISPLAY_NAME 150 // Maximum size of display names (??)
#define MAX_ADDRTYPE 25 // Maximum size of address type (??)
#define MAX_EMAIL_ADDRESS MAX_PATH // Maximum size of an email addr (fax #)
#define MAX_MACHINE_CAPS 30 // Maximum size for fax capability string
#define MAX_SEARCH_NAME 50
// Display Table stuff
#define GROUPBOX_TEXT_SIZE 40
#define LABEL_TEXT_SIZE 40
#define BUTTON_TEXT_SIZE 25
#define TAB_TEXT_SIZE 15
// TAPI-ish defines
#define COUNTRY_CODE_SIZE 10
#define AREA_CODE_SIZE 10
#define TELEPHONE_NUMBER_SIZE 50
#define ROUTING_NAME_SIZE 150
#define CANONICAL_NUMBER_SIZE (10+COUNTRY_CODE_SIZE+AREA_CODE_SIZE+TELEPHONE_NUMBER_SIZE+ROUTING_NAME_SIZE)
typedef struct tagPARSEDTELNUMBER
{
TCHAR szCountryCode[COUNTRY_CODE_SIZE+1]; // country code
TCHAR szAreaCode[AREA_CODE_SIZE+1]; // area code
TCHAR szTelNumber[TELEPHONE_NUMBER_SIZE+1]; // telephone number
TCHAR szRoutingName[ROUTING_NAME_SIZE+1]; // routing name within the tel number destination
} PARSEDTELNUMBER, *LPPARSEDTELNUMBER;
BOOL EncodeFaxAddress(LPTSTR lpszFaxAddr, LPPARSEDTELNUMBER lpParsedFaxAddr);
BOOL DecodeFaxAddress(LPTSTR lpszFaxAddr, LPPARSEDTELNUMBER lpParsedFaxAddr);
/*
* Function pointer prototypes for fax config functions
*/
typedef BOOL (* PFN_DECODE_FAX_ADDRESS)(LPTSTR lpszFaxAddr, LPPARSEDTELNUMBER lpParsedFaxAddr);
typedef BOOL (* PFN_ENCODE_FAX_ADDRESS)(LPTSTR lpszFaxAddr, LPPARSEDTELNUMBER lpParsedFaxAddr);
#ifdef RADIO_BUTTON
#define RADIO_BUTTON_1_RETURN_VALUE 1
#define RADIO_BUTTON_2_RETURN_VALUE 2
#define RADIO_BUTTON_3_RETURN_VALUE 3
#define RADIO_BUTTON_4_RETURN_VALUE 4
#endif
/****************************************
********* Properties **************
****************************************/
// CHECK: Move to property.h ?
// #define EFAX_PR_OPTIONS_BASE 0x6600
/*
* Prop Tag associated with my szFileName in the profile
*/
#define PR_FAB_FILE_A PROP_TAG(PT_STRING8,0x6600)
#define PR_FAB_UID PROP_TAG(PT_BINARY,0x6601)
/****** Display table related properties ******/
// Drop Down list box for country codes
#define PR_DDLBX_COUNTRIES_TABLE PROP_TAG(PT_OBJECT,0x6603)
// Template Buttons
#define PR_DIAL_HELPER_BUTTON PROP_TAG(PT_OBJECT,0x6604)
#define PR_ADVANCED_BUTTON PROP_TAG(PT_OBJECT,0x6605)
#define PR_DIAL_LONG_DISTANCE PROP_TAG(PT_BOOLEAN,0x6606)
// Address components properties moved to property.h. They are
// now used by chicago\security\chicago.c
// 0x6607-0x660a
// PR_COUNTRY_ID
// PR_AREA_CODE
// PR_TEL_NUMBER
#define PR_PREVIOUS_CP_NAME_A PROP_TAG(PT_STRING8,0x660b)
/******
****** Cross program Globals
******/
#ifdef _FAXAB_ABP
LCID lcidUser; // The Local Identifier
MAPIUID muidABMAWF = MUIDABMAWF; // This provider's MAPIUID
// HINSTANCE hInst; // This provider instance
LPTSTR lpszEMT = TEXT("FAX"); // This provider's Email Type
BOOL fDebugTrap = FALSE; // Deubg trap flag
BOOL fExposeFaxAB = FALSE; // Whether or not to expose the Fax AB
/*
* structures and filters defined for display tables
*/
DTBLLABEL dtbllabel = { sizeof(DTBLLABEL), 0 };
DTBLPAGE dtblpage = { sizeof(DTBLPAGE), 0, 0, 0 };
DTBLGROUPBOX dtblgroupbox = { sizeof(DTBLGROUPBOX), 0 };
CHAR szNoFilter[] = "*";
CHAR szDigitsOnlyFilter[] = "[0-9]";
CHAR szTelephoneNumberFilter[] = "[0-9\\-\\. ,\\|AaBbCcDdPpTtWw\\*#!@\\$\\?;]";
CHAR szAddrTypeFilter[] = "[~:]";
CHAR szFileNameFilter[] = "[~ \\\\]"; /* ends up [~<space><tab>\\] */
/*
* Standard column set is straight from the spec of required columns
* for Display Tables
*/
static const SizedSPropTagArray(8, DetInitColSet) =
{
8,
{
PR_ROWID,
PR_XPOS,
PR_DELTAX,
PR_YPOS,
PR_DELTAY,
PR_CONTROL_TYPE,
PR_CONTROL_FLAGS,
PR_CONTROL_STRUCTURE
}
};
#else
extern LCID lcidUser;
extern MAPIUID muidABMAWF;
// extern HINSTANCE hInst;
extern LPTSTR lpszEMT;
extern BOOL fDebugTrap;
extern BOOL fExposeFaxAB;
extern DTBLLABEL dtbllabel;
extern DTBLPAGE dtblpage;
extern DTBLGROUPBOX dtblgroupbox;
extern CHAR szNoFilter[];
extern CHAR szDigitsOnlyFilter[];
extern CHAR szTelephoneNumberFilter[];
extern CHAR szAddrTypeFilter[];
extern CHAR szFileNameFilter[]; // ends up [~\\]
extern SPropTagArray DetInitColSet;
#endif // _FAXAB_ABP
/****************************************
****** Common functions prototypes ******
****************************************/
/*
* Creates a new contents table object
*/
HRESULT
HrNewIVTAbc (LPMAPITABLE * lppIVTAbc,
LPABLOGON lpABLogon,
LPABCONT lpABC,
HINSTANCE hLibrary,
LPALLOCATEBUFFER lpAllocBuff,
LPALLOCATEMORE lpAllocMore,
LPFREEBUFFER lpFreeBuff,
LPMALLOC lpMalloc );
/*
* Creates/Updates the SAB's root hierarchy
*/
HRESULT
HrBuildRootHier(LPABLOGON lpABLogon, LPMAPITABLE * lppMAPITable);
/*
* Sets an error string associated with a particular hResult on an object.
* It's used in conjunction with the method GetLastError.
*/
VOID SetErrorIDS (LPVOID lpObject, HRESULT hResult, UINT ids);
/*
* Loads a string from a resource. Optionally allocates room for the string
* if lpAllocBuff is not NULL. See ABP.C.
*/
SCODE ScLoadString( UINT ids,
ULONG ulcch,
LPALLOCATEBUFFER lpAllocBuff,
HINSTANCE hLibrary,
LPTSTR * lppsz);
/*
* Calls TAPI to get current location area code and returns a pointer
* to a string for it.
*/
LPTSTR
GetCurrentLocationAreaCode( void );
/*
* Calls TAPI to get current location country id
*/
DWORD
GetCurrentLocationCountryID( void );
/* ***************************************************************************
* GetCountry
*
* - gets the a country or a country list from TAPI
*
* Parameters: dwReqCountryID - a TAPI country ID. 0 for all countries
*
* Returns: TRUE on success, FALSE on failure. *lppLineCountryList must
* be freed with LocalFree.
*/
BOOL
GetCountry( DWORD dwReqCountryID,
LPLINECOUNTRYLIST *lppLineCountryList
);
/* ***************************************************************************
* GetCountryCode
*
* - gets a country code when given a country ID
*
* Parameters: dwReqCountryID - a TAPI country ID
* lpdwCountryCode - an address of a DWORD in which to store the country code
*
* Returns: TRUE on success, FALSE on failure.
*/
BOOL
GetCountryCode( DWORD dwReqCountryID,
DWORD *lpdwCountryCode
);
/****************************************************************************
FUNCTION: MakeMessageBox
PURPOSE: Gets resource string and displays an error message box.
PARAMETERS: hInst - Instnace of the caller (for getting strings)
hWnd - Handle to parent window
ulResult - Result/Status code
0: information message
100-499: warning message
500 and up: error message
idString - Resource ID of message in StringTable
fStyle - style of the message box
RETURNS: the return value from MessageBox() function
****************************************************************************/
int
MakeMessageBox( HINSTANCE hInst,
HWND hWnd,
DWORD ulResult,
UINT idString,
UINT fStyle,
...
);
/* ***************************************************************************
* EncodeFaxAddress
*
* - encodes fax address components into the format name@+country-code (area-code) fax-number
*
* Parameters: lpszFaxAddr - address of a buffer in which to fill the encoded fax number
* lpParsedFaxAddr - an address of a PARSEDTELNUMBER structure which contains
* the components of the address that need to be encoded
*
* Returns: TRUE on success, FALSE on failure.
*
* CHECK: will need localization
*/
BOOL EncodeFaxAddress( LPTSTR lpszFaxAddr,
LPPARSEDTELNUMBER lpParsedFaxAddr
);
/* ***************************************************************************
* DecodeFaxAddress
*
* - parses a fax address of the format name@+country-code (area-code) fax-number
*
* Parameters: lpszFaxAddr - a Fax address in the above format
* lpParsedFaxAddr - an address of a PARSEDTELNUMBER structure in which to
* fill the parsed information
*
* Returns: TRUE on success, FALSE on failure.
* success: full address
* no routing name
* no area code
* failure: no '+country-code '
* no telephone number
*
* CHECK: will need localization
*/
BOOL DecodeFaxAddress( LPTSTR lpszFaxAddr,
LPPARSEDTELNUMBER lpParsedFaxAddr
);
#ifdef DO_WE_REALLY_NEED_TAPI
/* ***************************************************************************
* InitTAPI
*
* initializes TAPI by calling lineInitialize. enumerates all the available
* lines to set up pt_lpVdts->lprgLineInfo. also opens up each available line for
* monitoring. sets up pt_lpVdts->iLineCur and pt_lpVdts->iAddrCur by checking the
* preferred line/address name stored in the ini file against the available
* line/address names.
*
* Parameters: hInst - the instance of the calling module
* hWnd - window handle for UI
* lpszAppName - the name of the calling module
*
* returns NO_ERROR if success and the corresponding error code otherwise.
*/
DWORD
InitTAPI( HINSTANCE hInst,
HWND hWnd,
LPTSTR lpszAppName
);
/****************************************************************************
* DeinitTAPI
*
* frees up the memory allocated, closes all the lines we have opened for
* monitoring and calls lineShutDown to disconnect from TAPI.
*/
BOOL DeinitTAPI();
//
typedef struct _TagPTGData
{
CRITICAL_SECTION csInstance; // Critical section ro control access to hInst
WORD wInvocationFlags; // MAWFSettingsDialog invocation flags
HINSTANCE hInst; // DLL instance
HWND hWnd; // Application main window
LPPROPSTORAGE lpPropStorage; // Profile Section pointer
tThreadParam threadParam; // parameter passed to the wait-for-app thread
TCHAR szDefCoverPage[MAX_PATH]; // the default cover page file name
MEMALLOCATIONS *lpMemAllocations; // pointer to the allocations array
DEVICETYPE aDeviceTypes[NUMBER_OF_DEVICE_TYPES]; // the device types array
WORD cDeviceTypes; // number of device types
PARSEDMODEM aDevices[NUMBER_OF_DEVICES]; // The devices array
WORD iDeviceIndex; // index (in the aDevices) of the active fax device
WORD cDevices; // number of devices in the aDevices array
NONTAPIDEVICE aNonTAPIDevices[NUMBER_OF_DEVICES]; // the non-TAPI devices array
WORD iLastDeviceAdded; // type of the last device added
HWND hAddModemDlg; // handle of the DeviceAdd dialog
HWND hDeviceListDlg; // handle of the dialog that contains the device list
LPDTS lpVdts; // TAPI info structure
LPMALLOC lpMalloc; // IMalloc memory allocator
} PTGDATA, *LPPTGDATA;
/*********************************
****** Constants *************
*********************************/
#define NOT_SIGNED FALSE // for SetDlgItemInt()
#define MAPI_ERROR_MAX 30
#define MAX_SENDER_NAME_SIZE 255 // maximum size fo the sender name
#define MAX_BILLING_CODE_SIZE 8 // Maximum size of billing code
#define MAX_NUMBER_OF_BILLING_CODES 10 // Maximum number of billing codes in prev list
#define NUMBER_OF_MV_STRINGS 20 // Maximum number of strings in a multi value property
#define NUMBER_OF_DEVICES 20 // Maximum # of devices I can handle
#define NUMBER_OF_DEVICE_TYPES 20 // Maximum # of devices types I can handle
#define NUM_OF_PROPERTIES 70 // Number of properties
#define SIZE_OF_PROP_STRINGS 1000 // Size of buffer allocated for ALL string properties
#define SIZE_OF_PROP_SAVE_NAMES 400 // Size of buffer allocated for the property save names
#define NUM_OF_MAWF_PROPERTY_PAGES 4 // Number of At Work Fax Property Sheet pages
#define MAWF_SHORT 1 // Display one page MAWF property sheet
#define MAWF_FULL NUM_OF_MAWF_PROPERTY_PAGES // Display all pages MAWF property sheet
#define INIT_BUF_SIZE 1024
#define szAWKey "Software\\Microsoft\\At Work Fax"
// this should only happen if the thread did not have private storage, and
// an attempt to allocate one failed
#define CHECK_THREAD_STORAGE_POINTER(ptr,func,result) \
if (!(ptr)) \
{ \
Assert((ptr)); \
DEBUG_TRACE("%s: bad thread storage pointer. thread %x\n", (func), GetCurrentThreadId()); \
return ((result)); \
}
#define pt_csInstance lpPTGData->csInstance // per-thread critical section (for hInst)
#define pt_wInvocationFlags lpPTGData->wInvocationFlags // per-thread invocation flags
#define pt_hInst lpPTGData->hInst // per-thread instance handle
#define pt_hWnd lpPTGData->hWnd // per-thread main window handle
#define pt_lpPropStorage lpPTGData->lpPropStorage // per-thread property storage object
#define pt_threadParam lpPTGData->threadParam // per-thread CPE thread parameters
#define pt_szDefCoverPage lpPTGData->szDefCoverPage // per-thread default cover page
#define pt_lpMemAllocations lpPTGData->lpMemAllocations // per-thread memory allocations tracker
#define pt_aDeviceTypes lpPTGData->aDeviceTypes // per-thread device types list
#define pt_cDeviceTypes lpPTGData->cDeviceTypes // per-thread # of device types
#define pt_aDevices lpPTGData->aDevices // per-thread fax devices list
#define pt_cDevices lpPTGData->cDevices // per-thread # of fax devices
#define pt_iDeviceIndex lpPTGData->iDeviceIndex // per-thread current fax device index
#define pt_aNonTAPIDevices lpPTGData->aNonTAPIDevices // per-thread non-TAPI devices array
#define pt_iLastDeviceAdded lpPTGData->iLastDeviceAdded // per-thread type of last device added
#define pt_hAddModemDlg lpPTGData->hAddModemDlg // per-thread AddModem dlg handle
#define pt_hDeviceListDlg lpPTGData->hDeviceListDlg // per-thread device list dlg handle
#define pt_lpVdts lpPTGData->lpVdts // per-thread TAPI state
#define pt_lpMalloc lpPTGData->lpMalloc
#endif // DO_WE_REALLY_NEED_TAPI