319 lines
8.6 KiB
C
319 lines
8.6 KiB
C
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// SInfo.c
|
||
|
//
|
||
|
// Summary Information API implementation
|
||
|
//
|
||
|
// Notes:
|
||
|
// To make this file useful for OLE objects, define OLE_PROPS.
|
||
|
//
|
||
|
// The macro lpDocObj must be used for all methods to access the
|
||
|
// object data to ensure that this will compile with OLE_PROPS defined.
|
||
|
// The macro lpData must also be used for all access to the m_lpData
|
||
|
// member of the object. These macros only work when the LPSIOBJ
|
||
|
// parameter is named lpSIObj!
|
||
|
//
|
||
|
// All strings stored in objects are in the format described in proptype.h
|
||
|
//
|
||
|
// Change history:
|
||
|
//
|
||
|
// Date Who What
|
||
|
// --------------------------------------------------------------------------
|
||
|
// 06/03/94 B. Wentz Created file
|
||
|
// 06/08/94 B. Wentz Updated to new string format
|
||
|
// 06/25/94 B. Wentz Updated to lean & mean API
|
||
|
// 07/20/94 M. Jansson Updated include statemes, due to changes in PDK
|
||
|
//
|
||
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#include "priv.h"
|
||
|
#pragma hdrstop
|
||
|
#include "reg.h"
|
||
|
|
||
|
#ifndef _ABBREVIATED_DOCPROP_
|
||
|
|
||
|
// Internal prototypes
|
||
|
void PASCAL FreeData (LPSIOBJ lpSIObj);
|
||
|
|
||
|
// Do nothing for non-OLE code....
|
||
|
#define lpDocObj lpSIObj
|
||
|
#define lpData ((LPSINFO) lpSIObj->m_lpData)
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// OfficeDirtySIObj
|
||
|
//
|
||
|
// Purpose:
|
||
|
// Sets object state to dirty or clean.
|
||
|
//
|
||
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
DLLEXPORT VOID OfficeDirtySIObj (
|
||
|
LPSIOBJ lpSIObj, // The object
|
||
|
BOOL fDirty) // Flag indicating if the object is dirty.
|
||
|
{
|
||
|
Assert(lpSIObj != NULL);
|
||
|
lpDocObj->m_fObjChanged = fDirty;
|
||
|
|
||
|
} // OfficeDirtySIObj
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// FSumInfoCreate
|
||
|
//
|
||
|
// Purpose:
|
||
|
// Create the object and return it. Caller responsible for destruction.
|
||
|
//
|
||
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
BOOL FSumInfoCreate (
|
||
|
LPSIOBJ FAR *lplpSIObj, // Pointer to object
|
||
|
const void *prglpfn[]) // Pointer to functions
|
||
|
{
|
||
|
LPSIOBJ lpSIObj; // Hack - a temp, must call it "lpSIObj" for macros to work!
|
||
|
DWORD cb;
|
||
|
TCHAR szValue[10];
|
||
|
|
||
|
if (lplpSIObj == NULL)
|
||
|
return(TRUE);
|
||
|
|
||
|
// Make sure we get valid args before we start alloc'ing
|
||
|
if ((prglpfn == NULL) || (prglpfn[ifnCPConvert] == NULL) ||
|
||
|
((prglpfn[ifnFSzToNum] == NULL) && (prglpfn[ifnFNumToSz] != NULL)) ||
|
||
|
((prglpfn[ifnFSzToNum] != NULL) && (prglpfn[ifnFNumToSz] == NULL)))
|
||
|
return FALSE;
|
||
|
|
||
|
if ((*lplpSIObj = (LPSIOBJ) PvMemAlloc(sizeof (OFFICESUMINFO))) == NULL)
|
||
|
{
|
||
|
// REVIEW: Add alert
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
lpSIObj = *lplpSIObj; // Save us some indirecting & let us use the "LP" macros
|
||
|
|
||
|
// If alloc fails, free the original object too.
|
||
|
if ((lpData = (LPSINFO) PvMemAlloc(sizeof (SINFO))) == NULL)
|
||
|
{
|
||
|
// REVIEW: Add alert
|
||
|
VFreeMemP(*lplpSIObj, sizeof(OFFICESUMINFO));
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
FillBuf ((void *) lpData, (int) 0, (sizeof (SINFO) - ifnSIMax*(sizeof (void *))));
|
||
|
|
||
|
// Save the fnc for code page conversion, SzToNum, NumToSz
|
||
|
lpData->lpfnFCPConvert = (BOOL (*)(LPTSTR, DWORD, DWORD, BOOL)) prglpfn[ifnCPConvert];
|
||
|
lpData->lpfnFSzToNum = (BOOL (*)(NUM *, LPTSTR)) prglpfn[ifnFSzToNum];
|
||
|
lpData->lpfnFNumToSz = (BOOL (*)(NUM *, LPTSTR, DWORD)) prglpfn[ifnFNumToSz];
|
||
|
lpData->lpfnFUpdateStats = (BOOL (*)(HWND, LPSIOBJ, LPDSIOBJ)) prglpfn[ifnFUpdateStats];
|
||
|
|
||
|
// Check the registry to see if we should disable Total Editing tracking
|
||
|
cb = sizeof(szValue);
|
||
|
if (RegQueryValue(HKEY_CURRENT_USER, vcszNoTracking,
|
||
|
(LPTSTR)&szValue, &cb) == ERROR_SUCCESS
|
||
|
&& cb < sizeof(szValue))
|
||
|
lpData->fNoTimeTracking = (lstrcmpi(szValue,TEXT("0")) != 0); // lstrcmpi returns 0 if equal
|
||
|
|
||
|
OfficeDirtySIObj (*lplpSIObj, FALSE);
|
||
|
(*lplpSIObj)->m_hPage = NULL;
|
||
|
|
||
|
return TRUE;
|
||
|
|
||
|
} // FSumInfoCreate
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// FreeData
|
||
|
//
|
||
|
// Purpose:
|
||
|
// Deallocates all the member data for the object
|
||
|
//
|
||
|
// Note:
|
||
|
// Assumes object is valid.
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
void PASCAL FreeData (
|
||
|
LPSIOBJ lpSIObj) // Pointer to valid object
|
||
|
{
|
||
|
|
||
|
// Free any buffers held by PropVariants.
|
||
|
|
||
|
FreePropVariantArray (NUM_SI_PROPERTIES, GETSINFO(lpSIObj)->rgpropvar);
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// FSumInfoClear
|
||
|
//
|
||
|
// Purpose:
|
||
|
// Clear the data stored in the object, but do not destroy the object.
|
||
|
//
|
||
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
BOOL FSumInfoClear (
|
||
|
LPSIOBJ lpSIObj) // Pointer to object
|
||
|
{
|
||
|
BOOL fNoTimeTracking;
|
||
|
|
||
|
if ((lpDocObj == NULL) ||
|
||
|
(lpData == NULL))
|
||
|
return TRUE;
|
||
|
|
||
|
// Free data in the SINFO structure.
|
||
|
FreeData (lpDocObj);
|
||
|
|
||
|
// Invalidate any OLE Automation DocumentProperty objects we might have
|
||
|
InvalidateVBAObjects(lpSIObj, NULL, NULL);
|
||
|
|
||
|
// Clear the data, don't blt over the fn's stored at the end.
|
||
|
fNoTimeTracking = lpData->fNoTimeTracking;
|
||
|
FillBuf ((void *) lpData, (int) 0, (sizeof (SINFO) - ifnSIMax*(sizeof (void *))));
|
||
|
lpData->fNoTimeTracking = fNoTimeTracking;
|
||
|
|
||
|
OfficeDirtySIObj (lpSIObj, TRUE);
|
||
|
return TRUE;
|
||
|
|
||
|
} // FSumInfoClear
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// FSumInfoDestroy
|
||
|
//
|
||
|
// Purpose:
|
||
|
// Destroy the object
|
||
|
//
|
||
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
BOOL FSumInfoDestroy (LPSIOBJ *lplpSIObj) // Pointer to pointer to object
|
||
|
{
|
||
|
if ((lplpSIObj == NULL) ||
|
||
|
(*lplpSIObj == NULL))
|
||
|
return TRUE;
|
||
|
|
||
|
if ((*lplpSIObj)->m_lpData != NULL)
|
||
|
{
|
||
|
// Free data held by the SINFO structure.
|
||
|
FreeData (*lplpSIObj);
|
||
|
|
||
|
// Invalidate any OLE Automation DocumentProperty objects we might have
|
||
|
InvalidateVBAObjects(*lplpSIObj, NULL, NULL);
|
||
|
|
||
|
// Free the SINFO structure itself.
|
||
|
VFreeMemP((*lplpSIObj)->m_lpData, sizeof(SINFO));
|
||
|
}
|
||
|
|
||
|
// Free the OFFICESUMINFO buffer.
|
||
|
VFreeMemP(*lplpSIObj, sizeof(OFFICESUMINFO));
|
||
|
|
||
|
*lplpSIObj=NULL;
|
||
|
return TRUE;
|
||
|
|
||
|
} // FSumInfoDestroy
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// FSumInfoShouldSave
|
||
|
//
|
||
|
// Purpose:
|
||
|
// Indicates if the data has changed, meaning a write is needed.
|
||
|
//
|
||
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
DLLEXPORT BOOL FSumInfoShouldSave (LPSIOBJ lpSIObj) // Pointer to object
|
||
|
{
|
||
|
if (lpDocObj == NULL)
|
||
|
return FALSE;
|
||
|
|
||
|
return lpDocObj->m_fObjChanged;
|
||
|
|
||
|
} // FSumInfoShouldSave
|
||
|
|
||
|
|
||
|
//
|
||
|
// VSumInfoSetPropBit
|
||
|
//
|
||
|
// Set the bit that indicates that a filetime has been set/loaded
|
||
|
//
|
||
|
VOID PASCAL VSumInfoSetPropBit(LONG pid, BYTE *pbPropSet)
|
||
|
{
|
||
|
switch (pid)
|
||
|
{
|
||
|
case PID_EDITTIME:
|
||
|
*pbPropSet |= bEditTime;
|
||
|
break;
|
||
|
case PID_LASTPRINTED:
|
||
|
*pbPropSet |= bLastPrint;
|
||
|
break;
|
||
|
case PID_CREATE_DTM:
|
||
|
*pbPropSet |= bCreated;
|
||
|
break;
|
||
|
case PID_LASTSAVE_DTM:
|
||
|
*pbPropSet |= bLastSave;
|
||
|
break;
|
||
|
case PID_PAGECOUNT:
|
||
|
*pbPropSet |= bPageCount;
|
||
|
break;
|
||
|
case PID_WORDCOUNT:
|
||
|
*pbPropSet |= bWordCount;
|
||
|
break;
|
||
|
case PID_CHARCOUNT:
|
||
|
*pbPropSet |= bCharCount;
|
||
|
break;
|
||
|
case PID_DOC_SECURITY:
|
||
|
*pbPropSet |= bSecurity;
|
||
|
break;
|
||
|
#ifdef DEBUG
|
||
|
default:
|
||
|
Assert(FALSE);
|
||
|
break;
|
||
|
#endif
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// FSumInfoPropBitIsSet
|
||
|
//
|
||
|
// Check the bit that indicates that a filetime has been set/loaded
|
||
|
//
|
||
|
BOOL PASCAL FSumInfoPropBitIsSet(LONG pid, BYTE bPropSet)
|
||
|
{
|
||
|
switch (pid)
|
||
|
{
|
||
|
case PID_EDITTIME:
|
||
|
return (bPropSet & bEditTime);
|
||
|
break;
|
||
|
case PID_LASTPRINTED:
|
||
|
return(bPropSet & bLastPrint);
|
||
|
break;
|
||
|
case PID_CREATE_DTM:
|
||
|
return(bPropSet & bCreated);
|
||
|
break;
|
||
|
case PID_LASTSAVE_DTM:
|
||
|
return(bPropSet & bLastSave);
|
||
|
break;
|
||
|
case PID_PAGECOUNT:
|
||
|
return(bPropSet & bPageCount);
|
||
|
break;
|
||
|
case PID_WORDCOUNT:
|
||
|
return(bPropSet & bWordCount);
|
||
|
break;
|
||
|
case PID_CHARCOUNT:
|
||
|
return(bPropSet & bCharCount);
|
||
|
break;
|
||
|
case PID_DOC_SECURITY:
|
||
|
return(bPropSet & bSecurity);
|
||
|
break;
|
||
|
default:
|
||
|
#ifdef DEBUG
|
||
|
Assert(FALSE);
|
||
|
#endif
|
||
|
return(FALSE);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endif // _ABBREVIATED_DOCPROP_
|