Esempio n. 1
0
 public FileMD5Stats(IFileStats stats, MD5Checksum checksum)
 {
     if (stats == null)
     {
         throw new ArgumentNullException("stats");
     }
     _fileStats = (stats is FileStats) ? (FileStats)stats : new FileStats(stats.Length, stats.LengthLastVerifedUTC);
     _checksum  = checksum;
 }
 public FileCompareStatsVerifiedMD5(IFileStats stats, byte[] checksum, Guid groupID, DateTime lastCompared)
 {
     _md5          = new FileMD5Stats(stats, checksum);
     _lastCompared = FileStats.NormalizeDateTime(lastCompared);
     if (_md5.LastCalculatedUTC.Equals(_lastCompared))
     {
         throw new InvalidOperationException("Last verified date must be different from last calculated date");
     }
     _groupID = groupID;
 }
Esempio n. 3
0
 public FileMD5Stats(IFileStats stats, byte[] checksum)
 {
     if (stats == null)
     {
         throw new ArgumentNullException("status");
     }
     if (checksum == null)
     {
         throw new ArgumentNullException("checksum");
     }
     if (checksum.Length == 0)
     {
         throw new ArgumentException("Checksum cannot have zero bytes", "checksum");
     }
     _fileStats = (stats is FileStats) ? (FileStats)stats : new FileStats(stats.Length, stats.LengthLastVerifedUTC);
     try { _checksum = new MD5Checksum(checksum); }
     catch (Exception e) { throw new ArgumentException(e.Message, "checksum", e); }
 }
 public bool Equals(IFileStats other) => other != null && other is FileCompareStatsVerifiedMD5 && Equals((FileCompareStatsVerifiedMD5)other);
 public bool Equals(IFileStats other) => other != null && other is FileCompareStatusReverified && Equals((FileCompareStatusReverified)other);
Esempio n. 6
0
 internal IFileStats AnalyzeFile(IFileStats fileStats)
 {
     if (IO.ReadAllLines(fileStats.FilePath, out string[] content))
Esempio n. 7
0
 public bool Equals(IFileStats other) => other != null && other is FileMD5Stats && Equals((FileMD5Stats)other);
Esempio n. 8
0
        private async Task <bool> BeginSending(string key, uint slicesCount, string fileName, IFileStats properties, string directory, bool isQueue)
        {
            Dictionary <string, object> vs = new Dictionary <string, object>
            {
                { "Receiver", "FileReceiver" },
                { "DownloadKey", key },
                { "SlicesCount", (int)slicesCount },
                { "FileName", fileName },
                { "DateModified", properties.LastWriteTime.ToUnixTimeMilliseconds() },
                { "DateCreated", properties.CreationTime.ToUnixTimeMilliseconds() },
                { "FileSize", properties.Length },
                { "Directory", directory },
                { "ServerIP", ipFinderResult.MyIP }
            };

            if (!isQueue)
            {
                vs.Add("Guid", Guid.NewGuid().ToString());
                vs.Add("SenderName", deviceName);
            }
            else
            {
                vs.Add("IsQueueItem", "true");
            }

            var result = await packageManager.Send(vs);

            if (result.Status == RomeAppServiceResponseStatus.Success)
            {
                return(true);
            }
            else
            {
                System.Diagnostics.Debug.WriteLine("BeginSending: Send failed (" + result.Status.ToString() + ")");
                return(false);
            }
        }
Esempio n. 9
0
        private string GetQueueFileInfo(string key, uint slicesCount, string fileName, IFileStats properties, string directory, bool isQueue)
        {
            Dictionary <string, object> vs = new Dictionary <string, object>
            {
                { "Receiver", "FileReceiver" },
                { "DownloadKey", key },
                { "SlicesCount", (int)slicesCount },
                { "FileName", fileName },
                { "DateModified", properties.LastWriteTime.ToUnixTimeMilliseconds() },
                { "DateCreated", properties.CreationTime.ToUnixTimeMilliseconds() },
                { "FileSize", properties.Length },
                { "Directory", directory },
                { "ServerIP", ipFinderResult.MyIP }
            };
            var serialized = JsonConvert.SerializeObject(vs, Formatting.None);

            return(serialized);
        }
Esempio n. 10
0
        /// <param name="files">A list of Tuple(Relative directory path, StorageFile) objects.</param>
        public async Task <FileTransferResult> SendQueue(CancellationToken cancellationToken, List <Tuple <string, IFile> > files, string parentDirectoryName)
        {
            if ((ipFinderResult == null) || (ipFinderResult.Success == false))
            {
                await Handshake();

                if (ipFinderResult == null)
                {
                    ipFinderResult = new IPDetectionCompletedEventArgs
                    {
                        Success = false,
                    }
                }
                ;
            }

            if (ipFinderResult.Success == false)
            {
                return(FileTransferResult.FailedOnHandshake);
            }


            InitServer();

            Dictionary <IFile, string> sFileKeyPairs = new Dictionary <IFile, string>();

            IFileStats[] fs = new IFileStats[files.Count];

            ulong totalSlices = 0;

            for (int i = 0; i < files.Count; i++)
            {
                var item = files[i];

                var key = GenerateUniqueRandomKey();

                fs[i] = await item.Item2.GetFileStats();

                var slicesCount = (uint)Math.Ceiling(((double)fs[i].Length) / ((double)Constants.FileSliceMaxLength));

                totalSlices += slicesCount;

                keyTable.Add(key, new FileDetails
                {
                    storageFile       = item.Item2,
                    lastPieceAccessed = 0,
                    lastSliceSize     = (uint)((ulong)fs[i].Length % Constants.FileSliceMaxLength),
                    lastSliceId       = slicesCount - 1
                });

                sFileKeyPairs.Add(item.Item2, key);

                InitUrls(key, slicesCount);
            }

            var queueFinishKey = RandomFunctions.RandomString(15);

            server.AddResponseUrl("/" + queueFinishKey + "/finishQueue/", (Func <IWebServer, RequestDetails, string>)QueueFinished);
            System.Diagnostics.Debug.WriteLine("/" + queueFinishKey + "/finishQueue/");

            queueFinishTcs = new TaskCompletionSource <string>();
            fileSendTcs    = null;

            ulong finishedSlices = 0;

            ClearInternalEventSubscribers();
            FileTransferProgressInternal += (s, ee) =>
            {
                FileTransferProgress?.Invoke(s, new FileTransferProgressEventArgs
                {
                    State       = ee.State,
                    CurrentPart = finishedSlices + ee.CurrentPart,
                    Total       = totalSlices
                });

                if (ee.State == FileTransferState.Finished)
                {
                    finishedSlices += ee.Total;
                }
            };

            cancellationToken.Register(() =>
            {
                queueFinishTcs?.TrySetResult(TRANSFER_CANCELLED_MESSAGE);
                server?.Dispose();
            });

            if (await SendQueueInit(totalSlices, queueFinishKey, parentDirectoryName) == false)
            {
                return(FileTransferResult.FailedOnQueueInit);
            }

            bool infoSendResult = await SendQueueInfo(files, sFileKeyPairs, fs);

            return(await WaitQueueToFinish(cancellationToken));
        }
Esempio n. 11
0
 public FileCompareStats(IFileStats stats, byte[] checksum, Guid groupID)
 {
     _md5     = new FileMD5Stats(stats, checksum);
     _groupID = groupID;
 }
Esempio n. 12
0
 public bool Equals(IFileStats other) => other != null && other is FileMD5StatsVerifiedLength && Equals((FileMD5StatsVerifiedLength)other);