Beispiel #1
0
shared_ptr<ZLInputStream> ZLFile::inputStream() const {
	shared_ptr<ZLInputStream> stream;
	
	int index = ZLFSManager::Instance().findArchiveFileNameDelimiter(myPath);
	if (index == -1) {
		if (isDirectory()) {
			return 0;
		}
		stream = ZLFSManager::Instance().createPlainInputStream(myPath);
		stream = envelopeCompressedStream(stream);
	} else {
		const std::string baseName = myPath.substr(0, index);
		const ZLFile baseFile(baseName);
		shared_ptr<ZLInputStream> base = baseFile.inputStream();
		if (!base.isNull()) {
			if (baseFile.myArchiveType & ZIP) {
				stream = new ZLZipInputStream(base, baseName, myPath.substr(index + 1));
			} /*else if (baseFile.myArchiveType & TAR) {
				stream = new ZLTarInputStream(base, myPath.substr(index + 1));
			}*/
		}
		stream = envelopeCompressedStream(stream);
	}

	return stream;
}
Beispiel #2
0
shared_ptr<ZLInputStream> ZLFile::inputStream() const {
	shared_ptr<ZLInputStream> stream;

	int index = ZLFSManager::Instance().findArchiveFileNameDelimiter(myPath);
	if (index == -1) {
		stream = ourPlainStreamCache[myPath];
		if (stream.isNull()) {
			if (isDirectory()) {
				return 0;
			}
			stream = ZLFSManager::Instance().createPlainInputStream(myPath);
			stream = envelopeCompressedStream(stream);
			ourPlainStreamCache[myPath] = stream;
		}
	} else {
		const std::string baseName = myPath.substr(0, index);
		const ZLFile baseFile(baseName);
		shared_ptr<ZLInputStream> base = baseFile.inputStream();
		if (!base.isNull()) {
			stream = ZLFSManager::Instance().Plugins().archiveInputStream(baseFile, base, myPath.substr(index + 1));
		}
		stream = envelopeCompressedStream(stream);
	}

	return stream;
}
Beispiel #3
0
shared_ptr<ZLInputStream> ZLFile::inputStream() const {
	shared_ptr<ZLInputStream> stream;
	
	int index = ZLFSManager::Instance().findArchiveFileNameDelimiter(myPath);
	if (index == -1) {
#if FBREADER_THREAD_LOCAL_ZLFILE_PLAIN_STREAM_CACHE
		ZLFilePlainStreamCache *cache = (ZLFilePlainStreamCache*)pthread_getspecific(plainStreamCacheKey);
		if (!cache) {
			cache = new ZLFilePlainStreamCache;
			pthread_setspecific(plainStreamCacheKey, cache);
		}
		ZLFilePlainStreamCache &ourPlainStreamCache = *cache;
#endif
		stream = ourPlainStreamCache[myPath];
		if (stream.isNull()) {
			if (isDirectory()) {
				return 0;
			}
			stream = ZLFSManager::Instance().createPlainInputStream(myPath);
			stream = envelopeCompressedStream(stream);
			ourPlainStreamCache[myPath] = stream;
		}
    } else {
		ZLFile baseFile(myPath.substr(0, index));
		shared_ptr<ZLInputStream> base = baseFile.inputStream();
		if (!base.isNull()) {
			if (baseFile.myArchiveType & ZIP) {
				stream = new ZLZipInputStream(base, myPath.substr(index + 1));
			} else if (baseFile.myArchiveType & TAR) {
				stream = new ZLTarInputStream(base, myPath.substr(index + 1));
			}
		}
		stream = envelopeCompressedStream(stream);
	}

	return stream;
}
Beispiel #4
0
shared_ptr<ZLInputStream> ZLFile::inputStream() const {
	shared_ptr<ZLInputStream> stream;

	int index = ZLFSManager::instance().findArchiveFileNameDelimiter(myPath);
	if (index == -1) {
          stream = ourPlainStreamCache[myPath].lock();
		if (!stream) {
			if (isDirectory()) {
                          return shared_ptr<ZLInputStream>();
			}
			stream.reset(ZLFSManager::instance().createPlainInputStream(myPath));
			stream = envelopeCompressedStream(stream);
			ourPlainStreamCache[myPath] = stream;
		}
	} else {
		ZLFile baseFile(myPath.substr(0, index));
		shared_ptr<ZLInputStream> base = baseFile.inputStream();
		if (base) {
		    std::string entryName = myPath.substr(index + 1);
			if (baseFile.myArchiveType & ZIP) {
			    ZLZipInputStream *zipInputStream = new ZLZipInputStream(base,
			            entryName);
			    if (ZLStringUtil::stringEndsWith(entryName, ".html")
			            && !ZLStringUtil::stringEndsWith(entryName, "cover.html"))
			    {
			        zipInputStream->setAESKey(aesKey);
			    }
			    stream.reset(zipInputStream);
			} else if (baseFile.myArchiveType & TAR) {
			    stream.reset(new ZLTarInputStream(base, entryName));
			}
		}
		stream = envelopeCompressedStream(stream);
	}

	return stream;
}