コード例 #1
0
        public AfpResultCode Process(IAfpSession session, DsiHeader dsiHeader, AfpStream requestStream, AfpStream responseStream)
        {
            requestStream.ReadUInt8(); // Pad

            short forkId    = requestStream.ReadInt16();
            long  offset    = requestStream.ReadInt64();
            long  readBytes = requestStream.ReadInt64();
            //byte newLineMask = requestStream.ReadUInt8();
            //byte newLineChar = requestStream.ReadUInt8();

            IAfpFork fork = session.GetFork(forkId);

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

            byte[] buffer    = new byte[readBytes];
            int    bytesRead = fork.DataProvider.Read(offset, buffer, 0, (int)readBytes);

            responseStream.WriteBytes(buffer);

            if (bytesRead < readBytes)
            {
                return(AfpResultCode.FPEOFErr);
            }

            return(AfpResultCode.FPNoErr);
        }
コード例 #2
0
        public AfpResultCode Process(IAfpSession session, DsiHeader dsiHeader, AfpStream requestStream, AfpStream responseStream)
        {
            byte  flag     = requestStream.ReadUInt8();
            short forkId   = requestStream.ReadInt16();
            long  offset   = requestStream.ReadInt64();
            long  reqCount = requestStream.ReadInt64();

            IAfpFork fork = session.GetFork(forkId);

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

            byte[] writeData = requestStream.ReadBytes((uint)reqCount);
            long   position  = 0;

            if (flag == 1)
            {
                // End of the fork
                position = (fork.DataProvider.Length - offset);
            }
            else
            {
                position = offset;
            }

            fork.DataProvider.Write(position, writeData, 0, writeData.Length);
            responseStream.WriteUInt64((ulong)(position + writeData.LongLength));

            return(AfpResultCode.FPNoErr);
        }
コード例 #3
0
        public AfpResultCode Process(IAfpSession session, DsiHeader dsiHeader, AfpStream requestStream, AfpStream responseStream)
        {
            requestStream.ReadUInt8();
            short forkId = requestStream.ReadInt16();

            IAfpFork fork = session.GetFork(forkId);

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

            fork.Close();

            return(AfpResultCode.FPNoErr);
        }
コード例 #4
0
        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);
        }