public AfpResultCode Process(IAfpSession session, DsiHeader dsiHeader, AfpStream requestStream, AfpStream responseStream)
        {
            requestStream.ReadUInt8(); // Padding

            ushort      volumeId    = requestStream.ReadUInt16();
            uint        directoryId = requestStream.ReadUInt32();
            AfpPathType pathType    = requestStream.ReadEnum <AfpPathType>();
            string      pathName    = null;

            switch (pathType)
            {
            case AfpPathType.kFPLongName:
            case AfpPathType.kFPShortName:
                pathName = requestStream.ReadPascalString();
                break;

            case AfpPathType.kFPUTF8Name:
                pathName = requestStream.ReadUTF8StringWithHint();
                break;
            }

            IAfpVolume volume = session.GetVolume(volumeId);

            if (volume == null)
            {
                return(AfpResultCode.FPObjectNotFound);
            }

            IStorageContainer container = null;

            if (directoryId == 2)
            {
                container = volume.StorageProvider;
            }
            else
            {
                container = (volume.GetNode(directoryId) as IStorageContainer);
            }

            if (container == null)
            {
                return(AfpResultCode.FPObjectNotFound);
            }

            IStorageContainer newContainer = container.CreateContainer(pathName);

            uint newContainerId = volume.GetNode(newContainer);

            responseStream.WriteUInt32(newContainerId);

            return(AfpResultCode.FPNoErr);
        }
        public AfpResultCode Process(IAfpSession session, DsiHeader dsiHeader, AfpStream requestStream, AfpStream responseStream)
        {
            requestStream.ReadUInt8(); // Pad

            ushort volumeId = requestStream.ReadUInt16();
            uint   fileId   = requestStream.ReadUInt32();
            AfpFileDirectoryBitmap fileBitmap = requestStream.ReadEnum <AfpFileDirectoryBitmap>();

            IAfpVolume volume = session.GetVolume(volumeId);

            if (volume == null)
            {
                return(AfpResultCode.FPObjectNotFound);
            }

            IStorageFile item = volume.GetNode(fileId) as IStorageFile;

            if (item == null)
            {
                return(AfpResultCode.FPObjectNotFound);
            }

            responseStream.WriteEnum(fileBitmap);

            responseStream.WriteStorageFileInfo(volume, item, fileBitmap, false);

            return(AfpResultCode.FPNoErr);
        }
        public AfpResultCode Process(IAfpSession session, DsiHeader dsiHeader, AfpStream requestStream, AfpStream responseStream)
        {
            byte hardCreate = requestStream.ReadUInt8();

            ushort      volumeId    = requestStream.ReadUInt16();
            uint        directoryId = requestStream.ReadUInt32();
            AfpPathType pathType    = requestStream.ReadEnum <AfpPathType>();
            string      pathName    = null;

            switch (pathType)
            {
            case AfpPathType.kFPLongName:
            case AfpPathType.kFPShortName:
                pathName = requestStream.ReadPascalString();
                break;

            case AfpPathType.kFPUTF8Name:
                pathName = requestStream.ReadUTF8StringWithHint();
                break;
            }

            IAfpVolume volume = session.GetVolume(volumeId);

            if (volume == null)
            {
                throw new StorageItemNotFoundException();
            }

            IStorageContainer container = null;

            if (directoryId == 2)
            {
                container = volume.StorageProvider;
            }
            else
            {
                container = (volume.GetNode(directoryId) as IStorageContainer);
            }

            if (container == null)
            {
                throw new StorageItemNotFoundException();
            }

            IStorageFile existingFile = container.Content(pathName) as IStorageFile;

            if (existingFile != null && hardCreate == 0)
            {
                return(AfpResultCode.FPObjectExists);
            }

            IStorageFile newFile = container.CreateFile(pathName);

            return(AfpResultCode.FPNoErr);
        }
Example #4
0
        public void WriteStorageFileInfo(IAfpVolume volume, IStorageFile file, AfpFileDirectoryBitmap bitmap, bool writeFileByte = true)
        {
            if (writeFileByte)
            {
                this.WriteUInt8(0);
            }

            while ((this.Stream.Length % 2) != 0)
            {
                this.WriteUInt8(0);
            }

            this.BeginMarking();

            foreach (AfpFileDirectoryBitmap flag in bitmap.EnumerateFlags())
            {
                switch (flag)
                {
                case AfpFileDirectoryBitmap.kFPAttributeBit:
                    AfpFileDirectoryAttributes attrs = 0;

                    if ((file.Attributes & StorageItemAttributes.Hidden) != 0)
                    {
                        attrs |= AfpFileDirectoryAttributes.kFPInvisibleBit;
                    }

                    this.WriteEnum <AfpFileDirectoryAttributes>(attrs);
                    break;

                case AfpFileDirectoryBitmap.kFPParentDirIDBit:
                    if (file.Parent == null)
                    {
                        this.WriteUInt32(1);
                    }
                    else if (file.Parent is IStorageProvider)
                    {
                        this.WriteUInt32(2);
                    }
                    else
                    {
                        this.WriteUInt32(volume.GetNode(file.Parent));
                    }
                    break;

                case AfpFileDirectoryBitmap.kFPCreateDateBit:
                    this.WriteMacintoshDate(file.DateCreated);
                    break;

                case AfpFileDirectoryBitmap.kFPModDateBit:
                    this.WriteMacintoshDate(file.DateModified);
                    break;

                case AfpFileDirectoryBitmap.kFPBackupDateBit:
                    this.WriteUInt32(0x80000000);
                    break;

                case AfpFileDirectoryBitmap.kFPFinderInfoBit:
                    this.WriteBytes(new byte[32]);
                    break;

                case AfpFileDirectoryBitmap.kFPLongNameBit:
                    this.WriteMark("LongName");

                    break;

                case AfpFileDirectoryBitmap.kFPShortNameBit:
                    this.WriteMark("ShortName");
                    break;

                case AfpFileDirectoryBitmap.kFPUTF8NameBit:
                    this.WriteMark("UTF8Name");
                    this.WriteBytes(new byte[4]);
                    break;

                case AfpFileDirectoryBitmap.kFPNodeIDBit:
                    this.WriteUInt32(volume.GetNode(file));
                    break;

                case AfpFileDirectoryBitmap.kFPAccessRightsBit:
                    this.WriteEnum <AfpAccessRightsBitmap>(AfpAccessRightsBitmap.All);
                    break;

                case AfpFileDirectoryBitmap.kFPExtDataForkLenBit:
                    this.WriteUInt64((ulong)file.Length);
                    break;

                case AfpFileDirectoryBitmap.kFPDataForkLenBit:
                    this.WriteUInt32((uint)file.Length);
                    break;

                case AfpFileDirectoryBitmap.kFPRsrcForkLenBit:
                    this.WriteUInt32(0);
                    break;

                case AfpFileDirectoryBitmap.kFPExtRsrcForkLenBit:
                    this.WriteUInt64(0);
                    break;

                default:
                    Console.WriteLine("Unrecog file flag: {0}", flag);
                    break;
                }
            }

            foreach (AfpFileDirectoryBitmap flag in bitmap.EnumerateFlags())
            {
                switch (flag)
                {
                case AfpFileDirectoryBitmap.kFPLongNameBit:
                    this.BeginMark("LongName");
                    this.WritePascalString(file.Name, 32);
                    break;

                case AfpFileDirectoryBitmap.kFPShortNameBit:
                    this.BeginMark("ShortName");
                    this.WritePascalString(file.Name, 12);
                    break;

                case AfpFileDirectoryBitmap.kFPUTF8NameBit:
                    this.BeginMark("UTF8Name");
                    this.WriteUTF8StringWithHint(file.Name);
                    break;
                }
            }

            this.EndMarking();
        }
Example #5
0
        public void WriteStorageContainerInfo(IAfpVolume volume, IStorageContainer container, AfpFileDirectoryBitmap bitmap)
        {
            this.WriteUInt8(1 << 7);

            while ((this.Stream.Length % 2) != 0)
            {
                this.WriteUInt8(0);
            }

            this.BeginMarking();

            foreach (AfpFileDirectoryBitmap flag in bitmap.EnumerateFlags())
            {
                switch (flag)
                {
                case AfpFileDirectoryBitmap.kFPAttributeBit:
                    AfpFileDirectoryAttributes attrs = 0;

                    if ((container.Attributes & StorageItemAttributes.Hidden) != 0)
                    {
                        attrs |= AfpFileDirectoryAttributes.kFPInvisibleBit;
                    }

                    this.WriteEnum <AfpFileDirectoryAttributes>(attrs);
                    break;

                case AfpFileDirectoryBitmap.kFPParentDirIDBit:
                    if (container.Parent == null)
                    {
                        this.WriteUInt32(1);
                    }
                    else if (container.Parent is IStorageProvider)
                    {
                        this.WriteUInt32(2);
                    }
                    else
                    {
                        this.WriteUInt32(volume.GetNode(container.Parent));
                    }
                    break;

                case AfpFileDirectoryBitmap.kFPOffspringCountBit:
                    this.WriteUInt16((ushort)container.Contents().Count());
                    break;

                case AfpFileDirectoryBitmap.kFPCreateDateBit:
                    this.WriteMacintoshDate(container.DateCreated);
                    break;

                case AfpFileDirectoryBitmap.kFPModDateBit:
                    this.WriteMacintoshDate(container.DateModified);
                    break;

                case AfpFileDirectoryBitmap.kFPBackupDateBit:
                    this.WriteUInt32(0x80000000);
                    break;

                case AfpFileDirectoryBitmap.kFPFinderInfoBit:
                    this.WriteBytes(new byte[32]);
                    break;

                case AfpFileDirectoryBitmap.kFPLongNameBit:
                    this.WriteMark("LongName");
                    break;

                case AfpFileDirectoryBitmap.kFPShortNameBit:
                    this.WriteMark("ShortName");
                    break;

                case AfpFileDirectoryBitmap.kFPUTF8NameBit:
                    this.WriteMark("UTF8Name");
                    this.WriteBytes(new byte[4]);
                    break;

                case AfpFileDirectoryBitmap.kFPNodeIDBit:
                    if (container is IStorageProvider)
                    {
                        this.WriteUInt32(2);
                    }
                    else
                    {
                        this.WriteUInt32(volume.GetNode(container));
                    }
                    break;

                case AfpFileDirectoryBitmap.kFPOwnerIDBit:
                    this.WriteUInt32(0);
                    break;

                case AfpFileDirectoryBitmap.kFPGroupIDBit:
                    this.WriteUInt32(0);
                    break;

                case AfpFileDirectoryBitmap.kFPAccessRightsBit:
                    this.WriteEnum <AfpAccessRightsBitmap>(AfpAccessRightsBitmap.All);
                    break;

                default:
                    Console.WriteLine("Unrecog flag: {0}", flag);
                    break;
                }
            }

            //this.WriteUInt32(0); // Pad

            foreach (AfpFileDirectoryBitmap flag in bitmap.EnumerateFlags())
            {
                switch (flag)
                {
                case AfpFileDirectoryBitmap.kFPLongNameBit:
                    this.BeginMark("LongName");
                    this.WritePascalString(container.Name, 32);
                    break;

                case AfpFileDirectoryBitmap.kFPShortNameBit:
                    this.BeginMark("ShortName");
                    this.WritePascalString(container.Name, 12);
                    break;

                case AfpFileDirectoryBitmap.kFPUTF8NameBit:
                    this.BeginMark("UTF8Name");
                    this.WriteUTF8StringWithHint(container.Name);
                    break;
                }
            }

            this.EndMarking();
        }
Example #6
0
        public AfpResultCode Process(IAfpSession session, DsiHeader dsiHeader, AfpStream requestStream, AfpStream responseStream)
        {
            requestStream.ReadUInt8(); // Padding

            ushort      volumeId    = requestStream.ReadUInt16();
            uint        directoryId = requestStream.ReadUInt32();
            AfpPathType pathType    = requestStream.ReadEnum <AfpPathType>();
            string      pathName    = null;

            switch (pathType)
            {
            case AfpPathType.kFPLongName:
            case AfpPathType.kFPShortName:
                pathName = requestStream.ReadPascalString();
                break;

            case AfpPathType.kFPUTF8Name:
                pathName = requestStream.ReadUTF8StringWithHint();
                break;
            }

            IAfpVolume volume = session.GetVolume(volumeId);

            if (volume == null)
            {
                return(AfpResultCode.FPObjectNotFound);
            }

            IStorageContainer container = null;

            if (directoryId == 2)
            {
                container = volume.StorageProvider;
            }
            else
            {
                container = (volume.GetNode(directoryId) as IStorageContainer);
            }

            if (container == null)
            {
                return(AfpResultCode.FPObjectNotFound);
            }

            IStorageItem deleteItem = null;

            if (!string.IsNullOrEmpty(pathName))
            {
                deleteItem = container.Content(pathName);
            }

            if (deleteItem == null)
            {
                return(AfpResultCode.FPObjectNotFound);
            }

            IStorageContainer deleteContainer = (deleteItem as IStorageContainer);

            if (deleteContainer != null && deleteContainer.Contents().Count() > 0)
            {
                return(AfpResultCode.FPDirNotEmpty);
            }

            deleteItem.Delete();

            return(AfpResultCode.FPNoErr);
        }
        public AfpResultCode Process(IAfpSession session, DsiHeader dsiHeader, AfpStream requestStream, AfpStream responseStream)
        {
            requestStream.ReadUInt8(); // Pad

            ushort volumeId    = requestStream.ReadUInt16();
            uint   directoryID = requestStream.ReadUInt32();
            AfpFileDirectoryBitmap fileBitmap      = requestStream.ReadEnum <AfpFileDirectoryBitmap>();
            AfpFileDirectoryBitmap directoryBitmap = requestStream.ReadEnum <AfpFileDirectoryBitmap>();
            AfpPathType            pathType        = requestStream.ReadEnum <AfpPathType>();
            string pathname = null;

            switch (pathType)
            {
            case AfpPathType.kFPLongName:
            case AfpPathType.kFPShortName:
                pathname = requestStream.ReadPascalString();
                break;

            case AfpPathType.kFPUTF8Name:
                pathname = requestStream.ReadUTF8StringWithHint();
                break;
            }

            IAfpVolume volume = session.GetVolume(volumeId);

            if (volume == null)
            {
                return(AfpResultCode.FPObjectNotFound);
            }

            IStorageContainer container = null;

            if (directoryID == 2)
            {
                container = volume.StorageProvider;
            }
            else if (directoryID == 1)
            {
                if (pathname == volume.StorageProvider.Name)
                {
                    container = volume.StorageProvider;
                }
            }
            else
            {
                container = volume.GetNode(directoryID) as IStorageContainer;
            }

            if (container == null)
            {
                return(AfpResultCode.FPObjectNotFound);
            }

            IStorageItem item = null;

            if (directoryID == 1)
            {
                item = container;
            }
            else
            {
                if (string.IsNullOrEmpty(pathname))
                {
                    item = container;
                }
                else
                {
                    item = container.Content(pathname);
                }
            }

            if (item == null)
            {
                return(AfpResultCode.FPObjectNotFound);
            }

            responseStream.WriteEnum(fileBitmap);
            responseStream.WriteEnum(directoryBitmap);

            if (item is IStorageContainer)
            {
                responseStream.WriteStorageContainerInfo(volume, (IStorageContainer)item, directoryBitmap);
            }
            else
            {
                responseStream.WriteStorageFileInfo(volume, (IStorageFile)item, fileBitmap);
            }

            return(AfpResultCode.FPNoErr);
        }
Example #8
0
        public AfpResultCode Process(IAfpSession session, DsiHeader dsiHeader, AfpStream requestStream, AfpStream responseStream)
        {
            requestStream.ReadUInt8(); // Padding

            ushort      volumeId       = requestStream.ReadUInt16();
            uint        sourceDirId    = requestStream.ReadUInt32();
            uint        destDirId      = requestStream.ReadUInt32();
            AfpPathType sourcePathType = requestStream.ReadEnum <AfpPathType>();
            string      sourcePathName = null;

            switch (sourcePathType)
            {
            case AfpPathType.kFPLongName:
            case AfpPathType.kFPShortName:
                sourcePathName = requestStream.ReadPascalString();
                break;

            case AfpPathType.kFPUTF8Name:
                sourcePathName = requestStream.ReadUTF8StringWithHint();
                break;
            }

            AfpPathType destPathType = requestStream.ReadEnum <AfpPathType>();
            string      destPathName = null;

            switch (destPathType)
            {
            case AfpPathType.kFPLongName:
            case AfpPathType.kFPShortName:
                destPathName = requestStream.ReadPascalString();
                break;

            case AfpPathType.kFPUTF8Name:
                destPathName = requestStream.ReadUTF8StringWithHint();
                break;
            }

            AfpPathType newPathType = requestStream.ReadEnum <AfpPathType>();
            string      newPathName = null;

            switch (newPathType)
            {
            case AfpPathType.kFPLongName:
            case AfpPathType.kFPShortName:
                newPathName = requestStream.ReadPascalString();
                break;

            case AfpPathType.kFPUTF8Name:
                newPathName = requestStream.ReadUTF8StringWithHint();
                break;
            }

            IAfpVolume volume = session.GetVolume(volumeId);

            IStorageContainer sourceContainer      = sourceDirId == 2 ? volume.StorageProvider : (IStorageContainer)volume.GetNode(sourceDirId);
            IStorageContainer destinationContainer = destDirId == 2 ? volume.StorageProvider : (IStorageContainer)volume.GetNode(destDirId);

            if (sourceContainer == null || destinationContainer == null)
            {
                return(AfpResultCode.FPObjectNotFound);
            }

            IStorageItem sourceItem = null;

            if (!string.IsNullOrEmpty(destPathName))
            {
                destinationContainer = destinationContainer.Content(destPathName) as IStorageContainer;

                if (destinationContainer == null)
                {
                    return(AfpResultCode.FPObjectNotFound);
                }
            }

            if (!string.IsNullOrEmpty(sourcePathName))
            {
                sourceItem = sourceContainer.Content(sourcePathName);
            }
            else
            {
                sourceItem = sourceContainer;
            }

            if (sourceItem == null)
            {
                return(AfpResultCode.FPObjectNotFound);
            }

            if (string.IsNullOrEmpty(newPathName))
            {
                newPathName = sourceItem.Name;
            }

            if (destinationContainer.Content(newPathName) != null)
            {
                return(AfpResultCode.FPObjectExists);
            }

            sourceItem.Move(destinationContainer);
            sourceItem.Rename(newPathName);

            return(AfpResultCode.FPNoErr);
        }
        public AfpResultCode Process(IAfpSession session, DsiHeader dsiHeader, AfpStream requestStream, AfpStream responseStream)
        {
            byte   flag        = requestStream.ReadUInt8();
            ushort volumeId    = requestStream.ReadUInt16();
            uint   directoryId = requestStream.ReadUInt32();

            bool resourceFork = (flag == 0x80);

            if (resourceFork)
            {
                Log.Add(this, EntryType.Error, "Session '{0}' attempted to open resource fork, failing...", session);
                return(AfpResultCode.FPMiscErr);
            }

            AfpFileDirectoryBitmap bitmap     = requestStream.ReadEnum <AfpFileDirectoryBitmap>();
            AfpAccessModes         accessMode = requestStream.ReadEnum <AfpAccessModes>();
            AfpPathType            pathType   = requestStream.ReadEnum <AfpPathType>();
            string path = null;

            switch (pathType)
            {
            case AfpPathType.kFPLongName:
            case AfpPathType.kFPShortName:
                path = requestStream.ReadPascalString();
                break;

            case AfpPathType.kFPUTF8Name:
                path = requestStream.ReadUTF8StringWithHint();
                break;
            }

            IAfpVolume volume = session.GetVolume(volumeId);

            if (volume == null)
            {
                throw new StorageItemNotFoundException();
            }

            IStorageContainer container = null;

            if (directoryId == 2)
            {
                container = volume.StorageProvider;
            }
            else
            {
                container = (volume.GetNode(directoryId) as IStorageContainer);
            }

            if (container == null)
            {
                throw new StorageItemNotFoundException();
            }

            IStorageFile file = (container.Content(path) as IStorageFile);

            if (file == null)
            {
                throw new StorageItemNotFoundException();
            }

            IAfpFork info = session.OpenFork(file, accessMode);

            if (info == null)
            {
                throw new StorageItemNotFoundException();
            }

            responseStream.WriteEnum <AfpFileDirectoryBitmap>(bitmap);
            responseStream.WriteInt16(info.Identifier);
            responseStream.WriteStorageFileInfo(volume, file, bitmap);

            return(AfpResultCode.FPNoErr);
        }
Example #10
0
        public AfpResultCode Process(IAfpSession session, DsiHeader dsiHeader, AfpStream requestStream, AfpStream responseStream)
        {
            requestStream.ReadUInt8(); // Padding

            ushort volumeId    = requestStream.ReadUInt16();
            uint   directoryId = requestStream.ReadUInt32();
            AfpFileDirectoryBitmap fileBitmap      = requestStream.ReadEnum <AfpFileDirectoryBitmap>();
            AfpFileDirectoryBitmap directoryBitmap = requestStream.ReadEnum <AfpFileDirectoryBitmap>();

            short reqCount     = requestStream.ReadInt16();
            int   startIndex   = requestStream.ReadInt32();
            int   maxReplySize = requestStream.ReadInt32();

            AfpPathType pathType = requestStream.ReadEnum <AfpPathType>();
            string      path     = null;

            switch (pathType)
            {
            case AfpPathType.kFPLongName:
            case AfpPathType.kFPShortName:
                path = requestStream.ReadPascalString();
                break;

            case AfpPathType.kFPUTF8Name:
                path = requestStream.ReadUTF8StringWithHint();
                break;
            }

            IAfpVolume volume = session.GetVolume(volumeId);

            if (volume == null)
            {
                return(AfpResultCode.FPObjectNotFound);
            }

            IStorageContainer container = null;

            if (directoryId == 2)
            {
                container = volume.StorageProvider;
            }
            else
            {
                container = (volume.GetNode(directoryId) as IStorageContainer);
            }

            if (container == null)
            {
                return(AfpResultCode.FPObjectNotFound);
            }

            IStorageContainer lookAtContainer = null;

            if (string.IsNullOrEmpty(path))
            {
                lookAtContainer = container;
            }
            else
            {
                lookAtContainer = (container.Content(path) as IStorageContainer);
            }

            if (lookAtContainer == null)
            {
                return(AfpResultCode.FPObjectNotFound);
            }

            var useContents = lookAtContainer.Contents();

            if (fileBitmap == 0)
            {
                useContents = useContents.OfType <IStorageContainer>();
            }
            else if (directoryBitmap == 0)
            {
                useContents = useContents.OfType <IStorageFile>();
            }

            useContents = useContents
                          .Skip(startIndex - 1)
                          .Take(reqCount);

            var contents = useContents.ToList();

            if (contents.Count == 0)
            {
                return(AfpResultCode.FPObjectNotFound);
            }

            responseStream.WriteEnum <AfpFileDirectoryBitmap>(fileBitmap);
            responseStream.WriteEnum <AfpFileDirectoryBitmap>(directoryBitmap);
            responseStream.WriteInt16((short)contents.Count);

            foreach (IStorageItem item in contents)
            {
                AfpStream resultRecord = new AfpStream();

                resultRecord.WriteUInt16(0); // Length

                if (item is IStorageContainer)
                {
                    resultRecord.WriteStorageContainerInfo(volume, (IStorageContainer)item, directoryBitmap);
                }
                else
                {
                    resultRecord.WriteStorageFileInfo(volume, (IStorageFile)item, fileBitmap);
                }

                resultRecord.WritePadding();

                resultRecord.Stream.Position = 0;
                resultRecord.WriteUInt16((byte)resultRecord.Stream.Length);

                byte[] recordData = resultRecord.ToByteArray();
                responseStream.WriteBytes(recordData);
            }

            return(AfpResultCode.FPNoErr);
        }