Back to index

enigmail  1.4.3
nsPipeFilterListener.h
Go to the documentation of this file.
00001 /* ***** BEGIN LICENSE BLOCK *****
00002  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
00003  *
00004  * The contents of this file are subject to the Mozilla Public
00005  * License Version 1.1 (the "MPL"); you may not use this file
00006  * except in compliance with the MPL. You may obtain a copy of
00007  * the MPL at http://www.mozilla.org/MPL/
00008  *
00009  * Software distributed under the MPL is distributed on an "AS
00010  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
00011  * implied. See the MPL for the specific language governing
00012  * rights and limitations under the MPL.
00013  *
00014  * The Original Code is protoZilla.
00015  *
00016  * The Initial Developer of the Original Code is Ramalingam Saravanan.
00017  * Portions created by Ramalingam Saravanan <sarava@sarava.net> are
00018  * Copyright (C) 2000 Ramalingam Saravanan. All Rights Reserved.
00019  *
00020  * Contributor(s):
00021  * Patrick Brunschwig <patrick@mozilla-enigmail.org>
00022  *
00023  * Alternatively, the contents of this file may be used under the terms of
00024  * either the GNU General Public License Version 2 or later (the "GPL"), or
00025  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
00026  * in which case the provisions of the GPL or the LGPL are applicable instead
00027  * of those above. If you wish to allow use of your version of this file only
00028  * under the terms of either the GPL or the LGPL, and not to allow others to
00029  * use your version of this file under the terms of the MPL, indicate your
00030  * decision by deleting the provisions above and replace them with the notice
00031  * and other provisions required by the GPL or the LGPL. If you do not delete
00032  * the provisions above, a recipient may use your version of this file under
00033  * the terms of any one of the MPL, the GPL or the LGPL.
00034  * ***** END LICENSE BLOCK ***** */
00035 
00036 #ifndef nsPipeFilterListener_h__
00037 #define nsPipeFilterListener_h__
00038 
00039 #include "nspr.h"
00040 
00041 #include "enigmail.h"
00042 #include "nsIPipeFilterListener.h"
00043 #include "nsCOMPtr.h"
00044 
00045 #include "nsStringGlue.h"
00046 #include "nsIInputStream.h"
00047 
00048 typedef struct LineMatchStatus LineMatchStatus;
00049 struct LineMatchStatus {
00050   PRUint32 skipCount;
00051   EMBool matchedLine;
00052   EMBool matchedCR;
00053   PRUint32 matchOffset;
00054   PRUint32 matchCount;
00055 };
00056 
00057 // Implementation class for nsIPipeFilterListener
00058 class nsPipeFilterListener : public nsIPipeFilterListener,
00059                              public nsIInputStream
00060 {
00061 public:
00062     NS_DECL_ISUPPORTS
00063     NS_DECL_NSIREQUESTOBSERVER
00064     NS_DECL_NSISTREAMLISTENER
00065     NS_DECL_NSIPIPEFILTERLISTENER
00066     NS_DECL_NSIINPUTSTREAM
00067 
00068     nsPipeFilterListener();
00069     virtual ~nsPipeFilterListener();
00070 
00071     // Define a Create method to be used with a factory:
00072     static NS_METHOD
00073     Create(nsISupports *aOuter, REFNSIID aIID, void **aResult);
00074 
00075 protected:
00076     NS_METHOD TransmitData(const char* buf, PRUint32 count,
00077                            nsIStreamListener* listener,
00078                            nsIRequest* aRequest, nsISupports* aContext);
00079 
00080     NS_METHOD EndRequest(nsIRequest* aRequest, nsISupports* aContext);
00081 
00082     PRInt32  MatchDelimiter(const char* buf, PRUint32 bufLen,
00083                             LineMatchStatus& delim,
00084                             nsCString& delimStr,
00085                             nsCString& delimLine);
00086 
00087     PRUint32 MatchString(const char* buf, PRUint32 count,
00088                          const char* str, PRUint32 length,
00089                          PRUint32& strOffset);
00090 
00091     nsresult HeaderSearch(const char* buf, PRUint32 count,
00092                           PRUint32 *headerOffset);
00093 
00094     nsresult ParseMimeHeaders(const char* mimeHeaders, PRUint32 count,
00095                               PRInt32 *retval);
00096 
00097     nsresult ParseHeader(const char* header, PRUint32 count);
00098 
00099     static const char* const LineBreaks[3];
00100 
00101     EMBool                              mInitialized;
00102     EMBool                              mRequestStarted;
00103     EMBool                              mRequestEnded;
00104     EMBool                              mTailRequestStarted;
00105 
00106     nsCString                           mStartDelimiter;
00107     nsCString                           mEndDelimiter;
00108 
00109     nsCString                           mStartLine;
00110     nsCString                           mEndLine;
00111 
00112     LineMatchStatus                     mStart;
00113     LineMatchStatus                     mEnd;
00114 
00115     EMBool                              mKeepDelimiters;
00116     EMBool                              mMimeMultipart;
00117 
00118     EMBool                              mAutoMimeBoundary;
00119     EMBool                              mFirstMatch;
00120     EMBool                              mLastMatch;
00121     EMBool                              mSavePartMatch;
00122 
00123     nsCString                           mOldPartMatch;
00124     nsCString                           mPartMatch;
00125     PRUint32                            mLinebreak;
00126 
00127     const char*                         mStreamBuf;
00128     PRUint32                            mStreamOffset;
00129     PRUint32                            mStreamLength;
00130 
00131     // Owning refs
00132     nsCOMPtr<nsIStreamListener>         mListener;
00133     nsCOMPtr<nsIStreamListener>         mTailListener;
00134     nsCOMPtr<nsISupports>               mContext;
00135 };
00136 
00137 #endif // nsPipeFilterListener_h__