Beispiel #1
0
        public void SendRequest(DsiCommand command, byte[] payload, AfpTransportReplyHandler replyHandler = null)
        {
            DsiHeader header = new DsiHeader()
            {
                command   = command,
                flags     = DsiFlags.Request,
                requestId = this.NextRequestId(),
                errorCodeOrWriteOffset = 0,
                totalDataLength        = (uint)payload.Length
            };

            AfpStream stream = new AfpStream();

            header.Write(stream);
            stream.WriteBytes(payload);

            if (replyHandler != null)
            {
                _replyHandlers[header.requestId] = replyHandler;
            }

            byte[] result = stream.ToByteArray();

            this.SendBuffer(result);
        }
Beispiel #2
0
 public void Write(AfpStream stream)
 {
     stream.WriteEnum(flags);
     stream.WriteEnum(command);
     stream.WriteUInt16(requestId);
     stream.WriteUInt32(errorCodeOrWriteOffset);
     stream.WriteUInt32(totalDataLength);
     stream.WriteUInt32(reserved);
 }
Beispiel #3
0
        public DsiHeader WriteReply(AfpResultCode resultCode, byte[] resultPayload, AfpStream writeToStream)
        {
            DsiHeader replyHeader = this.CreateReply(resultCode, (uint)resultPayload.Length);

            replyHeader.Write(writeToStream);
            writeToStream.WriteBytes(resultPayload);

            return(replyHeader);
        }
Beispiel #4
0
        public void SendReply(DsiHeader header, AfpResultCode resultCode, byte[] payload)
        {
            AfpStream finalStream = new AfpStream();

            DsiHeader replyHeader = header.WriteReply(resultCode, payload, finalStream);

            this.OnCommandSent(replyHeader, payload);

            byte[] result = finalStream.ToByteArray();

            this.SendBuffer(result);
        }
Beispiel #5
0
        public static DsiHeader Read(AfpStream stream)
        {
            DsiHeader header = new DsiHeader();

            header.flags   = stream.ReadEnum <DsiFlags>();
            header.command = stream.ReadEnum <DsiCommand>();
            if (header.command == DsiCommand.Invalid)
            {
                return(header);
            }

            header.requestId = stream.ReadUInt16();
            header.errorCodeOrWriteOffset = stream.ReadUInt32();
            header.totalDataLength        = stream.ReadUInt32();
            header.reserved = stream.ReadUInt32();

            return(header);
        }
        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;
            }

            AfpPathType newNameType = requestStream.ReadEnum <AfpPathType>();
            string      newName     = null;

            switch (newNameType)
            {
            case AfpPathType.kFPLongName:
            case AfpPathType.kFPShortName:
                newName = requestStream.ReadPascalString();
                break;

            case AfpPathType.kFPUTF8Name:
                newName = 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 renameItem = container.Content(pathName);

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

            renameItem.Rename(newName);

            return(AfpResultCode.FPNoErr);
        }