|
|
1.1 ! root 1: /* ! 2: * stream.c - io stream function callbacks ! 3: * ! 4: * Created by Microsoft Corporation. ! 5: * (c) Copyright Microsoft Corp. 1990 - 1992 All Rights Reserved ! 6: */ ! 7: ! 8: /*************************************************************************** ! 9: * This file contains all routines that directly and indirectly deal with ! 10: * file i/o. The OLE stream call back functions exist in this file. ! 11: **************************************************************************/ ! 12: ! 13: //*** INCLUDES *** ! 14: ! 15: #include <windows.h> ! 16: #include <ole.h> ! 17: ! 18: #include "global.h" ! 19: #include "utility.h" ! 20: #include "stream.h" ! 21: #include "object.h" ! 22: #include "demorc.h" ! 23: ! 24: //*** Globals *** ! 25: ! 26: BOOL fLoadFile = FALSE; ! 27: ! 28: /*************************************************************************** ! 29: * ReadStream() - OLE Callback Function (Get) ! 30: * ! 31: * This function is pointed to from the OLESTREAM vtbl; it is Get. ! 32: * ! 33: * returns DWORD - number of bytes actually read ! 34: **************************************************************************/ ! 35: ! 36: DWORD APIENTRY ReadStream( //* ENTRY: ! 37: LPAPPSTREAM lpStream, //* application stream pointer ! 38: LPSTR lpstr, //* string pointer ! 39: DWORD cb //* byte count ! 40: ){ ! 41: ! 42: return _lread(lpStream->fh, lpstr, cb); ! 43: ! 44: } ! 45: ! 46: /*************************************************************************** ! 47: * WriteStream() - OLE Callback function (Put) ! 48: * ! 49: * This function is pointed to from the OLESTREAM vtbl; it is Put. ! 50: * ! 51: * Returns DWORD - number of bytes actually written ! 52: **************************************************************************/ ! 53: ! 54: DWORD APIENTRY WriteStream( //* ENTRY: ! 55: LPAPPSTREAM lpStream, //* application stream pointer ! 56: LPSTR lpstr, //* string pointer ! 57: DWORD cb //* number of bytes to write ! 58: ){ ! 59: ! 60: return _lwrite(lpStream->fh, lpstr, cb); ! 61: ! 62: } ! 63: ! 64: /**************************************************************************** ! 65: * ReadFromFile() ! 66: * ! 67: * This function reads OLE objects from a file. If the document ! 68: * contains manual links, the user will be prompted to update those links. ! 69: * ! 70: * Returns BOOL - TRUE if the read(s) were successful ! 71: ***************************************************************************/ ! 72: ! 73: BOOL FAR ReadFromFile( //* ENTRY: ! 74: LPAPPSTREAM lpStream, //* application stream pointer ! 75: LHCLIENTDOC lhcDoc, //* document handle ! 76: LPOLECLIENT lpClient //* pointer to OLE client structure ! 77: ){ //* LOCAL: ! 78: BOOL bReturn = FALSE; //* return value ! 79: INT cFileObjects; //* number of file objects ! 80: ! 81: Hourglass(TRUE); ! 82: fLoadFile = TRUE; ! 83: ! 84: SetFilePointer((HANDLE)lpStream->fh, 0, NULL, 0); ! 85: //* in the file ! 86: if (_lread(lpStream->fh, (LPSTR)&cFileObjects, sizeof(INT)) < sizeof(INT)) ! 87: goto Error; ! 88: ! 89: for (; cFileObjects; --cFileObjects) ! 90: { ! 91: if (!ObjRead(lpStream,lhcDoc,lpClient)) ! 92: { ! 93: ErrorMessage(E_FAILED_TO_READ_OBJECT); ! 94: goto Error; ! 95: } ! 96: } ! 97: ! 98: ShowDoc(lhcDoc,1); ! 99: UpdateLinks(lhcDoc); ! 100: ! 101: bReturn = TRUE; //* SUCCESS ! 102: ! 103: Error: //* ERROR Tag ! 104: ! 105: Hourglass(FALSE); ! 106: fLoadFile = FALSE; ! 107: return bReturn; //* return ! 108: ! 109: } ! 110: ! 111: /**************************************************************************** ! 112: * ObjRead() ! 113: * ! 114: * Rread an object from the specified file. The file pointer will ! 115: * be advanced past the object. ! 116: * ! 117: * HANDLE fh - DOS file handle of file to be read from ! 118: * ! 119: * returns HWND - window handle to item window containing the OLE object ! 120: ***************************************************************************/ ! 121: ! 122: BOOL FAR ObjRead( //* ENTRY: ! 123: LPAPPSTREAM lpStream, //* application stream pointer ! 124: LHCLIENTDOC lhcDoc, //* document handle ! 125: LPOLECLIENT lpClient //* pointer to OLE client structure ! 126: ){ //* LOCAL: ! 127: APPITEMPTR pItem; //* application item pointer ! 128: LPOLEOBJECT lpObject; //* pointer ole object ! 129: LONG otObject; //* type of object ! 130: RECT rcObject; //* object rect ! 131: CHAR szTmp[CBOBJNAMEMAX]; //* temporary string buffer ! 132: CHAR szProto[PROTOCOL_STRLEN+1];//* protocol string ! 133: INT i; //* index ! 134: ! 135: if (_lread(lpStream->fh, szTmp, CBOBJNAMEMAX) < CBOBJNAMEMAX ) ! 136: return FALSE; ! 137: ! 138: if (_lread(lpStream->fh, szProto, PROTOCOL_STRLEN) < PROTOCOL_STRLEN ) ! 139: return FALSE; ! 140: ! 141: for (i=0; szProto[i] != ' '; i++); ! 142: szProto[i] = NULL; ! 143: ! 144: ValidateName( szTmp ); ! 145: ! 146: if (!(pItem = PreItemCreate(lpClient, TRUE, lhcDoc))) ! 147: return FALSE; ! 148: ! 149: if (Error(OleLoadFromStream((LPOLESTREAM)&(lpStream->olestream), ! 150: szProto,(LPOLECLIENT)&(pItem->oleclient), lhcDoc, szTmp, &lpObject))) ! 151: goto Error; ! 152: ! 153: if (_lread(lpStream->fh, (LPSTR)&rcObject, sizeof(RECT)) < sizeof(RECT)) ! 154: goto Error; ! 155: ! 156: if (_lread(lpStream->fh, (LPSTR)&otObject, sizeof(LONG)) < sizeof(LONG)) ! 157: goto Error; ! 158: ! 159: if (PostItemCreate(lpObject, otObject, &rcObject, pItem)) ! 160: { ! 161: pItem->fNew = TRUE; ! 162: ObjSetBounds(pItem); ! 163: return TRUE; //* SUCCESS return ! 164: } ! 165: else ! 166: return FALSE; ! 167: ! 168: Error: //* ERROR Tag ! 169: ! 170: FreeAppItem(pItem); ! 171: return FALSE; ! 172: ! 173: } ! 174: ! 175: /************************************************************************* ! 176: * WriteToFile() ! 177: * ! 178: * Write current document to a file. ! 179: * ! 180: * returns BOOL - TRUE if file successfully written ! 181: ************************************************************************/ ! 182: ! 183: BOOL FAR WriteToFile( //* ENTRY: ! 184: LPAPPSTREAM lpStream //* application stream pointer ! 185: ){ //* LOCAL: ! 186: INT iObjectsWritten=0; //* counter of objects written to file ! 187: APPITEMPTR pItem; //* application Item pointer ! 188: ! 189: UpdateFromOpenServers(); ! 190: ! 191: SetFilePointer((HANDLE)lpStream->fh, 0, NULL, 0); ! 192: ! 193: Hourglass(TRUE); ! 194: ! 195: if (_lwrite(lpStream->fh, (LPSTR)&iObjects, sizeof(INT)) < sizeof(INT)) ! 196: goto Error; ! 197: ! 198: for (pItem = GetTopItem(); pItem; pItem = GetNextItem(pItem)) ! 199: { ! 200: if (!ObjWrite(lpStream, pItem)) ! 201: goto Error; ! 202: iObjectsWritten++; ! 203: } ! 204: ! 205: if (iObjectsWritten != iObjects) ! 206: goto Error; ! 207: ! 208: ! 209: Dirty(DOC_CLEAN); ! 210: Hourglass(FALSE); ! 211: return(TRUE); //* SUCCESS return ! 212: ! 213: Error: //* ERROR Tag ! 214: ! 215: Hourglass(FALSE); ! 216: return(FALSE); //* ERROR return ! 217: ! 218: } ! 219: ! 220: /**************************************************************************** ! 221: * ObjWrite() ! 222: * ! 223: * This function writes an object to the specified ! 224: * file. The file pointer will be advanced past the end of ! 225: * the written object. ! 226: ! 227: * Returns BOOL - TRUE if object written successfully ! 228: ***************************************************************************/ ! 229: ! 230: BOOL FAR ObjWrite( //* ENTRY: ! 231: LPAPPSTREAM lpStream, //* application stream pointer ! 232: APPITEMPTR pItem //* application item pointer ! 233: ){ //* LOCAL: ! 234: POINT pt; //* center of rec point ! 235: RECT rc; //* bounding rectangle ! 236: UINT cbTmp = CBOBJNAMEMAX; ! 237: CHAR szTmp[PROTOCOL_STRLEN];//* protocol string ! 238: ! 239: OleQueryName(pItem->lpObject, szTmp, &cbTmp); ! 240: ! 241: if (_lwrite(lpStream->fh, szTmp, CBOBJNAMEMAX) < CBOBJNAMEMAX ) ! 242: return FALSE; ! 243: ! 244: if (pItem->otObject == OT_STATIC) ! 245: wsprintf(szTmp, "%-15s", STATICP); ! 246: else ! 247: wsprintf(szTmp, "%-15s", STDFILEEDITING); ! 248: ! 249: if (_lwrite(lpStream->fh, szTmp, PROTOCOL_STRLEN) < PROTOCOL_STRLEN ) ! 250: return FALSE; ! 251: ! 252: if (Error(OleSaveToStream(pItem->lpObject, (LPOLESTREAM)&(lpStream->olestream)))) ! 253: return FALSE; ! 254: ! 255: GetClientRect(pItem->hwnd, (LPRECT)&rc); ! 256: pt = *(LPPOINT)&rc; ! 257: ClientToScreen(pItem->hwnd, (LPPOINT)&pt); ! 258: ScreenToClient(hwndFrame, (LPPOINT)&pt); ! 259: OffsetRect( ! 260: &rc, ! 261: pt.x - rc.left - GetSystemMetrics(SM_CXFRAME), ! 262: pt.y - rc.top - GetSystemMetrics(SM_CYFRAME) ! 263: ); ! 264: ! 265: if (_lwrite(lpStream->fh, (LPSTR)&rc, sizeof(RECT)) < sizeof(RECT) ! 266: || _lwrite(lpStream->fh, (LPSTR)&(pItem->otObject), sizeof(LONG)) < sizeof(LONG)) ! 267: return FALSE; ! 268: ! 269: return TRUE; //* SUCCESS return ! 270: ! 271: } ! 272: ! 273: /**************************************************************************** ! 274: * UpdateLinks() ! 275: * ! 276: * Get the most up to date rendering information and show it. ! 277: ***************************************************************************/ ! 278: ! 279: static VOID UpdateLinks( //* ENTRY ! 280: LHCLIENTDOC lhcDoc //* client document handle ! 281: ){ //* LOCAL: ! 282: INT i=0; //* index ! 283: APPITEMPTR pItem; //* temporary item pointer ! 284: CHAR szUpdate[CBMESSAGEMAX];//* update message? ! 285: ! 286: for (pItem = GetTopItem(); pItem; pItem = GetNextItem(pItem)) ! 287: { ! 288: if (pItem->lhcDoc == lhcDoc && pItem->otObject == OT_LINK) ! 289: { ! 290: if (!i) ! 291: { ! 292: LoadString(hInst, IDS_UPDATELINKS, szUpdate, CBMESSAGEMAX); ! 293: if (MessageBox(hwndFrame, szUpdate, szAppName, ! 294: MB_YESNO | MB_ICONEXCLAMATION) != IDYES) ! 295: break; ! 296: i++; ! 297: } ! 298: Error(OleUpdate(pItem->lpObject)); ! 299: } ! 300: } ! 301: ! 302: WaitForAllObjects(); ! 303: ! 304: } ! 305: ! 306: /**************************************************************************** ! 307: * UpdateFromOpenServers() ! 308: * ! 309: * Get the most up to date rendering information before storing it. ! 310: ***************************************************************************/ ! 311: ! 312: static VOID UpdateFromOpenServers(VOID) ! 313: { //* LOCAL: ! 314: APPITEMPTR pItem; //* temporary item pointer ! 315: APPITEMPTR pItemNext; ! 316: ! 317: for (pItem = GetTopItem(); pItem; pItem = pItemNext) ! 318: { ! 319: pItemNext = GetNextItem(pItem); ! 320: if (pItem->otObject == OT_EMBEDDED || ! 321: (pItem->uoObject == oleupdate_oncall ! 322: && pItem->otObject == OT_LINK )) ! 323: ! 324: if (OleQueryOpen(pItem->lpObject) == OLE_OK) ! 325: { ! 326: CHAR szMessage[2*CBMESSAGEMAX]; ! 327: CHAR szBuffer[CBMESSAGEMAX]; ! 328: UINT cb = CBOBJNAMEMAX; //* The name will be the server window title. ! 329: CHAR szTmp[CBOBJNAMEMAX]; //* when the object is edited. ! 330: ! 331: Error(OleQueryName(pItem->lpObject,szTmp,&cb)); ! 332: LoadString(hInst, IDS_UPDATE_OBJ, szBuffer, CBMESSAGEMAX); ! 333: wsprintf(szMessage, szBuffer, (LPSTR)szTmp); ! 334: ! 335: if (MessageBox(hwndFrame, szMessage, szAppName, MB_YESNO | MB_ICONEXCLAMATION) == IDYES) ! 336: { ! 337: Error(OleUpdate(pItem->lpObject)); ! 338: WaitForObject(pItem); ! 339: } ! 340: if (!pItem->fVisible) ! 341: ObjDelete(pItem, OLE_OBJ_DELETE); ! 342: } ! 343: ! 344: } ! 345: ! 346: WaitForAllObjects(); ! 347: ! 348: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.