websitepanel/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Owa/CobaltManager.cs
2015-02-04 02:01:46 -08:00

101 lines
No EOL
3.2 KiB
C#

using System;
using System.IO;
using System.Threading;
using Cobalt;
using log4net;
using WebsitePanel.WebDav.Core.Interfaces.Managers;
using WebsitePanel.WebDav.Core.Interfaces.Owa;
namespace WebsitePanel.WebDav.Core.Owa
{
public class CobaltManager : ICobaltManager
{
private readonly IWebDavManager _webDavManager;
private readonly IWopiFileManager _fileManager;
private readonly IAccessTokenManager _tokenManager;
private readonly ILog Log;
public CobaltManager(IWebDavManager webDavManager, IWopiFileManager fileManager,
IAccessTokenManager tokenManager)
{
_webDavManager = webDavManager;
_fileManager = fileManager;
_tokenManager = tokenManager;
Log = LogManager.GetLogger(this.GetType());
}
public Atom ProcessRequest(int accessTokenId, Stream requestStream)
{
var token = _tokenManager.GetToken(accessTokenId);
var atomRequest = new AtomFromStream(requestStream);
var requestBatch = new RequestBatch();
try
{
var cobaltFile = _fileManager.Get(token.FilePath) ?? _fileManager.Create(accessTokenId);
Object ctx;
ProtocolVersion protocolVersion;
requestBatch.DeserializeInputFromProtocol(atomRequest, out ctx, out protocolVersion);
cobaltFile.CobaltEndpoint.ExecuteRequestBatch(requestBatch);
foreach (var request in requestBatch.Requests)
{
if (request.GetType() == typeof (PutChangesRequest) &&
request.PartitionId == FilePartitionId.Content && request.CompletedSuccessfully)
{
using (var saveStream = new MemoryStream())
{
CopyStream(cobaltFile, saveStream);
_webDavManager.UploadFile(token.FilePath, saveStream.ToArray());
}
}
}
return requestBatch.SerializeOutputToProtocol(protocolVersion);
}
catch (Exception e)
{
Log.Error("Cobalt manager Process request", e);
throw;
}
}
private void CopyStream(CobaltFile file, Stream stream)
{
var tries = 3;
for (int i = 0; i < tries; i++)
{
try
{
GenericFdaStream myCobaltStream = new GenericFda(file.CobaltEndpoint, null).GetContentStream();
myCobaltStream.CopyTo(stream);
break;
}
catch (Exception)
{
//unable to read update - save failed
if (i == tries - 1)
{
throw;
}
//waiting for cobalt completion
Thread.Sleep(50);
}
}
}
}
}