/*********************************************************************** * * TID.C * * Microsoft At Work Fax Address Book Template ID object * This file contains the code for implementing the Microsoft At Work Fax AB * TID object. * * Copyright 1992, 1993 Microsoft Corporation. All Rights Reserved. * * Revision History: * * When Who What * -------- ------------------ --------------------------------------- * MAPI Original source from MAPI(154) sample AB Provider * 3.7.94 Yoram Yaacovi Modifications to make it an At Work Fax ABP * 8.7.94 Yoram Yaacovi Update for MAPI 304 * ***********************************************************************/ #define _FAXAB_TID #include "faxab.h" /* * TID jump table is defined here... */ static const TID_Vtbl vtblTID = { (TID_QueryInterface_METHOD *) WRAP_QueryInterface, (TID_AddRef_METHOD *) WRAP_AddRef, TID_Release, (TID_GetLastError_METHOD *) WRAP_GetLastError, (TID_SaveChanges_METHOD *) WRAP_SaveChanges, (TID_GetProps_METHOD *) WRAP_GetProps, (TID_GetPropList_METHOD *) WRAP_GetPropList, TID_OpenProperty, (TID_SetProps_METHOD *) WRAP_SetProps, (TID_DeleteProps_METHOD *) WRAP_DeleteProps, (TID_CopyTo_METHOD *) WRAP_CopyTo, (TID_CopyProps_METHOD *) WRAP_CopyProps, (TID_GetNamesFromIDs_METHOD *) WRAP_GetNamesFromIDs, (TID_GetIDsFromNames_METHOD *) WRAP_GetIDsFromNames, }; /************************************************************************* * - HrNewTID - * Creates the TID object associated with a mail user. * * */ HRESULT HrNewTID( LPMAPIPROP * lppMAPIPropNew, ULONG cbTemplateId, LPENTRYID lpTemplateId, ULONG ulTemplateFlags, LPMAPIPROP lpPropData, LPABLOGON lpABPLogon, LPCIID lpInterface, HINSTANCE hLibrary, LPALLOCATEBUFFER lpAllocBuff, LPALLOCATEMORE lpAllocMore, LPFREEBUFFER lpFreeBuff, LPMALLOC lpMalloc ) { LPTID lpTID; SCODE sc; HRESULT hr = hrSuccess; LPMAILUSER lpABUser; ULONG ulObjType; /* * Create the user object corresponding to the template id */ hr = HrNewFaxUser( &lpABUser, &ulObjType, cbTemplateId, lpTemplateId, lpABPLogon, lpInterface, hLibrary, lpAllocBuff, lpAllocMore, lpFreeBuff, lpMalloc ); if (HR_FAILED(hr)) { goto err; } /* * Allocate space for the TID structure */ sc = lpAllocBuff(SIZEOF(TID), (LPVOID *) & lpTID); if (FAILED(sc)) { DebugTrace("NewTID() - AllocBuffer failed %s\n",SzDecodeScode(sc)); hr = ResultFromScode (sc); goto err; } /* * Initailize the TID structure */ lpTID->lpVtbl = &vtblTID; lpTID->lcInit = 1; lpTID->hResult = hrSuccess; lpTID->idsLastError = 0; lpTID->hLibrary = hLibrary; lpTID->lpAllocBuff = lpAllocBuff; lpTID->lpAllocMore = lpAllocMore; lpTID->lpFreeBuff = lpFreeBuff; lpTID->lpMalloc = lpMalloc; lpTID->lpABLogon = lpABPLogon; lpTID->lpPropData = lpPropData; lpTID->lpABUser = lpABUser; /* * First time creation - must set the address type and template id. */ if (ulTemplateFlags & FILL_ENTRY) { ULONG ulCount; LPSPropValue lpspv = NULL; /* * Copy all the properties from my object to the propdata */ hr = lpABUser->lpVtbl->GetProps( lpABUser, NULL, 0, /* ansi */ &ulCount, &lpspv ); if (FAILED(hr)) goto err; hr = lpPropData->lpVtbl->SetProps( lpPropData, ulCount, lpspv, NULL ); lpFreeBuff(lpspv); if (FAILED(hr)) goto err; } /* * AddRef lpPropData so we can use it after we return */ (void)lpPropData->lpVtbl->AddRef(lpPropData); InitializeCriticalSection(&lpTID->cs); *lppMAPIPropNew = (LPVOID) lpTID; out: DebugTraceResult(NewTID, hr); return hr; err: if (lpABUser) lpABUser->lpVtbl->Release(lpABUser); lpFreeBuff(lpTID); goto out; } /********************************************************************* ********************************************************************* * * The TID IMAPIProp methods * */ STDMETHODIMP_(ULONG) TID_Release(LPTID lpTID) { LONG lcInit; /* * Check to see if it's large enough to hold this object */ if (IsBadReadPtr(lpTID, SIZEOF(TID))) { /* * I'm not looking at an object that I expect to be. */ return 1; } /* * Check to see that it's TIDs vtbl */ if (lpTID->lpVtbl != &vtblTID) { /* * It's big enough but it's got the wrong vtbl. */ return 1; } /* * Release the mapi property object */ lpTID->lpPropData->lpVtbl->Release( lpTID->lpPropData ); EnterCriticalSection(&lpTID->cs); lcInit = --lpTID->lcInit; LeaveCriticalSection(&lpTID->cs); if (lcInit == 0) { /* * Release the ABUser object */ lpTID->lpABUser->lpVtbl->Release( lpTID->lpABUser ); /* * Clean up the critical section */ DeleteCriticalSection(&lpTID->cs); /* * Need to free the object */ lpTID->lpFreeBuff(lpTID); return 0; } return lcInit; } /* - TID_OpenProperty - * Satisfies the object that are needed to support the "Options" details pane * associated with the MailUser object from ABUSER.C. * * Note: We are masking error strings that might be possible to get from the * lpABUser object. Since (for the most part) the only errors that can be returned * from this object are resource failure types, it wouldn't be of much use to the * user. */ STDMETHODIMP TID_OpenProperty( LPTID lpTID, ULONG ulPropTag, LPCIID lpiid, ULONG ulInterfaceOptions, ULONG ulFlags, LPUNKNOWN * lppUnk ) { HRESULT hResult; /* * Check to see if it's large enough to hold this object */ if (IsBadReadPtr(lpTID, SIZEOF(TID))) { /* * No vtbl found */ return ResultFromScode(E_INVALIDARG); } /* * Check to see that it's TIDs vtbl */ if (lpTID->lpVtbl != &vtblTID) { /* * It's big enough but it's got the wrong vtbl. */ return ResultFromScode(E_INVALIDARG); } if ( ulInterfaceOptions & ~MAPI_UNICODE ) { DebugTraceArg( TID_OpenProperty, "unknown flags" ); return ResultFromScode( MAPI_E_UNKNOWN_FLAGS ); } if ( ulInterfaceOptions & MAPI_UNICODE ) { DebugTraceArg( TID_OpenProperty, "bad character width" ); return ResultFromScode( MAPI_E_BAD_CHARWIDTH ); } /* * Don't want to check any other parameters here. * Calls down to wrapped objects will do this for * me. */ switch (ulPropTag) { // For now, I just call the underlying (my) user object method to handle, which // means the template ID does not do anything. case PR_DETAILS_TABLE: case PR_DDLBX_COUNTRIES_TABLE: case PR_DIAL_HELPER_BUTTON: { hResult = lpTID->lpABUser->lpVtbl->OpenProperty( lpTID->lpABUser, ulPropTag, lpiid, ulInterfaceOptions, ulFlags, lppUnk); break; } default: { hResult = lpTID->lpPropData->lpVtbl->OpenProperty( lpTID->lpPropData, ulPropTag, lpiid, ulInterfaceOptions, ulFlags, lppUnk); break; } } DebugTraceResult(TID_OpenProperty, hResult); return hResult; } #undef _FAXAB_TID