// summinfo.cpp : implementation of the CDrawDoc class
//
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1998 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
#include "stdafx.h"
#include <winnls.h>
#include "drawcli.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
#include <objbase.h>
// the following header redefines
// the DEFINE_GUID macro to actually allocate data
#include <initguid.h>
#ifndef INITGUID
#define INITGUID
#endif
// the DEFINE_GUID macro in the following header now allocates data
#include "summinfo.h"
const OLECHAR szSummInfo[] = OLESTR("\005SummaryInformation");
#if defined(_UNICODE)
LPCSTR tcstocs(LPCTSTR lpctStr) { // typed char (WCHAR) to CHAR
static CHAR strTemp[1024];
wcstombs(strTemp, lpctStr, 1024);
return strTemp;
}
#else // !defined(_UNICODE)
#define tcstocs(lpctStr) (LPCSTR)(lpctStr)
#endif
CSummInfo::CSummInfo()
{
m_propSet.SetFormatVersion(0);
DWORD dwOSVer;
dwOSVer = (DWORD)MAKELONG(LOWORD(GetVersion()), 2);
m_propSet.SetOSVersion(dwOSVer);
m_propSet.SetClassID(FMTID_SummaryInformation);
m_pSection = m_propSet.AddSection(FMTID_SummaryInformation);
UINT cp = GetACP();
m_pSection->Set(PID_CODEPAGE, (void*)&cp, VT_I2);
SetTitle(_T(""));
SetSubject(_T(""));
SetAuthor(_T(""));
SetKeywords(_T(""));
SetComments(_T(""));
SetTemplate(_T(""));
SetLastAuthor(_T(""));
m_pSection->Set(PIDSI_REVNUMBER, (void*)_T("0"), VT_LPSTR);
FILETIME zeroTime = {0L, 0L};
m_pSection->Set(PIDSI_EDITTIME, (void*)&zeroTime, VT_FILETIME);
m_pSection->Set(PIDSI_LASTPRINTED, (void*)&zeroTime, VT_FILETIME);
m_pSection->Set(PIDSI_LASTSAVE_DTM, (void*)&zeroTime, VT_FILETIME);
m_pSection->Set(PIDSI_CREATE_DTM, (void*)&zeroTime, VT_FILETIME);
SetNumPages(0);
SetNumWords(0);
SetNumChars(0);
SetAppname(_T(""));
SetSecurity(0);
}
BOOL CSummInfo::SetTitle(LPCTSTR szTitle)
{
return m_pSection->Set(PIDSI_TITLE, (void*)tcstocs(szTitle), VT_LPSTR);
}
CString CSummInfo::GetTitle()
{
return CString((LPCSTR)m_pSection->Get(PIDSI_TITLE));
}
BOOL CSummInfo::SetSubject(LPCTSTR szSubject)
{
return m_pSection->Set(PIDSI_SUBJECT,
(void*)tcstocs(szSubject), VT_LPSTR);
}
CString CSummInfo::GetSubject()
{
return CString((LPCSTR)m_pSection->Get(PIDSI_SUBJECT));
}
BOOL CSummInfo::SetAuthor(LPCTSTR szAuthor)
{
return m_pSection->Set(PIDSI_AUTHOR,
(void*)tcstocs(szAuthor), VT_LPSTR);
}
CString CSummInfo::GetAuthor()
{
return CString((LPCSTR)m_pSection->Get(PIDSI_AUTHOR));
}
BOOL CSummInfo::SetKeywords(LPCTSTR szKeywords)
{
return m_pSection->Set(PIDSI_KEYWORDS,
(void*)tcstocs(szKeywords), VT_LPSTR);
}
CString CSummInfo::GetKeywords()
{
return CString((LPCSTR)m_pSection->Get(PIDSI_KEYWORDS));
}
BOOL CSummInfo::SetComments(LPCTSTR szComments)
{
return m_pSection->Set(PIDSI_COMMENTS,
(void*)tcstocs(szComments), VT_LPSTR);
}
CString CSummInfo::GetComments()
{
return CString((LPCSTR)m_pSection->Get(PIDSI_COMMENTS));
}
BOOL CSummInfo::SetTemplate(LPCTSTR szTemplate)
{
return m_pSection->Set(PIDSI_TEMPLATE,
(void*)tcstocs(szTemplate), VT_LPSTR);
}
CString CSummInfo::GetTemplate()
{
return CString((LPCSTR)m_pSection->Get(PIDSI_TEMPLATE));
}
BOOL CSummInfo::SetLastAuthor(LPCTSTR szLastAuthor)
{
return m_pSection->Set(PIDSI_LASTAUTHOR,
(void*)tcstocs(szLastAuthor), VT_LPSTR);
}
CString CSummInfo::GetLastAuthor()
{
return CString((LPCSTR)m_pSection->Get(PIDSI_LASTAUTHOR));
}
BOOL CSummInfo::IncrRevNum()
{
ULONG count;
_stscanf((LPCTSTR)GetRevNum(), _T("%lu"), &count);
count++;
TCHAR buff[20];
_stprintf(buff, _T("%lu"), count);
return m_pSection->Set(PIDSI_REVNUMBER, (void*)buff, VT_LPSTR);
}
CString CSummInfo::GetRevNum()
{
return CString((LPCSTR)m_pSection->Get(PIDSI_REVNUMBER));
}
void CSummInfo::StartEditTimeCount()
{
FILETIME now;
CoFileTimeNow(&now);
startEdit = *(__int64*)&now;
}
BOOL CSummInfo::AddCountToEditTime()
{
FILETIME now;
CoFileTimeNow(&now);
__int64 currTime = *(__int64*)&now;
__int64 thisSession = currTime - startEdit;
__int64 lastTotal = *(__int64*)m_pSection->Get(PIDSI_EDITTIME);
__int64 newTotal = lastTotal + thisSession;
return m_pSection->Set(PIDSI_EDITTIME, (void*)&newTotal, VT_FILETIME);
}
CString CSummInfo::GetEditTime()
{
FILETIME now;
CoFileTimeNow(&now);
__int64 currTime = *(__int64*)&now;
__int64 thisSession = currTime - startEdit;
__int64 lastTotal = *(__int64*)m_pSection->Get(PIDSI_EDITTIME);
__int64 newTotal = lastTotal + thisSession;
ULONG editMinutes = (ULONG)(newTotal/600000000);
TCHAR buff[20];
_stprintf(buff, _T("%lu min"), editMinutes);
return CString(buff);
}
BOOL CSummInfo::RecordPrintDate()
{
FILETIME printDate;
CoFileTimeNow(&printDate);
return m_pSection->Set(PIDSI_LASTPRINTED,
(void*)&printDate, VT_FILETIME);
}
CString CSummInfo::GetLastPrintDate()
{
FILETIME* pPrintDate = (FILETIME*)m_pSection->Get(PIDSI_LASTPRINTED);
if ((pPrintDate == NULL) ||
((pPrintDate->dwLowDateTime == 0L) &&
(pPrintDate->dwHighDateTime == 0L) ))
return CString(_T(""));
else
{
COleDateTime tempDate = *pPrintDate;
return tempDate.Format();
}
}
BOOL CSummInfo::RecordCreateDate()
{
FILETIME createDate;
CoFileTimeNow(&createDate);
return m_pSection->Set(PIDSI_CREATE_DTM,
(void*)&createDate, VT_FILETIME);
}
CString CSummInfo::GetCreateDate()
{
FILETIME* pCreateDate = (FILETIME*)m_pSection->Get(PIDSI_CREATE_DTM);
if ((pCreateDate == NULL) ||
((pCreateDate->dwLowDateTime == 0L) &&
(pCreateDate->dwHighDateTime == 0L) ))
return CString(_T(""));
else
{
COleDateTime tempDate = *pCreateDate;
return tempDate.Format();
}
}
BOOL CSummInfo::RecordSaveDate()
{
FILETIME saveDate;
CoFileTimeNow(&saveDate);
return m_pSection->Set(PIDSI_LASTSAVE_DTM,
(void*)&saveDate, VT_FILETIME);
}
CString CSummInfo::GetLastSaveDate()
{
FILETIME *pSaveDate = (FILETIME*)m_pSection->Get(PIDSI_LASTSAVE_DTM);
if ((pSaveDate == NULL) ||
((pSaveDate->dwLowDateTime == 0L) &&
(pSaveDate->dwHighDateTime == 0L) ))
return CString(_T(""));
else
{
COleDateTime tempDate = *pSaveDate;
return tempDate.Format();
}
}
BOOL CSummInfo::SetNumPages(ULONG nPages)
{
return m_pSection->Set(PIDSI_PAGECOUNT, (void*)&nPages, VT_I4);
}
CString CSummInfo::GetNumPages()
{
TCHAR buff[20];
ULONG* pNumPages = (ULONG*)m_pSection->Get(PIDSI_PAGECOUNT);
if (pNumPages != NULL)
{
_stprintf(buff, _T("%lu"), *pNumPages);
return CString(buff);
}
else
return CString(_T(""));
}
BOOL CSummInfo::SetNumWords(ULONG nWords)
{
return m_pSection->Set(PIDSI_WORDCOUNT, (void*)&nWords, VT_I4);
}
CString CSummInfo::GetNumWords()
{
TCHAR buff[20];
ULONG* pNumWords = (ULONG*)m_pSection->Get(PIDSI_WORDCOUNT);
if (pNumWords != NULL)
{
_stprintf(buff, _T("%lu"), *pNumWords);
return CString(buff);
}
else
return CString(_T(""));
}
BOOL CSummInfo::SetNumChars(ULONG nChars)
{
return m_pSection->Set(PIDSI_CHARCOUNT, (void*)&nChars, VT_I4);
}
CString CSummInfo::GetNumChars()
{
TCHAR buff[20];
ULONG* pNumChars = (ULONG*)m_pSection->Get(PIDSI_CHARCOUNT);
if (pNumChars != NULL)
{
_stprintf(buff, _T("%lu"), *pNumChars);
return CString(buff);
}
else
return CString(_T(""));
}
BOOL CSummInfo::SetAppname(LPCTSTR szAppname)
{
return m_pSection->Set(PIDSI_APPNAME,
(void*)tcstocs(szAppname), VT_LPSTR);
}
CString CSummInfo::GetAppname()
{
return CString((LPCSTR)m_pSection->Get(PIDSI_APPNAME));
}
BOOL CSummInfo::SetSecurity(ULONG nLevel)
{
return m_pSection->Set(PID_SECURITY, (void*)&nLevel, VT_I4);
}
CString CSummInfo::GetSecurity()
{
TCHAR buff[20];
ULONG* pSecurity = (ULONG*)m_pSection->Get(PID_SECURITY);
if (pSecurity != NULL)
{
_stprintf(buff, _T("%lu"), *pSecurity);
return CString(buff);
}
else
return CString(_T(""));
}
BOOL CSummInfo::WriteToStorage(LPSTORAGE lpRootStg)
{
if (lpRootStg != NULL)
{
LPSTREAM lpStream = NULL;
if (FAILED(lpRootStg->CreateStream(szSummInfo,
STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE,
0, 0, &lpStream)))
{
TRACE(_T("CreateStream failed\n"));
return FALSE;
}
else
{
if(!m_propSet.WriteToStream(lpStream))
{
TRACE(_T("WriteToStream failed\n"));
return FALSE;
}
lpRootStg->Commit(STGC_DEFAULT);
lpStream->Release();
return TRUE;
}
}
return FALSE;
}
BOOL CSummInfo::ReadFromStorage(LPSTORAGE lpRootStg)
{
if (lpRootStg != NULL)
{
LPSTREAM lpStream = NULL;
if (FAILED(lpRootStg->OpenStream(szSummInfo,
NULL, STGM_SHARE_EXCLUSIVE|STGM_READ,
0, &lpStream)))
{
TRACE(_T("OpenStream failed\n"));
return FALSE;
}
else
{
if (!m_propSet.ReadFromStream(lpStream))
{
TRACE(_T("ReadFromStream failed\n"));
return FALSE;
}
m_pSection = m_propSet.GetSection(FMTID_SummaryInformation);
lpStream->Release();
return TRUE;
}
}
return FALSE;
}