IPS.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:15k
源码类别:

Windows编程

开发平台:

Visual C++

  1. //**********************************************************************
  2. // File name: ips.cpp
  3. //
  4. //    Implementation file for the CSimpSvrApp Class
  5. //
  6. // Functions:
  7. //
  8. //    See ips.h for a list of member functions.
  9. //
  10. // Copyright (c) 1993-1997 Microsoft Corporation. All rights reserved.
  11. //**********************************************************************
  12. #include "pre.h"
  13. #include "obj.h"
  14. #include "ips.h"
  15. #include "app.h"
  16. #include "doc.h"
  17. //@@WTK WIN32, UNICODE
  18. //#include <storage.h>
  19. DEFINE_GUID(GUID_SIMPLE, 0xBCF6D4A0, 0xBE8C, 0x1068, 0xB6, 0xD4, 0x00, 0xDD, 0x01, 0x0C, 0x05, 0x09);
  20. //**********************************************************************
  21. //
  22. // CPersistStorage::QueryInterface
  23. //
  24. // Purpose:
  25. //
  26. //
  27. // Parameters:
  28. //
  29. //      REFIID riid         -   Interface being queried for.
  30. //
  31. //      LPVOID FAR *ppvObj  -   Out pointer for the interface.
  32. //
  33. // Return Value:
  34. //
  35. //      S_OK            - Success
  36. //      E_NOINTERFACE   - Failure
  37. //
  38. // Function Calls:
  39. //      Function                    Location
  40. //
  41. //      CSimpSvrObj::QueryInterface OBJ.CPP
  42. //
  43. // Comments:
  44. //
  45. //
  46. //********************************************************************
  47. STDMETHODIMP CPersistStorage::QueryInterface ( REFIID riid, LPVOID FAR* ppvObj)
  48. {
  49. OutputDebugString("In CPersistStorage::QueryInterfacern");
  50. // need to NULL the out parameter
  51. return m_lpObj->QueryInterface(riid, ppvObj);
  52. };
  53. //**********************************************************************
  54. //
  55. // CPersistStorage::AddRef
  56. //
  57. // Purpose:
  58. //
  59. //      Increments the reference count on CPersistStorage and the "object"
  60. //      object.
  61. //
  62. // Parameters:
  63. //
  64. //      None
  65. //
  66. // Return Value:
  67. //
  68. //      The Reference count on the Object.
  69. //
  70. // Function Calls:
  71. //      Function                    Location
  72. //
  73. //      OuputDebugString            Windows API
  74. //      CSimpSvrObj::AddRef         OBJ.CPP
  75. //
  76. // Comments:
  77. //
  78. //
  79. //********************************************************************
  80. STDMETHODIMP_(ULONG) CPersistStorage::AddRef ()
  81. {
  82. OutputDebugString("In CPersistStorage::AddRefrn");
  83. ++m_nCount;
  84. return m_lpObj->AddRef();
  85. };
  86. //**********************************************************************
  87. //
  88. // CPersistStorage::Release
  89. //
  90. // Purpose:
  91. //
  92. //      Decrements the reference count of CPersistStorage and the
  93. //      "object" object.
  94. //
  95. // Parameters:
  96. //
  97. //      None
  98. //
  99. // Return Value:
  100. //
  101. //      The new reference count
  102. //
  103. // Function Calls:
  104. //      Function                    Location
  105. //
  106. //      OutputDebugString           Windows API
  107. //      CSimpSvrObj::Release        OBJ.CPP
  108. //
  109. // Comments:
  110. //
  111. //
  112. //********************************************************************
  113. STDMETHODIMP_(ULONG) CPersistStorage::Release ()
  114. {
  115. OutputDebugString("In CPersistStorage::Releasern");
  116. --m_nCount;
  117. return m_lpObj->Release();
  118. };
  119. //**********************************************************************
  120. //
  121. // CPersistStorage::InitNew
  122. //
  123. // Purpose:
  124. //
  125. //      Used to give a new OLE object a ptr to its storage.
  126. //
  127. // Parameters:
  128. //
  129. //      LPSTORAGE pStg  - Pointer to the storage
  130. //
  131. // Return Value:
  132. //
  133. //
  134. //
  135. // Function Calls:
  136. //      Function                    Location
  137. //
  138. //      OutputDebugString           Windows API
  139. //      IStorage::Release           OLE
  140. //      IStorage::AddRef            OLE
  141. //
  142. //
  143. // Comments:
  144. //
  145. //
  146. //********************************************************************
  147. STDMETHODIMP CPersistStorage::InitNew (LPSTORAGE pStg)
  148. {
  149. OutputDebugString("In CPersistStorage::InitNewrn");
  150. // release any streams and storages that may be open
  151. ReleaseStreamsAndStorage();
  152. m_lpObj->m_lpStorage = pStg;
  153. // AddRef the new Storage
  154. if (m_lpObj->m_lpStorage)
  155. m_lpObj->m_lpStorage->AddRef();
  156. CreateStreams(m_lpObj->m_lpStorage);
  157. return S_OK;
  158. }
  159. //**********************************************************************
  160. //
  161. // CPersistStorage::GetClassID
  162. //
  163. // Purpose:
  164. //
  165. //      Returns the CLSID of this object.
  166. //
  167. // Parameters:
  168. //
  169. //      LPCLSID lpClassID   - Out ptr in which to return the CLSID
  170. //
  171. // Return Value:
  172. //
  173. //       S_OK
  174. //
  175. // Function Calls:
  176. //      Function                    Location
  177. //
  178. //      OutputDebugString           Windows API
  179. //
  180. //
  181. // Comments:
  182. //
  183. //
  184. //********************************************************************
  185. STDMETHODIMP CPersistStorage::GetClassID  ( LPCLSID lpClassID)
  186. {
  187. OutputDebugString("In CPersistStorage::GetClassIDrn");
  188. *lpClassID = GUID_SIMPLE;
  189. return  S_OK ;
  190. };
  191. //**********************************************************************
  192. //
  193. // CPersistStorage::Save
  194. //
  195. // Purpose:
  196. //
  197. //      Instructs the object to save itself into the storage.
  198. //
  199. // Parameters:
  200. //
  201. //      LPSTORAGE pStgSave  - Storage in which the object should be saved
  202. //
  203. //      BOOL fSameAsLoad    - TRUE if pStgSave is the same as the storage
  204. //                            that the object was originally created with.
  205. //
  206. // Return Value:
  207. //
  208. //      S_OK
  209. //
  210. // Function Calls:
  211. //      Function                    Location
  212. //
  213. //      OutputDebugString           Windows API
  214. //      CPersistStorage::InitNew    IPS.CPP
  215. //      CSimpSvrObj::SaveToStorage  OBJ.CPP
  216. //
  217. //
  218. // Comments:
  219. //
  220. //      A real app will want better error checking in this method.
  221. //
  222. //********************************************************************
  223. STDMETHODIMP CPersistStorage::Save  ( LPSTORAGE pStgSave, BOOL fSameAsLoad)
  224. {
  225. OutputDebugString("In CPersistStorage::Savern");
  226. // save the data
  227. m_lpObj->SaveToStorage (pStgSave, fSameAsLoad);
  228. m_lpObj->m_fSaveWithSameAsLoad = fSameAsLoad;
  229. m_lpObj->m_fNoScribbleMode = TRUE;
  230. return  S_OK ;
  231. };
  232. //**********************************************************************
  233. //
  234. // CPersistStorage::SaveCompleted
  235. //
  236. // Purpose:
  237. //
  238. //      Called when the container is finished saving the object
  239. //
  240. // Parameters:
  241. //
  242. //      LPSTORAGE pStgNew   - ptr to the new storage
  243. //
  244. // Return Value:
  245. //
  246. //      S_OK
  247. //
  248. // Function Calls:
  249. //      Function                    Location
  250. //
  251. //      OutputDebugString           Windows API
  252. //
  253. //
  254. // Comments:
  255. //
  256. //
  257. //********************************************************************
  258. STDMETHODIMP CPersistStorage::SaveCompleted  ( LPSTORAGE pStgNew)
  259. {
  260. OutputDebugString("In CPersistStorage::SaveCompletedrn");
  261. if (pStgNew)
  262. {
  263. ReleaseStreamsAndStorage();
  264. m_lpObj->m_lpStorage = pStgNew;
  265. m_lpObj->m_lpStorage->AddRef();
  266. OpenStreams(pStgNew);
  267. }
  268. /* OLE2NOTE: it is only legal to perform a Save or SaveAs operation
  269. **    on an embedded object. if the document is a file-based document
  270. **    then we can not be changed to a IStorage-base object.
  271. **
  272. **      fSameAsLoad   lpStgNew     Type of Save     Send OnSave
  273. **    ---------------------------------------------------------
  274. **         TRUE        NULL        SAVE             YES
  275. **         TRUE        ! NULL      SAVE *           YES
  276. **         FALSE       ! NULL      SAVE AS          YES
  277. **         FALSE       NULL        SAVE COPY AS     NO
  278. **
  279. **    * this is a strange case that is possible. it is inefficient
  280. **    for the caller; it would be better to pass lpStgNew==NULL for
  281. **    the Save operation.
  282. */
  283. if ( pStgNew || m_lpObj->m_fSaveWithSameAsLoad)
  284. {
  285. if (m_lpObj->m_fNoScribbleMode)
  286. m_lpObj->GetOleAdviseHolder()->SendOnSave();  // normally would clear a
  287.   // dirty bit
  288. m_lpObj->m_fSaveWithSameAsLoad = FALSE;
  289. }
  290. m_lpObj->m_fNoScribbleMode = FALSE;
  291. return  S_OK ;
  292. };
  293. //**********************************************************************
  294. //
  295. // CPersistStorage::Load
  296. //
  297. // Purpose:
  298. //
  299. //      Instructs the object to be loaded from storage.
  300. //
  301. // Parameters:
  302. //
  303. //      LPSTORAGE pStg  - Ptr to the storage in which to be loaded
  304. //
  305. // Return Value:
  306. //
  307. //      S_OK
  308. //
  309. // Function Calls:
  310. //      Function                        Location
  311. //
  312. //      OutputDebugString               Windows API
  313. //      CSimpSvrObj::LoadFromStorage    OBJ.CPP
  314. //
  315. //
  316. // Comments:
  317. //
  318. //      A real app will want better error checking in this method.
  319. //
  320. //********************************************************************
  321. STDMETHODIMP CPersistStorage::Load  ( LPSTORAGE pStg)
  322. {
  323. OutputDebugString("In CPersistStorage::Loadrn");
  324. // remember the storage
  325. if (m_lpObj->m_lpStorage)
  326. {
  327. m_lpObj->m_lpStorage->Release();
  328. m_lpObj->m_lpStorage = NULL;
  329. }
  330. m_lpObj->m_lpStorage = pStg;
  331. m_lpObj->m_lpStorage->AddRef();
  332. OpenStreams(m_lpObj->m_lpStorage);
  333. m_lpObj->LoadFromStorage();
  334. return  S_OK ;
  335. };
  336. //**********************************************************************
  337. //
  338. // CPersistStorage::IsDirty
  339. //
  340. // Purpose:
  341. //
  342. //      Returns whether or not the object is dirty w/respect to its
  343. //      Storage
  344. //
  345. // Parameters:
  346. //
  347. //      None
  348. //
  349. // Return Value:
  350. //
  351. //
  352. // Function Calls:
  353. //      Function                    Location
  354. //
  355. //      OutputDebugString           Windows API
  356. //
  357. //
  358. // Comments:
  359. //
  360. //      This sample does not implement this function, although a
  361. //      real application should.
  362. //
  363. //********************************************************************
  364. STDMETHODIMP CPersistStorage::IsDirty()
  365. {
  366. OutputDebugString("In CPersistStorage::IsDirtyrn");
  367. return  S_OK ;
  368. };
  369. //**********************************************************************
  370. //
  371. // CPersistStorage::HandsOffStorage
  372. //
  373. // Purpose:
  374. //
  375. //      Forces the object to release its handle to its storage.
  376. //
  377. // Parameters:
  378. //
  379. //      None
  380. //
  381. // Return Value:
  382. //
  383. //      S_OK
  384. //
  385. // Function Calls:
  386. //      Function                    Location
  387. //
  388. //      OutputDebugString           Windows API
  389. //      IStorage::Release           OLE
  390. //
  391. // Comments:
  392. //
  393. //
  394. //********************************************************************
  395. STDMETHODIMP CPersistStorage::HandsOffStorage  ()
  396. {
  397. OutputDebugString("In CPersistStorage::HandsOffStoragern");
  398. ReleaseStreamsAndStorage();
  399. return  S_OK ;
  400. };
  401. //**********************************************************************
  402. //
  403. // CPersistStorage::CreateStreams
  404. //
  405. // Purpose:
  406. //
  407. //      Creates the streams that are held open for the object's lifetime.
  408. //
  409. // Parameters:
  410. //
  411. //      LPSTORAGE lpStg -   Storage in which to create the streams
  412. //
  413. // Return Value:
  414. //
  415. //      S_OK
  416. //
  417. // Function Calls:
  418. //      Function                    Location
  419. //
  420. //      OutputDebugString           Windows API
  421. //      IStorage::Release           OLE
  422. //      IStream::Release            OLE
  423. //      IStorage::CreateStream      OLE
  424. //
  425. // Comments:
  426. //
  427. //
  428. //********************************************************************
  429. void CPersistStorage::CreateStreams(LPSTORAGE lpStg)
  430. {
  431. if (m_lpObj->m_lpColorStm)
  432. m_lpObj->m_lpColorStm->Release();
  433. if (m_lpObj->m_lpSizeStm)
  434. m_lpObj->m_lpSizeStm->Release();
  435. // create a stream to save the colors
  436. //@@WTK WIN32, UNICODE
  437. //lpStg->CreateStream ( "RGB",
  438. lpStg->CreateStream ( OLESTR("RGB"),
  439.    STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE,
  440.    0,
  441.    0,
  442.    &m_lpObj->m_lpColorStm);
  443. // create a stream to save the size
  444. //@@WTK WIN32, UNICODE
  445. //lpStg->CreateStream ( "size",
  446. lpStg->CreateStream ( OLESTR("size"),
  447.    STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE,
  448.    0,
  449.    0,
  450.    &m_lpObj->m_lpSizeStm);
  451. }
  452. //**********************************************************************
  453. //
  454. // CPersistStorage::OpenStreams
  455. //
  456. // Purpose:
  457. //
  458. //      Opens the streams in a storage.
  459. //
  460. // Parameters:
  461. //
  462. //      LPSTORAGE lpStg -   Storage in which to open the streams.
  463. //
  464. // Return Value:
  465. //
  466. //      S_OK
  467. //
  468. // Function Calls:
  469. //      Function                    Location
  470. //
  471. //      OutputDebugString           Windows API
  472. //      IStorage::Release           OLE
  473. //
  474. // Comments:
  475. //
  476. //
  477. //********************************************************************
  478. void CPersistStorage::OpenStreams(LPSTORAGE lpStg)
  479. {
  480. if (m_lpObj->m_lpColorStm)
  481. m_lpObj->m_lpColorStm->Release();
  482. if (m_lpObj->m_lpSizeStm)
  483. m_lpObj->m_lpSizeStm->Release();
  484. // open the color stream
  485. //@@WTK WIN32, UNICODE
  486. //lpStg->OpenStream ( "RGB",
  487. lpStg->OpenStream ( OLESTR("RGB"),
  488.    0,
  489.    STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
  490.    0,
  491.    &m_lpObj->m_lpColorStm);
  492. // open the color stream
  493. //@@WTK WIN32, UNICODE
  494. //lpStg->OpenStream ( "size",
  495. lpStg->OpenStream ( OLESTR("size"),
  496.    0,
  497.    STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
  498.    0,
  499.    &m_lpObj->m_lpSizeStm);
  500. }
  501. //**********************************************************************
  502. //
  503. // CPersistStorage::ReleaseStreamsAndStorage
  504. //
  505. // Purpose:
  506. //
  507. //      Releases the stream and storage ptrs
  508. //
  509. // Parameters:
  510. //
  511. //      None
  512. //
  513. // Return Value:
  514. //
  515. //      S_OK
  516. //
  517. // Function Calls:
  518. //      Function                    Location
  519. //
  520. //      OutputDebugString           Windows API
  521. //      IStorage::Release           OLE
  522. //
  523. // Comments:
  524. //
  525. //
  526. //********************************************************************
  527. void CPersistStorage::ReleaseStreamsAndStorage()
  528. {
  529. if (m_lpObj->m_lpColorStm)
  530. {
  531. m_lpObj->m_lpColorStm->Release();
  532. m_lpObj->m_lpColorStm = NULL;
  533. }
  534. if (m_lpObj->m_lpSizeStm)
  535. {
  536. m_lpObj->m_lpSizeStm->Release();
  537. m_lpObj->m_lpSizeStm = NULL;
  538. }
  539. if (m_lpObj->m_lpStorage)
  540. {
  541. m_lpObj->m_lpStorage->Release();
  542. m_lpObj->m_lpStorage = NULL;
  543. }
  544. }
  545. //**********************************************************************
  546. //
  547. // CPersistStorage::CreateStreams
  548. //
  549. // Purpose:
  550. //
  551. //      Creates temporary streams in a storage.
  552. //
  553. // Parameters:
  554. //
  555. //      LPSTORAGE lpStg                 - Pointer to the storage
  556. //
  557. //      LPSTREAM FAR* lplpTempColor     - Color Stream
  558. //
  559. //      LPSTREAM FAR* lplpTempSize      - Size Stream
  560. //
  561. // Return Value:
  562. //
  563. //      S_OK
  564. //
  565. // Function Calls:
  566. //      Function                    Location
  567. //
  568. //      OutputDebugString           Windows API
  569. //      IStorage::Release           OLE
  570. //
  571. // Comments:
  572. //
  573. //
  574. //********************************************************************
  575. void CPersistStorage::CreateStreams(LPSTORAGE lpStg, LPSTREAM FAR* lplpTempColor,LPSTREAM FAR* lplpTempSize)
  576. {
  577. // create a stream to save the colors
  578.  //@@WTK WIN32, UNICODE
  579.  //lpStg->CreateStream ( "RGB",
  580.  lpStg->CreateStream ( OLESTR("RGB"),
  581.    STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE,
  582.    0,
  583.    0,
  584.    lplpTempColor);
  585. // create a stream to save the size
  586. //@@WTK WIN32, UNICODE
  587. //lpStg->CreateStream ( "size",
  588. lpStg->CreateStream ( OLESTR("size"),
  589.    STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE,
  590.    0,
  591.    0,
  592.    lplpTempSize);
  593. }