def runExternalFilter(self, inputStream, outputStream):
		if self.__use_stdin:
			inFile = None
		else:
			inFile = self.newTempFile("%s.in" % self.__class__.__name__)
			Pump.stream2file(inputStream, inFile)

		if self.__use_stdout:
			outFile = None
		else:
			outFile = self.newTempFile("%s.out" % self.__class__.__name__)

		cmd = self.getCommandLine(inFile, outFile)

		try:
			assert trace("Starting %s: %s" % (self.__name, cmd))
			xfilter = Process(cmd, separate_stderr=self.__separate_stderr)
			if self.__use_stdin:
				assert trace("Writing file to %s stdin" % self.__name)
				Pump.stream2stream(inputStream, xfilter.getInputStream())
			
			if self.__use_stdout:
				# output 
				assert trace("Pumping %s stdout to outputStream" % self.__name)
				Pump.stream2stream(xfilter.getOutputStream(), outputStream)

				if self.__separate_stderr:
					assert trace("Handling %s stderr" % self.__name)
					self.handleErrorOutput(xfilter.getErrorStream())
			else:
				assert trace("Handling %s stdout" % self.__name)
				self.handleOutput(xfilter.getOutputStream())

				if self.__separate_stderr:
					assert trace("Handling %s stderr" % self.__name)
					self.handleErrorOutput(xfilter.getErrorStream())

			rc = xfilter.waitFor()
			assert trace("%s finished with exit code: 0x%X" % (self.__name, rc))
			if not (rc in self.__normalReturnCodes):
				raise ExternalFilterException, "Return code 0x%X" % (rc,)

			if not self.__use_stdout:
				if os.path.exists(outFile):
					try:
						if os.path.getsize(outFile) > 0:
							Pump.file2stream(outFile, outputStream, "b")
						else:
							raise ExternalFilterException, "Output file is empty: %s" % (outFile,)
					finally:
						self.removeTempFile(outFile)
				else:
					raise ExternalFilterException, "Output file not found: %s" % (outFile,)

		finally:
			if inFile is not None:
				self.removeTempFile(inFile)
				pass

		return rc