MarkupDoc.cpp
上传用户:hawkcdm
上传日期:2013-02-10
资源大小:411k
文件大小:6k
源码类别:

xml/soap/webservice

开发平台:

Visual C++

  1. // MarkupDoc.cpp : implementation of the CMarkupDoc class
  2. //
  3. // Markup Release 6.1 Lite
  4. // Copyright (C) 1999-2001 First Objective Software, Inc. All rights reserved
  5. // This entire notice must be retained in this source code
  6. // Redistributing this source code requires written permission
  7. // This software is provided "as is", with no warranty.
  8. // Latest fixes enhancements and documentation at www.firstobject.com
  9. #include "stdafx.h"
  10. #include "MarkupApp.h"
  11. #include "MarkupDoc.h"
  12. #include "MarkupView.h"
  13. #include "MainFrm.h"
  14. #ifdef _DEBUG
  15. #define new DEBUG_NEW
  16. #undef THIS_FILE
  17. static char THIS_FILE[] = __FILE__;
  18. #endif
  19. /////////////////////////////////////////////////////////////////////////////
  20. // CMarkupDoc
  21. IMPLEMENT_DYNCREATE(CMarkupDoc, CDocument)
  22. BEGIN_MESSAGE_MAP(CMarkupDoc, CDocument)
  23. //{{AFX_MSG_MAP(CMarkupDoc)
  24. ON_COMMAND(ID_FILE_PARSE, OnFileParse)
  25. ON_UPDATE_COMMAND_UI(ID_FILE_PARSE, OnUpdateFileParse)
  26. //}}AFX_MSG_MAP
  27. END_MESSAGE_MAP()
  28. /////////////////////////////////////////////////////////////////////////////
  29. // CMarkupDoc construction/destruction
  30. CMarkupDoc::CMarkupDoc()
  31. {
  32. m_bIsParsed = TRUE;
  33. }
  34. CMarkupDoc::~CMarkupDoc()
  35. {
  36. }
  37. BOOL CMarkupDoc::OnNewDocument()
  38. {
  39. if (!CDocument::OnNewDocument())
  40. return FALSE;
  41. m_csText = _T("<?xml version="1.0"?>rn<NEW/>rn");
  42. m_doc.SetDoc( m_csText );
  43. return TRUE;
  44. }
  45. /////////////////////////////////////////////////////////////////////////////
  46. // CMarkupDoc serialization
  47. void CMarkupDoc::Serialize(CArchive& ar)
  48. {
  49. if ( ar.IsStoring() )
  50. {
  51. // Write
  52. }
  53. else
  54. {
  55. // Read
  56. }
  57. }
  58. /////////////////////////////////////////////////////////////////////////////
  59. // CMarkupDoc diagnostics
  60. #ifdef _DEBUG
  61. void CMarkupDoc::AssertValid() const
  62. {
  63. CDocument::AssertValid();
  64. }
  65. void CMarkupDoc::Dump(CDumpContext& dc) const
  66. {
  67. CDocument::Dump(dc);
  68. }
  69. #endif //_DEBUG
  70. /////////////////////////////////////////////////////////////////////////////
  71. // CMarkupDoc commands
  72. void CMarkupDoc::TimeBefore()
  73. {
  74. // Keep track of time before operation
  75. GetSystemTime( &m_stBefore );
  76. }
  77. void CMarkupDoc::TimeAfter(LPCTSTR lpszTitle, LPCTSTR szOp)
  78. {
  79. // Determine time span
  80. SYSTEMTIME stAfter;
  81. GetSystemTime( &stAfter );
  82. int nBefore = m_stBefore.wMilliseconds + m_stBefore.wSecond * 1000 + m_stBefore.wMinute * 60000;
  83. int nAfter = stAfter.wMilliseconds + stAfter.wSecond * 1000 + stAfter.wMinute * 60000;
  84. int nDiff = nAfter - nBefore;
  85. if ( m_stBefore.wHour < stAfter.wHour )
  86. nDiff += 24*60000;
  87. // Display in status bar
  88. CString csSpan;
  89. csSpan.Format( _T("%s of %s took about %d milliseconds"), szOp, lpszTitle, nDiff );
  90. ((CMainFrame*)(AfxGetApp()->m_pMainWnd))->SetStatus( csSpan );
  91. }
  92. CString CMarkupDoc::TitleFromPath(LPCTSTR lpszPathName)
  93. {
  94. // Determine file name from pathname
  95. CString csTitle = lpszPathName;
  96. for ( int nPathChar=0; lpszPathName[nPathChar]; ++nPathChar )
  97. {
  98. TCHAR cChar = lpszPathName[nPathChar];
  99. if ( cChar == '\' || cChar == '/' || cChar == ':')
  100. csTitle = &lpszPathName[nPathChar+1];
  101. }
  102. return csTitle;
  103. }
  104. void CMarkupDoc::ShowError(LPCTSTR lpszTitle, LPCTSTR szError)
  105. {
  106. // Display in status bar
  107. CString csError;
  108. csError.Format( _T("%s: %s"), lpszTitle, szError );
  109. ((CMainFrame*)(AfxGetApp()->m_pMainWnd))->SetStatus( csError );
  110. }
  111. BOOL CMarkupDoc::OnOpenDocument(LPCTSTR lpszPathName) 
  112. {
  113. // Load up buffer
  114. unsigned char* pBuffer = NULL;
  115. int nFileLen = 0;
  116. try
  117. {
  118. CFile file( lpszPathName, CFile::modeRead );
  119. nFileLen = file.GetLength();
  120. // Allocate Buffer for Ansi file data
  121. pBuffer = new unsigned char[nFileLen + 1];
  122. nFileLen = file.Read( pBuffer, nFileLen );
  123. file.Close();
  124. pBuffer[nFileLen] = '';
  125. }
  126. catch (CFileException*)
  127. {
  128. if ( pBuffer )
  129. delete pBuffer;
  130. return FALSE;
  131. }
  132. #if defined(_UNICODE)
  133. // Convert file to UNICODE if necessary
  134. int nWideSize = MultiByteToWideChar(CP_UTF8,0,(const char*)pBuffer,nFileLen,m_csText.GetBuffer(nFileLen),nFileLen);
  135. m_csText.ReleaseBuffer(nWideSize);
  136. #else
  137. m_csText = (char*)pBuffer;
  138. #endif
  139. // Convert newlines to CRLFs for CEdit
  140. CString csCRLFText;
  141. const _TCHAR* pSource = (LPCTSTR)m_csText;
  142. _TCHAR* pDest = csCRLFText.GetBuffer(m_csText.GetLength() * 2);
  143. int nSrcChar = 0, nDestChar = 0;
  144. while ( pSource[nSrcChar] )
  145. {
  146. if ( pSource[nSrcChar] == 'n' && (nSrcChar == 0 || pSource[nSrcChar-1]!='r') )
  147. pDest[nDestChar++] = 'r';
  148. pDest[nDestChar++] = pSource[nSrcChar++];
  149. }
  150. csCRLFText.ReleaseBuffer(nDestChar);
  151. m_csText = csCRLFText;
  152. // Parse
  153. TimeBefore();
  154. m_bIsParsed = m_doc.SetDoc( m_csText );
  155. if ( m_bIsParsed )
  156. TimeAfter( TitleFromPath(lpszPathName), _T("parse") );
  157. else
  158. ShowError( TitleFromPath(lpszPathName), m_doc.GetError() );
  159. delete [] pBuffer;
  160. SetModifiedFlag( FALSE );
  161. return TRUE;
  162. }
  163. BOOL CMarkupDoc::OnSaveDocument(LPCTSTR lpszPathName) 
  164. {
  165. // Get text out of view
  166. CString csViewText;
  167. POSITION pos = GetFirstViewPosition();
  168. if ( pos )
  169. {
  170. CMarkupView* pView = (CMarkupView*)GetNextView(pos);
  171. pView->GetEditText( csViewText );
  172. }
  173. #if defined( _UNICODE )
  174. CString csDoc = m_doc.GetDoc();
  175. if ( ! IsParsed() )
  176. csDoc = csViewText;
  177. int nUTF8Len = WideCharToMultiByte(CP_UTF8,0,csDoc,csDoc.GetLength(),NULL,0,NULL,NULL);
  178. char* pBuffer = new char[nUTF8Len+1];
  179. WideCharToMultiByte(CP_UTF8,0,csDoc,csDoc.GetLength(),pBuffer,nUTF8Len+1,NULL,NULL);
  180. try
  181. {
  182. CFile file( lpszPathName, CFile::modeWrite | CFile::modeCreate );
  183. file.Write( pBuffer, nUTF8Len );
  184. file.Close();
  185. }
  186. catch (CFileException*)
  187. {
  188. return FALSE;
  189. }
  190. #else
  191. CString csDoc = m_doc.GetDoc();
  192. if ( ! IsParsed() )
  193. csDoc = csViewText;
  194. try
  195. {
  196. CFile file( lpszPathName, CFile::modeWrite | CFile::modeCreate );
  197. file.Write( csDoc.GetBuffer(0), csDoc.GetLength() );
  198. file.Close();
  199. }
  200. catch (CFileException*)
  201. {
  202. return FALSE;
  203. }
  204. #endif
  205. SetModifiedFlag( FALSE );
  206. return TRUE;
  207. }
  208. void CMarkupDoc::OnCloseDocument() 
  209. {
  210. CWaitCursor wait;
  211. CDocument::OnCloseDocument();
  212. }
  213. void CMarkupDoc::OnFileParse() 
  214. {
  215. POSITION pos = GetFirstViewPosition();
  216. if ( pos )
  217. {
  218. CMarkupView* pView = (CMarkupView*)GetNextView(pos);
  219. pView->GetEditText( m_csText );
  220. TimeBefore();
  221. BOOL bParsed = m_doc.SetDoc( m_csText );
  222. if ( bParsed )
  223. TimeAfter( GetTitle(), _T("parse") );
  224. else
  225. ShowError( GetTitle(), m_doc.GetError() );
  226. UpdateAllViews( NULL );
  227. m_bIsParsed = bParsed;
  228. }
  229. }
  230. void CMarkupDoc::OnUpdateFileParse(CCmdUI* pCmdUI) 
  231. {
  232. pCmdUI->Enable( ! m_bIsParsed );
  233. }