Files
Slnkdwf/SlnkDWFImpl/myEPlotSectionImpl.cpp
Jos Groot Lipman 0e37d774d2 Merge SLNKDWF64 branch
svn path=/Slnkdwf/trunk/; revision=23911
2015-01-21 12:09:31 +00:00

329 lines
7.6 KiB
C++

// EPlotSection.cpp : Implementation of CEPlotSection
#include "stdafx.h"
#include "myEPlotSectionImpl.h"
#include "myWT_File.h"
#include "dwfcore/mime.h"
// CEPlotSection
CEPlotSectionImpl::~CEPlotSectionImpl()
{
#ifndef DWFTK_READ_ONLY
if (m_pW2DOutStream)
delete m_pW2DOutStream;
#endif
if (m_pW2DInStream)
delete m_pW2DInStream;
}
void CEPlotSectionImpl::Init(DWFToolkit::DWFEPlotSection* pSection,
const CString SourceDescription,
BOOL pForWrite)
{
m_pSection = pSection;
ATLASSERT(m_pSection == pSection);
m_ForWrite = pForWrite;
m_SourceDescription = SourceDescription;
if (!pForWrite)
{
m_pSection->readDescriptor();
}
}
const CString CEPlotSectionImpl::get_Name()
{
return CString(m_pSection->name());
}
const CString CEPlotSectionImpl::get_Title()
{
return CString(m_pSection->title());
}
ULONG CEPlotSectionImpl::get_PaperColor()
{
DWFPaper *paper = m_pSection->paper();
return paper->color();
}
// Always inches
double CEPlotSectionImpl::get_PaperClipWidth()
{
DWFPaper *paper = m_pSection->paper();
if (paper)
{
const double *clip = paper->clip();
switch (paper->units())
{
case DWFPaper::eMillimeters:
return (clip[2] - clip[0])/25.4;
break;
case DWFPaper::eInches:
return clip[2] - clip[0];
break;
}
}
return -1; // Invalid
}
double CEPlotSectionImpl::get_PaperClipHeight()
{
DWFPaper *paper = m_pSection->paper();
if (paper)
{
const double *clip = paper->clip();
switch (paper->units())
{
case DWFPaper::eMillimeters:
return (clip[3] - clip[1])/25.4;
break;
case DWFPaper::eInches:
return clip[3] - clip[1];
break;
}
}
return -1; // Invalid
}
STDMETHODIMP CEPlotSectionImpl::Open(BOOL bForWrite)
{
#ifdef DWFTK_READ_ONLY
ATLASSERT(!bForWrite);
#endif
try
{
//
// get the graphics stream
//
DWFResourceContainer::ResourceIterator* piResources =
m_pSection->findResourcesByRole( DWFXML::kzRole_Graphics2d );
if ((piResources == NULL) || (piResources->valid() == false))
{
if (piResources)
{
DWFCORE_FREE_OBJECT( piResources );
}
throw myCString("Illegal EPlot section - no graphics");
}
//
// get the w2d resource
//
//Since we know it's a Graphics2D role, we should be able to cast
//into an EPlotGraphicResource, otherwise the authoring tool didn't
//read the spec.
DWFToolkit::DWFGraphicResource* pW2D = dynamic_cast<DWFGraphicResource*>(piResources->get());
ATLASSERT(pW2D != NULL);
DWFString s = pW2D->creationTime();
if (s.chars())
myTRACE("\nCreationTime %s", (const wchar_t *)pW2D->creationTime());
//
// done with the iterator
//
DWFCORE_FREE_OBJECT( piResources );
if (pW2D == NULL)
{
throw myCString("Type mismatch - not a W2D resource");
}
if (pW2D->mime() != DWFCore::DWFMIME::kzMIMEType_W2D)
{
myDoTRACE("\nMime: %ls", (const wchar_t*)pW2D->mime());
throw myCString("Unsupported graphics resource (%ls)."
"\nMeasurement/Print disabled?", (const wchar_t*)pW2D->mime());
}
//
// get the data stream
//
#ifndef DWFTK_READ_ONLY
if (bForWrite)
{
m_pW2DOutStream = new DWFCore::DWFBufferOutputStream(1024);
}
else
#endif
{
// TODO: Fors geheugenlek?
m_pW2DInStream = pW2D->getInputStream();
m_nSize = pW2D->size();
#ifndef DWFTK_READ_ONLY
if (!m_pW2DInStream && m_pW2DOutStream)
m_pW2DInStream = new DWFCore::DWFBufferInputStream(m_pW2DOutStream->buffer(), m_pW2DOutStream->bytes());
#endif
}
return S_OK;
}
catch (DWFException& ex)
{
CString err;
err.Format("%ls\n%ls\n%s\n%ls(%d)",ex.type(),ex.message(),ex.function(),ex.file(),ex.line());
throw myCString("\nCEPlotSectionImpl::open(\"%s\")\n%s", m_SourceDescription, err);
}
}
const DWFProperty* const CEPlotSectionImpl::findProperty( const DWFString& zName,
const DWFString& zCategory )
{
return m_pSection->findProperty( zName, zCategory);
}
void const CEPlotSectionImpl::addProperty( const DWFString& zCategory,
const DWFString& zName,
const DWFString& zValue )
{
m_pSection->addProperty( DWFCORE_ALLOC_OBJECT(DWFToolkit::DWFProperty(zName, zValue, zCategory, L"", L"")), true );
}
HRESULT CEPlotSectionImpl::Read( void *pv, ULONG cb, ULONG *pcbRead)
{
ATLASSERT(m_pW2DInStream); // Open first!
(*pcbRead)=0;
if (m_pW2DInStream->available()>0)
{
(*pcbRead) = (ULONG)m_pW2DInStream->read( pv, cb );
}
return S_OK;
};
HRESULT CEPlotSectionImpl::Seek( ULONG cb, ULONG *pcbRead)
{
ATLASSERT(m_pW2DInStream); // Open first!
(*pcbRead)=0;
if (m_pW2DInStream->available()>0)
{
(*pcbRead) = (ULONG)m_pW2DInStream->seek( SEEK_CUR, cb );
}
return S_OK;
};
#ifndef DWFTK_READ_ONLY
HRESULT CEPlotSectionImpl::Write( const void *pv, ULONG cb, ULONG *pcbWritten)
{
ATLASSERT(m_pW2DOutStream); // Open first!
(*pcbWritten)=0;
(*pcbWritten) = (ULONG)m_pW2DOutStream->write( pv, cb );
return S_OK;
};
#endif
STDMETHODIMP CEPlotSectionImpl::Close(void)
{
// Don't bother ASSERT(m_pW2DInStream); // Open first!
// if (m_pW2DOutStream)
// m_pSection->res m_pW2DOutStream
if (m_pW2DInStream)
delete m_pW2DInStream;
m_pW2DInStream = NULL;
return S_OK;
}
STDMETHODIMP CEPlotSectionImpl::get_SourceDescription(CString & pVal)
{
pVal = m_SourceDescription;
return S_OK;
}
#ifndef DWFTK_READ_ONLY
STDMETHODIMP CEPlotSectionImpl::get_PropertiesXML(CString &pVal)
{
if (m_pSection!=NULL)
{
DWFCore::DWFBufferOutputStream m_XMLProps(1024);
DWFUUID _oUUID;
DWFXMLSerializer XML(_oUUID);
XML.attach(m_XMLProps);
//DWFManifest& rManifest = m_pSection;
m_pSection->serializeXML(XML, DWFPackageWriter::eDescriptor);
XML.detach();
pVal = CString((LPCSTR)m_XMLProps.buffer(), (int)m_XMLProps.bytes());
return S_OK;
}
else
return E_FAIL;
return S_OK;
}
bool CEPlotSectionImpl::SaveAs(const CString &destpath)
{
ATLASSERT(!m_pW2DInStream); // Don't open first!
try
{
Open(false);
DWFFile m_pTempFile(destpath);
DWFStreamFileDescriptor fds (m_pTempFile, L"wb");
fds.open();
DWFFileOutputStream rTempStream;
rTempStream.attach(&fds,false);
// Copy pW2DStream to rTempStream
#define DATA_BUFFER_BYTES 16384
unsigned char* pDataBuffer = DWFCORE_ALLOC_MEMORY( unsigned char, DATA_BUFFER_BYTES );
if (pDataBuffer == NULL)
{
_DWFCORE_THROW( DWFMemoryException, L"No memory for data buffer" );
}
while (m_pW2DInStream->available()>0)
{
size_t nBytes;
nBytes = m_pW2DInStream->read( pDataBuffer, DATA_BUFFER_BYTES );
rTempStream.write( pDataBuffer, nBytes );
}
rTempStream.flush();
rTempStream.detach();
fds.close();
DWFCORE_FREE_MEMORY( pDataBuffer )
Close();
}
catch (DWFException& ex)
{
CString err;
err.Format("%ls\n%ls\n%s\n%ls(%d)",ex.type(),ex.message(),ex.function(),ex.file(),ex.line());
throw myCString("\nCEPlotSectionImpl::open(\"%s\")\n%s", m_SourceDescription, err);
}
return true;
};
bool CEPlotSectionImpl::SaveAsAscii(const CString &srcpath, const CString &destpath)
{
myWT_File my_input_file;
my_input_file.set_filename(srcpath);
my_input_file.SaveAsAscii(destpath);
return true;
}
bool CEPlotSectionImpl::SaveAsAscii(const CString &destpath, EPlot_Progress_Action progress_action /* = NULL */)
{
ATLASSERT(!m_pW2DInStream); // Don't open first!
myWT_File my_input_file;
my_input_file.set_eplotsection(this);
return my_input_file.SaveAsAscii(destpath, progress_action);
};
#endif