This repository has been archived on 2023-01-27. You can view files and clone it, but cannot push or open issues or pull requests.
cad/ref/xcad/samples/SwAddIn/SwDocHandler.cs
2022-10-15 19:16:08 +02:00

165 lines
5.8 KiB
C#

//*********************************************************************
//xCAD
//Copyright(C) 2020 Xarial Pty Limited
//Product URL: https://www.xcad.net
//License: https://xcad.xarial.com/license/
//*********************************************************************
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
using Xarial.XCad;
using Xarial.XCad.Data.Enums;
using Xarial.XCad.Documents;
using Xarial.XCad.Documents.Services;
namespace SwAddInExample
{
public class SwDocHandler : IDocumentHandler
{
public class RevData
{
public int Revision { get; set; }
public Guid RevisionStamp { get; set; }
}
private const string STREAM_NAME = "_xCadStream_";
private const string SUB_STORAGE_PATH = "_xCadStorage1_\\SubStorage2";
private const string TIME_STAMP_STREAM_NAME = "TimeStampStream";
private const string USER_NAME_STREAM_NAME = "UserName";
private RevData m_RevData;
private IXApplication m_App;
private IXDocument m_Model;
public void Init(IXApplication app, IXDocument model)
{
m_App = app;
m_Model = model;
m_Model.StreamReadAvailable += LoadFromStream;
m_Model.StreamWriteAvailable += SaveToStream;
m_Model.StorageReadAvailable += LoadFromStorage;
m_Model.StorageWriteAvailable += SaveToStorage;
//m_App.ShowMessageBox($"Opened {model.Title}");
}
private void SaveToStream(IXDocument doc)
{
using (var stream = doc.OpenStream(STREAM_NAME, AccessType_e.Write))
{
var xmlSer = new XmlSerializer(typeof(RevData));
if (m_RevData == null)
{
m_RevData = new RevData();
}
m_RevData.Revision = m_RevData.Revision + 1;
m_RevData.RevisionStamp = Guid.NewGuid();
xmlSer.Serialize(stream, m_RevData);
}
}
private void LoadFromStream(IXDocument doc)
{
using (var stream = doc.TryOpenStream(STREAM_NAME, AccessType_e.Read))
{
if (stream != null)
{
var xmlSer = new XmlSerializer(typeof(RevData));
m_RevData = xmlSer.Deserialize(stream) as RevData;
//m_App.ShowMessageBox($"Revision data of {doc.Title}: {m_RevData.Revision} - {m_RevData.RevisionStamp}");
}
else
{
//m_App.ShowMessageBox($"No revision data stored in {doc.Title}");
}
}
}
private void LoadFromStorage(IXDocument doc)
{
var path = SUB_STORAGE_PATH.Split('\\');
using (var storage = doc.TryOpenStorage(path[0], AccessType_e.Read))
{
if (storage != null)
{
using (var subStorage = storage.TryOpenStorage(path[1], false))
{
if (subStorage != null)
{
foreach (var subStreamName in subStorage.GetSubStreamNames())
{
using (var str = subStorage.TryOpenStream(subStreamName, false))
{
if (str != null)
{
var buffer = new byte[str.Length];
str.Read(buffer, 0, buffer.Length);
var timeStamp = Encoding.UTF8.GetString(buffer);
//m_App.ShowMessageBox($"Metadata stamp in {subStreamName} of {doc.Title}: {timeStamp}");
}
else
{
//m_App.ShowMessageBox($"No metadata stamp stream in {doc.Title}");
}
}
}
}
}
}
else
{
//m_App.ShowMessageBox($"No metadata storage in {doc.Title}");
}
}
}
private void SaveToStorage(IXDocument doc)
{
var path = SUB_STORAGE_PATH.Split('\\');
using (var storage = doc.OpenStorage(path[0], AccessType_e.Write))
{
using (var subStorage = storage.TryOpenStorage(path[1], true))
{
using (var str = subStorage.TryOpenStream(TIME_STAMP_STREAM_NAME, true))
{
var buffer = Encoding.UTF8.GetBytes(DateTime.Now.ToString("yyyy-MM-dd-hh-mm-ss"));
str.Write(buffer, 0, buffer.Length);
}
using (var str = subStorage.TryOpenStream(USER_NAME_STREAM_NAME, true))
{
var buffer = Encoding.UTF8.GetBytes(System.Environment.UserName);
str.Write(buffer, 0, buffer.Length);
}
}
}
}
public void Dispose()
{
m_Model.StreamReadAvailable -= LoadFromStream;
m_Model.StreamWriteAvailable -= SaveToStream;
m_Model.StorageReadAvailable -= LoadFromStorage;
m_Model.StorageWriteAvailable -= SaveToStorage;
System.Diagnostics.Debug.Print($"Closed {m_Model.Title}");
//m_App.ShowMessageBox($"Closed {m_Model.Title}");
}
}
}