2013-09-15 14:08:14 -04:00
|
|
|
using System;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.IO;
|
|
|
|
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
|
|
|
|
{
|
|
|
|
public abstract IEnumerable<string> SupportedProtocols { get; }
|
|
|
|
|
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
|
|
|
}
|
|
|
|
|
|
|
|
public void DeleteFile(IOConnectionInfo ioc)
|
|
|
|
{
|
|
|
|
throw new NotImplementedException();
|
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
|
|
|
private static string IocToPath(IOConnectionInfo ioc)
|
|
|
|
{
|
2013-09-16 14:22:35 -04:00
|
|
|
int protocolLength = ioc.Path.IndexOf("://", StringComparison.Ordinal);
|
2013-09-15 14:08:14 -04:00
|
|
|
|
|
|
|
if (protocolLength < 0)
|
|
|
|
return ioc.Path;
|
|
|
|
else
|
|
|
|
return ioc.Path.Substring(protocolLength + 3);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|