2013-07-09 03:59:17 -04:00
|
|
|
using System;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.Globalization;
|
|
|
|
using System.IO;
|
|
|
|
using System.Linq;
|
2013-08-06 16:21:58 -04:00
|
|
|
using System.Net;
|
2013-07-09 03:59:17 -04:00
|
|
|
using System.Text;
|
|
|
|
|
|
|
|
using Android.App;
|
|
|
|
using Android.Content;
|
|
|
|
using Android.OS;
|
|
|
|
using Android.Runtime;
|
|
|
|
using Android.Views;
|
|
|
|
using Android.Widget;
|
|
|
|
using KeePassLib.Serialization;
|
|
|
|
using KeePassLib.Utility;
|
|
|
|
|
|
|
|
namespace keepass2android.Io
|
|
|
|
{
|
|
|
|
public class BuiltInFileStorage: IFileStorage
|
|
|
|
{
|
|
|
|
public void DeleteFile(IOConnectionInfo ioc)
|
|
|
|
{
|
|
|
|
IOConnection.DeleteFile(ioc);
|
|
|
|
}
|
|
|
|
|
|
|
|
public bool CheckForFileChangeFast(IOConnectionInfo ioc, string previousFileVersion)
|
|
|
|
{
|
|
|
|
if (!ioc.IsLocalFile())
|
|
|
|
return false;
|
2013-07-11 11:27:10 -04:00
|
|
|
if (previousFileVersion == null)
|
|
|
|
return false;
|
2013-07-09 03:59:17 -04:00
|
|
|
DateTime previousDate;
|
2013-07-11 11:27:10 -04:00
|
|
|
if (!DateTime.TryParse(previousFileVersion, CultureInfo.InvariantCulture, DateTimeStyles.None, out previousDate))
|
2013-07-09 03:59:17 -04:00
|
|
|
return false;
|
2013-07-11 11:27:10 -04:00
|
|
|
DateTime currentModificationDate = File.GetLastWriteTimeUtc(ioc.Path);
|
|
|
|
TimeSpan diff = currentModificationDate - previousDate;
|
|
|
|
return diff > TimeSpan.FromSeconds(1);
|
|
|
|
//don't use > operator because milliseconds are truncated
|
2013-07-30 14:42:16 -04:00
|
|
|
//return File.GetLastWriteTimeUtc(ioc.Path) - previousDate >= TimeSpan.FromSeconds(1);
|
2013-07-09 03:59:17 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public string GetCurrentFileVersionFast(IOConnectionInfo ioc)
|
|
|
|
{
|
|
|
|
|
|
|
|
if (ioc.IsLocalFile())
|
|
|
|
{
|
|
|
|
return File.GetLastWriteTimeUtc(ioc.Path).ToString(CultureInfo.InvariantCulture);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return DateTime.MinValue.ToString(CultureInfo.InvariantCulture);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
public Stream OpenFileForRead(IOConnectionInfo ioc)
|
|
|
|
{
|
2013-08-06 16:21:58 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
return IOConnection.OpenRead(ioc);
|
|
|
|
}
|
|
|
|
catch (WebException ex)
|
|
|
|
{
|
|
|
|
if ((ex.Response is HttpWebResponse) && (((HttpWebResponse)ex.Response).StatusCode == HttpStatusCode.NotFound))
|
|
|
|
{
|
2013-08-14 00:36:12 -04:00
|
|
|
throw new FileNotFoundException(ex.Message, ioc.Path, ex);
|
2013-08-06 16:21:58 -04:00
|
|
|
}
|
|
|
|
throw;
|
|
|
|
}
|
|
|
|
|
2013-07-09 03:59:17 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
public IWriteTransaction OpenWriteTransaction(IOConnectionInfo ioc, bool useFileTransaction)
|
|
|
|
{
|
|
|
|
return new BuiltInFileTransaction(ioc, useFileTransaction);
|
|
|
|
}
|
|
|
|
|
|
|
|
public class BuiltInFileTransaction : IWriteTransaction
|
|
|
|
{
|
|
|
|
private readonly FileTransactionEx _transaction;
|
|
|
|
|
|
|
|
public BuiltInFileTransaction(IOConnectionInfo ioc, bool useFileTransaction)
|
|
|
|
{
|
|
|
|
_transaction = new FileTransactionEx(ioc, useFileTransaction);
|
|
|
|
}
|
|
|
|
|
|
|
|
public void Dispose()
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
public Stream OpenFile()
|
|
|
|
{
|
|
|
|
return _transaction.OpenWrite();
|
|
|
|
}
|
|
|
|
|
|
|
|
public void CommitWrite()
|
|
|
|
{
|
|
|
|
_transaction.CommitWrite();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public bool CompleteIoId()
|
|
|
|
{
|
|
|
|
throw new NotImplementedException();
|
|
|
|
}
|
|
|
|
|
|
|
|
public bool? FileExists()
|
|
|
|
{
|
|
|
|
throw new NotImplementedException();
|
|
|
|
}
|
|
|
|
|
|
|
|
public string GetFilenameWithoutPathAndExt(IOConnectionInfo ioc)
|
|
|
|
{
|
|
|
|
return UrlUtil.StripExtension(
|
|
|
|
UrlUtil.GetFileName(ioc.Path));
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|