/** \brief parse option from configuration file. * * \param[in,out] as Pointer to session handle * \param[in] opt name of option to set (left of =) * \param[in] param name of value for option (right of =) * \param type type for param, currently unused * \return 0 if parsing was successful, -1 if an error occured. currently * always returns 0 */ PRIVATE int set_option(auto_handle *as, const char *opt, const char *param, option_type type) { int32_t numval; dbg_printf(P_INFO2, "%s=%s (type: %d)", opt, param, type); assert(as != NULL); if(!strcmp(opt, "url")) { getFeeds(&as->feeds, param); } else if(!strcmp(opt, "feed")) { parseFeed(&as->feeds, param); } else if(!strcmp(opt, "download-folder")) { set_path(param, &as->download_folder); } else if(!strcmp(opt, "statefile")) { set_path(param, &as->statefile); } else if(!strcmp(opt, "interval")) { numval = parseUInt(param); if(numval > 0) { as->check_interval = numval; } else if(numval != -1) { dbg_printf(P_ERROR, "Interval must be 1 minute or more, reverting to default (%dmin)\n\t%s=%s", AM_DEFAULT_INTERVAL, opt, param); } else { dbg_printf(P_ERROR, "Unknown parameter: %s=%s", opt, param); } } else if(!strcmp(opt, "patterns")) { addPatterns_old(&as->filters, param); } else if(!strcmp(opt, "filter")) { parseFilter(&as->filters, param); } else if(!strcmp(opt, "prowl-apikey")) { as->prowl_key = am_strdup(param); } else if(!strcmp(opt, "download-done-script")) { as->download_done_script = am_strdup(param); } else { dbg_printf(P_ERROR, "Unknown option: %s", opt); } return 0; }
void NewsFeed::addFeed(QString title, QUrl url, int limit) { m_urls[title] = url; m_limits[title] = limit; m_feeds[title] = QString(); if (m_currentActive.isEmpty()) { setActive(title); } QFile f(confDir() + "/feeds/" + title + ".xml"); f.open(QIODevice::ReadOnly); if (f.isOpen()) { QString feed(f.readAll()); m_feeds[title] = parseFeed(feed, limit); setHtml(m_feeds[title]); } }
void RssParser::run() { while (m_running) { m_mutex.lock(); if (!m_queue.empty()) { ParsingJob job = m_queue.dequeue(); m_mutex.unlock(); parseFeed(job); } else { qDebug() << Q_FUNC_INFO << "Thread is waiting."; m_waitCondition.wait(&m_mutex); qDebug() << Q_FUNC_INFO << "Thread woke up."; m_mutex.unlock(); } } }
bool RSS10Parser::parseXmlDoc(xmlDocPtr doc) { if (!doc) return false; xmlNode* node = xmlDocGetRootElement(doc); if (!node) { xmlFreeDoc(doc); return false; } for (; node; node = node->next) { String name(reinterpret_cast<const char*>(node->name)); if (name == "RDF") { xmlNode* childnode = node->children; for (; childnode; childnode = childnode->next) { if (childnode->type == XML_ELEMENT_NODE) { name = String(reinterpret_cast<const char*>(childnode->name)); name.makeLower(); if (name == "channel") { BLACKBERRY_ASSERT(!m_root); if (!m_root) m_root = parseFeed(childnode->children); } else if (name == "item") { BLACKBERRY_ASSERT(m_root); if (m_root) { RSSItem* item = parseItem(childnode->children); if (item) m_root->m_items.append(item); } } } } } } xmlFreeDoc(doc); return m_root; }
void NewsFeed::requestFinished(int code, bool error) { if (!m_links[m_reqs[code]]) { return; } if (error) { m_feeds[m_reqs[code]] = m_links[m_reqs[code]]->errorString(); return; } QString feed = m_links[m_reqs[code]]->readAll(); feed.replace("&", "&"); feed.replace("“", "\""); feed.replace("”", "\""); m_feeds[m_reqs[code]] = parseFeed(feed, m_limits[m_reqs[code]]); if (!m_feeds[m_reqs[code]].size()) { m_feeds[m_reqs[code]] = feed; } if (currentActive() == m_reqs[code]) { setActive(m_reqs[code]); } // save cache QDir d(confDir()); if (!d.exists("feeds")) { d.mkdir("feeds"); } QFile f(d.absolutePath() + "/feeds/" + m_reqs[code] + ".xml"); f.open(QIODevice::WriteOnly); if (f.isOpen()) { f.write(feed.toAscii()); } // cleanup m_links[m_reqs[code]]->deleteLater(); m_links.remove(m_reqs[code]); m_reqs.remove(code); }
int main(int argc, char* argv[]) { // Parse command line arguments, use defaults when needed ArgumentStruct* args; args = parseArguments(argc, argv); // Struct to store response from CURL MessageStruct response; struct tm* lastUpdated = getTime(&response, args->url); // Preapre response for re-use freeResponse(response); // Get RSS feed from server if (args->update) { // If we're either not refetching the same URL, or it has updates if (args->ignoreTimestamp || fetchingNewURL(args) || args->previouslyFetchedURL == NULL || timeDiff(&(args->lastUpdated), lastUpdated)) { if(get(&response, args->url)) { printf("ERROR : Could not find feed at %s\n", args->url); freeArgs(args); return 1; } // Write result out to file if(storeFeed(response, args->dataFile, args->tempDirectory)) { printf("ERROR : Writing response to file (Running again should fix this)\n"); freeArgs(args); return 1; } } else { printf("No updates for feed : %s\n", args->url); freeArgs(args); return 0; } } // Create array of article sturctures RSSFeed* feed = NULL; feed = parseFeed(args); // Display feed displayFeed(feed, args); storeSettings(args, feed); // Free everything that has been dynamically allocated freeFeed(feed); freeResponse(response); freeArgs(args); return 0; }
/** \brief parse option from configuration file. * * \param[in,out] as Pointer to session handle * \param[in] opt name of option to set (left of =) * \param[in] param name of value for option (right of =) * \param type type for param, currently unused * \return 0 if parsing was successful, -1 if an error occured. currently * always returns 0 */ PRIVATE int set_option(auto_handle *as, const char *opt, const char *param, option_type type) { int32_t numval; int32_t result = SUCCESS; dbg_printf(P_INFO2, "[config] %s=%s (type: %d)", opt, param, type); assert(as != NULL); if(!strcmp(opt, "url")) { dbg_printf(P_ERROR, "the 'url' option is not supported any more, please use the 'feed' option instead!"); result = FAILURE; } else if(!strcmp(opt, "feed")) { result = parseFeed(&as->feeds, param); } else if(!strcmp(opt, "transmission-home")) { set_path(param, &as->transmission_path); } else if(!strcmp(opt, "prowl-apikey")) { as->prowl_key = am_strdup(param); } else if(!strcmp(opt, "toasty-deviceid")) { as->toasty_key = am_strdup(param); } else if(!strcmp(opt, "pushalot-token")) { as->pushalot_key = am_strdup(param); } else if(!strcmp(opt, "transmission-version")) { if (!strcmp(param, "external")) { /* we should probably only set this when transmission-external is set */ as->transmission_version = AM_TRANSMISSION_EXTERNAL; } else if(param[0] == '1' && param[1] == '.' && param[2] == '2') { as->transmission_version = AM_TRANSMISSION_1_2; } else if(param[0] == '1' && param[1] == '.' && param[2] == '3') { as->transmission_version = AM_TRANSMISSION_1_3; } else { dbg_printf(P_ERROR, "Unknown parameter: %s=%s", opt, param); } } else if (!strcmp(opt, "transmission-external")) { set_path(param, &as->transmission_external); as->transmission_version = AM_TRANSMISSION_EXTERNAL; } else if(!strcmp(opt, "torrent-folder")) { set_path(param, &as->torrent_folder); } else if(!strcmp(opt, "statefile")) { set_path(param, &as->statefile); } else if(!strcmp(opt, "rpc-host")) { as->host = am_strdup(param); } else if(!strcmp(opt, "rpc-auth")) { as->auth = am_strdup(param); } else if(!strcmp(opt, "upload-limit")) { numval = parseUInt(param); if(numval > 0) { as->upspeed = (uint16_t)numval; } else { dbg_printf(P_ERROR, "Unknown parameter: %s=%s", opt, param); } } else if(!strcmp(opt, "rpc-port")) { numval = parseUInt(param); if (numval > 1024 && numval < 65535) { as->rpc_port = numval; } else if(numval != -1) { dbg_printf(P_ERROR, "RPC port must be an integer between 1025 and 65535, reverting to default (%d)\n\t%s=%s", AM_DEFAULT_RPCPORT, opt, param); } else { dbg_printf(P_ERROR, "Unknown parameter: %s=%s", opt, param); } } else if(!strcmp(opt, "interval")) { numval = parseUInt(param); if(numval > 0) { as->check_interval = numval; } else if(numval != -1) { dbg_printf(P_ERROR, "Interval must be 1 minute or more, reverting to default (%dmin)\n\t%s=%s", AM_DEFAULT_INTERVAL, opt, param); } else { dbg_printf(P_ERROR, "Unknown parameter: %s=%s", opt, param); } } else if(!strcmp(opt, "use-transmission")) { if(!strncmp(param, "0", 1) || !strncmp(param, "no", 2)) { as->use_transmission = 0; } else if(!strncmp(param, "1", 1) || !strncmp(param, "yes", 3)) { as->use_transmission = 1; } else { dbg_printf(P_ERROR, "Unknown parameter: %s=%s", opt, param); } } else if(!strcmp(opt, "start-torrents")) { if(!strncmp(param, "0", 1) || !strncmp(param, "no", 2)) { as->start_torrent = 0; } else if(!strncmp(param, "1", 1) || !strncmp(param, "yes", 3)) { as->start_torrent = 1; } else { dbg_printf(P_ERROR, "Unknown parameter for option '%s': '%s'", opt, param); } } else if(!strcmp(opt, "patterns")) { dbg_printf(P_ERROR, "the 'patterns' option is not supported any more, please use the 'filter' option instead!"); result = FAILURE; } else if(!strcmp(opt, "filter")) { result = parseFilter(&as->filters, param); } else { dbg_printf(P_ERROR, "Unknown option: %s", opt); } return result; }