summaryrefslogtreecommitdiff
path: root/noncore/applets/keyhelper/keyhelperapplet/anylnk/ProcessInvoker.h
blob: 1f53cd6779f0462e18d471bf611e498c7e376819 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#ifndef _PROCESS_INVOKER_H_
#define _PROCESS_INVOKER_H_

#include <qobject.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/time.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>

#include <qtimer.h>
#include <qdatastream.h>
#include <qcstring.h>
#include <qpe/qcopenvelope_qws.h>
#include <qpe/global.h>
//#include "KHUtil.h"
#include "StringParser.h"

typedef void Sigfunc(int);

#define	SC_CHANNEL	"QPE/ShellCommander"

/* Sigleton Object */
class ProcessInvoker : public QObject
{
	Q_OBJECT
public:
	static ProcessInvoker& getInstance()
	{
		static ProcessInvoker instance;
		return(instance);
	}

	bool run();
	bool run(const QString& args);
	void terminate();
	void terminate(pid_t pid);
	void kill();
	void kill(pid_t pid);
	void setCommand(const QString& command){
		m_arguments.clear();
		addArgument(command);
	}
	void setArguments(const QStringList& arglist){
		m_arguments = arglist;
	}
	void setArguments(const QString& arguments){
		//setArguments(KHUtil::parseArgs(arguments));
		setArguments(StringParser::split(' ', arguments));
	}
	void addArgument(const QString& argument){
		m_arguments.append(argument);
	}
	void addArguments(const QString& arguments){
		QStringList arglist;
		//arglist = KHUtil::parseArgs(arguments);
		arglist = StringParser::split(' ', arguments);
		addArguments(arglist);
	}
	void addArguments(const QStringList& arglist){
		for(QStringList::ConstIterator it=arglist.begin();
				it!=arglist.end(); ++it){
			addArgument(*it);
		}
	}
	//const QStringList parseArgs(const QString& arguments);
	void setRunning(int pid);
	void setNotify(bool enable=true){
		m_isNotify = enable;
	}

	bool isRunning(){
		return(m_isRunning);
	}
	void notifyFinish(int status, bool success=true);

	pid_t m_child;

	friend class Dummy; /* for compile warning */
signals:
	void start(int, QStringList);
	void finish(QString,int);
private:
	ProcessInvoker();
	ProcessInvoker(const ProcessInvoker&);
	ProcessInvoker& operator=(const ProcessInvoker&);
	~ProcessInvoker();

	class Dummy{}; /* for compile warning */

	QTimer* m_pTimer;
	QStringList m_arguments;

	bool m_isRunning;
	bool m_isNotify;

	Sigfunc* m_defChildHandler;

	int m_stdfd[2];
	int m_errfd[2];
	int m_maxfdp1;

	bool openPipe();
	void closePipe(int fd[] = NULL, int n = 2);
	void notifyStatus(const QString& result, int code);

	void workerProc();
private slots:
	void readOutputs();
};

#endif /* _PROCESS_INVOKER_H_ */