int main (int argc, char **argv)
{
	int c, i;
	opterr = 0;
	bool iactive = false;

	strcpy (homedir, argv[0]);
	for (i = strlen (homedir)-1; i >= 0; i--)
	{
		bool ended = false;
		if (homedir[i] == '/') ended = true;
		homedir[i] = '\0';
		if (ended) break;
	}
	
	sprintf (db_root, DEFAULT_DB_ROOT);
	sprintf (import_root, DEFAULT_IMPORT_ROOT);
	
	while ((c = getopt (argc, argv, "d:i:l:k:r")) != -1)
	{
		switch (c)
		{
			case 'd':
				strcpy (db_root, optarg);
				break;
			case 'l':
				strcpy (homedir, optarg);
				break;
			case 'i':
				strcpy (import_root, optarg);
				break;
			case 'k':
				nice (atoi(optarg));
				break;
			case 'r':
				log_disable ();
				interactive_enable ();
				iactive = true;
				break;
			case '?':
				printf ("Usage:\n");
				printf ("  ./crossepg_importer [options]\n");
				printf ("Options:\n");
				printf ("  -d db_root       crossepg db root folder\n");
				printf ("                   default: %s\n", db_root);
				printf ("  -l homedir       home directory\n");
				printf ("                   default: %s\n", homedir);
				printf ("  -i import_root   import root folder\n");
				printf ("                   default: %s\n", import_root);
				printf ("  -k nice          see \"man nice\"\n");
				printf ("  -r               interactive mode\n");
				printf ("  -h               show this help\n");
				return 0;
		}
	}
	
	while (homedir[strlen (homedir) - 1] == '/') homedir[strlen (homedir) - 1] = '\0';
	while (db_root[strlen (db_root) - 1] == '/') db_root[strlen (db_root) - 1] = '\0';
	while (import_root[strlen (import_root) - 1] == '/') import_root[strlen (import_root) - 1] = '\0';
	
	log_open (db_root);
	log_banner ("CrossEPG Importer");

	sprintf (import_homedir, "%s/import/", homedir);
	
	if (epgdb_open (db_root)) log_add ("EPGDB opened");
	else
	{
		log_add ("Error opening EPGDB");
		epgdb_close ();
		log_close ();
		return 0;
	}
	epgdb_load ();
	
	aliases_make (homedir);
	
	if (iactive) interactive_manager ();
	else
	{
		volatile bool useless = false;
		importer_parse_directory (import_root, db_root, NULL, NULL, NULL, &useless);
		importer_parse_directory (import_homedir, db_root, NULL, NULL, NULL, &useless);
		
		log_add ("Saving data...");
		if (epgdb_save (NULL)) log_add ("Data saved");
		else log_add ("Error saving data");
	}
	
	epgdb_clean ();
	memory_stats ();
	log_close ();
	return 0;
}
int main (int argc, char **argv)
{
	int c, i;
	opterr = 0;
	bool iactive = false;
	
	strcpy (homedir, argv[0]);
	for (i = strlen (homedir)-1; i >= 0; i--)
	{
		bool ended = false;
		if (homedir[i] == '/') ended = true;
		homedir[i] = '\0';
		if (ended) break;
	}

	strcpy (demuxer, DEFAULT_DEMUXER);
	strcpy (provider, DEFAULT_OTV_PROVIDER);

	while ((c = getopt (argc, argv, "h:d:x:l:p:k:riyz")) != -1)
	{
		switch (c)
		{
			case 'd':
				db_root = optarg;
				break;
			case 'x':
				strcpy (demuxer, optarg);
				break;
			case 'l':
				strcpy (homedir, optarg);
				break;
			case 'i':
				printf ("WARNING! Option -i is deprecated\n");
				break;
			case 'p':
				strcpy (provider, optarg);
				break;
			case 'k':
				nice (atoi(optarg));
				break;
			case 'r':
				log_disable ();
				interactive_enable ();
				iactive = true;
				break;
			case 'y':
				huffman_debug_summaries = true;
				break;
			case 'z':
				huffman_debug_titles = true;
				break;
			case '?':
				printf ("Usage:\n");
				printf ("  ./crossepg_downloader [options]\n");
				printf ("Options:\n");
				printf ("  -d db_root    crossepg db root folder\n");
				printf ("                default: %s\n", db_root);
				printf ("  -x demuxer    dvb demuxer\n");
				printf ("                default: %s\n", demuxer);
				printf ("  -l homedir    home directory\n");
				printf ("                default: %s\n", homedir);
				printf ("  -p provider   opentv provider\n");
				printf ("                default: %s\n", provider);
				printf ("  -k nice       see \"man nice\"\n");
				printf ("  -r            interactive mode\n");
				printf ("  -y            debug mode for huffman dictionary (summaries)\n");
				printf ("  -z            debug mode for huffman dictionary (titles)\n");
				printf ("  -h            show this help\n");
				return 0;
		}
	}
	
	while (homedir[strlen (homedir) - 1] == '/') homedir[strlen (homedir) - 1] = '\0';
	while (db_root[strlen (db_root) - 1] == '/') db_root[strlen (db_root) - 1] = '\0';
	
	mkdir (db_root, S_IRWXU|S_IRWXG|S_IRWXO);
	
	log_open (db_root);
	log_banner ("CrossEPG Downloader");

	xmltv_encodings_init ();

	if (iactive) interactive_manager ();
	else
	{
		char opentv_file[256];

		sprintf (opentv_file, "%s/providers/%s.conf", homedir, provider);
		if (providers_read (opentv_file))
		{
			if (providers_get_protocol () == 1)
			{
				log_add ("Provider %s identified as opentv", provider);
				if (!db_load ())
					goto error;
				download_opentv ();
				if (epgdb_save (NULL)) log_add ("Data saved");
				else log_add ("Error saving data");
				db_close ();
			}
			else if (providers_get_protocol () == 2)
			{
				log_add ("Provider %s identified as xmltv", provider);
				log_add ("Preferred language: %s", providers_get_xmltv_plang ());
				if (!db_load ())
					goto error;

				xmltv_channels_init ();
				for (i=0; i<10; i++)
				{
					if (strlen(providers_get_xmltv_channels (i)) == 0)
					{
						log_add ("No more url available");
						log_add ("Error downloading/parsing channels file");
						goto error;
					}
					log_add ("Download channels from url: %s (%d)", providers_get_xmltv_channels (i), i);
					if (xmltv_downloader_channels (providers_get_xmltv_channels (i), db_root, NULL, NULL, &stop))
						break;
				}

				xmltv_parser_set_iso639 (providers_get_xmltv_plang ());
				for (i=0; i<10; i++)
				{
					if (strlen(providers_get_xmltv_url (i)) == 0)
					{
						log_add ("No more url available");
						log_add ("Error downloading/parsing events file");
						goto error;
					}
					log_add ("Download events from url: %s", providers_get_xmltv_url (i));
					if (xmltv_downloader_events (providers_get_xmltv_url (i), db_root, NULL, NULL, &stop))
					{
						if (epgdb_save (NULL)) log_add ("Data saved");
						else log_add ("Error saving data");
						break;
					}
				}
				xmltv_channels_cleanup ();
				db_close ();
			}
			else if (providers_get_protocol () == 3)
			{
				log_add ("Provider %s identified as xepgdb", provider);
				log_add ("Headers url: %s", providers_get_xepgdb_headers_url ());
				log_add ("Descriptors url: %s", providers_get_xepgdb_descriptors_url ());

				if (!db_load ())
					goto error;
				if (dbmerge_downloader (providers_get_xepgdb_headers_url (), providers_get_xepgdb_descriptors_url (), db_root, NULL, NULL, &stop))
				{
					if (epgdb_save (NULL)) log_add ("Data saved");
					else log_add ("Error saving data");
				}
				else
					log_add ("Error downloading/parsing xepgdb files");
				db_close ();
			}
			else if (providers_get_protocol () == 4)
			{
				char filename[1024], tmp[1024], *tmp2;
				log_add ("Provider %s identified as script", provider);
				log_add ("Script file name: %s", providers_get_script_filename ());

				tmp2 = replace_str (providers_get_script_arguments (), "%%dbroot%%", db_root);
				strcpy (tmp, tmp2);
				tmp2 = replace_str (tmp, "%%homedir%%", homedir);
				sprintf (filename, "LD_LIBRARY_PATH=%s %s/scripts/%s %s", homedir, homedir, providers_get_script_filename (), tmp2);

				log_add ("Executing script %s ...", filename);
				system (filename);
				log_add ("Script terminated");
			}
		}
		else
			log_add ("Cannot load provider configuration (%s)", opentv_file);
	}
	
	memory_stats ();
error:
	log_close ();
	return 0;
}
Esempio n. 3
0
void conv_enter(Object *npc, Object *pc, struct conv *conv)
{
	struct KeyHandler kh;

        assert(conv);

        if (! conv->keywords && conv_keyword_highlighting) {
            conv_highlight_keywords(conv);
        }

        /* If NPC initiates conversation, make sure we have a valid session
         * subject, else describe() will crash when determining if unknown NPC
         * is hostile or not. */
        if (! Session->subject) {
            Session->subject = (class Being*)pc;
        }

	log_banner("^c+yCONVERSATION^c-");

        session_run_hook(Session, conv_start_hook, "pp", pc, npc);

        conv_done = 0;
	kh.fx = conv_get_player_query;
	conv_set_query("hail");

	for (;;) {

                /* Truncate the query to 4 characters */
                conv_query[4] = 0;

                conv_mark_if_keyword(conv, conv_query);

                /* If query was NAME, assume the NPC is now known */
                if (!strcasecmp(conv_query, "NAME")) {
                        ((class Character*)npc)->setKnown(true);
                }

                /* Query the NPC */
                closure_exec(conv->proc, "ypp", conv_query, npc, pc);

		if (conv_done)
			break;

		/*** Setup for next query ***/

		memset(conv_query, 0, sizeof(conv_query));
		conv_room = sizeof(conv_query) - 1;
		conv_ptr = conv_query;

		cmdwin_clear();
		cmdwin_push("Say: ");
                console_print("You Say: ");

		/*** Get next query ***/

		eventPushKeyHandler(&kh);
		eventHandle();
		eventPopKeyHandler();

		conv_query[MAX_KEYWORD_SZ] = 0;
		conv_len = strlen(conv_query);
                if (! conv_len)
                        sprintf(conv_query, "bye");
                // End input row
                log_msg("\n");
		//log_msg("^c+%c%s:^c- %s", CONV_PC_COLOR, 
                //        pc->getName(), conv_query);

		/*** Check if player ended conversation ***/

		if (Quit)
			break;

		if (strlen(conv_query) == 0)
			conv_set_query("BYE");

		if (!strcasecmp(conv_query, "BYE")) {
			conv_end();
		}

	}

	cmdwin_clear();
	cmdwin_repaint();

        session_run_hook(Session, conv_end_hook, "pp", pc, npc);
        
}
int main (int argc, char **argv)
{
	int c;
	opterr = 0;
	char *outputfile;
	FILE *fd;
	//char *eventsfile;
	//bool useless = false;

	sprintf (db_root, DEFAULT_DB_ROOT);

	while ((c = getopt (argc, argv, "d:k")) != -1)
	{
		switch (c)
		{
			case 'd':
				strcpy (db_root, optarg);
				break;
			case 'k':
				nice (atoi(optarg));
				break;
			case '?':
				print_help ();
				return 0;
		}
	}
	if (optind != argc-1)
	{
		print_help ();
		return 0;
	}
	else
		outputfile = argv[argc-1];

	while (db_root[strlen (db_root) - 1] == '/') db_root[strlen (db_root) - 1] = '\0';

	log_open (db_root);
	log_banner ("CrossEPG Exporter");

	if (epgdb_open (db_root)) log_add ("EPGDB opened (root=%s)", db_root);
	else
	{
		log_add ("Error opening EPGDB");
		epgdb_close ();
		log_close ();
		return 0;
	}
	epgdb_load ();

	log_add ("Exporting data into %s", outputfile);
	//log_add ("Exporting data into");
	//return 0;
	fd = fopen (outputfile, "w");
	if (fd != NULL)
	{
		int count = 0;
		char *desc, *ldesc, *desc_escaped, *ldesc_escaped;

		fprintf (fd, "nid, tsid, sid, start time, length, description, long description, iso693, event id, mjd, genre_id, flags, revision\n");

		epgdb_channel_t *channel = epgdb_channels_get_first ();
		while (channel != NULL)
		{
			epgdb_title_t *title = channel->title_first;
			while (title != NULL)
			{
				//char row[MAX_ROW_SIZE];
				desc = epgdb_read_description (title);
				ldesc = epgdb_read_long_description (title);
				desc_escaped = escape_string (desc);
				ldesc_escaped = escape_string (ldesc);
				fprintf (fd, "%u, %u, %u, %u, %u, \"%s\", \"%s\", \"%c%c%c\", %u, %u, %u, %u, %u\n",
						channel->nid,
						channel->tsid,
						channel->sid,
						title->start_time,
						title->length,
						desc_escaped,
						ldesc_escaped,
						title->iso_639_1,
						title->iso_639_2,
						title->iso_639_3,
						title->event_id,
						title->mjd,
						title->genre_id,
						title->flags,
						title->revision);

				count++;

				_free (desc);
				_free (ldesc);
				_free (desc_escaped);
				_free (ldesc_escaped);
				title = title->next;
			}

			channel = channel->next;
		}
		fclose (fd);
		log_add ("Exported %d events", count);
	}
	else
		log_add ("Cannot open %s", outputfile);

	epgdb_clean ();
	memory_stats ();
	log_close ();
	return 0;
}