Ejemplo n.º 1
0
 private void closeOnError(object socObj, string errMsg)
 {
     transferStatus = FTPStatus.NONE;
     closedOnError  = true;
     closeFTPConnection(socObj);
     throw new Exception(errMsg);
 }
Ejemplo n.º 2
0
 void Initialize()
 {
     transferStatus = FTPStatus.NONE;
     rcvSize        = 0;
     fileName       = "";
     fileSize       = 0;
 }
Ejemplo n.º 3
0
        public override void ProcessMsg(object socObj)
        {
            base.ProcessMsg(socObj);
            StateObject stateObj = (StateObject)socObj;

            switch (transferStatus)
            {
            case FTPStatus.NONE:
                //파일수신정보
                if (stateObj.Cmd == MsgDef.MSG_SEND_FILE)
                {
                    this.fileName = stateObj.FileName;
                    this.fileSize = stateObj.FileSize;
                    validFullPath = Utils.getValidFileName(filePath, fileName, 0);
                    tempFullPath  = validFullPath + SocConst.TEMP_FILE_SUFFIX;

                    //수신대기상태
                    stateObj.data = MsgDef.MSG_ACK;

                    //파일수신상태로 변경
                    transferStatus = FTPStatus.RECEIVE_STREAM;
                    this.SetBinary();

                    stateObj.status     = SocHandlerStatus.RECEIVING;
                    stateObj.ftpStatus  = FTPStatus.RECEIVED_FILE_INFO;
                    stateObj.socMessage = string.Format("파일수신정보[{0}/{1}]==>[{2}]",
                                                        stateObj.FileName, stateObj.FileSize, validFullPath);

                    Logger.info(stateObj);
                    OnSocStatusChangedOnInfo(new SocStatusEventArgs(stateObj));

                    fs = File.Open(tempFullPath, FileMode.Create, FileAccess.Write);
                    //수신대기 알림
                    if (SendMsg(stateObj) == SocCode.SOC_ERR_CODE)
                    {
                        closeOnError(stateObj, string.Format("파일수신 대기메시지 전송에러:FTPStatus.NONE/Msg[{0}]", stateObj.data));
                    }
                }
                else
                {
                    closeOnError(stateObj, string.Format("Unknown Msg[{0}]:FTPStatus.NONE", stateObj.data));
                }
                break;

            //파일 수신
            case FTPStatus.RECEIVE_STREAM:
                //파일 전송 취소인경우
                if (stateObj.Cmd == MsgDef.MSG_CANCEL)
                {
                    //수신종료
                    stateObj.data = MsgDef.MSG_BYE;
                    if (SendMsg(stateObj) == SocCode.SOC_ERR_CODE)
                    {
                        closeOnError(stateObj, string.Format("파일수신종료메시지 전송에러:FTPStatus.RECEIVE_STREAM/Msg[{0}]", stateObj.data));
                    }
                    //종료로 상태변경
                    transferStatus      = FTPStatus.SENT_BYE;
                    stateObj.ftpStatus  = FTPStatus.SENT_DONE;
                    stateObj.status     = SocHandlerStatus.DISCONNECTED;
                    stateObj.socMessage = string.Format("파일수신종료/Msg[{0}]", MsgDef.MSG_BYE);
                    Logger.info(stateObj);
                    OnSocStatusChangedOnInfo(new SocStatusEventArgs(stateObj));
                    closeFTPConnection(stateObj);
                    break;
                }
                //수신파일스트림 Write
                fs.Write(stateObj.buffer, 0, stateObj.bufferSize);
                rcvSize += stateObj.bufferSize;

                stateObj.socMessage = string.Format("수신중인 바이트:rcvSize[{0}]/fileSize[{1}]", rcvSize, fileSize);
                Logger.debug(stateObj);
                //수신완료
                if (rcvSize >= fileSize)
                {
                    fs.Close();
                    File.Move(tempFullPath, validFullPath);
                    stateObj.socMessage = string.Format("수신완료한 바이트 rcvSize[{0}]/fileSize[{1}]", rcvSize, fileSize);
                    transferStatus      = FTPStatus.SENT_DONE;
                    this.SetText();
                }

                stateObj.data         = string.Format(MsgDef.MSG_RCVCHECK_FMT, MsgDef.MSG_RCVCHECK, stateObj.bufferSize);
                stateObj.ftpStatus    = FTPStatus.RECEIVE_STREAM;
                stateObj.fileSizeDone = rcvSize;
                OnSocStatusChangedOnDebug(new SocStatusEventArgs(stateObj));

                stateObj.socMessage = string.Format("수신바이트 확인전송:Msg[{0}]", stateObj.data);
                Logger.debug(stateObj);

                if (SendMsg(stateObj) == SocCode.SOC_ERR_CODE)
                {
                    closeOnError(stateObj, string.Format("수신바이트 확인전송에러:FTPStatus.RECEIVE_STREAM/Msg[{0}]", stateObj.data));
                }

                break;

            //수신취소
            case FTPStatus.RECEIVE_CANCELED:
                //취소전송
                stateObj.data = MsgDef.MSG_CANCEL;
                if (SendMsg(stateObj) == SocCode.SOC_ERR_CODE)
                {
                    closeOnError(stateObj, string.Format("파일수신취소메시지 전송에러:FTPStatus.RECEIVE_CANCELED/Msg[{0}]", stateObj.data));
                }
                //완료로 상태변경
                transferStatus      = FTPStatus.SENT_DONE;
                stateObj.ftpStatus  = FTPStatus.SENT_DONE;
                stateObj.socMessage = string.Format("파일수신취소/Msg[{0}]", stateObj.data);
                Logger.info(stateObj);
                OnSocStatusChangedOnInfo(new SocStatusEventArgs(stateObj));
                break;

            //수신완료
            case FTPStatus.SENT_DONE:
                if (stateObj.Cmd == MsgDef.MSG_COMPLETE)
                {
                    //수신종료
                    stateObj.data = MsgDef.MSG_BYE;

                    if (SendMsg(stateObj) == SocCode.SOC_ERR_CODE)
                    {
                        closeOnError(stateObj, string.Format("파일수신종료메시지 전송에러:FTPStatus.SENT_DONE/Msg[{0}]", stateObj.data));
                    }
                    transferStatus      = FTPStatus.SENT_BYE;
                    stateObj.ftpStatus  = FTPStatus.SENT_DONE;
                    stateObj.status     = SocHandlerStatus.DISCONNECTED;
                    stateObj.socMessage = string.Format("파일수신종료:{0}", MsgDef.MSG_BYE);
                    Logger.info(stateObj);
                    OnSocStatusChangedOnInfo(new SocStatusEventArgs(stateObj));
                    closeFTPConnection(stateObj);
                }
                else
                {
                    closeOnError(stateObj, string.Format("Unknown Msg[{0}]:FTPStatus.SENT_DONE", stateObj.data));
                }
                break;
            }
            stateObj.socMessage = string.Format("Ftp ProcessMsg End");
            if (fileReceivingCanceled)
            {
                transferStatus        = FTPStatus.RECEIVE_CANCELED;
                fileReceivingCanceled = false;
            }
            Logger.debug(stateObj);
        }
Ejemplo n.º 4
0
 void Initialize()
 {
     transferStatus = FTPStatus.NONE;
     rcvSize = 0;
     fileName = "";
     fileSize = 0;
 }
Ejemplo n.º 5
0
 private void closeOnError(object socObj, string errMsg)
 {
     transferStatus = FTPStatus.NONE;
     closedOnError = true;
     closeFTPConnection(socObj);
     throw new Exception(errMsg);
 }
Ejemplo n.º 6
0
        public override void ProcessMsg(object socObj)
        {
            base.ProcessMsg(socObj);
            StateObject stateObj = (StateObject)socObj;

            switch (transferStatus)
            {
                case FTPStatus.NONE:
                    //파일수신정보
                    if (stateObj.Cmd == MsgDef.MSG_SEND_FILE)
                    {
                        this.fileName = stateObj.FileName;
                        this.fileSize = stateObj.FileSize;
                        validFullPath = Utils.getValidFileName(filePath, fileName, 0);
                        tempFullPath = validFullPath + SocConst.TEMP_FILE_SUFFIX;

                        //수신대기상태
                        stateObj.data = MsgDef.MSG_ACK;

                        //파일수신상태로 변경
                        transferStatus = FTPStatus.RECEIVE_STREAM;
                        this.SetBinary();

                        stateObj.status = SocHandlerStatus.RECEIVING;
                        stateObj.ftpStatus = FTPStatus.RECEIVED_FILE_INFO;
                        stateObj.socMessage = string.Format("파일수신정보[{0}/{1}]==>[{2}]",
                            stateObj.FileName, stateObj.FileSize, validFullPath);

                        Logger.info(stateObj);
                        OnSocStatusChangedOnInfo(new SocStatusEventArgs(stateObj));

                        fs = File.Open(tempFullPath, FileMode.Create, FileAccess.Write);
                        //수신대기 알림
                        if (SendMsg(stateObj) == SocCode.SOC_ERR_CODE)
                        {
                            closeOnError(stateObj, string.Format("파일수신 대기메시지 전송에러:FTPStatus.NONE/Msg[{0}]", stateObj.data));
                        }
                    }
                    else
                    {
                        closeOnError(stateObj, string.Format("Unknown Msg[{0}]:FTPStatus.NONE", stateObj.data));
                    }
                    break;

                //파일 수신
                case FTPStatus.RECEIVE_STREAM:
                    //파일 전송 취소인경우
                    if (stateObj.Cmd == MsgDef.MSG_CANCEL)
                    {
                        //수신종료
                        stateObj.data = MsgDef.MSG_BYE;
                        if (SendMsg(stateObj) == SocCode.SOC_ERR_CODE)
                        {
                            closeOnError(stateObj, string.Format("파일수신종료메시지 전송에러:FTPStatus.RECEIVE_STREAM/Msg[{0}]", stateObj.data));
                        }
                        //종료로 상태변경
                        transferStatus = FTPStatus.SENT_BYE;
                        stateObj.ftpStatus = FTPStatus.SENT_DONE;
                        stateObj.status = SocHandlerStatus.DISCONNECTED;
                        stateObj.socMessage = string.Format("파일수신종료/Msg[{0}]", MsgDef.MSG_BYE);
                        Logger.info(stateObj);
                        OnSocStatusChangedOnInfo(new SocStatusEventArgs(stateObj));
                        closeFTPConnection(stateObj);
                        break;
                    }
                    //수신파일스트림 Write
                    fs.Write(stateObj.buffer, 0, stateObj.bufferSize);
                    rcvSize += stateObj.bufferSize;

                    stateObj.socMessage = string.Format("수신중인 바이트:rcvSize[{0}]/fileSize[{1}]", rcvSize, fileSize);
                    Logger.debug(stateObj);
                    //수신완료
                    if (rcvSize >= fileSize)
                    {
                        fs.Close();
                        File.Move(tempFullPath, validFullPath);
                        stateObj.socMessage = string.Format("수신완료한 바이트 rcvSize[{0}]/fileSize[{1}]", rcvSize, fileSize);
                        transferStatus = FTPStatus.SENT_DONE;
                        this.SetText();
                    }

                    stateObj.data = string.Format(MsgDef.MSG_RCVCHECK_FMT, MsgDef.MSG_RCVCHECK, stateObj.bufferSize);
                    stateObj.ftpStatus = FTPStatus.RECEIVE_STREAM;
                    stateObj.fileSizeDone = rcvSize;
                    OnSocStatusChangedOnDebug(new SocStatusEventArgs(stateObj));

                    stateObj.socMessage = string.Format("수신바이트 확인전송:Msg[{0}]", stateObj.data);
                    Logger.debug(stateObj);

                    if (SendMsg(stateObj) == SocCode.SOC_ERR_CODE)
                    {
                        closeOnError(stateObj, string.Format("수신바이트 확인전송에러:FTPStatus.RECEIVE_STREAM/Msg[{0}]", stateObj.data));
                    }

                    break;
                //수신취소
                case FTPStatus.RECEIVE_CANCELED:
                    //취소전송
                    stateObj.data = MsgDef.MSG_CANCEL;
                    if (SendMsg(stateObj) == SocCode.SOC_ERR_CODE)
                    {
                        closeOnError(stateObj, string.Format("파일수신취소메시지 전송에러:FTPStatus.RECEIVE_CANCELED/Msg[{0}]", stateObj.data));
                    }
                    //완료로 상태변경
                    transferStatus = FTPStatus.SENT_DONE;
                    stateObj.ftpStatus = FTPStatus.SENT_DONE;
                    stateObj.socMessage = string.Format("파일수신취소/Msg[{0}]", stateObj.data);
                    Logger.info(stateObj);
                    OnSocStatusChangedOnInfo(new SocStatusEventArgs(stateObj));
                    break;
                //수신완료
                case FTPStatus.SENT_DONE:
                    if (stateObj.Cmd == MsgDef.MSG_COMPLETE)
                    {
                        //수신종료
                        stateObj.data = MsgDef.MSG_BYE;

                        if (SendMsg(stateObj) == SocCode.SOC_ERR_CODE)
                        {
                            closeOnError(stateObj, string.Format("파일수신종료메시지 전송에러:FTPStatus.SENT_DONE/Msg[{0}]", stateObj.data));

                        }
                        transferStatus = FTPStatus.SENT_BYE;
                        stateObj.ftpStatus = FTPStatus.SENT_DONE;
                        stateObj.status = SocHandlerStatus.DISCONNECTED;
                        stateObj.socMessage = string.Format("파일수신종료:{0}", MsgDef.MSG_BYE);
                        Logger.info(stateObj);
                        OnSocStatusChangedOnInfo(new SocStatusEventArgs(stateObj));
                        closeFTPConnection(stateObj);
                    }
                    else
                    {
                        closeOnError(stateObj, string.Format("Unknown Msg[{0}]:FTPStatus.SENT_DONE", stateObj.data));
                    }
                    break;
            }
            stateObj.socMessage = string.Format("Ftp ProcessMsg End");
            if (fileReceivingCanceled)
            {
                transferStatus = FTPStatus.RECEIVE_CANCELED;
                fileReceivingCanceled = false;
            }
            Logger.debug(stateObj);
        }