2013-09-15 14:08:14 -04:00
|
|
|
using System;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.IO;
|
2013-09-28 01:46:44 -04:00
|
|
|
using System.Linq;
|
2013-09-15 14:08:14 -04:00
|
|
|
using Android.App;
|
|
|
|
using KeePassLib.Serialization;
|
|
|
|
using KeePassLib.Utility;
|
|
|
|
using Keepass2android.Javafilestorage;
|
|
|
|
using Exception = System.Exception;
|
2013-09-16 14:22:35 -04:00
|
|
|
using FileNotFoundException = Java.IO.FileNotFoundException;
|
2013-09-15 14:08:14 -04:00
|
|
|
|
|
|
|
namespace keepass2android.Io
|
|
|
|
{
|
|
|
|
public abstract class JavaFileStorage: IFileStorage
|
|
|
|
{
|
2013-09-28 01:46:44 -04:00
|
|
|
public IEnumerable<string> SupportedProtocols { get { yield return Protocol; } }
|
|
|
|
|
2013-09-15 14:08:14 -04:00
|
|
|
|
2013-09-17 00:53:18 -04:00
|
|
|
private readonly IJavaFileStorage _jfs;
|
|
|
|
private readonly IKp2aApp _app;
|
2013-09-15 14:08:14 -04:00
|
|
|
|
2013-09-17 00:53:18 -04:00
|
|
|
public JavaFileStorage(IJavaFileStorage jfs, IKp2aApp app)
|
2013-09-15 14:08:14 -04:00
|
|
|
{
|
2013-09-17 00:53:18 -04:00
|
|
|
_jfs = jfs;
|
|
|
|
_app = app;
|
2013-09-15 14:08:14 -04:00
|
|
|
}
|
|
|
|
|
2013-09-28 01:46:44 -04:00
|
|
|
public void Delete(IOConnectionInfo ioc)
|
2013-09-15 14:08:14 -04:00
|
|
|
{
|
2013-09-28 01:46:44 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
Jfs.Delete(IocToPath(ioc));
|
|
|
|
}
|
|
|
|
catch (FileNotFoundException e)
|
|
|
|
{
|
|
|
|
throw new System.IO.FileNotFoundException(e.Message, e);
|
|
|
|
}
|
|
|
|
catch (Java.Lang.Exception e)
|
|
|
|
{
|
|
|
|
throw LogAndConvertJavaException(e);
|
|
|
|
}
|
2013-09-15 14:08:14 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
public bool CheckForFileChangeFast(IOConnectionInfo ioc, string previousFileVersion)
|
|
|
|
{
|
2013-09-17 00:53:18 -04:00
|
|
|
return false;
|
|
|
|
|
|
|
|
//commented because this currently might use the network which is not permitted here
|
|
|
|
/*try
|
2013-09-15 14:08:14 -04:00
|
|
|
{
|
2013-09-17 00:53:18 -04:00
|
|
|
return Jfs.CheckForFileChangeFast(ioc.Path, previousFileVersion);
|
2013-09-15 14:08:14 -04:00
|
|
|
}
|
|
|
|
catch (Java.Lang.Exception e)
|
|
|
|
{
|
2013-09-16 14:22:35 -04:00
|
|
|
throw LogAndConvertJavaException(e);
|
2013-09-17 00:53:18 -04:00
|
|
|
}*/
|
2013-09-15 14:08:14 -04:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
public string GetCurrentFileVersionFast(IOConnectionInfo ioc)
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
2013-09-17 00:53:18 -04:00
|
|
|
return Jfs.GetCurrentFileVersionFast(ioc.Path);
|
2013-09-15 14:08:14 -04:00
|
|
|
}
|
|
|
|
catch (Java.Lang.Exception e)
|
|
|
|
{
|
2013-09-16 14:22:35 -04:00
|
|
|
throw LogAndConvertJavaException(e);
|
2013-09-15 14:08:14 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public Stream OpenFileForRead(IOConnectionInfo ioc)
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
2013-09-17 00:53:18 -04:00
|
|
|
return Jfs.OpenFileForRead(IocToPath(ioc));
|
2013-09-15 14:08:14 -04:00
|
|
|
}
|
2013-09-16 14:22:35 -04:00
|
|
|
catch (FileNotFoundException e)
|
2013-09-15 14:08:14 -04:00
|
|
|
{
|
|
|
|
throw new System.IO.FileNotFoundException(e.Message, e);
|
|
|
|
}
|
|
|
|
catch (Java.Lang.Exception e)
|
|
|
|
{
|
2013-09-16 14:22:35 -04:00
|
|
|
throw LogAndConvertJavaException(e);
|
2013-09-15 14:08:14 -04:00
|
|
|
}
|
2013-09-16 14:22:35 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-09-17 00:53:18 -04:00
|
|
|
private Exception LogAndConvertJavaException(Java.Lang.Exception e)
|
2013-09-16 14:22:35 -04:00
|
|
|
{
|
|
|
|
Kp2aLog.Log(e.Message);
|
2013-09-17 00:53:18 -04:00
|
|
|
var ex = new Exception(e.LocalizedMessage ??
|
|
|
|
e.Message ??
|
|
|
|
_app.GetResourceString(UiStringKey.ErrorOcurred)+e, e);
|
2013-09-16 14:22:35 -04:00
|
|
|
return ex;
|
2013-09-15 14:08:14 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
public IWriteTransaction OpenWriteTransaction(IOConnectionInfo ioc, bool useFileTransaction)
|
|
|
|
{
|
2013-09-17 00:53:18 -04:00
|
|
|
return new JavaFileStorageWriteTransaction(IocToPath(ioc), useFileTransaction, this);
|
2013-09-15 14:08:14 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
public IFileStorageSetup RequiredSetup
|
|
|
|
{
|
|
|
|
get
|
|
|
|
{
|
2013-09-17 00:53:18 -04:00
|
|
|
if (Jfs.IsConnected)
|
2013-09-15 14:08:14 -04:00
|
|
|
return null;
|
|
|
|
return new JavaFileStorageSetup(this);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-09-17 00:53:18 -04:00
|
|
|
internal IJavaFileStorage Jfs
|
|
|
|
{
|
|
|
|
get { return _jfs; }
|
|
|
|
}
|
|
|
|
|
2013-09-15 14:08:14 -04:00
|
|
|
public class JavaFileStorageSetup : IFileStorageSetup, IFileStorageSetupOnResume
|
|
|
|
{
|
|
|
|
private readonly JavaFileStorage _javaFileStorage;
|
|
|
|
|
|
|
|
public JavaFileStorageSetup(JavaFileStorage javaFileStorage)
|
|
|
|
{
|
|
|
|
_javaFileStorage = javaFileStorage;
|
|
|
|
}
|
|
|
|
|
|
|
|
public bool TrySetup(Activity activity)
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
2013-09-17 00:53:18 -04:00
|
|
|
return _javaFileStorage.Jfs.TryConnect(activity);
|
2013-09-15 14:08:14 -04:00
|
|
|
}
|
|
|
|
catch (Java.Lang.Exception e)
|
|
|
|
{
|
2013-09-17 00:53:18 -04:00
|
|
|
throw _javaFileStorage.LogAndConvertJavaException(e);
|
2013-09-15 14:08:14 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public bool TrySetupOnResume(Activity activity)
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
2013-09-17 00:53:18 -04:00
|
|
|
_javaFileStorage.Jfs.OnResume();
|
|
|
|
return _javaFileStorage.Jfs.IsConnected;
|
2013-09-15 14:08:14 -04:00
|
|
|
}
|
|
|
|
catch (Java.Lang.Exception e)
|
|
|
|
{
|
2013-09-17 00:53:18 -04:00
|
|
|
throw _javaFileStorage.LogAndConvertJavaException(e);
|
2013-09-15 14:08:14 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class JavaFileStorageWriteTransaction: IWriteTransaction
|
|
|
|
{
|
|
|
|
private readonly string _path;
|
|
|
|
private readonly bool _useFileTransaction;
|
2013-09-17 00:53:18 -04:00
|
|
|
private readonly JavaFileStorage _javaFileStorage;
|
2013-09-15 14:08:14 -04:00
|
|
|
private MemoryStream _memoryStream;
|
|
|
|
|
2013-09-17 00:53:18 -04:00
|
|
|
public JavaFileStorageWriteTransaction(string path, bool useFileTransaction, JavaFileStorage javaFileStorage)
|
2013-09-15 14:08:14 -04:00
|
|
|
{
|
|
|
|
_path = path;
|
|
|
|
_useFileTransaction = useFileTransaction;
|
|
|
|
_javaFileStorage = javaFileStorage;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void Dispose()
|
|
|
|
{
|
|
|
|
_memoryStream.Dispose();
|
|
|
|
}
|
|
|
|
|
|
|
|
public Stream OpenFile()
|
|
|
|
{
|
|
|
|
_memoryStream = new MemoryStream();
|
|
|
|
return _memoryStream;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void CommitWrite()
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
2013-09-17 00:53:18 -04:00
|
|
|
_javaFileStorage.Jfs.UploadFile(_path, _memoryStream.ToArray(), _useFileTransaction);
|
2013-09-15 14:08:14 -04:00
|
|
|
}
|
|
|
|
catch (Java.Lang.Exception e)
|
|
|
|
{
|
2013-09-17 00:53:18 -04:00
|
|
|
throw _javaFileStorage.LogAndConvertJavaException(e);
|
2013-09-15 14:08:14 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public bool CompleteIoId()
|
|
|
|
{
|
|
|
|
throw new NotImplementedException();
|
|
|
|
}
|
|
|
|
|
|
|
|
public bool? FileExists()
|
|
|
|
{
|
|
|
|
throw new NotImplementedException();
|
|
|
|
}
|
|
|
|
|
|
|
|
public string GetFilenameWithoutPathAndExt(IOConnectionInfo ioc)
|
|
|
|
{
|
|
|
|
return UrlUtil.StripExtension(
|
|
|
|
UrlUtil.GetFileName(IocToPath(ioc)));
|
|
|
|
}
|
|
|
|
|
|
|
|
public bool RequiresCredentials(IOConnectionInfo ioc)
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2013-09-28 01:46:44 -04:00
|
|
|
public void CreateDirectory(IOConnectionInfo ioc)
|
2013-09-15 14:08:14 -04:00
|
|
|
{
|
2013-09-28 01:46:44 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
Jfs.CreateFolder(IocToPath(ioc));
|
|
|
|
}
|
|
|
|
catch (FileNotFoundException e)
|
|
|
|
{
|
|
|
|
throw new System.IO.FileNotFoundException(e.Message, e);
|
|
|
|
}
|
|
|
|
catch (Java.Lang.Exception e)
|
|
|
|
{
|
|
|
|
throw LogAndConvertJavaException(e);
|
|
|
|
}
|
|
|
|
}
|
2013-09-15 14:08:14 -04:00
|
|
|
|
2013-09-28 01:46:44 -04:00
|
|
|
public IEnumerable<FileDescription> ListContents(IOConnectionInfo ioc)
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
IList<JavaFileStorageFileEntry> entries = Jfs.ListFiles(IocToPath(ioc));
|
|
|
|
|
|
|
|
return entries.Select(
|
|
|
|
e => new FileDescription
|
|
|
|
{
|
|
|
|
CanRead = e.CanRead,
|
|
|
|
CanWrite = e.CanWrite,
|
|
|
|
IsDirectory = e.IsDirectory,
|
|
|
|
LastModified = JavaTimeToCSharp(e.LastModifiedTime),
|
|
|
|
Path = Protocol + "://" + e.Path,
|
|
|
|
SizeInBytes = e.SizeInBytes
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
|
|
|
}
|
|
|
|
catch (FileNotFoundException e)
|
|
|
|
{
|
|
|
|
throw new System.IO.FileNotFoundException(e.Message, e);
|
|
|
|
}
|
|
|
|
catch (Java.Lang.Exception e)
|
|
|
|
{
|
|
|
|
throw LogAndConvertJavaException(e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private DateTime JavaTimeToCSharp(long javatime)
|
|
|
|
{
|
|
|
|
//todo test
|
|
|
|
return new DateTime(1970, 1, 1).AddMilliseconds(javatime);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
private string IocToPath(IOConnectionInfo ioc)
|
|
|
|
{
|
|
|
|
if (ioc.Path.StartsWith(Protocol + "://"))
|
|
|
|
return ioc.Path.Substring(Protocol.Length + 3);
|
2013-09-15 14:08:14 -04:00
|
|
|
else
|
2013-09-28 01:46:44 -04:00
|
|
|
{
|
|
|
|
return ioc.Path;
|
|
|
|
}
|
2013-09-15 14:08:14 -04:00
|
|
|
}
|
2013-09-28 01:46:44 -04:00
|
|
|
|
|
|
|
protected abstract string Protocol { get; }
|
2013-09-15 14:08:14 -04:00
|
|
|
}
|
|
|
|
}
|