1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-06-20 11:54:07 +03:00

XCAF: binary notes with array of bytes

This commit is contained in:
snn 2017-02-15 14:09:53 +03:00
parent e66ddc4bab
commit bc1c59d0a0
6 changed files with 165 additions and 59 deletions

View File

@ -17,6 +17,7 @@
#include <CDM_MessageDriver.hxx> #include <CDM_MessageDriver.hxx>
#include <Standard_Type.hxx> #include <Standard_Type.hxx>
#include <TDF_Attribute.hxx> #include <TDF_Attribute.hxx>
#include <TColStd_HArray1OfByte.hxx>
#include <TCollection_AsciiString.hxx> #include <TCollection_AsciiString.hxx>
#include <TCollection_ExtendedString.hxx> #include <TCollection_ExtendedString.hxx>
#include <BinMXCAFDoc_NoteBinDataDriver.hxx> #include <BinMXCAFDoc_NoteBinDataDriver.hxx>
@ -58,11 +59,19 @@ Standard_Boolean BinMXCAFDoc_NoteBinDataDriver::Paste(const BinObjMgt_Persistent
return Standard_False; return Standard_False;
TCollection_ExtendedString aTitle; TCollection_ExtendedString aTitle;
TCollection_AsciiString aData, aMIMEtype; TCollection_AsciiString aMIMEtype;
if (!(theSource >> aTitle >> aData >> aMIMEtype)) Standard_Integer nbSize;
if (!(theSource >> aTitle >> aMIMEtype >> nbSize))
return Standard_False; return Standard_False;
aNote->Set(aTitle, aData, aMIMEtype); Handle(TColStd_HArray1OfByte) aData;
if (nbSize > 0)
{
aData.reset(new TColStd_HArray1OfByte(1, nbSize));
theSource.GetByteArray(&aData->ChangeFirst(), nbSize);
}
aNote->Set(aTitle, aMIMEtype, aData);
return Standard_True; return Standard_True;
} }
@ -80,10 +89,8 @@ void BinMXCAFDoc_NoteBinDataDriver::Paste(const Handle(TDF_Attribute)& theSource
Handle(XCAFDoc_NoteBinData) aNote = Handle(XCAFDoc_NoteBinData)::DownCast(theSource); Handle(XCAFDoc_NoteBinData) aNote = Handle(XCAFDoc_NoteBinData)::DownCast(theSource);
if (!aNote.IsNull()) if (!aNote.IsNull())
{ {
theTarget theTarget << aNote->Title() << aNote->MIMEtype() << aNote->Size();
<< aNote->Title() if (aNote->Size() > 0)
<< aNote->MIMEtype() theTarget.PutByteArray(&aNote->Data()->ChangeFirst(), aNote->Size());
<< aNote->Data()
;
} }
} }

View File

@ -15,7 +15,6 @@
#include <OSD_File.hxx> #include <OSD_File.hxx>
#include <Standard_GUID.hxx> #include <Standard_GUID.hxx>
#include <TCollection_HAsciiString.hxx>
#include <TDF_Label.hxx> #include <TDF_Label.hxx>
#include <XCAFDoc_NoteBinData.hxx> #include <XCAFDoc_NoteBinData.hxx>
@ -33,19 +32,41 @@ Standard_Boolean XCAFDoc_NoteBinData::IsMine(const TDF_Label& theLabel)
return (!theLabel.IsNull() && theLabel.FindAttribute(XCAFDoc_NoteBinData::GetID(), anAttr)); return (!theLabel.IsNull() && theLabel.FindAttribute(XCAFDoc_NoteBinData::GetID(), anAttr));
} }
Handle(XCAFDoc_NoteBinData) XCAFDoc_NoteBinData::Set(const TDF_Label& theLabel, Handle(XCAFDoc_NoteBinData)
XCAFDoc_NoteBinData::Set(const TDF_Label& theLabel,
const TCollection_ExtendedString& theUserName, const TCollection_ExtendedString& theUserName,
const TCollection_ExtendedString& theTimeStamp, const TCollection_ExtendedString& theTimeStamp,
const TCollection_ExtendedString& theTitle, const TCollection_ExtendedString& theTitle,
OSD_File& theFile, const TCollection_AsciiString& theMIMEtype,
const TCollection_AsciiString& theMIMEtype) OSD_File& theFile)
{ {
Handle(XCAFDoc_NoteBinData) aNoteBinData; Handle(XCAFDoc_NoteBinData) aNoteBinData;
if (!theLabel.IsNull() && !theLabel.FindAttribute(XCAFDoc_NoteBinData::GetID(), aNoteBinData)) if (!theLabel.IsNull() && !theLabel.FindAttribute(XCAFDoc_NoteBinData::GetID(), aNoteBinData))
{ {
aNoteBinData = new XCAFDoc_NoteBinData(); aNoteBinData = new XCAFDoc_NoteBinData();
aNoteBinData->XCAFDoc_Note::Set(theUserName, theTimeStamp); aNoteBinData->XCAFDoc_Note::Set(theUserName, theTimeStamp);
aNoteBinData->Set(theTitle, theFile, theMIMEtype); if (aNoteBinData->Set(theTitle, theMIMEtype, theFile))
theLabel.AddAttribute(aNoteBinData);
else
aNoteBinData.Nullify();
}
return aNoteBinData;
}
Handle(XCAFDoc_NoteBinData)
XCAFDoc_NoteBinData::Set(const TDF_Label& theLabel,
const TCollection_ExtendedString& theUserName,
const TCollection_ExtendedString& theTimeStamp,
const TCollection_ExtendedString& theTitle,
const TCollection_AsciiString& theMIMEtype,
const Handle(TColStd_HArray1OfByte)& theData)
{
Handle(XCAFDoc_NoteBinData) aNoteBinData;
if (!theLabel.IsNull() && !theLabel.FindAttribute(XCAFDoc_NoteBinData::GetID(), aNoteBinData))
{
aNoteBinData = new XCAFDoc_NoteBinData();
aNoteBinData->XCAFDoc_Note::Set(theUserName, theTimeStamp);
aNoteBinData->Set(theTitle, theMIMEtype, theData);
theLabel.AddAttribute(aNoteBinData); theLabel.AddAttribute(aNoteBinData);
} }
return aNoteBinData; return aNoteBinData;
@ -55,25 +76,33 @@ XCAFDoc_NoteBinData::XCAFDoc_NoteBinData()
{ {
} }
void XCAFDoc_NoteBinData::Set(const TCollection_ExtendedString& theTitle, Standard_Boolean XCAFDoc_NoteBinData::Set(const TCollection_ExtendedString& theTitle,
OSD_File& theFile, const TCollection_AsciiString& theMIMEtype,
const TCollection_AsciiString& theMIMEtype) OSD_File& theFile)
{ {
if (!theFile.IsOpen() || !theFile.IsReadable()) if (!theFile.IsOpen() || !theFile.IsReadable())
return; return Standard_False;
Backup(); Backup();
TCollection_AsciiString myData; if (theFile.Size() > IntegerLast())
theFile.Read(myData, theFile.Size()); return Standard_False;
myData.reset(new TColStd_HArray1OfByte(1, theFile.Size()));
Standard_Integer nbReadBytes = 0;
theFile.Read((Standard_Address)&myData->First(), myData->Length(), nbReadBytes);
if (nbReadBytes < myData->Length())
return Standard_False;
myTitle = theTitle; myTitle = theTitle;
myMIMEtype = theMIMEtype; myMIMEtype = theMIMEtype;
return Standard_True;
} }
void XCAFDoc_NoteBinData::Set(const TCollection_ExtendedString& theTitle, void XCAFDoc_NoteBinData::Set(const TCollection_ExtendedString& theTitle,
const TCollection_AsciiString& theData, const TCollection_AsciiString& theMIMEtype,
const TCollection_AsciiString& theMIMEtype) const Handle(TColStd_HArray1OfByte)& theData)
{ {
Backup(); Backup();
@ -87,16 +116,21 @@ const TCollection_ExtendedString& XCAFDoc_NoteBinData::Title() const
return myTitle; return myTitle;
} }
const TCollection_AsciiString& XCAFDoc_NoteBinData::Data() const
{
return myData;
}
const TCollection_AsciiString& XCAFDoc_NoteBinData::MIMEtype() const const TCollection_AsciiString& XCAFDoc_NoteBinData::MIMEtype() const
{ {
return myMIMEtype; return myMIMEtype;
} }
Standard_Integer XCAFDoc_NoteBinData::Size() const
{
return (!myData.IsNull() ? myData->Length() : 0);
}
const Handle(TColStd_HArray1OfByte)& XCAFDoc_NoteBinData::Data() const
{
return myData;
}
const Standard_GUID& XCAFDoc_NoteBinData::ID() const const Standard_GUID& XCAFDoc_NoteBinData::ID() const
{ {
return GetID(); return GetID();
@ -114,9 +148,9 @@ void XCAFDoc_NoteBinData::Restore(const Handle(TDF_Attribute)& theAttr)
Handle(XCAFDoc_NoteBinData) aMine = Handle(XCAFDoc_NoteBinData)::DownCast(theAttr); Handle(XCAFDoc_NoteBinData) aMine = Handle(XCAFDoc_NoteBinData)::DownCast(theAttr);
if (!aMine.IsNull()) if (!aMine.IsNull())
{ {
myData = aMine->myData;
myTitle = aMine->myTitle; myTitle = aMine->myTitle;
myMIMEtype = aMine->myMIMEtype; myMIMEtype = aMine->myMIMEtype;
myData = aMine->myData;
} }
} }
@ -127,7 +161,7 @@ void XCAFDoc_NoteBinData::Paste(const Handle(TDF_Attribute)& theAttrInto,
Handle(XCAFDoc_NoteBinData) aMine = Handle(XCAFDoc_NoteBinData)::DownCast(theAttrInto); Handle(XCAFDoc_NoteBinData) aMine = Handle(XCAFDoc_NoteBinData)::DownCast(theAttrInto);
if (!aMine.IsNull()) if (!aMine.IsNull())
aMine->Set(myTitle, myData, myMIMEtype); aMine->Set(myTitle, myMIMEtype, myData);
} }
Standard_OStream& XCAFDoc_NoteBinData::Dump(Standard_OStream& theOS) const Standard_OStream& XCAFDoc_NoteBinData::Dump(Standard_OStream& theOS) const
@ -136,8 +170,12 @@ Standard_OStream& XCAFDoc_NoteBinData::Dump(Standard_OStream& theOS) const
theOS << "\n" theOS << "\n"
<< "Title : " << (!myTitle.IsEmpty() ? myMIMEtype : "<untitled>") << "\n" << "Title : " << (!myTitle.IsEmpty() ? myMIMEtype : "<untitled>") << "\n"
<< "MIME type : " << (!myMIMEtype.IsEmpty() ? myMIMEtype : "<none>") << "\n" << "MIME type : " << (!myMIMEtype.IsEmpty() ? myMIMEtype : "<none>") << "\n"
<< "Size : " << myData.Length() << " bytes" << "\n" << "Size : " << Size() << " bytes" << "\n"
<< myData
; ;
if (!myData.IsNull())
{
for (Standard_Integer i = myData->Lower(); i <= myData->Upper(); ++i)
theOS << myData->Value(i);
}
return theOS; return theOS;
} }

View File

@ -17,10 +17,11 @@
#define _XCAFDoc_NoteBinData_HeaderFile #define _XCAFDoc_NoteBinData_HeaderFile
#include <XCAFDoc_Note.hxx> #include <XCAFDoc_Note.hxx>
#include <TColStd_HArray1OfByte.hxx>
#include <TCollection_AsciiString.hxx>
#include <TCollection_ExtendedString.hxx>
class OSD_File; class OSD_File;
class TCollection_AsciiString;
class TCollection_ExtendedString;
class XCAFDoc_NoteBinData; class XCAFDoc_NoteBinData;
DEFINE_STANDARD_HANDLE(XCAFDoc_NoteBinData, XCAFDoc_Note) DEFINE_STANDARD_HANDLE(XCAFDoc_NoteBinData, XCAFDoc_Note)
@ -39,23 +40,33 @@ public:
const TCollection_ExtendedString& theUserName, const TCollection_ExtendedString& theUserName,
const TCollection_ExtendedString& theTimeStamp, const TCollection_ExtendedString& theTimeStamp,
const TCollection_ExtendedString& theTitle, const TCollection_ExtendedString& theTitle,
OSD_File& theFile, const TCollection_AsciiString& theMIMEtype,
const TCollection_AsciiString& theMIMEtype); OSD_File& theFile);
Standard_EXPORT static Handle(XCAFDoc_NoteBinData) Set(const TDF_Label& theLabel,
const TCollection_ExtendedString& theUserName,
const TCollection_ExtendedString& theTimeStamp,
const TCollection_ExtendedString& theTitle,
const TCollection_AsciiString& theMIMEtype,
const Handle(TColStd_HArray1OfByte)& theData);
Standard_EXPORT XCAFDoc_NoteBinData(); Standard_EXPORT XCAFDoc_NoteBinData();
Standard_EXPORT void Set(const TCollection_ExtendedString& theTitle, Standard_EXPORT Standard_Boolean Set(const TCollection_ExtendedString& theTitle,
OSD_File& theFile, const TCollection_AsciiString& theMIMEtype,
const TCollection_AsciiString& theMIMEtype); OSD_File& theFile);
Standard_EXPORT void Set(const TCollection_ExtendedString& theTitle, Standard_EXPORT void Set(const TCollection_ExtendedString& theTitle,
const TCollection_AsciiString& theData, const TCollection_AsciiString& theMIMEtype,
const TCollection_AsciiString& theMIMEtype); const Handle(TColStd_HArray1OfByte)& theData);
Standard_EXPORT const TCollection_ExtendedString& Title() const; Standard_EXPORT const TCollection_ExtendedString& Title() const;
Standard_EXPORT const TCollection_AsciiString& Data() const;
Standard_EXPORT const TCollection_AsciiString& MIMEtype() const; Standard_EXPORT const TCollection_AsciiString& MIMEtype() const;
Standard_EXPORT Standard_Integer Size() const;
Standard_EXPORT const Handle(TColStd_HArray1OfByte)& Data() const;
public: public:
Standard_EXPORT const Standard_GUID& ID() const Standard_OVERRIDE; Standard_EXPORT const Standard_GUID& ID() const Standard_OVERRIDE;
@ -72,8 +83,8 @@ public:
protected: protected:
TCollection_ExtendedString myTitle; TCollection_ExtendedString myTitle;
TCollection_AsciiString myData;
TCollection_AsciiString myMIMEtype; TCollection_AsciiString myMIMEtype;
Handle(TColStd_HArray1OfByte) myData;
}; };
#endif // _XCAFDoc_NoteBinData_HeaderFile #endif // _XCAFDoc_NoteBinData_HeaderFile

View File

@ -14,6 +14,7 @@
// commercial license or contractual agreement. // commercial license or contractual agreement.
#include <Standard_GUID.hxx> #include <Standard_GUID.hxx>
#include <TColStd_HArray1OfByte.hxx>
#include <TDF_Label.hxx> #include <TDF_Label.hxx>
#include <TDF_ChildIterator.hxx> #include <TDF_ChildIterator.hxx>
#include <TDF_LabelSequence.hxx> #include <TDF_LabelSequence.hxx>
@ -88,13 +89,26 @@ Handle(XCAFDoc_Note)
XCAFDoc_NotesTool::AddBinData(const TCollection_ExtendedString& theUserName, XCAFDoc_NotesTool::AddBinData(const TCollection_ExtendedString& theUserName,
const TCollection_ExtendedString& theTimeStamp, const TCollection_ExtendedString& theTimeStamp,
const TCollection_ExtendedString& theTitle, const TCollection_ExtendedString& theTitle,
OSD_File& theFile, const TCollection_AsciiString& theMIMEtype,
const TCollection_AsciiString& theMIMEtype) OSD_File& theFile)
{ {
TDF_Label aNoteLabel; TDF_Label aNoteLabel;
TDF_TagSource aTag; TDF_TagSource aTag;
aNoteLabel = aTag.NewChild(Label()); aNoteLabel = aTag.NewChild(Label());
return XCAFDoc_NoteBinData::Set(aNoteLabel, theUserName, theTimeStamp, theTitle, theFile, theMIMEtype); return XCAFDoc_NoteBinData::Set(aNoteLabel, theUserName, theTimeStamp, theTitle, theMIMEtype, theFile);
}
Handle(XCAFDoc_Note)
XCAFDoc_NotesTool::AddBinData(const TCollection_ExtendedString& theUserName,
const TCollection_ExtendedString& theTimeStamp,
const TCollection_ExtendedString& theTitle,
const TCollection_AsciiString& theMIMEtype,
const Handle(TColStd_HArray1OfByte)& theData)
{
TDF_Label aNoteLabel;
TDF_TagSource aTag;
aNoteLabel = aTag.NewChild(Label());
return XCAFDoc_NoteBinData::Set(aNoteLabel, theUserName, theTimeStamp, theTitle, theMIMEtype, theData);
} }
Standard_Boolean XCAFDoc_NotesTool::HasAttachedNotes(const TDF_Label& theLabel) const Standard_Boolean XCAFDoc_NotesTool::HasAttachedNotes(const TDF_Label& theLabel) const

View File

@ -25,6 +25,7 @@ class OSD_File;
class Standard_GUID; class Standard_GUID;
class TCollection_AsciiString; class TCollection_AsciiString;
class TCollection_ExtendedString; class TCollection_ExtendedString;
class TColStd_HArray1OfByte;
class TDF_RelocationTable; class TDF_RelocationTable;
class XCAFDoc_Note; class XCAFDoc_Note;
@ -54,8 +55,14 @@ public:
Standard_EXPORT Handle(XCAFDoc_Note) AddBinData(const TCollection_ExtendedString& theUserName, Standard_EXPORT Handle(XCAFDoc_Note) AddBinData(const TCollection_ExtendedString& theUserName,
const TCollection_ExtendedString& theTimeStamp, const TCollection_ExtendedString& theTimeStamp,
const TCollection_ExtendedString& theTitle, const TCollection_ExtendedString& theTitle,
OSD_File& theFile, const TCollection_AsciiString& theMIMEtype,
const TCollection_AsciiString& theMIMEtype); OSD_File& theFile);
Standard_EXPORT Handle(XCAFDoc_Note) AddBinData(const TCollection_ExtendedString& theUserName,
const TCollection_ExtendedString& theTimeStamp,
const TCollection_ExtendedString& theTitle,
const TCollection_AsciiString& theMIMEtype,
const Handle(TColStd_HArray1OfByte)& theData);
Standard_EXPORT Standard_Boolean HasAttachedNotes(const TDF_Label& theLabel) const; Standard_EXPORT Standard_Boolean HasAttachedNotes(const TDF_Label& theLabel) const;

View File

@ -17,13 +17,15 @@
#include <Standard_Type.hxx> #include <Standard_Type.hxx>
#include <TDF_Attribute.hxx> #include <TDF_Attribute.hxx>
#include <XCAFDoc_NoteBinData.hxx> #include <XCAFDoc_NoteBinData.hxx>
#include <XmlObjMgt.hxx>
#include <XmlMXCAFDoc_NoteBinDataDriver.hxx> #include <XmlMXCAFDoc_NoteBinDataDriver.hxx>
#include <XmlObjMgt_Persistent.hxx> #include <XmlObjMgt_Persistent.hxx>
#include <LDOM_OSStream.hxx>
IMPLEMENT_STANDARD_RTTIEXT(XmlMXCAFDoc_NoteBinDataDriver, XmlMXCAFDoc_NoteDriver) IMPLEMENT_STANDARD_RTTIEXT(XmlMXCAFDoc_NoteBinDataDriver, XmlMXCAFDoc_NoteDriver)
IMPLEMENT_DOMSTRING(Title, "title") IMPLEMENT_DOMSTRING(Title, "title")
IMPLEMENT_DOMSTRING(MIMEtype, "mime_type") IMPLEMENT_DOMSTRING(MIMEtype, "mime_type")
IMPLEMENT_DOMSTRING(Data, "data") IMPLEMENT_DOMSTRING(Size, "size")
//======================================================================= //=======================================================================
//function : //function :
@ -57,15 +59,30 @@ Standard_Boolean XmlMXCAFDoc_NoteBinDataDriver::Paste(const XmlObjMgt_Persistent
XmlObjMgt_DOMString aTitle = anElement.getAttribute(::Title()); XmlObjMgt_DOMString aTitle = anElement.getAttribute(::Title());
XmlObjMgt_DOMString aMIMEtype = anElement.getAttribute(::MIMEtype()); XmlObjMgt_DOMString aMIMEtype = anElement.getAttribute(::MIMEtype());
XmlObjMgt_DOMString aData = anElement.getAttribute(::Data()); XmlObjMgt_DOMString aSize = anElement.getAttribute(::Size());
if (aTitle == NULL || aMIMEtype == NULL || aData == NULL) if (aTitle == NULL || aMIMEtype == NULL || aSize == NULL)
return Standard_False; return Standard_False;
Handle(XCAFDoc_NoteBinData) aNote = Handle(XCAFDoc_NoteBinData)::DownCast(theTarget); Handle(XCAFDoc_NoteBinData) aNote = Handle(XCAFDoc_NoteBinData)::DownCast(theTarget);
if (aNote.IsNull()) if (aNote.IsNull())
return Standard_False; return Standard_False;
aNote->Set(aTitle.GetString(), aData.GetString(), aMIMEtype.GetString()); Standard_Integer nbSize = 0;
if (!aSize.GetInteger(nbSize))
return Standard_False;
XmlObjMgt_DOMString aDataStr = XmlObjMgt::GetStringValue(theSource);
Standard_SStream anSS(aDataStr.GetString());
Handle(TColStd_HArray1OfByte) aData = new TColStd_HArray1OfByte(1, nbSize);
for (Standard_Integer i = 1; i <= nbSize; ++i)
{
Standard_Byte aValue;
anSS >> aValue;
aData->ChangeValue(i) = aValue;
}
aNote->Set(aTitle.GetString(), aMIMEtype.GetString(), aData);
return Standard_True; return Standard_True;
} }
@ -84,9 +101,21 @@ void XmlMXCAFDoc_NoteBinDataDriver::Paste(const Handle(TDF_Attribute)& theSource
XmlObjMgt_DOMString aTitle(TCollection_AsciiString(aNote->Title()).ToCString()); XmlObjMgt_DOMString aTitle(TCollection_AsciiString(aNote->Title()).ToCString());
XmlObjMgt_DOMString aMIMEtype(aNote->MIMEtype().ToCString()); XmlObjMgt_DOMString aMIMEtype(aNote->MIMEtype().ToCString());
XmlObjMgt_DOMString aData(aNote->Data().ToCString());
theTarget.Element().setAttribute(::Title(), aTitle); theTarget.Element().setAttribute(::Title(), aTitle);
theTarget.Element().setAttribute(::MIMEtype(), aMIMEtype); theTarget.Element().setAttribute(::MIMEtype(), aMIMEtype);
theTarget.Element().setAttribute(::Data(), aData); theTarget.Element().setAttribute(::Size(), aNote->Size());
if (aNote->Size() > 0)
{
const Handle(TColStd_HArray1OfByte)& aData = aNote->Data();
LDOM_OSStream anOSS(aNote->Size());
for (Standard_Integer i = aData->Lower(); i <= aData->Upper(); ++i)
{
anOSS << std::hex << aData->Value(i);
}
Standard_Character* dump = (Standard_Character*)anOSS.str(); // copying! Don't forget to delete it.
XmlObjMgt::SetStringValue(theTarget, dump, Standard_True);
delete[] dump;
}
} }