/* Jungle Monkey Multicast Search Protocol Client * Copyright (C) 2000-2001 The Regents of the University of Michigan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "config.h" #include #include #include #include #include #include #include #include #ifdef JM_ENABLE_GNOME #include #else #include #endif #include "jmintl.h" #include "util/util.h" #include "jmmsp.h" #include "jmmsp_debug.h" #include "jmmsp_cache.h" #include "jmmsp_search.h" #include "jmmsp_vfs.h" static void sig_int_cb (int ignore); static void search_cb (JMMSPSearch* search, JMMSPSearchID id, const JMMSPReply* reply, gpointer user_data); static void error_cb (JMMSP* jmmsp, gpointer user_data); /* ******************** */ /* Globals */ static int verbose = 0; static BPeer* bpeer; static JMMSP* jmmsp; static JMMSPCache* jmmsp_cache; static JMMSPVFS* jmmsp_vfs; static JMMSPSearch* jmmsp_search; static JMMSPSearchID search_id; extern int btp_debug_level; extern unsigned int btp_debug_flags; int main(int argc, char* argv[]) { const gchar* url = NULL; GMainLoop* main_loop; const gchar* keyword = NULL; const gchar* file = NULL; gboolean do_cache = FALSE; struct poptOption jm_options[] = { {"help", 'h', POPT_ARG_NONE, NULL, 1, "Show this help message", NULL}, {"usage", '\0', POPT_ARG_NONE, NULL, 2, "Display brief usage message", NULL}, {"version", 0, POPT_ARG_NONE, NULL, 3, "Output verson information and exit", NULL}, {"verbose", 'v', POPT_ARG_NONE, &verbose, 0, "Print lots of stuff", NULL}, {"keyword", 'k', POPT_ARG_STRING, &keyword, 0, "Keyword", "KEYWORD"}, {"cache", '\0', POPT_ARG_NONE, &do_cache, 0, "Cache replies", NULL}, {NULL, '\0', 0, NULL, 0, NULL, NULL} }; poptContext ctx; int rc; int exit_status = EXIT_SUCCESS; /* ******************** */ /* Initialize NLS */ #ifdef ENABLE_NLS { /* gtk_set_locale(); */ bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); } #endif /* ******************** */ /* Parse command line */ ctx = poptGetContext(NULL, argc, (const char**) argv, jm_options, 0); poptSetOtherOptionHelp(ctx, _("[OPTION]... [URL] [FILES]...")); while ((rc = poptGetNextOpt(ctx)) > 0) { switch (rc) { case 1: goto help; break; case 2: goto usage; break; case 3: goto version; break; } } url = poptGetArg(ctx); if (url == NULL) { g_print ("*** You must specify a URL.\n"); goto usage; } /* Catch SIGINT */ signal (SIGINT, sig_int_cb); /* ******************** */ /* Create bpeer */ /* btp_debug_level = 1; */ /* btp_debug_flags = 0xFFFF; */ /* jmmsp_debug_flags = 0xffff; */ bpeer = b_peer_new ("ask.eecs.umich.edu", NULL, FALSE); g_assert (bpeer); g_print ("BTP open at %s:%d\n", bpeer->hostname, bpeer->port); /* ******************** */ /* Join/create jmmsp */ if (!strncmp(url, "jmmsp://", sizeof("jmmsp://")-1)) /* JOIN */ { GURL* gurl; gurl = gnet_url_new (url); if (gurl == NULL) { g_print ("*** Malformed URL: %s\n", url); goto usage; } jmmsp = jmmsp_join (bpeer, gurl); if (!jmmsp) { fprintf (stderr, "%s: Could not join group %s\n", argv[0], url); exit (EXIT_FAILURE); } g_print ("Joined %s\n", url); } else { jmmsp = jmmsp_create (bpeer, url); /* CREATE */ if (!jmmsp) { fprintf (stderr, "%s: Could not join group %s\n", argv[0], url); exit (EXIT_FAILURE); } g_print ("Created jmmsp://%s:%d/%s\n", bpeer->hostname, bpeer->port, url); } jmmsp->error_func = error_cb; /* Create Cache */ if (do_cache) { jmmsp_cache = jmmsp_cache_new (); jmmsp_cache_set_policy (jmmsp_cache, JMMSP_CACHE_SIZE_DEFAULT, JMMSP_CACHE_TIMEOUT_DEFAULT); jmmsp_add_handler (jmmsp, (JMMSPHandler*) jmmsp_cache); } /* Create VFS */ jmmsp_vfs = jmmsp_vfs_new (); while ((file = poptGetArg(ctx)) != NULL) { GURL* dummy_url; dummy_url = gnet_url_new_fields ("http", "localhost", 0, file); jmmsp_vfs_add (jmmsp_vfs, file, dummy_url, 0); } jmmsp_add_handler (jmmsp, (JMMSPHandler*) jmmsp_vfs); /* Create search */ jmmsp_search = jmmsp_search_new (); jmmsp_add_handler (jmmsp, (JMMSPHandler*) jmmsp_search); if (keyword) { search_id = jmmsp_search_query (jmmsp_search, keyword, search_cb, NULL); g_assert (search_id); } poptFreeContext(ctx); /* ******************** */ /* Start the main loop */ main_loop = g_main_new(FALSE); g_main_run(main_loop); exit(EXIT_SUCCESS); usage: poptPrintUsage(ctx, stdout, 0); exit(exit_status); help: g_print (_("`jmmspclient' - Jungle Monkey Multicast Search Protocol Client\n")); poptPrintHelp(ctx, stdout, 0); g_print (_("\n" "Report bugs to \n")); exit(exit_status); version: g_print (_("jmmspclient %s\n" "Written by David A. Helder\n" "\n" "Copyright (C) 2000-2001 The Regents of the University of Michigan\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"), VERSION); exit(exit_status); } /* **************************************** */ static void sig_int_cb (int ignore) { /* Reset signal handler */ signal (SIGINT, SIG_DFL); /* Delete stuff */ if (jmmsp_search) { if (search_id) jmmsp_search_cancel (jmmsp_search, search_id); /* jmmsp_search_delete (jmmsp_search); */ } if (jmmsp_vfs) jmmsp_vfs_delete (jmmsp_vfs); if (jmmsp_cache) jmmsp_cache_delete (jmmsp_cache); if (jmmsp) { fprintf (stderr, "is up = %d\n", jmmsp_is_up (jmmsp)); jmmsp_delete (jmmsp); } exit (EXIT_SUCCESS); } static void search_cb(JMMSPSearch* search, JMMSPSearchID id, const JMMSPReply* reply, gpointer user_data) { if (reply) { gchar* url_str; url_str = gnet_url_get_nice_string (reply->url); g_print ("JMMSP Match: %s, %s, %d\n", reply->name, url_str, reply->length); g_free (url_str); } else { g_print ("JMMSP Search error.\n"); search_id = NULL; } } static void error_cb (JMMSP* jmmsp, gpointer user_data) { g_print ("JMMSP Error\n"); }