コード例 #1
0
        public override void Run()
        {
            try
            {
                IOConnectionInfo ioc = _app.GetDb().Ioc;
                IFileStorage fileStorage = _app.GetFileStorage(ioc);
                if (fileStorage is CachingFileStorage)
                {
                    throw new Exception("Cannot sync a cached database!");
                }
                StatusLogger.UpdateMessage(UiStringKey.CheckingDatabaseForChanges);

                //download file from remote location and calculate hash:
                StatusLogger.UpdateSubMessage(_app.GetResourceString(UiStringKey.DownloadingRemoteFile));

                MemoryStream remoteData = new MemoryStream();
                using (
                    HashingStreamEx hashingRemoteStream = new HashingStreamEx(fileStorage.OpenFileForRead(ioc), false,
                                                                                new SHA256Managed()))
                {
                    hashingRemoteStream.CopyTo(remoteData);
                    hashingRemoteStream.Close();

                    if (!MemUtil.ArraysEqual(_app.GetDb().KpDatabase.HashOfFileOnDisk, hashingRemoteStream.Hash))
                    {
                        _app.TriggerReload(_context);
                        Finish(true);
                    }
                    else
                    {
                        Finish(true, _app.GetResourceString(UiStringKey.RemoteDatabaseUnchanged));
                    }
                }

            }
            catch (Exception e)
            {
                Finish(false, e.Message);
            }
        }
コード例 #2
0
ファイル: CachingFileStorage.cs プロジェクト: pythe/wristpass
        public MemoryStream GetRemoteDataAndHash(IOConnectionInfo ioc, out string hash)
        {
            MemoryStream remoteData = new MemoryStream();

            using (var remoteStream =_cachedStorage.OpenFileForRead(ioc))
            {
                //note: directly copying to remoteData and hashing causes NullReferenceExceptions in FTP and with Digest auth
                // -> use the temp data approach:
                MemoryStream tempData = new MemoryStream();
                remoteStream.CopyTo(tempData);
                tempData.Position = 0;
                HashingStreamEx hashingRemoteStream = new HashingStreamEx(tempData, false, new SHA256Managed());

                hashingRemoteStream.CopyTo(remoteData);
                hashingRemoteStream.Close();
                hash = MemUtil.ByteArrayToHexString(hashingRemoteStream.Hash);
            }
            remoteData.Position = 0;
            return remoteData;
        }