1 /*
2  * This file is part of gtkD.
3  *
4  * gtkD is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License as published by
6  * the Free Software Foundation; either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * gtkD is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public License
15  * along with gtkD; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA
17  */
18 
19 module gtk.SpawnTests;
20 
21 import glib.Spawn;
22 
23 import gio.Application : GioApplication = Application;
24 import gtk.Application;
25 import gtk.ApplicationWindow;
26 import gtk.TextView;
27 import gtk.TextBuffer;
28 import gtk.TextIter;
29 import gtk.Box;
30 import gtk.VBox;
31 import gtk.ScrolledWindow;
32 import gtk.Button;
33 import gtk.Image;
34 
35 import std.string;
36 import std.stdio;
37 
38 class SpawnWindow : ApplicationWindow
39 {
40 	TextView viewInput;
41 	TextView viewOutput;
42 	TextView viewError;
43 	TextIter iterOut;
44 	TextIter iterError;
45 
46 	this(Application application)
47 	{
48 		super(application);
49 		setTitle("Spawn testing");
50 		setupWindow();
51 		setSizeRequest(400,400);
52 		showAll();
53 	}
54 
55 	private void setupWindow()
56 	{
57 		Box main = new VBox(false, 2);
58 
59 		viewInput = new TextView();
60 		viewOutput = new TextView();
61 		viewError = new TextView();
62 
63 		main.packStart(new ScrolledWindow(viewInput), false, false, 2);
64 		Button button = new Button("exec", &execInput);
65 		main.packStart(button, false, false, 4);
66 		main.packStart(new ScrolledWindow(viewOutput), true, true, 2);
67 		main.packStart(new ScrolledWindow(viewError), false, false, 2);
68 
69 		setBorderWidth(7);
70 		add(main);
71 	}
72 
73 	private void execInput(Button button)
74 	{
75 		string[] args = std..string.split(viewInput.getBuffer().getText());
76 		exec(args);
77 	}
78 
79 	private bool exec(string[] args)
80 	{
81 		foreach ( size_t i, string arg ; args)
82 		{
83 			writefln("[%s] >%s<", i, arg);
84 		}
85 		Spawn spawn = new Spawn(args[0]);
86 
87 		if (args.length > 1 )
88 		{
89 			for( int i=1 ; i<args.length ; i++ )
90 			{
91 				writefln("SpawnTests.exec adding parameter [%s] %s",i,args[i]);
92 				spawn.addParm(args[i]);
93 			}
94 		}
95 		return exec(spawn);
96 	}
97 
98 	bool childEnded(Spawn spawn)
99 	{
100 		writefln("process %s ended with status %s", viewInput.getBuffer().getText(),spawn.getExitStatus());
101 		return true; //gotta check this.
102 	}
103 
104 	private bool exec(Spawn spawn)
105 	{
106 		//TODO: These functions should accept a string.
107 		viewOutput.getBuffer().setText("");
108 		viewError.getBuffer().setText("");
109 
110 		TextBuffer bufferError = viewError.getBuffer();
111 		TextIter iterError = new TextIter();
112 
113         int result = spawn.commandLineSync(&childEnded, &syncOutput, &syncError);
114 
115 		bufferError.getEndIter(iterError);
116 		viewError.getBuffer().insert(iterError, spawn.getLastError()~"\n");
117 
118 		writefln("exit loop");
119 
120 		spawn.close();
121 		return true;
122 	}
123 
124 	public bool syncOutput(string line)
125 	{
126 		TextIter iter = new TextIter();
127 		viewOutput.getBuffer().getEndIter(iter);
128 		viewOutput.getBuffer().insert(iter, line~"\n");
129 		return true;
130 	}
131 
132 	public bool syncError(string line)
133 	{
134 		TextIter iter = new TextIter();
135 		viewError.getBuffer().getEndIter(iter);
136 		viewError.getBuffer().insert(iter, line~"\n");
137 		return true;
138 	}
139 
140 	public void setInput(string[] args)
141 	{
142 		TextBuffer inBuffer = viewInput.getBuffer();
143 		string t;
144 		foreach ( size_t count, string arg; args)
145 		{
146 			if ( count > 0 ) t ~= " ";
147 			t ~= arg;
148 		}
149 		inBuffer.setText(t);
150 	}
151 
152 	public void setInput(string arg)
153 	{
154 		viewInput.getBuffer().setText(arg);
155 	}
156 }
157 
158 int main(string[] args)
159 {
160 	auto application = new Application("org.gtkd.demo.spawntest", GApplicationFlags.FLAGS_NONE);
161 
162 	application.addOnActivate(delegate void(GioApplication app) { 
163 		SpawnWindow sw = new SpawnWindow(application);
164 
165 		if ( args.length > 1 )
166 		{
167 			sw.setInput(args[1..args.length]);
168 		}
169 		else
170 		{
171 			sw.setInput("/bin/ls");
172 		}
173 	});
174 
175 	return application.run(args);
176 }