/*++ Copyright (c) 2000 Microsoft Corporation. All rights reserved. --*/ // EBFTPDataFilter.h : Declaration of the CEBFTPDataFilter #ifndef __EBFTPDATAFILTER_H_ #define __EBFTPDATAFILTER_H_ #include "resource.h" // main symbols #include "EBSessionFilter.h" enum FilterState { WaitForResponse, WaitForCommand } ; const MAX_LINE_LEN = 100; ///////////////////////////////////////////////////////////////////////////// // CEBFTPDataFilter ////////////////////////////////////////////////////////////////////////// // // Class: CEBFTPDataFilter // // This class implements the data-filter for the FTP control channel // (TCP port 21) // ////////////////////////////////////////////////////////////////////////// class ATL_NO_VTABLE CEBFTPDataFilter : public CComObjectRootEx, public IFWXDataFilter, public IFWXIOCompletion { CComPtr m_spExternalSocket; CComPtr m_spInternalSocket; CComPtr m_spCallBackInterface; typedef CComObject SF; CComPtr m_spSessionFilter; CComPtr m_piSession; CComPtr m_PreparedData; FilterState m_FilterState; // Accumulated client cmd CComPtr m_spPartialUserCmdBuf; char *m_PartialUserCmd; unsigned m_PartialUserCmdBytes; // Accumulated server response int m_Code; int m_OriginalCode; int m_Digits; BOOLEAN m_GotResponse; BOOLEAN m_Continuation; char *m_PartialResponse; unsigned m_PartialResponseAllocated; unsigned m_PartialResponseBytes; // Overiding the 226/250 CComPtr m_spResponseOverride; BOOL m_fScanningFile; BOOL m_fSkippedReply; public: ~CEBFTPDataFilter(); CEBFTPDataFilter() { m_PartialResponseAllocated = 0; m_PartialResponse = NULL; m_fScanningFile = FALSE; m_fSkippedReply = FALSE; } HRESULT Initialize(CComObject *pSessionFilter, IFWXFirewall *pCallback, CComPtr pisession, IFWXPreparedData *PreparedData ); void OverrideReply(IFWXIOBuffer *pReplyOverride); BEGIN_COM_MAP(CEBFTPDataFilter) COM_INTERFACE_ENTRY(IFWXDataFilter) END_COM_MAP() private: HRESULT _SetState(FilterState NewState); void _MarkScanningFile() { Lock(); m_fSkippedReply = FALSE; m_fScanningFile = TRUE; Unlock(); } BOOL _ExtendResponseBuffer(); HRESULT _SetPassive(IN_ADDR Address, USHORT Port); HRESULT _SetPort(IN_ADDR Address, USHORT Port); void _CloseSockets(BOOLEAN fAbortive); void _Abort(); void _SendResponse(LPCSTR response, DWORD zise); bool IsUploadFileCommand(void) const; IFWXSocket * _GetExternalSocket() { IFWXSocket *ret; Lock(); ret = m_spExternalSocket; if (ret) ret->AddRef(); Unlock(); return ret; } IFWXSocket * _GetInternalSocket() { IFWXSocket *ret; Lock(); ret = m_spInternalSocket; if (ret) ret->AddRef(); Unlock(); return ret; } // IFWXDataFilter public: STDMETHODIMP SetSockets( IFWXSocket *piInternalSocket, IFWXSocket *piExternalSocket, IFWXConnection *piConnection, IUnknown *punkFilterContext ); STDMETHODIMP Detach(); // IFWXIOCompletion STDMETHODIMP CompleteAsyncIO( BOOL fSuccess, DWORD Win32ErrorCode, IFWXIOBuffer *pIOBuffer, UserContextType UserData, PSOCKADDR From, INT FromLen ); }; #endif //__EBFTPDATAFILTER_H_