Back to index

lightning-sunbird  0.9+nobinonly
nsJARInputStream.cpp
Go to the documentation of this file.
00001 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
00002 /* nsJARInputStream.cpp
00003  * 
00004  * ***** BEGIN LICENSE BLOCK *****
00005  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
00006  *
00007  * The contents of this file are subject to the Mozilla Public License Version
00008  * 1.1 (the "License"); you may not use this file except in compliance with
00009  * the License. You may obtain a copy of the License at
00010  * http://www.mozilla.org/MPL/
00011  *
00012  * Software distributed under the License is distributed on an "AS IS" basis,
00013  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
00014  * for the specific language governing rights and limitations under the
00015  * License.
00016  *
00017  * The Original Code is Netscape Communicator source code. The Initial Developer of the Original Code is Netscape Communications Corporation.  Portions created by Netscape are Copyright (C) 1999 Netscape Communications Corporation.  All Rights Reserved.
00018  *
00019  * The Initial Developer of the Original Code is
00020  * Netscape Communications Corporation.
00021  * Portions created by the Initial Developer are Copyright (C) 1999
00022  * the Initial Developer. All Rights Reserved.
00023  *
00024  * Contributor(s):
00025  *   Mitch Stoltz <mstoltz@netscape.com>
00026  *
00027  * Alternatively, the contents of this file may be used under the terms of
00028  * either the GNU General Public License Version 2 or later (the "GPL"), or
00029  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
00030  * in which case the provisions of the GPL or the LGPL are applicable instead
00031  * of those above. If you wish to allow use of your version of this file only
00032  * under the terms of either the GPL or the LGPL, and not to allow others to
00033  * use your version of this file under the terms of the MPL, indicate your
00034  * decision by deleting the provisions above and replace them with the notice
00035  * and other provisions required by the GPL or the LGPL. If you do not delete
00036  * the provisions above, a recipient may use your version of this file under
00037  * the terms of any one of the MPL, the GPL or the LGPL.
00038  *
00039  * ***** END LICENSE BLOCK ***** */
00040 
00041 #include "nsJARInputStream.h"
00042 #include "zipfile.h"           // defines ZIP error codes
00043 #include "nsZipArchive.h"
00044 
00045 
00046 /*---------------------------------------------
00047  *  nsISupports implementation
00048  *--------------------------------------------*/
00049 
00050 NS_IMPL_THREADSAFE_ISUPPORTS1(nsJARInputStream, nsIInputStream)
00051 
00052 /*----------------------------------------------------------
00053  * nsJARInputStream implementation
00054  *--------------------------------------------------------*/
00055 
00056 NS_IMETHODIMP 
00057 nsJARInputStream::Available(PRUint32 *_retval)
00058 {
00059     *_retval = mReadInfo.Available();
00060     
00061     return NS_OK;
00062 }
00063 
00064 NS_IMETHODIMP
00065 nsJARInputStream::Read(char* buf, PRUint32 count, PRUint32 *bytesRead)
00066 {
00067     if (!mJAR)
00068         return NS_BASE_STREAM_CLOSED;
00069     
00070     PRInt32 err = mReadInfo.Read(buf, count, bytesRead);
00071     return err == ZIP_OK ? NS_OK : NS_ERROR_FAILURE;
00072 }
00073 
00074 NS_IMETHODIMP
00075 nsJARInputStream::ReadSegments(nsWriteSegmentFun writer, void * closure, PRUint32 count, PRUint32 *_retval)
00076 {
00077     // don't have a buffer to read from, so this better not be called!
00078     NS_NOTREACHED("Consumers should be using Read()!");
00079     return NS_ERROR_NOT_IMPLEMENTED;
00080 }
00081 
00082 NS_IMETHODIMP
00083 nsJARInputStream::IsNonBlocking(PRBool *aNonBlocking)
00084 {
00085     *aNonBlocking = PR_FALSE;
00086     return NS_OK;
00087 }
00088 
00089 NS_IMETHODIMP
00090 nsJARInputStream::Close()
00091 {
00092     NS_IF_RELEASE(mJAR);
00093     return NS_OK;
00094 }
00095 
00096 nsresult 
00097 nsJARInputStream::Init(nsJAR* aJAR, const char* aFilename)
00098 {
00099   if (!aFilename)
00100     return NS_ERROR_NULL_POINTER;
00101   mJAR = aJAR;
00102   NS_ADDREF(mJAR);
00103 
00104   PRInt32 result;
00105   PRFileDesc* fd = aJAR->OpenFile();
00106   NS_ASSERTION(fd, "Couldn't open JAR!");
00107 
00108   if (!fd)
00109       return NS_ERROR_UNEXPECTED;
00110   
00111   result = aJAR->mZip.ReadInit(aFilename, &mReadInfo, fd);
00112   if (result != ZIP_OK)
00113     return NS_ERROR_FAILURE;
00114   return NS_OK;
00115 }
00116 
00117 //----------------------------------------------
00118 // nsJARInputStream constructor and destructor
00119 //----------------------------------------------
00120 
00121 nsJARInputStream::nsJARInputStream()
00122     : mJAR(nsnull)
00123 {
00124 }
00125 
00126 nsJARInputStream::~nsJARInputStream()
00127 {
00128   Close();
00129 }
00130