//////////////////////////////////////////////////////////////////////////////// // // DocSum.c // // 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. // // Change history: // // Date Who What // -------------------------------------------------------------------------- // 06/01/94 B. Wentz Created file // 06/25/94 B. Wentz Converted to lean & mean API's // 07/26/94 B. Wentz Added code to merge DocumentSummary and UserDefined streams. // 08/03/94 B. Wentz Added Manager & Company Properties // //////////////////////////////////////////////////////////////////////////////// #include "priv.h" #pragma hdrstop #ifndef WINNT #include #include "offglue.h" #include #include #include "proptype.h" #include "internal.h" #include "propmisc.h" #include "debug.h" #endif #ifndef _ABBREVIATED_DOCPROP_ // Internal prototypes static void PASCAL FreeData (LPDSIOBJ lpDSIObj); static BOOL FFreeHeadPart(LPPLXHEADPART lpplxheadpart, SHORT iPlex); static SHORT ILookupHeading(LPPLXHEADPART lpplxheadpart, LPTSTR lpsz); // Do nothing for non-OLE code.... #define lpDocObj lpDSIObj #define lpData ((LPDSINFO) lpDSIObj->m_lpData) //////////////////////////////////////////////////////////////////////////////// // // OfficeDirtyDSIObj // // Purpose: // Sets object state to dirty or clean. // //////////////////////////////////////////////////////////////////////////////// VOID OfficeDirtyDSIObj (LPDSIOBJ lpDSIObj, // The object BOOL fDirty) // Flag indicating if the object is dirty. { Assert(lpDSIObj != NULL); lpDocObj->m_fObjChanged = fDirty; } // OfficeDirtyDSIObj //////////////////////////////////////////////////////////////////////////////// // // FDocSumCreate // // Purpose: // Create the object and return it. // //////////////////////////////////////////////////////////////////////////////// BOOL FDocSumCreate (LPDSIOBJ FAR *lplpDSIObj, // Pointer to pointer to object void *prglpfn[]) // Pointer to function array { LPDSIOBJ lpDSIObj; // Hack - a temp, must call it "lpDSIObj" for macros to work! if (lplpDSIObj == NULL) return(TRUE); // Make sure we get valid args before we start alloc'ing if ((prglpfn == NULL) || (prglpfn[ifnCPConvert] == NULL)) return FALSE; if ((*lplpDSIObj = (LPDSIOBJ) PvMemAlloc(sizeof (DOCSUMINFO))) == NULL) { // REVIEW: Add alert return FALSE; } lpDSIObj = *lplpDSIObj; // Save us some indirecting & let us use the "LP" macros // If alloc fails, free the original object too. if ((lpData = PvMemAlloc(sizeof (DSINFO))) == NULL) { // REVIEW: Add alert VFreeMemP(*lplpDSIObj, sizeof(DOCSUMINFO)); return FALSE; } FillBuf ((void *) lpData, (int) 0, (sizeof (DSINFO) - ifnDSIMax*(sizeof (void *)))); // Save the fnc's for Code Page conversions lpData->lpfnFCPConvert = (BOOL (*)(LPTSTR, DWORD, DWORD, BOOL)) prglpfn[ifnCPConvert]; OfficeDirtyDSIObj (*lplpDSIObj, FALSE); (*lplpDSIObj)->m_hPage = NULL; return TRUE; } // FDocSumCreate //////////////////////////////////////////////////////////////////////////////// // // FDocSumDestroy // // Purpose: // Destroy the given object. // //////////////////////////////////////////////////////////////////////////////// BOOL FDocSumDestroy (LPDSIOBJ FAR *lplpDSIObj) // Pointer to pointer to object { if ((lplpDSIObj == NULL) || (*lplpDSIObj == NULL)) return TRUE; if (((LPDSIOBJ) *lplpDSIObj)->m_lpData != NULL) { // Free data in the DSINFO structure. FreeData (*lplpDSIObj); // Invalidate any OLE Automation DocumentProperty objects we might have InvalidateVBAObjects(NULL, *lplpDSIObj, NULL); // Free the DSINFO buffer itself. VFreeMemP((*lplpDSIObj)->m_lpData, sizeof(DSINFO)); } // Free the DOCSUMINFO structure. VFreeMemP(*lplpDSIObj, sizeof(DOCSUMINFO)); *lplpDSIObj = NULL; return TRUE; } // FDocSumDestroy //////////////////////////////////////////////////////////////////////////////// // // FreeData // // Purpose: // Deallocates all the member data for the object // // Note: // Assumes object is valid. // //////////////////////////////////////////////////////////////////////////////// static void PASCAL FreeData (LPDSIOBJ lpDSIObj) // Pointer to valid object { // Free any buffers held by the PropVariants. FreePropVariantArray (NUM_DSI_PROPERTIES, GETDSINFO(lpDSIObj)->rgpropvar); } // FreeData //////////////////////////////////////////////////////////////////////////////// // // FDocSumClear // // Purpose: // Clear the data stored in the object, but do not destroy the object // //////////////////////////////////////////////////////////////////////////////// BOOL FDocSumClear (LPDSIOBJ lpDSIObj) // Pointer to object { if ((lpDocObj == NULL) || (lpData == NULL)) return TRUE; FreeData (lpDocObj); // Invalidate any OLE Automation DocumentProperty objects we might have InvalidateVBAObjects(NULL, lpDSIObj, NULL); // Clear the data, don't blt over the fn's stored at the end. FillBuf ((void *) lpData, (int) 0, (sizeof (DSINFO) - ifnDSIMax*(sizeof (void *)))); OfficeDirtyDSIObj (lpDSIObj, TRUE); return TRUE; } // FDocSumClear //////////////////////////////////////////////////////////////////////////////// // // FDocSumShouldSave // // Purpose: // Indicates if the data has changed, meaning a write is needed. // //////////////////////////////////////////////////////////////////////////////// BOOL FDocSumShouldSave (LPDSIOBJ lpDSIObj) // Pointer to object { if ((lpDocObj == NULL) || (lpData == NULL)) return FALSE; return lpDocObj->m_fObjChanged; } // FDocSumShouldSave //////////////////////////////////////////////////////////////////////////////// // // FLinkValsChanged // // Purpose: // Determine if the link values changed // //////////////////////////////////////////////////////////////////////////////// BOOL FLinkValsChanged (LPDSIOBJ lpDSIObj) // Pointer to object { BOOL f = FALSE; if ((lpDocObj == NULL) || (lpData == NULL)) return FALSE; // If the PID_LINKSDIRTY property is extant, valid, & true, // then return TRUE and clear the property. if (GETDSINFO(lpDSIObj)->rgpropvar[ PID_LINKSDIRTY ].vt == VT_BOOL && GETDSINFO(lpDSIObj)->rgpropvar[ PID_LINKSDIRTY ].boolVal) { f = TRUE; GETDSINFO(lpDSIObj)->rgpropvar[ PID_LINKSDIRTY ].boolVal = VARIANT_FALSE; } return(f); } // FLinkValsChanged #endif //_ABBREVIATED_DOCPROP_