Commit 4d5f328c authored by Sergey Konovalov's avatar Sergey Konovalov

open/save vml signatureline

parent b18cd44c
......@@ -2754,6 +2754,7 @@ void CDrawingConverter::doc_LoadShape(PPTX::Logic::SpTreeElem *elem, XmlUtils::C
{
pShape->nvSpPr.cNvPr.id = -1;
}
pShape->signatureLine = pPPTShape->m_oSignatureLine;
elem->InitElem(pShape);
......@@ -4374,6 +4375,15 @@ HRESULT CDrawingConverter::SaveObject(LONG lStart, LONG lLength, const std::wstr
bOle = oPic.oleObject->isValid();
}
}
bool bSignatureLine = false;
if (oElem.is<PPTX::Logic::Shape>())
{
PPTX::Logic::Shape& oShape = oElem.as<PPTX::Logic::Shape>();
if(oShape.signatureLine.IsInit())
{
bSignatureLine = true;
}
}
m_pReader->m_nDocumentType = XMLWRITER_DOC_TYPE_PPTX;
......@@ -4393,6 +4403,12 @@ HRESULT CDrawingConverter::SaveObject(LONG lStart, LONG lLength, const std::wstr
{
ConvertPicVML(oElem, bsMainProps, oXmlWriter);
}
else if(bSignatureLine)
{
oXmlWriter.WriteString(L"<w:pict>");
ConvertShapeVML(oElem, bsMainProps, oXmlWriter, true);
oXmlWriter.WriteString(L"</w:pict>");
}
else
{
......@@ -4586,13 +4602,13 @@ void CDrawingConverter::ConvertPicVML(PPTX::Logic::SpTreeElem& oElem, const std:
oPic.toXmlWriterVML(&oWriter, *m_pTheme, *m_pClrMap);
}
void CDrawingConverter::ConvertShapeVML(PPTX::Logic::SpTreeElem& oElem, const std::wstring& bsMainProps, NSBinPptxRW::CXmlWriter& oWriter)
void CDrawingConverter::ConvertShapeVML(PPTX::Logic::SpTreeElem& oElem, const std::wstring& bsMainProps, NSBinPptxRW::CXmlWriter& oWriter, bool bSignature)
{
ConvertMainPropsToVML(bsMainProps, oWriter, oElem);
oWriter.m_bIsTop = true; // не забыть скинуть в самом шейпе
PPTX::Logic::Shape& oShape = oElem.as<PPTX::Logic::Shape>();
oShape.toXmlWriterVML(&oWriter, *m_pTheme, *m_pClrMap);
oShape.toXmlWriterVML(&oWriter, *m_pTheme, *m_pClrMap, false, bSignature);
}
void CDrawingConverter::ConvertGroupVML(PPTX::Logic::SpTreeElem& oElem, const std::wstring& bsMainProps, NSBinPptxRW::CXmlWriter& oWriter)
......
......@@ -279,7 +279,7 @@ namespace NSBinPptxRW
void ConvertMainPropsToVML (const std::wstring& sMainProps, NSBinPptxRW::CXmlWriter& oWriter, PPTX::Logic::SpTreeElem& oElem);
void ConvertPicVML (PPTX::Logic::SpTreeElem& oElem, const std::wstring& sMainProps, NSBinPptxRW::CXmlWriter& oWriter);
void ConvertShapeVML (PPTX::Logic::SpTreeElem& oShape, const std::wstring& sMainProps, NSBinPptxRW::CXmlWriter& oWriter);
void ConvertShapeVML (PPTX::Logic::SpTreeElem& oShape, const std::wstring& sMainProps, NSBinPptxRW::CXmlWriter& oWriter, bool bSignature = false);
void ConvertGroupVML (PPTX::Logic::SpTreeElem& oGroup, const std::wstring& sMainProps, NSBinPptxRW::CXmlWriter& oWriter);
void ConvertTextVML (XmlUtils::CXmlNode &nodeTextBox, PPTX::Logic::Shape* pShape);
......
......@@ -629,12 +629,12 @@ public:
virtual HRESULT put_BrushType(const LONG& lType){ return S_OK; }
virtual HRESULT get_BrushColor1(LONG* lColor){ return S_OK; }
virtual HRESULT put_BrushColor1(const LONG& lColor){ return S_OK; }
virtual HRESULT get_BrushAlpha1(LONG* lAlpha)
virtual HRESULT get_BrushAlpha1(LONG* lAlpha){ return S_OK; }
virtual HRESULT put_BrushAlpha1(const LONG& lAlpha)
{
m_bIsFillPart = (0 != lAlpha) ? true : false;
return S_OK;
m_bIsFillPart = (0 != lAlpha) ? true : false;
return S_OK;
}
virtual HRESULT put_BrushAlpha1(const LONG& lAlpha){ return S_OK; }
virtual HRESULT get_BrushColor2(LONG* lColor){ return S_OK; }
virtual HRESULT put_BrushColor2(const LONG& lColor){ return S_OK; }
virtual HRESULT get_BrushAlpha2(LONG* lAlpha){ return S_OK; }
......
......@@ -33,6 +33,7 @@
#include "./../BaseShape.h"
#include "CustomGeomShape.h"
#include "PPTShapeEnum.h"
#include "../../../../../../Common/DocxFormat/Source/DocxFormat/Logic/VmlOfficeDrawing.h"
using namespace NSOfficeDrawing;
using namespace NSPresentationEditor;
......@@ -53,6 +54,7 @@ public:
bool m_bIsFilled;
bool m_bIsStroked;
nullable<OOX::VmlOffice::CSignatureLine> m_oSignatureLine;
public:
CPPTShape() : CBaseShape(), m_arStringTextRects()
......@@ -278,6 +280,11 @@ public:
else
m_bIsStroked = true;
}
XmlUtils::CXmlNode oNodeSignature;
if (oNodeShapeType.GetNode(_T("o:signatureline"), oNodeSignature))
{
m_oSignatureLine = oNodeSignature;
}
ReCalculate();
return true;
......
......@@ -1026,12 +1026,12 @@ namespace PPTX
}
if(bOle)
{
pWriter->WriteAttribute(L"filled", L"f");
pWriter->WriteAttribute(L"filled", (std::wstring)L"f");
}
std::wstring strNodeVal;
if (!spPr.ln.is_init())
{
pWriter->WriteAttribute(L"stroked", L"false");
pWriter->WriteAttribute(L"stroked", (std::wstring)L"false");
}
else
{
......@@ -1061,7 +1061,7 @@ namespace PPTX
{
pWriter->WriteAttribute(L"r:id", blipFill.blip->embed->ToString());
}
pWriter->WriteAttribute(L"o:title", L"");
pWriter->WriteAttribute(L"o:title", (std::wstring)L"");
pWriter->EndAttributes();
pWriter->EndNode(L"v:imagedata");
}
......@@ -1097,8 +1097,8 @@ namespace PPTX
}
if(bOle)
{
pWriter->WriteAttribute(L"filled", L"f");
pWriter->WriteAttribute(L"stroked", L"f");
pWriter->WriteAttribute(L"filled", (std::wstring)L"f");
pWriter->WriteAttribute(L"stroked", (std::wstring)L"f");
}
pWriter->EndAttributes();
......@@ -1108,7 +1108,7 @@ namespace PPTX
pWriter->StartNode(L"v:imagedata");
pWriter->StartAttributes();
pWriter->WriteAttribute(L"r:id", blipFill.blip->embed->ToString());
pWriter->WriteAttribute(L"o:title", L"");
pWriter->WriteAttribute(L"o:title", (std::wstring)L"");
pWriter->EndAttributes();
pWriter->EndNode(L"v:imagedata");
}
......
......@@ -357,8 +357,15 @@ namespace PPTX
txXfrm->fromPPTY(pReader);
break;
}
case 7:
{
signatureLine = new OOX::VmlOffice::CSignatureLine();
signatureLine->fromPPTY(pReader);
break;
}
default:
{
pReader->SkipRecord();
break;
}
}
......@@ -433,6 +440,7 @@ namespace PPTX
}
pWriter->WriteRecord2(6, txXfrm);
pWriter->WriteRecord2(7, signatureLine);
pWriter->EndRecord();
}
......@@ -505,7 +513,7 @@ namespace PPTX
}
}
void Shape::toXmlWriterVML(NSBinPptxRW::CXmlWriter *pWriter, NSCommon::smart_ptr<PPTX::Theme>& oTheme, NSCommon::smart_ptr<PPTX::Logic::ClrMap>& oClrMap, bool in_group)
void Shape::toXmlWriterVML(NSBinPptxRW::CXmlWriter *pWriter, NSCommon::smart_ptr<PPTX::Theme>& oTheme, NSCommon::smart_ptr<PPTX::Logic::ClrMap>& oClrMap, bool in_group, bool bSignature)
{
std::wstring strPath, strTextRect;
bool bOle = false;
......@@ -546,7 +554,7 @@ namespace PPTX
std::wstring strStrokeNode;;
CalculateFill(spPr, style, oTheme, oClrMap, strFillAttr, strFillNode, bOle);
CalculateLine(spPr, style, oTheme, oClrMap, strStrokeAttr, strStrokeNode, bOle);
CalculateLine(spPr, style, oTheme, oClrMap, strStrokeAttr, strStrokeNode, bOle, bSignature);
pWriter->StartNode(L"v:shape");
......@@ -637,7 +645,7 @@ namespace PPTX
//oStylesWriter.m_oWriter.AddCharNoCheck(WCHAR(','));
//oStylesWriter.m_oWriter.AddIntNoCheck(dH / 100);
//pWriter->WriteAttribute(L"coordsize", oStylesWriter.GetXmlString());
pWriter->WriteAttribute(L"coordsize", L"100000,100000");
pWriter->WriteAttribute(L"coordsize", (std::wstring)L"100000,100000");
pWriter->WriteAttribute(L"path", strPath);
}
......@@ -672,6 +680,10 @@ namespace PPTX
pWriter->WriteString(*strTextBoxShape); //??? todooo -> oTextBoxShape
pWriter->EndNode(L"v:textbox");
}
if (signatureLine.is_init())
{
signatureLine->toXmlWriter(pWriter);
}
pWriter->EndNode(L"v:shape");
......
......@@ -44,6 +44,7 @@
#include "../../../ASCOfficeDocxFile2/DocWrapper/DocxSerializer.h"
#include "../../../Common/DocxFormat/Source/Common/SimpleTypes_Vml.h"
#include "../../../Common/DocxFormat/Source/DocxFormat/Logic/Sdt.h"
#include "../../../Common/DocxFormat/Source/DocxFormat/Logic/VmlOfficeDrawing.h"
namespace OOX
{
......@@ -308,7 +309,7 @@ namespace PPTX
void SetLevelUpElement( Shape* p){m_pLevelUp = p;};
virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const;
void toXmlWriterVML (NSBinPptxRW::CXmlWriter* pWriter, smart_ptr<PPTX::Theme>& oTheme, smart_ptr<PPTX::Logic::ClrMap>& oClrMap, bool in_group = false);
void toXmlWriterVML (NSBinPptxRW::CXmlWriter* pWriter, smart_ptr<PPTX::Theme>& oTheme, smart_ptr<PPTX::Logic::ClrMap>& oClrMap, bool in_group = false, bool bSignature = false);
void toXmlWriterVMLBackground (NSBinPptxRW::CXmlWriter *pWriter, NSCommon::smart_ptr<PPTX::Theme>& oTheme, NSCommon::smart_ptr<PPTX::Logic::ClrMap>& oClrMap);
virtual void toXmlWriter (NSBinPptxRW::CXmlWriter* pWriter) const;
......@@ -330,6 +331,7 @@ namespace PPTX
nullable<BodyPr> oTextBoxBodyPr;
nullable_bool attrUseBgFill;
nullable<OOX::VmlOffice::CSignatureLine> signatureLine;
protected:
virtual void FillParentPointersForChilds();
};
......
......@@ -178,7 +178,7 @@ namespace PPTX
*/
}
void CalculateLine(PPTX::Logic::SpPr& oSpPr, nullable<ShapeStyle>& pShapeStyle, NSCommon::smart_ptr<PPTX::Theme>& oTheme,
NSCommon::smart_ptr<PPTX::Logic::ClrMap>& oClrMap, std::wstring& strAttr, std::wstring& strNode, bool bOle)
NSCommon::smart_ptr<PPTX::Logic::ClrMap>& oClrMap, std::wstring& strAttr, std::wstring& strNode, bool bOle, bool bSignature)
{
PPTX::Logic::Ln line;
DWORD ARGB = 0;
......@@ -196,7 +196,7 @@ namespace PPTX
ARGB = line.Fill.as<SolidFill>().Color.GetRGBColor(oTheme, oClrMap, ARGB);
strAttr = _T(" strokecolor=\"") + GetHexColor(ARGB) + _T("\"");
}
else if (bOle)
else if (bOle || bSignature)
strAttr = _T(" stroked=\"f\"");
if (line.w.is_init())
......
......@@ -47,7 +47,7 @@ namespace PPTX
smart_ptr<PPTX::Logic::ClrMap>& oClrMap, std::wstring& strAttr, std::wstring& strNode, bool bOle = false);
void CalculateLine(PPTX::Logic::SpPr& oSpPr, nullable<ShapeStyle>& pShapeStyle,
smart_ptr<PPTX::Theme>& oTheme, smart_ptr<PPTX::Logic::ClrMap>& oClrMap, std::wstring& strAttr, std::wstring& strNode, bool bOle = false);
smart_ptr<PPTX::Theme>& oTheme, smart_ptr<PPTX::Logic::ClrMap>& oClrMap, std::wstring& strAttr, std::wstring& strNode, bool bOle = false, bool bSignature = false);
class SpTreeElem : public WrapperWritingElement
{
......
......@@ -76,6 +76,14 @@ namespace ComplexTypes
sResult += _T("\" ");\
}
#define ComplexTypes_WriteAttribute2Encode( sStartString, oValue ) \
if ( oValue.IsInit() )\
{\
sResult += sStartString;\
sResult += XmlUtils::EncodeXmlString(oValue.get2());\
sResult += _T("\" ");\
}
class ComplexType
{
public:
......
......@@ -44,6 +44,8 @@
#include "../WritingElement.h"
#include "../RId.h"
#include "../../../../../ASCOfficePPTXFile/PPTXFormat/WrapperWritingElement.h"
namespace OOX
{
namespace VmlOffice
......@@ -2163,7 +2165,7 @@ namespace OOX
//--------------------------------------------------------------------------------
// CSignatureLine 14.2.2.30 (Part 4)
//--------------------------------------------------------------------------------
class CSignatureLine : public WritingElement
class CSignatureLine : public WritingElement, public PPTX::WrapperWritingElement
{
public:
WritingElement_AdditionConstructors(CSignatureLine)
......@@ -2178,7 +2180,19 @@ namespace OOX
virtual void fromXML(XmlUtils::CXmlNode& oNode)
{
// TO DO: Реализовать CSignatureLine::fromXML(XmlUtils::CXmlNode& oNode)
oNode.ReadAttributeBase(L"o:addlxml", m_sAddXml);
oNode.ReadAttributeBase(L"allowcomments", m_oAllowComments);
oNode.ReadAttributeBase(L"v:ext", m_oExt);
oNode.ReadAttributeBase(L"id", m_oId);
oNode.ReadAttributeBase(L"issignatureline", m_oIsSignatureLine);
oNode.ReadAttributeBase(L"provid", m_oProvId);
oNode.ReadAttributeBase(L"showsigndate", m_oShowSignDate);
oNode.ReadAttributeBase(L"o:signinginstructions", m_sSigningInstructions);
oNode.ReadAttributeBase(L"signinginstructionsset", m_oSigningInstructionsSet);
oNode.ReadAttributeBase(L"o:sigprovurl", m_sSigProvUrl);
oNode.ReadAttributeBase(L"o:suggestedsigner", m_sSuggestedSigner);
oNode.ReadAttributeBase(L"o:suggestedsigner2", m_sSuggestedSigner2);
oNode.ReadAttributeBase(L"o:suggestedsigneremail", m_sSuggestedSignerEmail);
}
virtual void fromXML(XmlUtils::CXmlLiteReader& oReader)
{
......@@ -2193,27 +2207,27 @@ namespace OOX
ComplexTypes_WriteAttribute ( _T("v:ext=\""), m_oExt );
if ( SimpleTypes::booleanTrue != m_oIsSignatureLine.GetValue() )
sResult += _T("issignatureline=\"") + m_oIsSignatureLine.ToString() + _T("\" ");
if ( m_oIsSignatureLine.IsInit() )
sResult += _T("issignatureline=\"") + m_oIsSignatureLine->ToString2(SimpleTypes::onofftostringT) + _T("\" ");
ComplexTypes_WriteAttribute ( _T("id=\""), m_oId );
ComplexTypes_WriteAttribute ( _T("provid=\""), m_oProvId );
if ( SimpleTypes::booleanFalse != m_oSigningInstructionsSet.GetValue() )
sResult += _T("signinginstructionsset=\"") + m_oSigningInstructionsSet.ToString() + _T("\" ");
if ( m_oSigningInstructionsSet.IsInit() )
sResult += _T("signinginstructionsset=\"") + m_oSigningInstructionsSet->ToString2(SimpleTypes::onofftostringT) + _T("\" ");
if ( SimpleTypes::booleanFalse != m_oAllowComments.GetValue() )
sResult += _T("allowcomments=\"") + m_oAllowComments.ToString() + _T("\" ");
if ( m_oAllowComments.IsInit() )
sResult += _T("allowcomments=\"") + m_oAllowComments->ToString2(SimpleTypes::onofftostringT) + _T("\" ");
if ( SimpleTypes::booleanTrue != m_oShowSignDate.GetValue() )
sResult += _T("showsigndate=\"") + m_oShowSignDate.ToString() + _T("\" ");
if ( m_oShowSignDate.IsInit() )
sResult += _T("showsigndate=\"") + m_oShowSignDate->ToString2(SimpleTypes::onofftostringT) + _T("\" ");
ComplexTypes_WriteAttribute2( _T("o:suggestedsigner=\""), m_sSuggestedSigner );
ComplexTypes_WriteAttribute2( _T("o:suggestedsigner2=\""), m_sSuggestedSigner2 );
ComplexTypes_WriteAttribute2( _T("o:suggestedsigneremail=\""), m_sSuggestedSignerEmail );
ComplexTypes_WriteAttribute2( _T("o:signinginstructions=\""), m_sSigningInstructions );
ComplexTypes_WriteAttribute2( _T("o:addlxml=\""), m_sAddXml );
ComplexTypes_WriteAttribute2( _T("o:sigprovurl=\""), m_sSigProvUrl );
ComplexTypes_WriteAttribute2Encode( _T("o:suggestedsigner=\""), m_sSuggestedSigner );
ComplexTypes_WriteAttribute2Encode( _T("o:suggestedsigner2=\""), m_sSuggestedSigner2 );
ComplexTypes_WriteAttribute2Encode( _T("o:suggestedsigneremail=\""), m_sSuggestedSignerEmail );
ComplexTypes_WriteAttribute2Encode( _T("o:signinginstructions=\""), m_sSigningInstructions );
ComplexTypes_WriteAttribute2Encode( _T("o:addlxml=\""), m_sAddXml );
ComplexTypes_WriteAttribute2Encode( _T("o:sigprovurl=\""), m_sSigProvUrl );
sResult += _T("/>");
......@@ -2223,6 +2237,135 @@ namespace OOX
{
return OOX::et_o_signatureline;
}
virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
{
LONG _end_rec = pReader->GetPos() + pReader->GetLong() + 4;
pReader->Skip(1); // start attributes
while (true)
{
BYTE _at = pReader->GetUChar_TypeNode();
if (_at == NSBinPptxRW::g_nodeAttributeEnd)
break;
switch (_at)
{
case 0:
{
m_sAddXml = pReader->GetString2();
break;
}
case 1:
{
m_oAllowComments.Init();
m_oAllowComments->FromBool(pReader->GetBool());
break;
}
case 2:
{
m_oExt.Init();
m_oExt->SetValue((SimpleTypes::EExt)pReader->GetUChar());
break;
}
case 3:
{
m_oId = pReader->GetString2();
break;
}
case 4:
{
m_oIsSignatureLine.Init();
m_oIsSignatureLine->FromBool(pReader->GetBool());
break;
}
case 5:
{
m_oProvId = pReader->GetString2();
break;
}
case 6:
{
m_oShowSignDate.Init();
m_oShowSignDate->FromBool(pReader->GetBool());
break;
}
case 7:
{
m_sSigningInstructions = pReader->GetString2();
break;
}
case 8:
{
m_oSigningInstructionsSet.Init();
m_oSigningInstructionsSet->FromBool(pReader->GetBool());
break;
}
case 9:
{
m_sSigProvUrl = pReader->GetString2();
break;
}
case 10:
{
m_sSuggestedSigner = pReader->GetString2();
break;
}
case 11:
{
m_sSuggestedSigner2 = pReader->GetString2();
break;
}
case 12:
{
m_sSuggestedSignerEmail = pReader->GetString2();
break;
}
default:
break;
}
}
pReader->Seek(_end_rec);
}
virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const
{
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeStart);
if (m_sAddXml.IsInit())
pWriter->WriteString1(0, m_sAddXml.get());
if (m_oAllowComments.IsInit())
pWriter->WriteBool1(1, m_oAllowComments->ToBool());
if (m_oExt.IsInit())
{
pWriter->WriteBYTE(2);
pWriter->WriteBYTE(m_oExt->GetValue());
}
if (m_oId.IsInit())
pWriter->WriteString1(3, m_oId->ToString());
if (m_oIsSignatureLine.IsInit())
pWriter->WriteBool1(4, m_oIsSignatureLine->ToBool());
if (m_oProvId.IsInit())
pWriter->WriteString1(5, m_oProvId->ToString());
if (m_oShowSignDate.IsInit())
pWriter->WriteBool1(6, m_oShowSignDate->ToBool());
if (m_sSigningInstructions.IsInit())
pWriter->WriteString1(7, m_sSigningInstructions.get());
if (m_oSigningInstructionsSet.IsInit())
pWriter->WriteBool1(8, m_oSigningInstructionsSet->ToBool());
if (m_sSigProvUrl.IsInit())
pWriter->WriteString1(9, m_sSigProvUrl.get());
if (m_sSuggestedSigner.IsInit())
pWriter->WriteString1(10, m_sSuggestedSigner.get());
if (m_sSuggestedSigner2.IsInit())
pWriter->WriteString1(11, m_sSuggestedSigner2.get());
if (m_sSuggestedSignerEmail.IsInit())
pWriter->WriteString1(12, m_sSuggestedSignerEmail.get());
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd);
}
virtual void toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const
{
pWriter->WriteString(toXML());
}
private:
......@@ -2249,19 +2392,19 @@ namespace OOX
public:
// Attributes
nullable<std::wstring> m_sAddXml;
SimpleTypes::CTrueFalse<SimpleTypes::booleanFalse> m_oAllowComments;
nullable<SimpleTypes::CExt<>> m_oExt;
nullable<SimpleTypes::CGuid> m_oId;
SimpleTypes::CTrueFalse<SimpleTypes::booleanTrue> m_oIsSignatureLine;
nullable<SimpleTypes::CGuid> m_oProvId;
SimpleTypes::CTrueFalse<SimpleTypes::booleanTrue> m_oShowSignDate;
nullable<std::wstring> m_sSigningInstructions;
SimpleTypes::CTrueFalse<SimpleTypes::booleanFalse> m_oSigningInstructionsSet;
nullable<std::wstring> m_sSigProvUrl;
nullable<std::wstring> m_sSuggestedSigner;
nullable<std::wstring> m_sSuggestedSigner2;
nullable<std::wstring> m_sSuggestedSignerEmail;
nullable<std::wstring> m_sAddXml;
nullable<SimpleTypes::COnOff<>> m_oAllowComments;
nullable<SimpleTypes::CExt<>> m_oExt;
nullable<SimpleTypes::CGuid> m_oId;
nullable<SimpleTypes::COnOff<>> m_oIsSignatureLine;
nullable<SimpleTypes::CGuid> m_oProvId;
nullable<SimpleTypes::COnOff<>> m_oShowSignDate;
nullable<std::wstring> m_sSigningInstructions;
nullable<SimpleTypes::COnOff<>> m_oSigningInstructionsSet;
nullable<std::wstring> m_sSigProvUrl;
nullable<std::wstring> m_sSuggestedSigner;
nullable<std::wstring> m_sSuggestedSigner2;
nullable<std::wstring> m_sSuggestedSignerEmail;
};
//--------------------------------------------------------------------------------
// CSkew 14.2.2.31 (Part 4)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment