Example #1
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;
  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;
}
Example #2
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]);
	}
}
Example #3
0
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();
    }
  }
}
Example #4
0
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;
}
Example #5
0
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("&", "&#38;");
	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);
}
Example #6
0
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;
}
Example #7
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;
}