예제 #1
0
        //Створення файлу вручну
        public FileElement(DirElement parent, Header parentHeader, SafeStreamAccess dataFileStream, string Name, Stream fileStream, bool isCompressed,
                           Object addElementLocker, Object changeElementsLocker, Bitmap Icon = null, SafeStreamAccess.ProgressCallback Progress = null) : base(addElementLocker, changeElementsLocker)
        {
            lock (_addElementLocker)
            {
                UInt64 fileSize = (UInt64)fileStream.Length;

                byte[] icon     = GetIconBytes(Icon);
                UInt32 iconSize = icon == null ? 0 : (UInt32)icon.Length;

                UInt64 fileStartPos = dataFileStream.GetFreeSpaceStartPos(Crypto.GetMod16(fileSize));                 //Вибираємо місце куди писати файл
                UInt64 iconStartPos = dataFileStream.GetFreeSpaceStartPos(Crypto.GetMod16(iconSize));                 //Вибираємо місце куди писати іконку
                iconStartPos = (iconStartPos == fileStartPos) ? iconStartPos += Crypto.GetMod16(fileSize) : iconStartPos;

                lock (dataFileStream.writeLock)
                {
                    header = new Header(parentHeader.headersFileStream, parentHeader.AES, ElementType.File);
                    this.dataFileStream = dataFileStream;

                    _Name         = Name;
                    _ParentID     = parent.ID;
                    _FileStartPos = fileStartPos;
                    _FileSize     = fileSize;
                    _IconStartPos = iconStartPos;
                    _IconSize     = iconSize;
                    _IsCompressed = isCompressed;
                    _Hash         = new byte[16];
                    CryptoRandom.GetBytes(_Hash);
                    _PHash = GetPHash(Icon);

                    SaveInf();
                    _Exists = false;
                }

                AesCryptoServiceProvider AES = GetFileAES(_FileIV);

                if (fileSize > 0)
                {
                    dataFileStream.WriteEncrypt((long)fileStartPos, fileStream, AES, out _Hash, Progress);
                }

                if ((icon != null) && (iconSize > 0))
                {
                    AES.IV = _IconIV;
                    dataFileStream.WriteEncrypt((long)iconStartPos, icon, AES);
                }

                //Закидаємо файл в потрібну папку і записуємо зміни
                _Exists = true;
                ChangeParent(parent, true);
            }
        }
예제 #2
0
        //Створення папки вручну
        protected DirElement(DirElement parent, SafeStreamAccess dataFileStream, string Name, Object addElementLocker, Object changeElementsLocker, Bitmap Icon = null,
                             SafeStreamAccess.ProgressCallback Progress = null) : this(addElementLocker, changeElementsLocker)
        {
            lock (_addElementLocker)
            {
                lock (dataFileStream.writeLock)
                {
                    header = new Header(parent.header.headersFileStream, parent.header.AES, ElementType.Dir);
                    this.dataFileStream = dataFileStream;

                    byte[] icon         = GetIconBytes(Icon);
                    UInt32 iconSize     = icon == null ? 0 : (UInt32)icon.Length;
                    UInt64 iconStartPos = dataFileStream.GetFreeSpaceStartPos(Crypto.GetMod16(iconSize));                     //Вибираємо місце куди писати іконку

                    AesCryptoServiceProvider AES = GetFileAES(_IconIV);

                    if ((icon != null) && (iconSize > 0))
                    {
                        dataFileStream.WriteEncrypt((long)iconStartPos, icon, AES);
                    }

                    _Name         = Name;
                    _ID           = GenID();
                    _ParentID     = parent.ID;
                    _IconStartPos = iconStartPos;
                    _IconSize     = iconSize;
                    _PHash        = GetPHash(Icon);
                    Parent        = parent;

                    SaveInf();
                }
            }
        }
예제 #3
0
        private void SetIcon(Bitmap icon)
        {
            lock (_addElementLocker)
            {
                byte[] buf;
                UInt32 oldIconSize = _IconSize;
                //Якщо стара іконка видаляється, то зробити пошук в FreeSpaceMap і додавати туди вільне місце
                _IconSize     = 0;
                _IconStartPos = GenID();
                _PHash        = GetPHash(Icon);

                if (icon != null)
                {
                    buf = GetIconBytes(icon);

                    _IconSize = (UInt32)buf.Length;
                    if (_IconSize == 0)                     //Вибираємо місце куди писати іконку
                    {
                        _IconStartPos = GenID();
                    }
                    else
                    {
                        _IconStartPos = dataFileStream.GetFreeSpaceStartPos(Crypto.GetMod16(_IconSize));

                        AesCryptoServiceProvider AES = GetFileAES(_IconIV);
                        dataFileStream.WriteEncrypt((long)_IconStartPos, buf, AES);
                    }
                }

                SaveInf();
                NotifyPropertyChanged("Icon");

                buf = null;
            }
        }