silent_updater::silent_updater(int major, int minor, int update, int build, QObject *parent) : QObject(parent), m_download_aborted(false), m_started(false), m_major(major), m_minor(minor), m_update(update), m_build(build), m_reply(NULL), m_update_reply(NULL), m_filesystem_error(QFile::NoError) { m_check_tm.reset(new QTimer); m_nm.reset(new QNetworkAccessManager); connect(m_check_tm.data(), SIGNAL(timeout()), SLOT(on_check_updates())); if (QFile::exists(old_filename())) QFile::remove(old_filename()); if (QFile::exists(update_filename())) QFile::remove(update_filename()); }
void mac_trc_update_all_info() { Rect r; SetPortWindowPort(win.ref); SetRect(&r, 0,0, win.ref->portRect.right,UPPER_MERGIN); EraseRect(&r); mac_trc_update_voices(); update_filename(); update_title(); mac_trc_update_time(-1,-1); }
/* write event data to xml file */ void xml_write_node (gint node_id, gint light, gint temp, gint time) { xmlNodePtr xml_node = xmlNewChild (root_node, NULL, "light_temp_event", NULL); gchar buf[256]; snprintf (buf, sizeof (buf), "%d", node_id); xmlNewChild (xml_node, NULL, "node_id", buf); snprintf (buf, sizeof (buf), "%d", light); xmlNewChild (xml_node, NULL, "light", buf); snprintf (buf, sizeof (buf), "%d", temp); xmlNewChild (xml_node, NULL, "temp", buf); snprintf (buf, sizeof (buf), "%d", time); xmlNewChild (xml_node, NULL, "time", buf); xmlSaveFormatFileEnc (current_file, doc, "UTF-8", 1); update_filename (); }
int main (int argc, char** argv) { gchar* hostname; gint port; GMainLoop* main_loop; GConn* conn; gnet_init (); /* Parse args */ if (argc != 4) { g_print ("usage: %s <server> <port> <output-directory>\n", argv[0]); exit(EXIT_FAILURE); } hostname = argv[1]; port = atoi(argv[2]); out_dir = argv[3]; check_dir (out_dir); update_filename (); /* Create the main loop */ main_loop = g_main_new(FALSE); /* Create connection object */ conn = gnet_conn_new (hostname, port, ob_conn_func, NULL); g_assert (conn); /* Connect */ gnet_conn_connect (conn); gnet_conn_set_watch_error (conn, TRUE); gnet_conn_timeout (conn, 30000); /* 30 second timeout */ //open the xml file init_xml (); atexit (flush_xml); /* Start the main loop */ g_main_run (main_loop); exit (EXIT_SUCCESS); return 0; }
void silent_updater::on_update_check_finished() { // network request completed if (m_update_reply->error() == QNetworkReply::NoError) { // ok, no errors QByteArray data = m_update_reply->readAll(); QString xml = QString::fromUtf8(data.constData()); QDomDocument doc; QString errorStr; int errorLine; int errorColumn; if (doc.setContent(xml, true, &errorStr, &errorLine, &errorColumn)) { QDomElement root = doc.documentElement(); QDomNode node = root.firstChild(); while(!node.isNull()) { QDomElement element = node.toElement(); // validate element if (!element.isNull() && (element.tagName() == "qmule") && !element.attribute("url").isEmpty()) { qDebug() << "url: " << element.attribute("url"); QRegExp vrx("(\\d+.\\d+.\\d+.\\d+)"); if (vrx.exactMatch(element.attribute("version"))) { QStringList vlist = element.attribute("version").split("."); if (vlist.size() == 4) { if (vlist.at(0).toInt() > m_major) { // current version is obsolete emit current_version_is_obsolete(vlist.at(0).toInt(), vlist.at(1).toInt(), vlist.at(2).toInt(), vlist.at(3).toInt()); } else if (vlist.at(0).toInt() == m_major) // execute update only when major versions are equals { bool update = false; if (vlist.at(3).toInt() > m_build) update = true; if (vlist.at(2).toInt() > m_update) update = true; if (vlist.at(2).toInt() < m_update) update = false; if (vlist.at(1).toInt() > m_minor) update = true; if (vlist.at(1).toInt() < m_minor) update = false; if (update) { // need update ! qDebug() << "new version was found " << element.attribute("version"); m_file.reset(new QFile(update_filename())); if (QFile::exists(update_filename())) QFile::remove(update_filename()); // check file if (!m_file->open(QIODevice::WriteOnly)) { qDebug() << "can't create file " << update_filename(); m_file.reset(); } else { qDebug() << "start network request"; // store new version m_major = vlist.at(0).toInt(); m_minor = vlist.at(1).toInt(); m_update= vlist.at(2).toInt(); m_build = vlist.at(3).toInt(); // start async request and return m_reply = m_nm->get(QNetworkRequest(QUrl(element.attribute("url")))); connect(m_reply, SIGNAL(readyRead()), SLOT(on_data_ready())); connect(m_reply, SIGNAL(finished()), SLOT(on_data_finished())); m_update_reply->deleteLater(); m_update_reply = NULL; return; } } } else { qDebug() << "incompatible majors: our: " << m_major << " web: " << vlist.at(0).toInt(); } } else { qDebug() << "what is it? list size incorrect - it is impossible"; } } else { qDebug() << "unrecognized version: " << element.attribute("version"); } } node = node.nextSibling(); } } else { qDebug() << "fail on decode xml " << xml << " with error " << errorStr; } } else { qDebug() << "error on update request " << m_update_reply->error(); } m_update_reply->deleteLater(); m_update_reply = NULL; // start new cycle - possible we got temporary fail m_check_tm->start(update_timeout); }
void silent_updater::on_data_finished() { qDebug() << "data finished"; bool bCompleted = true; // read last part on_data_ready(); m_file->flush(); // check errors if (m_reply->error() || (m_filesystem_error != QFile::NoError)) { bCompleted = false; qDebug() << "error on finished " << m_reply->error() << " or filesystem error " << m_filesystem_error; // clear resources m_file->remove(); m_filesystem_error = QFile::NoError; } //remove updater and file holder m_reply->deleteLater(); m_reply = NULL; m_file.reset(); if (bCompleted) { qDebug() << "new file download was completed - upgrade it"; QFile f(update_filename()); #ifdef Q_WS_WIN if (!MoveFileExA(current_filename().toLocal8Bit(), old_filename().toLocal8Bit(), MOVEFILE_COPY_ALLOWED)) { qDebug() << "error on move file : " << current_filename() << " to " << old_filename() << GetLastError(); } #else if (!QFile::remove(current_filename())) { qDebug() << "unable to remove file " << current_filename(); } #endif else { qDebug() << "move completed succefully"; if (f.copy(current_filename())) { qDebug() << "new program succesfully copied"; QFile::setPermissions(current_filename(), QFile::permissions(current_filename()) | QFile::ExeUser | QFile::ExeGroup); emit new_version_ready(m_major, m_minor, m_update, m_build); } else { qDebug() << "unable to replace current file"; } } } else { // start new upgrade iteration when changes weren't made m_check_tm->start(update_timeout); } }
static int wget_log_process_line (GwgetData *gwgetdata) { gchar *p; gint dots = 0; if ((gwgetdata->line == NULL) || (strlen (gwgetdata->line) == 0)) return 0; switch (gwgetdata->state) { case DL_NOT_CONNECTED: if (strstr(gwgetdata->line," => `")) { /* wget <1.11 */ update_filename(gwgetdata); break; } /* First check to see if we connected to the host correctly. */ /* Wget 1.8.1 says "connected." rather than "connected!" */ if (strstr (gwgetdata->line, "connected!") != NULL || strstr (gwgetdata->line, "connected.") != NULL) { gwget_data_set_state (gwgetdata, DL_CONNECTED); break; } /* Second filter out other non-error messages that can precede "connected" */ if (strncmp (gwgetdata->line, "--", 2) == 0 || strncmp (gwgetdata->line, " ", 2) == 0) break; if ((strncmp (gwgetdata->line, "Connecting to ", 14) == 0) && (strstr (gwgetdata->line, "failed: ") == NULL)) break; /* Wget 1.8.1 adds an explicit "Resolving" status msg */ if ((strstr (gwgetdata->line, "Resolving") != NULL) && (strstr (gwgetdata->line, "Host not found.") == NULL) && (strstr (gwgetdata->line, "Name or service not known") == NULL)) break; /* Wget, under certain circumstances, returns a list of resolved IP addresses * before attempting to connect, which can be ignored. */ /* Test for ipv4 address */ dots = 0; for (p = gwgetdata->line; p[0]; p ++) { if (isdigit (p[0])) continue; else if (p[0] == '.') dots ++; else if ((p[0] == '\n') || (p[0] == ',')) break; else break; } if ((! p[0]) || (p[0] == '\n') || (p[0] == ',')) { if (dots == 3) break; } /* Test for ipv6 address */ dots = 0; for (p = gwgetdata->line; p[0]; p ++) { if (isxdigit (p[0])) continue; else if (p[0] == ':') dots ++; else if ((p[0] == '\n') || (p[0] == ',')) break; else break; } if ((! p[0]) || (p[0] == '\n') || (p[0] == ',')) { if (dots > 1) break; } /* Failing the above checks, we _assume_ we have an error. The wget process will * be killed after we create an error message. */ if (strncmp (gwgetdata->line, "socket: ", 8) == 0) show_error (gwgetdata, _ ("Socket error")); else if (strncmp (gwgetdata->line, "Connection to ", 14) == 0) show_error (gwgetdata, _ ("Connection refused")); else if (strstr (gwgetdata->line, "No route to host") != NULL) show_error (gwgetdata, _ ("No route to host")); else if (strncmp (gwgetdata->line, "connect: ", 9) == 0) show_error (gwgetdata, _ ("Connection refused when downloading URL:")); else if (strstr (gwgetdata->line, "Host not found.") != NULL) show_error (gwgetdata, _ ("Host not found")); else if (strstr (gwgetdata->line, "Name or service not known") != NULL) show_error (gwgetdata, _ ("Name or service not known")); else if (strstr (gwgetdata->line, "unsupported protocol") != NULL) show_error (gwgetdata, _ ("Unsupported protocol")); else if (strstr (gwgetdata->line, "Refusing to truncate existing") != NULL) show_error(gwgetdata, _("Refusing to truncate existing file")); else if (strstr (gwgetdata->line, "unable to resolve")) show_error (gwgetdata, _ ("Unable to resolve host address")); else if ((p = strstr (gwgetdata->line, "failed: ")) != NULL) { /* * This is somewhat generic looking, but is informative */ show_error (gwgetdata, p + 8); } else { /* * All other possible output may as well be reported, since we treat it * as an error. We tag the message as unknown to make it more meaningful. */ p = g_strconcat (_ ("Unknown error "), gwgetdata->line, NULL); show_error (gwgetdata, p); g_free (p); } kill (gwgetdata->wget_pid, SIGKILL); return 1; break; case DL_CONNECTED: /* File not found for FTP */ if (strncmp (gwgetdata->line, "No such file ", 13) == 0 || strncmp (gwgetdata->line, "No such dir", 11) == 0) { show_error (gwgetdata, _ ("File not found")); break; } /* File not found for HTTP or Proxy */ if (strstr (gwgetdata->line, "ERROR") != NULL) { gwget_data_set_state (gwgetdata, DL_ERROR); show_error (gwgetdata, _ ("File not found")); break; } /* local file conflicts */ if (strstr (gwgetdata->line, "Continued download fail") != NULL) { show_error (gwgetdata, _ ("Can't continue download, existing local file " "conflicts with remote file")); break; } /* Incorrect login or FTP with limited concurrent downloads */ if (strstr (gwgetdata->line, "Login incorrect") != NULL) { if (check_server_already_exists(gwgetdata->url)==TRUE) { /* Login is correct but there is a limit in concurrents downloads */ gwget_data_set_state (gwgetdata, DL_WAITING); } else { gwget_data_set_state (gwgetdata, DL_ERROR); } break; } /* Get the leght of file being downloaded */ p = strstr (gwgetdata->line, "Length: "); if (p != NULL) { p += 8; /* Only set the total size if we don't have one yet. */ if (gwgetdata->total_size == 0 && !gwgetdata->recursive) { gwget_data_set_total_size (gwgetdata,convert_wget_size (p)); } gwget_data_set_state (gwgetdata, DL_RETRIEVING); set_icon_newdownload(); set_start_size_and_time(gwgetdata); gwgetdata->session_elapsed = 0; } else { /* We didn't get a length so, probably it's unspecified size so get the start of download by trying to catch the string "K ->" */ p = strstr (gwgetdata->line, "K -> "); if (p != NULL) { /* Unspecified size, so set total_size to 0 */ gwget_data_set_total_size (gwgetdata, 0); gwget_data_set_state (gwgetdata, DL_RETRIEVING); set_start_size_and_time(gwgetdata); } gwgetdata->session_elapsed = 0; } break; case DL_RETRIEVING: if (strstr(gwgetdata->line,"Saving to: `")) { /* wget >=1.11 */ update_filename(gwgetdata); break; } if (strncmp (gwgetdata->line, "Cannot write to ", 15) == 0) { show_error (gwgetdata, _ ("Can't write to target directory")); kill (gwgetdata->wget_pid, SIGKILL); return 1; break; } if (gwgetdata->recursive) { /* Get the leght of file being downloaded */ p = strstr (gwgetdata->line, "Length: "); if (p != NULL) { p += 8; gwget_data_set_total_size (gwgetdata,convert_wget_size (p)); set_start_size_and_time(gwgetdata); gwgetdata->session_elapsed = 0; } else { /* We didn't get a length so, probably it's unspecified size so get the start of download by trying to catch the string "K ->" */ p = strstr (gwgetdata->line, "K -> "); if (p != NULL) { /* Unspecified size, so set total_size to 0 */ gwget_data_set_total_size (gwgetdata, 0); set_start_size_and_time(gwgetdata); } gwgetdata->session_elapsed = 0; } if (strstr (gwgetdata->line,"-- ") != NULL) { gchar *tmp=NULL; gint i,j; j=0; tmp = g_new(gchar,strlen(gwgetdata->line)); for (i=14;i<strlen(gwgetdata->line);i++) { tmp[j]=gwgetdata->line[i]; j++; } tmp[j]='\0'; gwget_data_set_filename_from_url(gwgetdata,tmp); gwgetdata->local_filename = g_strconcat (gwgetdata->dir, gwgetdata->filename, NULL); g_free(tmp); } if (strstr (gwgetdata->line, " =>") != NULL) { gchar *tmp=NULL; gint i,j; j=0; tmp = g_new(gchar,strlen(gwgetdata->line)); for (i=15;i<strlen(gwgetdata->line);i++) { tmp[j]=gwgetdata->line[i]; j++; } /* Remove the las ' character */ tmp[j-1]='\0'; gwgetdata->local_filename = g_strdup (tmp); gwgetdata->cur_size=0; gwgetdata->total_size=0; gwgetdata->session_start_time = 0; gwgetdata->session_start_size = 0; g_free(tmp); } } break; default: break; } return 0; }