// -------------------------------------------------------------------------------- // Ixpnntp.h // Copyright (c)1993-1996 Microsoft Corporation, All Rights Reserved // // Eric Andrews // Steve Serdy // -------------------------------------------------------------------------------- #ifndef __IXPNNTP_H__ #define __IXPNNTP_H__ #include "imnxport.h" #include "ixpbase.h" #include "asynconn.h" #include "sicily.h" #define MAX_SEC_PKGS 32 // most sec pkgs we will try // -------------------------------------------------------------------------------- // Sub states that aren't exposed to the user // -------------------------------------------------------------------------------- typedef enum { // These are generic substates that a lot of commands use to differenitate // between the response ("200 article follows") and the data (the actual // article text). NS_RESP, NS_DATA, // These substates are specific to handling posting NS_SEND_ENDPOST, NS_ENDPOST_RESP, // These substates are specific to connecting or authorizing NS_CONNECT_RESP, // awaiting the banner that is sent after a connection is made NS_MODE_READER_RESP, // awaiting MODE READER response NS_GENERIC_TEST, // awaiting AUTHINFO GENERIC response NS_GENERIC_PKG_DATA, // awaiting AUTHINFO_GENERIC data NS_TRANSACT_TEST, // awaiting AUTHINFO TRANSACT TEST response NS_TRANSACT_PACKAGE, // awaiting AUTHINFO TRANSACT response NS_TRANSACT_NEGO, // awaiting AUTHINFO TRANSACT response NS_TRANSACT_RESP, // awaiting AUTHINFO TRANSACT response NS_AUTHINFO_USER_RESP, // awaiting AUTHINFO USER XXXX response NS_AUTHINFO_PASS_RESP, // awaiting AUTHINFO PASS XXXX response NS_AUTHINFO_SIMPLE_RESP, // awaiting AUTHINFO SIMPLE response NS_AUTHINFO_SIMPLE_USERPASS_RESP, NS_RECONNECTING // in the process of doing an internal reconnect } NNTPSUBSTATE; typedef enum { AUTHINFO_NONE = 0, AUTHINFO_GENERIC, AUTHINFO_TRANSACT, } AUTH_TYPE; typedef enum { GETHDR_XOVER, GETHDR_XHDR } GETHDR_TYPE; enum { HDR_SUBJECT = 0, HDR_FROM, HDR_DATE, HDR_MSGID, HDR_REFERENCES, HDR_LINES, HDR_XREF, HDR_MAX }; typedef struct tagMEMORYINFO { DWORD cPointers; LPVOID rgPointers[1]; } MEMORYINFO, *PMEMORYINFO; class CNNTPTransport : public INNTPTransport2, public CIxpBase { public: // ---------------------------------------------------------------------------- // Contstruction // ---------------------------------------------------------------------------- CNNTPTransport(void); ~CNNTPTransport(void); // ---------------------------------------------------------------------------- // IUnknown methods // ---------------------------------------------------------------------------- STDMETHODIMP QueryInterface(REFIID, LPVOID *); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); // ---------------------------------------------------------------------------- // IAsyncConnCB methods // ---------------------------------------------------------------------------- void OnNotify(ASYNCSTATE asOld, ASYNCSTATE asNew, ASYNCEVENT ae); // ---------------------------------------------------------------------------- // IInternetTransport methods // ---------------------------------------------------------------------------- STDMETHODIMP InitNew(LPSTR pszLogFilePath, INNTPCallback *pCallback); STDMETHODIMP InetServerFromAccount(IImnAccount *pAccount, LPINETSERVER pInetServer); STDMETHODIMP Connect(LPINETSERVER pInetServer, boolean fAuthenticate, boolean fCommandLogging); STDMETHODIMP DropConnection(void); STDMETHODIMP Disconnect(void); STDMETHODIMP Stop(void); STDMETHODIMP IsState(IXPISSTATE isstate); STDMETHODIMP GetServerInfo(LPINETSERVER pInetServer); STDMETHODIMP_(IXPTYPE) GetIXPType(void); STDMETHODIMP HandsOffCallback(void); STDMETHODIMP GetStatus(IXPSTATUS *pCurrentStatus); // ---------------------------------------------------------------------------- // INNTPTransport2 methods // ---------------------------------------------------------------------------- STDMETHODIMP SetWindow(void); STDMETHODIMP ResetWindow(void); // ---------------------------------------------------------------------------- // CIxpBase methods // ---------------------------------------------------------------------------- virtual void ResetBase(void); virtual void DoQuit(void); virtual void OnConnected(void); virtual void OnDisconnected(void); virtual void OnEnterBusy(void); virtual void OnLeaveBusy(void); // ---------------------------------------------------------------------------- // INNTPTransport methods // ---------------------------------------------------------------------------- STDMETHODIMP CommandAUTHINFO(LPNNTPAUTHINFO pAuthInfo); STDMETHODIMP CommandGROUP(LPSTR pszGroup); STDMETHODIMP CommandLAST(void); STDMETHODIMP CommandNEXT(void); STDMETHODIMP CommandSTAT(LPARTICLEID pArticleId); STDMETHODIMP CommandARTICLE(LPARTICLEID pArticleId); STDMETHODIMP CommandHEAD(LPARTICLEID pArticleId); STDMETHODIMP CommandBODY(LPARTICLEID pArticleId); STDMETHODIMP CommandPOST(LPNNTPMESSAGE pMessage); STDMETHODIMP CommandLIST(LPSTR pszArgs); STDMETHODIMP CommandLISTGROUP(LPSTR pszGroup); STDMETHODIMP CommandNEWGROUPS(SYSTEMTIME *pstLast, LPSTR pszDist); STDMETHODIMP CommandDATE(void); STDMETHODIMP CommandMODE(LPSTR pszMode); STDMETHODIMP CommandXHDR(LPSTR pszHeader, LPRANGE pRange, LPSTR pszMessageId); STDMETHODIMP CommandQUIT(void); STDMETHODIMP GetHeaders(LPRANGE pRange); STDMETHODIMP ReleaseResponse(LPNNTPRESPONSE pResp); private: // ---------------------------------------------------------------------------- // Private Member functions // ---------------------------------------------------------------------------- void OnSocketReceive(void); void DispatchResponse(HRESULT hrResult, BOOL fDone=TRUE, LPNNTPRESPONSE pResponse=NULL); HRESULT HrGetResponse(void); void StartLogon(void); HRESULT LogonRetry(HRESULT hrLogon); HRESULT TryNextSecPkg(void); HRESULT MaybeTryAuthinfo(void); HRESULT HandleConnectResponse(void); HRESULT ProcessGenericTestResponse(void); HRESULT ProcessTransactTestResponse(void); HRESULT ProcessGroupResponse(void); HRESULT ProcessNextResponse(void); HRESULT ProcessListData(void); HRESULT ProcessListGroupData(void); HRESULT ProcessDateResponse(void); HRESULT ProcessArticleData(void); HRESULT ProcessXoverData(void); HRESULT ProcessXhdrData(void); HRESULT BuildHeadersFromXhdr(BOOL fFirst); LPSTR GetNextField(LPSTR pszField); HRESULT SendNextXhdrCommand(void); HRESULT ProcessNextXhdrResponse(BOOL* pfDone); HRESULT HrPostMessage(void); // ---------------------------------------------------------------------------- // Private member variables // ---------------------------------------------------------------------------- // Various state variables NNTPSTATE m_state; NNTPSUBSTATE m_substate; GETHDR_TYPE m_gethdr; DWORD m_hdrtype; // Sicily information SSPICONTEXT m_sicinfo; SSPIBUFFER m_sicmsg; int m_cSecPkg; // number of sec pkgs to try, -1 if not inited int m_iSecPkg; // current sec pkg being tried AUTH_TYPE m_iAuthType; LPSTR m_rgszSecPkg[MAX_SEC_PKGS]; // pointers into m_szSecPkgs LPSTR m_szSecPkgs; // string returned by "AUTHINFO TRANSACT TEST" BOOL m_fRetryPkg; // From the GetHeaders() command in case the XOVER request fails RANGE m_rRange; RANGE m_rRangeCur; LPNNTPHEADER m_rgHeaders; DWORD m_iHeader; DWORD m_cHeaders; PMEMORYINFO m_pMemInfo; // Posting NNTPMESSAGE m_rMessage; // Flags BOOL m_fSupportsXRef; // TRUE if this server's XOver records contain the XRef: field BOOL m_fNoXover; // TRUE if the server does not support XOVER // Connection info HRESULT m_hrPostingAllowed; // Authentication LPNNTPAUTHINFO m_pAuthInfo; }; #endif // __IXPNNTP_H__