diff src/Input/modplug/archive/arch_zip.cxx @ 0:13389e613d67 trunk

[svn] - initial import of audacious-plugins tree (lots to do)
author nenolod
date Mon, 18 Sep 2006 01:11:49 -0700
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Input/modplug/archive/arch_zip.cxx	Mon Sep 18 01:11:49 2006 -0700
@@ -0,0 +1,143 @@
+/* Modplug XMMS Plugin
+ * Authors: Kenton Varda <temporal@gauge3d.org>
+ *
+ * This source code is public domain.
+ */
+
+//open()
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "arch_zip.h"
+#include <iostream>
+#include <vector>
+	
+arch_Zip::arch_Zip(const string& aFileName)
+{
+	//check if file exists
+	int lFileDesc = open(aFileName.c_str(), O_RDONLY);
+	string lGoodName;
+	bool bFound = false;
+
+	if(lFileDesc == -1)
+	{
+		mSize = 0;
+		return;
+	}
+	
+	close(lFileDesc);
+	
+	// file exists.
+	string lCommand = "unzip -l -qq \"" + aFileName + '\"';   //get info
+	FILE *f = popen(lCommand.c_str(), "r");
+
+	if(f <= 0)
+	{
+		mSize = 0;
+		return;
+	}
+	
+
+	bool eof = false;
+	while(!eof)
+	{
+		char line[301];
+		char lUncompName[300];
+		if (fgets(line, 300, f) <= 0) 
+		{
+			eof = true;
+			break;
+		}
+		
+		if (processLine(line, &mSize, lUncompName))
+		{
+			lGoodName = lUncompName;
+			bFound = true;
+			break;
+		}
+		
+	}
+	if(!bFound)
+	{
+		mSize = 0;
+		return;
+	}
+
+	pclose(f);
+	
+	mMap = new char[mSize];
+	
+	lCommand = "unzip -p \"" + aFileName + "\" \"" + lGoodName + '\"';
+	//decompress to stdout
+	f = popen(lCommand.c_str(), "r");
+	
+	if (f <= 0)
+	{
+		mSize = 0;
+		return;
+	}
+
+	fread((char *)mMap, sizeof(char), mSize, f);
+	
+	pclose(f);
+	
+}
+
+bool arch_Zip::processLine(char *buffer, uint32 *mSize, char *filename)
+{
+	uint32 mlSize;
+	mlSize = 0;
+
+	if (sscanf(buffer, "%u %*s %*s %s\n", &mlSize, &filename[0]) <= 0)
+		return false;
+		
+	*mSize = mlSize;
+	string lName = filename;
+
+	// size date time name
+	return IsOurFile(lName);	
+}
+
+arch_Zip::~arch_Zip()
+{
+	if(mSize != 0)
+		delete [] (char*)mMap;
+}
+	
+bool arch_Zip::ContainsMod(const string& aFileName)
+{
+	int lFileDesc = open(aFileName.c_str(), O_RDONLY);
+
+	if(lFileDesc == -1)
+		return false;
+	
+	close(lFileDesc);
+	
+	// file exists.
+	string lCommand = "unzip -l -qq \"" + aFileName + '\"';   //get info
+	FILE *f = popen(lCommand.c_str(), "r");
+
+	if(f <= 0)
+		return false;
+	
+	bool eof = false;
+	while(!eof)
+	{
+		char line[301], lName[300];
+		if (fgets(line, 300, f) <= 0) 
+			return false;
+		
+		uint32 tempSize;
+		// Simplification of previous if statement
+		pclose(f);
+		return (processLine(line, &tempSize, lName));
+		
+	}
+
+	pclose(f);	
+	return false;
+}