|
|
////////////////////////////////////////////////////////////////////////////////
//
// 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_
|