[#35036] Intentional Programming — "John" <nojgoalbyspam@...>

Hi all

17 messages 2002/03/01

[#35112] RDoc question — Michael Davis <mdavis@...>

I have a question about RDoc. I would like to reference an external

17 messages 2002/03/02

[#35162] string to array and back — Ron Jeffries <ronjeffries@...>

I am needing to convert strings to arrays of bytes and back. I see pack and

19 messages 2002/03/03

[#35364] file reading impossibly slow? — Ron Jeffries <ronjeffries@...>

So I'm doing this benchmark to work with my set program. Part of the problem is

18 messages 2002/03/07

[#35429] Interesting link on static/dynamic typing... — Robert Feldt <feldt@...>

...relevant to Ruby compared to other languages discussion:

25 messages 2002/03/08
[#35441] Re: Interesting link on static/dynamic typing... — Paul Brannan <paul@...> 2002/03/08

On Fri, Mar 08, 2002 at 05:34:43PM +0900, Robert Feldt wrote:

[#35460] Spam, ruby-talk, and me — Dave Thomas <Dave@...>

14 messages 2002/03/08

[#35537] Confusion — David Corbin <dcorbin@...>

The following is from my debugging through xmlc.rb

16 messages 2002/03/10

[#35579] RE: WIN32OLE and LDAP — "Morris, Chris" <chris.morris@...>

> The new version 0.4.2 of Win32OLE has WIN32OLE.bind method.

16 messages 2002/03/11

[#35652] Method type 'abstract' — Peter Hickman <peter@...>

The one thing I miss in Ruby is the abstract class method to go along

15 messages 2002/03/12

[#35653] Some potential RCRs — "Bob Alexander" <bobalex@...>

Here are a few thing I am considering submitting as RCRs. I'm looking =

50 messages 2002/03/12
[#35672] Re: Some potential RCRs — matz@... (Yukihiro Matsumoto) 2002/03/12

Hi,

[#35683] Re: Some potential RCRs — Massimiliano Mirra <list@...> 2002/03/12

On Wed, Mar 13, 2002 at 03:58:01AM +0900, Yukihiro Matsumoto wrote:

[#35697] Re: Some potential RCRs — David Alan Black <dblack@...> 2002/03/13

Hello --

[#35694] rpkg 0.3 — Massimiliano Mirra <list@...>

14 messages 2002/03/13
[#35699] RE: [ANN] rpkg 0.3 — <james@...> 2002/03/13

>

[#35787] testunit - setup -> set_up ? — "Morris, Chris" <chris.morris@...>

I'm just starting to use testunit instead of rubyunit ... I noticed with an

21 messages 2002/03/13
[#35793] RE: testunit - setup -> set_up ? — "Nathaniel Talbott" <nathaniel@...> 2002/03/13

Morris, Chris [mailto:chris.morris@snelling.com] wrote:

[#35796] Re: testunit - setup -> set_up ? — Dave Thomas <Dave@...> 2002/03/13

"Nathaniel Talbott" <nathaniel@talbott.ws> writes:

[#35797] RE: testunit - setup -> set_up ? — "Nathaniel Talbott" <nathaniel@...> 2002/03/13

dave@thomases.com [mailto:dave@thomases.com] wrote:

[#35898] camelCase and underscore_style — "Morris, Chris" <chris.morris@...>

First, a question. If underscore_style is the Ruby norm for methods and the

20 messages 2002/03/15
[#35924] Re: camelCase and underscore_style — "Guy N. Hurst" <gnhurst@...> 2002/03/15

Phil Tomson wrote:

[#35930] RE: camelCase and underscore_style — "Nathaniel Talbott" <nathaniel@...> 2002/03/16

Guy N. Hurst [mailto:gnhurst@hurstlinks.com] wrote:

[#35989] ANN: Locana GUI and GUI Builder version 0.81 — Michael Davis <mdavis@...>

I am pleased to announce release 0.81 of Locana. Locana is a GUI

16 messages 2002/03/16

[#35992] XPath — Michael Schuerig <schuerig@...>

27 messages 2002/03/16

[#36034] Mini Rant: Indenting — Thomas Hurst <tom.hurst@...>

Why is it that I see *so* much code like:

14 messages 2002/03/17

[#36049] web templating for static sites? — Massimiliano Mirra <list@...>

I'm using the Template Toolkit for generating static web sites and I

42 messages 2002/03/17
[#36426] web standars (was: web templating for static sites?) — Tobias Reif <tobiasreif@...> 2002/03/20

Albert Wagner wrote:

[#36052] Xml Serialization for Ruby — "Chris Morris" <chrismo@...>

=Xml Serialization for Ruby

20 messages 2002/03/17
[#36059] Re: [ANN] Xml Serialization for Ruby — Massimiliano Mirra <list@...> 2002/03/17

On Mon, Mar 18, 2002 at 05:20:56AM +0900, Chris Morris wrote:

[#36067] eval/Module question — David Corbin <dcorbin@...>

If I have a String src that is similar to the following:

13 messages 2002/03/18

[#36157] Development of Windows version of Ruby — ptkwt@...1.aracnet.com (Phil Tomson)

Now that we've dumped the cygwin requirement for the Windows version of

63 messages 2002/03/18
[#36330] Re: Development of Windows version of Ruby — Ron Jeffries <ronjeffries@...> 2002/03/19

On Tue, 19 Mar 2002 14:05:27 GMT, "Albert L. Wagner" <alwagner@uark.edu> wrote:

[#36431] Re: Development of Windows version of Ruby — Dennis Newbold <dennisn@...> 2002/03/20

[#36458] Windows version of Ruby (proposals) — ptkwt@... (Phil Tomson) 2002/03/21

Dennis Newbold <dennisn@pe.net> wrote in message news:<Pine.GSO.3.96.1020320113603.22242B-100000@shell2>...

[#36482] RE: Windows version of Ruby (proposals) — "Christian Boos" <cboos@...> 2002/03/21

Some thoughts on the 2 first Windows issues, plus a 4th one...

[#36496] Re: Windows version of Ruby (proposals) — Dave Thomas <Dave@...> 2002/03/21

"Christian Boos" <cboos@bct-technology.com> writes:

[#36510] Re: Windows version of Ruby (proposals) — nobu.nokada@... 2002/03/21

Hi,

[#36514] Re: Windows version of Ruby (proposals) — Dave Thomas <Dave@...> 2002/03/21

nobu.nokada@softhome.net writes:

[#36518] Re: Windows version of Ruby (proposals) — nobu.nokada@... 2002/03/21

Hi,

[#36211] dots in Dir.entries — matz@... (Yukihiro Matsumoto)

Hi,

22 messages 2002/03/19

[#36231] style choice — Ron Jeffries <ronjeffries@...>

A style question for the community ... which of the following do you prefer, and

18 messages 2002/03/19

[#36345] ANN: REXML 2.0 — Sean Russell <ser@...>

I have a feeling there will only be three major revisions of REXML. Version

19 messages 2002/03/20

[#36610] Re: Windows version of Ruby (proposals) — Ron Jeffries <ronjeffries@...>

On Thu, 21 Mar 2002 14:11:55 GMT, Dave Thomas <Dave@PragmaticProgrammer.com> wrote:

16 messages 2002/03/22

[#36645] Ruby for Mac OS 10.1 — Jim Freeze <jim@...>

Hi:

28 messages 2002/03/23

[#36768] Re: Difference between 'do' and 'begin' — Clemens Hintze <c.hintze@...>

In <slrna9ulvi.f2h.mwg@fluffy.isd.dp.ua> Wladimir Mutel <mwg@fluffy.isd.dp.ua> writes:

23 messages 2002/03/26
[#36783] RE: Difference between 'do' and 'begin' — <james@...> 2002/03/26

[#36792] Re: Difference between 'do' and 'begin' — Kent Dahl <kentda@...> 2002/03/26

james@rubyxml.com wrote:

[#36808] Error calling Tk in a loop — <james@...>

I'm trying to write some code that pops up a Tk window when for certain

15 messages 2002/03/26

[#36841] RE: Windows version of Ruby (proposals) — "Andres Hidalgo" <sol123@...>

I believe that Ruby has a place in windows (Office), I happened to have

14 messages 2002/03/27

[#36863] Hash.new(Hash.new) doesn't use Hash.new as default value — "Jonas Delfs" <jonas@...>

Hi -

18 messages 2002/03/27

[#37080] Why isn't Math object-oriented? — Bil Kleb <W.L.Kleb@...>

So I'm reading along in the Pixaxe book (yet again), and I am told

15 messages 2002/03/30

[#37121] String#begins?(s) — timsuth@... (Tim Sutherland)

class String

24 messages 2002/03/31

Re: ruby-gtk fatal error

From: Patrik Sundberg <ps@...>
Date: 2002-03-24 13:52:22 UTC
List: ruby-talk #36665
On Sun, Mar 24, 2002 at 11:23:35AM +0900, Neil Conway wrote:
> On Sat, 2002-03-23 at 17:24, Patrik Sundberg wrote:
> > I can't seem to come up with a small script exhibiting this behaviour.. My
> > application uses libglade and is about 600 lines of code. I tried adding the
> > code which seems to make my app break to helloworld.rb but it doesn't behave
> > similair.. Would you like to see the code which do show the problem even
> > though it is a bit larger?
> 
> Yes, please.

ok. here it goes, but I don't think it is very easy to follow.
as you can see this isn't very easy to debug. I have a server listening on a
remote computer which gives outside access to a Samba network and a gui which
uses this gateway to get files from the samba network. it is an application to
search for files on a student network when not on this network (since i live
in a non-student apartment). perhaps it can also have something to do with the
module mp3list which handles searches to a BIG list of files (the file is
around 25Mb) which mmaps the indexfile in a c-module for performance reasons. 

[outsider.rb]:
#!/usr/local/bin/ruby

require 'gtk'
require 'lglade'
require 'gdk_imlib'
require 'gnome'
require 'zip'
require 'mp3list'
require 'smbgw/client'

# constants
GLADEFILE='/usr/local/share/examples/ruby/outsider'
LISTFILENAME = 'SUBnets MP3Lista - MP3Get'
LISTFILEMIRRORS = ['//Perry/MP3 Listan/',
				   '//Proffe/MP3Listan/',
				   '//n243/MP3Lista',
				   '//area26/mp3listan/']
UPDATE_INTERVAL = 60*60*24*3
BLOCKSIZE = 1024*400

class Download
	NATIVE = 0
	SAMBA = 1
	def initialize(opened_file, type, local_path)
		@remote_file, @type = opened_file, type
		@local_file = File.new(local_path, "w")
		@cancelled = false
	end

	def start(blocksize=8192)

	end

	def cancel
		@cancelled = true
	end

	def cancelled?
		@cancelled
	end

end

class SearchResultMenu
	def initialize(selected_files)
		@selected_files = selected_files
		@glade = GladeXML.new($OUTSIDERGLADEFILE, "searchresult_menu") {|h|
			method(h)
		}
		@menu = @glade.getWidget('searchresult_menu')
		@menu.popup(nil,nil,nil,3,Time.now.to_i)
	end

	private

	def download
		print "download\n"
		if $global_config.use_smb_gw and $global_config.gw_type = 'UNIX'
			smb_url = "smb:"+(@selected_files[0].path+@selected_files[0].filename).gsub(/\\/, '/')
			$pending_downloads << smb_url
		elsif $global_config.use_smb_gw and $global_config.gw_type = 'WIN32'
			$stdout.print "Not yet implemented!\n"
		elsif not $global_config.use_smb_gw and $global_config.gw_type = 'UNIX'
			$stdout.print "Not yet implemented!\n"
		elsif not $global_config.use_smb_gw and $global_config.gw_type = 'WIN32'
			$stdout.print "Not yet implemented!\n"
		end
	end

	def download_one_of
		print "download_one_of\n"

	end

	def list_directory
		print "list_directory\n"
	end

	def download_directory
		print "download_directory\n"
	end

	def resume_incomplete_download
		print "resume_incomplete\n"
	end
end


class DownloadMenu
	def initialize(downloads)
		p downloads
	end
end


class MainWindow
	def initialize
		@glade = GladeXML.new($OUTSIDERGLADEFILE, "main_window") {|h|
			method(h)
		}
		@main_window = @glade.getWidget('main_window')
		@search_e = @glade.getWidget('search_e')
		@g = @glade.getWidget('maxresults_sb')
		@maxdownloads_sb = @glade.getWidget('maxdownloads_sb')
		@re_exact_match_cb = @glade.getWidget('re_exact_match_cb')
		@re_case_sensitive_cb = @glade.getWidget('re_case_sensitive_cb')
		@filetype_e = @glade.getWidget('filetype_e')
		@files_searchtype_rb = @glade.getWidget('files')
		@dirs_searchtype_rb = @glade.getWidget('dirs')
		@both_searchtype_rb = @glade.getWidget('both')
		@search_results = @glade.getWidget('search_results')
		@downloads = @glade.getWidget('downloads')
		@statusbar = @glade.getWidget('statusbar')
		@sb_context = @statusbar.get_context_id('MainWin')
		update_gui
	end

	def update_gui
		@g.set_value($global_config.maxresults)
		@maxdownloads_sb.set_value($global_config.maxdownloads)
		@re_exact_match_cb.active = $global_config.re_exact_match
		@re_case_sensitive_cb.active = $global_config.re_case_sensitive
	end

	def show
		filename = ENV['HOME']+'/.outsider/'+LISTFILENAME+'.txt'
		if not test(?e, filename)
			update_mp3list
		end
		@list = Mp3List::List.new(filename)

		if Time.now - File.stat(filename).mtime > UPDATE_INTERVAL
			update_mp3list
		end
		@main_window.show
	end

	def update_downloadlist
		print "update_downloadlist\n"
	end

	protected

	def update_config
		$global_config.re_exact_match = @re_exact_match_cb.active
		$global_config.re_case_sensitive = @re_case_sensitive_cb.active
		$global_config.maxresults = @g.get_value_as_int()
		$global_config.maxdownloads = @maxdownloads_sb.get_value_as_int()
	end

	def quit
		exit(0)
		#Gtk.main_quit
	end

	def resume_incomplete_downloads
		print "resume_incomplete\n"
	end

	def config
		update_config
		config_window = ConfigWindow.new
		config_window.show
	end

	def searchresult_clicked(widget, event, data)
		return unless event.button == 3
		print "searchresult_clicked\n"
		selected_files = Array.new
		@search_results.each_selection {|row|
			result = @search_results.get_row_data(row)
			selected_files << result
		}
		if selected_files.size == 0
			return
		end
		SearchResultMenu.new(selected_files)
		@search_results.unselect_all
	end

	def download_clicked
		print "download_clicked\n"
		downloads = Array.new
		@downloads.each_selection {|row|
			download = @downloads.get_row_data(row)
			downloads << download 
		}
		if downloads.size == 0
			return
		end
		DownloadMenu.new(downloads)
	end

	def about
		print "about\n"
	end

	def search
		@statusbar.push(@sb_context, "Searching..")
		@search_results.clear
		@timeout_id = Gtk.timeout_add(100) { real_search }
	end

	def real_search
		Gtk.timeout_remove(@timeout_id)
		update_config
		if $global_config.re_exact_match
			expression = @search_e.get_text()
		else
			#InfoBox.new('Non-exact regular expression searches aren\' supported yet.')
			$stderr.print 'Non-exact regular expression searches aren\' supported yet.\n'
			return
		end
		if @files_searchtype_rb.active
			search_type = Mp3List::SEARCH_FILES
		elsif @dirs_searchtype_rb.active
			search_type = Mp3List::SEARCH_DIRS
		else
			search_type = Mp3List::SEARCH_BOTH
		end

		results = Mp3List::Search.new(@list,
									  expression,
									  $global_config.re_case_sensitive,
									  search_type,
									  Mp3List::TYPE_ANY,
									  0,
									  $global_config.maxresults)

		i = 0
		results.each {|result|
			@search_results.append([result.filename, result.size.to_s, result.path])
			@search_results.set_row_data(i, result)
			i += 1
		}
		@statusbar.pop(@sb_context)
		@statusbar.push(@sb_context, "Found #{results.size} results.")
	end

	def re_exact_match_toggle
		print "re_exact_match_toggle\n"
	end

	def re_case_sensitive_toggle
		print "re_case_sensitive_toggle\n"
	end

	def update_mp3list
		print "update_mp3list\n"
		glade = GladeXML.new($OUTSIDERGLADEFILE, "update_window") {|h|
			method(h)
		}
		@update_window = glade.getWidget('update_window')
		@progressbar = glade.getWidget('progressbar')
		@progressbar.set_percentage(0.0)
		@update_window.show
		@timeout_id = Gtk.timeout_add(100) { real_update_mp3list }
	end

	def real_update_mp3list
		Gtk.timeout_remove(@timeout_id)
		Thread.new {
			filename = ENV['HOME']+'/.outsider/'+LISTFILENAME+'.zip'
			gw = SMBGw::Gateway.new($global_config.gw_host,
									$global_config.gw_user,
									$global_config.gw_password)
			remote = nil
			LISTFILEMIRRORS.each {|dir|
				begin
					remote = SMBGw::File.new(gw,'smb:'+dir+LISTFILENAME+'.zip',"r")
					break
				rescue Exception => e	
					next
				end
			}
			if remote.nil?
				print "Couldn't update list!\n"
				return
			end

			@list.destroy
=begin
			local = File.new(filename, "w")
			lsize = 0
			rsize = remote.size
			until remote.eof?
				written = local.write(remote.read(BLOCKSIZE))
				lsize += written
				@progressbar.set_percentage(lsize.to_f/rsize.to_f)
				$stdout.flush
			end
=end
			remote.close
#			local.close
			p 'innan zip'
			p "/usr/local/bin/unzip -o #{filename}"
			p 'efter zip'
			p filename[0..-4]+'txt'
			@list = Mp3List::List.new(filename[0..-4]+'txt')
			p 'ny lista..'
		}
	end
end


class Config

	attr_accessor :dlpath, :incompletepath, :maxresults, :maxdownloads, :re_exact_match, :re_case_sensitive
	attr_accessor :use_smb_gw, :gw_host, :gw_port, :gw_user, :gw_password, :gw_type
	def initialize
		@dlpath = ENV['HOME']+'/mp3/dl'
		@incompletepath = ENV['HOME']+'/mp3/dl/incomplete'
		@maxresults = 300 
		@maxdownloads = 1 
		@re_exact_match = true
		@re_case_sensitive = false
		@use_smb_gw = true
		@gw_host = 'smbgw.ryd.student.liu.se'
		@gw_port = 31337
		@gw_type = 'UNIX'
		@gw_user = 'yourUsername'
		@gw_password = 'secretPassword'
	end

	def gw_object
		SMBGw::Gateway.new(@gw_host, @gw_user, @gw_password, @gw_port)
	end
end


class PathDialog
	def initialize(parent, msg, current_file)
		@glade = GladeXML.new($OUTSIDERGLADEFILE, "path_dialog") {|h|
			method(h)
		}
		@parent, @msg, @current_file = parent, msg, current_file
		@dialog = @glade.getWidget("path_dialog")
		@dialog.set_filename(@current_file)
	end

	def show
		@dialog.show
	end
	
	def close_window
		@dialog.destroy
	end

	protected

	def ok 
		@parent.send @msg, @dialog.get_filename
		close_window
	end

	def cancel 
		@parent.send @msg, @current_file
		close_window
	end
end

class ConfigWindow
	def initialize
		# created from FirstTimeWindow or setupGUI() ?
		if defined? $global_config 
			@first_time = false
		else
			@first_time = true
			$global_config = Config.new
		end

		# get widgets
		@glade = GladeXML.new($OUTSIDERGLADEFILE, "config_window") {|h|
			method(h)
		}
		@config_window = @glade.getWidget('config_window')	
		@dlpath_e = @glade.getWidget('dlpath_e')
		@incompletepath_e = @glade.getWidget('incompletepath_e')
		@maxresults_sb = @glade.getWidget('maxresults_sb')
		@maxdownloads_sb = @glade.getWidget('maxdownloads_sb')
		@re_exact_match_cb = @glade.getWidget('re_exact_match_cb')
		@re_case_sensitive_cb = @glade.getWidget('re_case_sensitive_cb')
		@use_smb_gw_cb = @glade.getWidget('use_smb_gw_cb')
		@gw_host_e = @glade.getWidget('gw_host_e')
		@gw_port_e = @glade.getWidget('gw_port_e')
		@gw_type_e = @glade.getWidget('gw_type_e')
		@gw_user_e = @glade.getWidget('gw_user_e')
		@gw_password_e = @glade.getWidget('gw_password_e')

		# update with relevant configuration
		@dlpath_e.set_text($global_config.dlpath)
		@incompletepath_e.set_text($global_config.incompletepath)
		@maxresults_sb.set_value($global_config.maxresults)
		@maxdownloads_sb.set_value($global_config.maxdownloads)
		@re_exact_match_cb.active = $global_config.re_exact_match
		@re_case_sensitive_cb.active = $global_config.re_case_sensitive
		@use_smb_gw_cb.active = $global_config.use_smb_gw
		@gw_host_e.set_text($global_config.gw_host)
		@gw_port_e.set_text($global_config.gw_port.to_s)
		@gw_type_e.set_text($global_config.gw_type)
		@gw_user_e.set_text($global_config.gw_user)
		@gw_password_e.set_text($global_config.gw_password)
	end

	def show
		@config_window.show
	end

	def update_downloadpath(path)
		@dlpath_e.set_text(File.dirname(path))
	end

	def update_incompletepath(path)
		@incompletepath_e.set_text(File.dirname(path))
	end

	protected

	def ok
		$global_config.dlpath = @dlpath_e.get_text()
		$global_config.incompletepath = @incompletepath_e.get_text()
		$global_config.maxresults = @maxresults_sb.get_value_as_int()
		$global_config.maxdownloads = @maxdownloads_sb.get_value_as_int()
		$global_config.re_exact_match = @re_exact_match_cb.active
		$global_config.re_case_sensitive = @re_case_sensitive_cb.active
		$global_config.use_smb_gw = @use_smb_gw_cb.active
		$global_config.gw_host = @gw_host_e.get_text()
		$global_config.gw_port = @gw_port_e.get_text()
		$global_config.gw_type = @gw_type_e.get_text()
		$global_config.gw_user = @gw_user_e.get_text()
		$global_config.gw_password = @gw_password_e.get_text()
		save_config()
		if @first_time
			$main_window = MainWindow.new
			$main_window.show
		else
			$main_window.update_gui
		end
		@config_window.destroy
	end

	def cancel
		Gtk.main_quit if @first_time
		@config_window.destroy
	end

	def get_downloadpath
		PathDialog.new(self, :update_downloadpath, $global_config.dlpath).show
	end

	def get_incompletepath
		PathDialog.new(self, :update_incompletepath, $global_config.incompletepath).show
	end
end

class FirstTimeWindow 
	def initialize
		@glade = GladeXML.new($OUTSIDERGLADEFILE, "first_time_window") {|h|
			method(h)
		}
		@first_time_window = @glade.getWidget('first_time_window')
		$config_window = ConfigWindow.new
		@first_time_window.show
	end

	def show_config_window
		$config_window.show
		@first_time_window.destroy
	end

	def close
		Gtk.main_quit
	end
end

def save_config()
	if not test(?e, ENV['HOME']+'/.outsider')
		Dir.mkdir(ENV['HOME']+'/.outsider')
	end
	File.open(ENV['HOME']+'/.outsider/conf', "w") {|f|
		f.puts("# Automatically generated config file - do not edit!")
		f.puts("dlpath = #{$global_config.dlpath}")
		f.puts("incompletepath = #{$global_config.incompletepath}")
		f.puts("maxresults = #{$global_config.maxresults}")
		f.puts("maxdownloads = #{$global_config.maxdownloads}")
		f.puts("re_exact_match = #{$global_config.re_exact_match}")
		f.puts("re_case_sensitive = #{$global_config.re_case_sensitive}")
		f.puts("use_smb_gw = #{$global_config.use_smb_gw}")
		f.puts("gw_host = #{$global_config.gw_host}")
		f.puts("gw_port = #{$global_config.gw_port}")
		f.puts("gw_type = #{$global_config.gw_type}")
		f.puts("gw_user = #{$global_config.gw_user}")
		f.puts("gw_password = #{$global_config.gw_password}")
		f.puts("# End of configuration file")
	}
end

def parse_config(file)
	while file.gets
		case $_
			when /dlpath\s*=\s*(.*)/
				dlpath = $1
			when /incompletepath\s*=\s*(.*)/
				incompletepath = $1
			when /maxresults\s*=\s*(.*)/
				maxresults = $1.to_i
			when /maxdownloads\s*=\s*(.*)/
				maxdownloads = $1.to_i
			when /re_exact_match\s*=\s*(.*)/
				re_exact_match = ($1 == 'true')
			when /re_case_sensitive\s*=\s*(.*)/
				re_case_sensitive = ($1 == 'true')
			when /use_smb_gw\s*=\s*(.*)/
				use_smb_gw = ($1 == 'true')
			when /gw_host\s*=\s*(.*)/
				gw_host = $1
			when /gw_port\s*=\s*(.*)/
				gw_port = $1.to_i
			when /gw_type\s*=\s*(.*)/
				gw_type = $1
			when /gw_user\s*=\s*(.*)/
				gw_user = $1
			when /gw_password\s*=\s*(.*)/
				gw_password = $1
			when /^\s+|^\#/
				next
			else
				$stderr.print "Syntax error in con/figuration file at line "+
							  "#{$.}:\n==> #{$_}\nPlease correct manually or remove configfile.\n"
				exit(1)
		end
	end

	begin
		$global_config = Config.new
		$global_config.dlpath = dlpath
		$global_config.incompletepath = incompletepath
		$global_config.maxresults = maxresults
		$global_config.maxdownloads = maxdownloads
		$global_config.re_exact_match = re_exact_match
		$global_config.re_case_sensitive = re_case_sensitive
		$global_config.use_smb_gw = use_smb_gw
		$global_config.gw_host = gw_host
		$global_config.gw_port = gw_port 
		$global_config.gw_user = gw_user
		$global_config.gw_password = gw_password
	rescue
		$stderr.print "Configuration item missing! Either fix by hand or delete ~/.outsider/conf"
		exit(1)
	end
end

# EXECUTION STARTS HERE!


if test(?e, GLADEFILE)
	$OUTSIDERGLADEFILE = GLADEFILE
elsif test(?e, "./outsider.glade")
	$OUTSIDERGLADEFILE = "./outsider.glade"
elsif test(?e, "../../share/outsider/outsider.glade")
	$OUTSIDERGLADEFILE = "../../share/outsider/outsider.glade"
end

if $OUTSIDERGLADEFILE.nil?
	raise "Couldn't find outsider.glade file. This should be located at #{GLADEFILE} or ./outsider.glade"
end

configfile_path = ENV['HOME']+'/.outsider/conf'
if test(?e, configfile_path)
	configfile = File.open(configfile_path, "r")
	parse_config(configfile)
	configfile.close
	$main_window = MainWindow.new
	$main_window.show
else
	FirstTimeWindow.new
end

$download_threads = Hash.new
$pending_downloads = []

# the download queu-handler thread
Thread.new {
	loop {
		if $pending_downloads.size > 0
			$pending_downloads.each {|url|
				# Create download thread
				$download_threads[url] = Thread.new(url) {|url|
					$pending_downloads.delete(url)
					gw = SMBGw::Gateway.new($global_config.gw_host,
											$global_config.gw_user,
											$global_config.gw_password)
					remote = SMBGw::File.new(gw, url, "r")
					local = File.new(url.split('/')[-1], "w")

					until remote.eof?
						local.write(remote.read(BLOCKSIZE))
						print "#"
						$stdout.flush
						Thread.pass
					end
					remote.close
					local.close
					$download_threads.delete(url)
				}
			}
		end
		sleep(1)
	}
}

Gtk.main

[end of outsider.rb]

the utility-file used which contains the socket operations:
[smbgw/client.rb]
#-
# Copyright (c) 2001 Patrik Sundberg, Raditex AB
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $Id: client.rb,v 1.2 2002/03/24 00:05:09 ps Exp $

require 'socket'

module SMBGw
	class Gateway
		attr_accessor :host, :username, :password, :port
		def initialize(host, username, password, port=31337)
			@host, @username, @password, @port = host, username, password, port
		end
	end

	class File
		def initialize(gw, url, mode)
			@socket = TCPSocket.new(gw.host, gw.port)	
			@socket.puts("auth #{gw.username} #{gw.password}")
			res = @socket.gets.chomp
			if res != 'OK'
				raise "Failed to authenticate user with gateway!"
			end
			@socket.puts("open_file #{mode} #{url}")
			error_check(@socket.gets.chomp)
		end

		def read(blocksize=1024)
			@socket.puts("read #{blocksize.to_s}")
			res = @socket.gets.chomp
			unless error_check(res)
				size = @socket.gets.chomp.split[1].to_i
				return @socket.read(size)
			end
		end

		def write(data)

		end

		def eof?
			@socket.puts('eof?')
			res = @socket.gets.chomp
			res == 'TRUE' unless error_check(res)
		end

		def pos
			@socket.puts('pos')
			res = @socket.gets.chomp
			res unless error_check(res)
		end

		def pos=(position)
			@socket.puts("pos= #{position.to_s}")
			res = @socket.gets.chomp
			true unless error_check(res)
		end

		def close
			@socket.puts('close')
			res = @socket.gets.chomp
			@socket.close
			true unless error_check(res)
		end

		def size
			@socket.puts('size')
			res = @socket.gets.chomp
			res.to_i unless error_check(res)
		end

		private
		def error_check(msg)
			if msg =~ /ERROR\s+(.*)/
				raise "SMBGw::File error: #{$1}"
			else
				return false
			end
		end
	end

	class Dir

	end
end

[end of client.rb]

-- 
---------------------------------------------------------------------------.
Patrik Sundberg    Address: Rydsv臠en 100C, 584 31 Linking, Sweden       |
                   Email:   ps@raditex.se || ps@radiac.mine.nu             |
                   Phone:   +46 13 178567 || +46 707 602240                |
.---> Applied Physics and Electrical Engineering student                   |
|-----> Master of Science in Business Administration and Economics student |
|-------> UNIX/Programming consultant                                      |
`--------------------------------------------------------------------------'

In This Thread

Prev Next