// // C++ Implementation: global // // Description: // // // Author: Paulo Moura Guedes , (C) 2004 // // Copyright: See COPYING file that comes with this distribution // // #include "global.h" #include #include #include #include #include #include #include #include #include #include #include Global* Global::m_self_ = 0; static KStaticDeleter staticDeleter; Global* Global::self() { if (!m_self_) { staticDeleter.setObject(m_self_, new Global()); } return m_self_; } Global::Global(TQObject *parent, const char *name) : TQObject(parent, name), loop_started_(false) { m_self_ = this; dcop_client_ = kapp->dcopClient(); } Global::~Global() { if(m_self_ == this) staticDeleter.setObject(m_self_, 0, false); } bool Global::isKLinkStatusEmbeddedInQuanta() { TQCString app_id = "quanta-" + TQCString().setNum(getpid()); return self()->dcop_client_->isApplicationRegistered(app_id); } bool Global::isQuantaRunningAsUnique() { return self()->dcop_client_->isApplicationRegistered("quanta"); } bool Global::isQuantaAvailableViaDCOP() { if(isQuantaRunningAsUnique() || isKLinkStatusEmbeddedInQuanta()) return true; else { self()->execCommand("ps h -o pid -C quanta -C quanta_be"); TQStringList ps_list = TQStringList::split("\n", self()->script_output_); for(uint i = 0; i != ps_list.size(); ++i) { ps_list[i] = ps_list[i].stripWhiteSpace (); if(self()->dcop_client_->isApplicationRegistered("quanta-" + ps_list[i].local8Bit())) { //kdDebug(23100) << "Application registered!" << endl; return true; } } return false; } } TQCString Global::quantaDCOPAppId() { DCOPClient* client = kapp->dcopClient(); TQCString app_id; if(client->isApplicationRegistered("quanta")) // quanta is unnique application app_id = "quanta"; else if(self()->isKLinkStatusEmbeddedInQuanta()) // klinkstatus is running as a part inside quanta { TQCString app = "quanta-"; TQCString pid = TQCString().setNum(getpid()); app_id = app + pid; } else { self()->execCommand("ps h -o pid -C quanta -C quanta_be"); TQStringList ps_list = TQStringList::split("\n", self()->script_output_); for(uint i = 0; i != ps_list.size(); ++i) { ps_list[i] = ps_list[i].stripWhiteSpace (); if(self()->dcop_client_->isApplicationRegistered("quanta-" + ps_list[i].local8Bit())) app_id = "quanta-" + ps_list[i]; } } if(self()->dcop_client_->isApplicationRegistered(app_id)) return app_id; else { kdError(23100) << "You didn't check if Global::isQuantaAvailableViaDCOP!" << endl; return ""; } } KURL Global::urlWithQuantaPreviewPrefix(KURL const& url) { Q_ASSERT(isKLinkStatusEmbeddedInQuanta()); DCOPRef quanta(Global::quantaDCOPAppId(),"WindowManagerIf"); TQString string_url_with_prefix = quanta.call("urlWithPreviewPrefix", url.url()); //kdDebug(23100) << "string_url_with_prefix: " << string_url_with_prefix << endl; return KURL(string_url_with_prefix); } void Global::openQuanta(TQStringList const& args) { TQString command(args.join(" ")); Global::execCommand("quanta " + command); } void Global::execCommand(TQString const& command) { //We create a TDEProcess that executes the "ps" *nix command to get the PIDs of the //other instances of quanta actually running self()->process_PS_ = new TDEProcess(); *(self()->process_PS_) << TQStringList::split(" ",command); connect( self()->process_PS_, TQT_SIGNAL(receivedStdout(TDEProcess*,char*,int)), self(), TQT_SLOT(slotGetScriptOutput(TDEProcess*,char*,int))); connect( self()->process_PS_, TQT_SIGNAL(receivedStderr(TDEProcess*,char*,int)), self(), TQT_SLOT(slotGetScriptError(TDEProcess*,char*,int))); connect( self()->process_PS_, TQT_SIGNAL(processExited(TDEProcess*)), self(), TQT_SLOT(slotProcessExited(TDEProcess*))); //if TDEProcess fails I think a message box is needed... I will fix it if (!self()->process_PS_->start(TDEProcess::NotifyOnExit,TDEProcess::All)) kdError() << "Failed to query for running KLinkStatus instances!" << endl; //TODO: Replace the above error with a real messagebox after the message freeze is over else { //To avoid lock-ups, start a timer. TQTimer* timer = new TQTimer(self()); connect(timer, TQT_SIGNAL(timeout()), self(), TQT_SLOT(slotProcessTimeout())); timer->start(120*1000, true); self()->loop_started_ = true; kapp->enter_loop(); delete timer; } } void Global::slotGetScriptOutput(TDEProcess* /*process*/, char* buf, int buflen) { TQCString tmp( buf, buflen + 1 ); script_output_ = TQString(); script_output_ = TQString::fromLocal8Bit(tmp).remove(" "); } void Global::slotGetScriptError(TDEProcess*, char* buf, int buflen) { //TODO: Implement some error handling? Q_UNUSED(buf); Q_UNUSED(buflen); } void Global::slotProcessExited(TDEProcess*) { slotProcessTimeout(); } void Global::slotProcessTimeout() { if (loop_started_) { kapp->exit_loop(); loop_started_ = false; } } #include "global.moc"