#!/usr/bin/env python

import urllib2
import os
import sys
import zipfile

try:
	import cStringIO as StringIO
except:
	import StringIO


SRC = "http://www.3gpp.org/ftp/Specs/archive/06_series/06.06/0606-421.zip"


def get_zipfile(data):
	return zipfile.ZipFile(StringIO.StringIO(data))


def get_subfile_data(data, filename):
	z = get_zipfile(data)
	return z.read(filename)


def process_file(z, e):
	fh = open(os.path.basename(e.filename.lower()), 'w')
	d = z.read(e).replace('\r','')
	fh.write(d)
	fh.close()


def main(*args):

	# Args
	if len(args) != 2:
		print "Usage: %s target_dir" % args[0]
		return

	tgt = args[1]

	# Create and go to target dir
	if not os.path.isdir(tgt):
		os.mkdir(tgt)
	os.chdir(tgt)

	# Get the original data
	u = urllib2.urlopen(SRC)
	d = u.read()

	# Get DISK.zip
	d = get_subfile_data(d, 'DISK.zip')

	# Get Dir_C.zip
	d = get_subfile_data(d, 'Dir_C.zip')

	# Get zip file object
	z = get_zipfile(d)

	# Save each file
	for e in z.filelist:
		process_file(z, e)


if __name__ == '__main__':
	main(*sys.argv)
