Diff of /trunk/src/wms.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 13 by harbaum, Thu Dec 11 20:34:41 2008 UTC revision 14 by harbaum, Mon Dec 15 19:45:38 2008 UTC
# Line 465  static wms_layer_t *wms_get_requestable_ Line 465  static wms_layer_t *wms_get_requestable_
465    return r_layer;    return r_layer;
466  }  }
467    
468    enum {
469      WMS_SERVER_COL_NAME = 0,
470      WMS_SERVER_COL_DATA,
471      WMS_SERVER_NUM_COLS
472    };
473    
474    typedef struct {
475      appdata_t *appdata;
476      wms_t *wms;
477      GtkWidget *dialog, *view;
478      GtkListStore *store;
479      GtkWidget *but_add, *but_edit, *but_remove;
480      GtkWidget *server_label, *path_label;
481    } wms_server_context_t;
482    
483    static wms_server_t *get_selection(wms_server_context_t *context) {
484      GtkTreeSelection *selection;
485      GtkTreeModel     *model;
486      GtkTreeIter       iter;
487    
488      selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(context->view));
489      if(gtk_tree_selection_get_selected(selection, &model, &iter)) {
490        wms_server_t *wms_server;
491        gtk_tree_model_get(model, &iter, WMS_SERVER_COL_DATA, &wms_server, -1);
492        return(wms_server);
493      }
494    
495      return NULL;
496    }
497    
498    static void wms_server_selected(wms_server_context_t *context,
499                                    wms_server_t *selected) {
500    
501      if(!selected && context->wms->server && context->wms->path) {
502        /* if the projects settings match a list entry, then select this */
503    
504        GtkTreeSelection *selection =
505          gtk_tree_view_get_selection(GTK_TREE_VIEW(context->view));
506    
507        /* walk the entire store to get all values */
508        wms_server_t *server = NULL;
509        GtkTreeIter iter;
510    
511        gboolean valid =
512          gtk_tree_model_get_iter_first(GTK_TREE_MODEL(context->store), &iter);
513    
514        while(valid && !selected) {
515          gtk_tree_model_get(GTK_TREE_MODEL(context->store), &iter,
516                             WMS_SERVER_COL_DATA, &server, -1);
517          g_assert(server);
518    
519          if((strcmp(server->server, context->wms->server) == 0) &&
520             (strcmp(server->path, context->wms->path) == 0)) {
521            gtk_tree_selection_select_iter(selection, &iter);
522            selected = server;
523          }
524    
525          valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(context->store), &iter);
526        }
527      }
528    
529      gtk_widget_set_sensitive(context->but_remove, selected != NULL);
530      gtk_widget_set_sensitive(context->but_edit, selected != NULL);
531    
532      /* user can click ok if a entry is selected or if both fields are */
533      /* otherwise valid */
534      if(selected) {
535        gtk_dialog_set_response_sensitive(GTK_DIALOG(context->dialog),
536                          GTK_RESPONSE_ACCEPT, TRUE);
537    
538        gtk_label_set_text(GTK_LABEL(context->server_label), selected->server);
539        gtk_label_set_text(GTK_LABEL(context->path_label), selected->path);
540      } else {
541        gtk_dialog_set_response_sensitive(GTK_DIALOG(context->dialog),
542                  GTK_RESPONSE_ACCEPT, context->wms->server && context->wms->path);
543    
544        if(context->wms->server)
545          gtk_label_set_text(GTK_LABEL(context->server_label),
546                             context->wms->server);
547        if(context->wms->path)
548          gtk_label_set_text(GTK_LABEL(context->path_label),
549                             context->wms->path);
550      }
551    }
552    
553    static gboolean
554    wms_server_selection_func(GtkTreeSelection *selection, GtkTreeModel *model,
555                         GtkTreePath *path, gboolean path_currently_selected,
556                         gpointer userdata) {
557      wms_server_context_t *context = (wms_server_context_t*)userdata;
558      GtkTreeIter iter;
559    
560      if(gtk_tree_model_get_iter(model, &iter, path)) {
561        wms_server_t *wms_server = NULL;
562    
563        g_assert(gtk_tree_path_get_depth(path) == 1);
564        gtk_tree_model_get(model, &iter, WMS_SERVER_COL_DATA, &wms_server, -1);
565        wms_server_selected(context, wms_server);
566      }
567    
568      return TRUE; /* allow selection state to change */
569    }
570    
571    static void on_server_remove(GtkWidget *but, wms_server_context_t *context) {
572      GtkTreeSelection *selection;
573      GtkTreeModel     *model;
574      GtkTreeIter       iter;
575    
576      selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(context->view));
577      if(gtk_tree_selection_get_selected(selection, &model, &iter)) {
578        wms_server_t *server = NULL;
579        gtk_tree_model_get(model, &iter, WMS_SERVER_COL_DATA, &server, -1);
580    
581        g_assert(server);
582    
583        /* de-chain */
584        printf("de-chaining server %s\n", server->name);
585        wms_server_t **prev = &context->appdata->settings->wms_server;
586        while(*prev != server) prev = &((*prev)->next);
587        *prev = server->next;
588    
589        /* free tag itself */
590        wms_server_free(server);
591    
592        /* and remove from store */
593        gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
594      }
595    
596      wms_server_selected(context, NULL);
597    }
598    
599    static void callback_modified_name(GtkWidget *widget, gpointer data) {
600      wms_server_context_t *context = (wms_server_context_t*)data;
601    
602      char *name = (char*)gtk_entry_get_text(GTK_ENTRY(widget));
603    
604      /* name must not contain some special chars */
605      gboolean ok = TRUE;
606    
607      /* search all entries except the last (which is the one we are editing) */
608      wms_server_t *server = context->appdata->settings->wms_server;
609      while(server && server->next) {
610        if(strcasecmp(server->name, name) == 0) ok = FALSE;
611        server = server->next;
612      }
613    
614      GtkWidget *toplevel = gtk_widget_get_toplevel(widget);
615      /* toplevel is a dialog only of dialog has been realized */
616      if(GTK_IS_DIALOG(toplevel))
617        gtk_dialog_set_response_sensitive(
618                          GTK_DIALOG(gtk_widget_get_toplevel(widget)),
619                          GTK_RESPONSE_ACCEPT, ok);
620    }
621    
622    /* edit url and path of a given wms server entry */
623    gboolean wms_server_edit(wms_server_context_t *context, gboolean edit_name,
624                             wms_server_t *wms_server) {
625      GtkWidget *dialog = gtk_dialog_new_with_buttons(_("Edit WMS Server"),
626              GTK_WINDOW(context->dialog), GTK_DIALOG_MODAL,
627              GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
628              GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
629              NULL);
630    
631    #ifdef USE_HILDON
632      gtk_window_set_default_size(GTK_WINDOW(dialog), 500, 50);
633    #else
634      gtk_window_set_default_size(GTK_WINDOW(dialog), 400, 50);
635    #endif
636    
637      gtk_dialog_set_default_response(GTK_DIALOG(dialog),
638                                      GTK_RESPONSE_ACCEPT);
639    
640      GtkWidget *label, *name, *server, *path;
641      GtkWidget *table = gtk_table_new(2, 3, FALSE);
642    
643      gtk_table_attach(GTK_TABLE(table),
644                       label = gtk_label_new(_("Name:")), 0, 1, 0, 1,
645                       GTK_FILL, 0, 0, 0);
646      gtk_misc_set_alignment(GTK_MISC(label), 0.f, 0.5f);
647      gtk_table_attach_defaults(GTK_TABLE(table),
648                        name = gtk_entry_new(), 1, 2, 0, 1);
649      gtk_entry_set_activates_default(GTK_ENTRY(name), TRUE);
650      HILDON_ENTRY_NO_AUTOCAP(name);
651      gtk_widget_set_sensitive(GTK_WIDGET(name), edit_name);
652      g_signal_connect(G_OBJECT(name), "changed",
653                       G_CALLBACK(callback_modified_name), context);
654    
655      gtk_table_attach(GTK_TABLE(table),
656                       label = gtk_label_new(_("Server:")), 0, 1, 1, 2,
657                       GTK_FILL, 0, 0, 0);
658      gtk_misc_set_alignment(GTK_MISC(label), 0.f, 0.5f);
659      gtk_table_attach_defaults(GTK_TABLE(table),
660                        server = gtk_entry_new(), 1, 2, 1, 2);
661      gtk_entry_set_activates_default(GTK_ENTRY(server), TRUE);
662      HILDON_ENTRY_NO_AUTOCAP(server);
663    
664      gtk_table_attach(GTK_TABLE(table),
665                       label = gtk_label_new(_("Path:")), 0, 1, 2, 3,
666                       GTK_FILL, 0, 0, 0);
667      gtk_misc_set_alignment(GTK_MISC(label), 0.f, 0.5f);
668      gtk_table_attach_defaults(GTK_TABLE(table),
669                        path = gtk_entry_new(), 1, 2, 2, 3);
670      gtk_entry_set_activates_default(GTK_ENTRY(path), TRUE);
671      HILDON_ENTRY_NO_AUTOCAP(path);
672    
673      gtk_entry_set_text(GTK_ENTRY(name), wms_server->name);
674      gtk_entry_set_text(GTK_ENTRY(server), wms_server->server);
675      gtk_entry_set_text(GTK_ENTRY(path), wms_server->path);
676    
677      gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(dialog)->vbox), table);
678    
679      gtk_widget_show_all(dialog);
680    
681      if(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog))) {
682        if(edit_name) {
683          GtkTreeSelection *selection;
684          GtkTreeModel     *model;
685          GtkTreeIter       iter;
686          selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(context->view));
687          gtk_tree_selection_get_selected(selection, &model, &iter);
688          gtk_list_store_set(context->store, &iter,
689                             WMS_SERVER_COL_NAME, wms_server->name,
690                             -1);
691    
692          g_free(wms_server->name);
693          wms_server->name = strdup((char*)gtk_entry_get_text(GTK_ENTRY(name)));
694        }
695    
696        g_free(wms_server->server);
697        wms_server->server = strdup((char*)gtk_entry_get_text(GTK_ENTRY(server)));
698        g_free(wms_server->path);
699        wms_server->path = strdup((char*)gtk_entry_get_text(GTK_ENTRY(path)));
700        printf("setting %s/%s\n", wms_server->server, wms_server->path);
701    
702        /* set texts below */
703        gtk_label_set_text(GTK_LABEL(context->server_label), wms_server->server);
704        gtk_label_set_text(GTK_LABEL(context->path_label), wms_server->path);
705    
706        gtk_widget_destroy(dialog);
707    
708        return TRUE;
709      }
710    
711      gtk_widget_destroy(dialog);
712      return FALSE;
713    }
714    
715    /* user clicked "edit..." button in the wms server list */
716    static void on_server_edit(GtkWidget *but, wms_server_context_t *context) {
717      GtkTreeSelection *selection;
718      GtkTreeModel     *model;
719      GtkTreeIter       iter;
720    
721      selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(context->view));
722      if(gtk_tree_selection_get_selected(selection, &model, &iter)) {
723        wms_server_t *server = NULL;
724        gtk_tree_model_get(model, &iter, WMS_SERVER_COL_DATA, &server, -1);
725        g_assert(server);
726    
727        wms_server_edit(context, FALSE, server);
728      }
729    }
730    
731    /* user clicked "add..." button in the wms server list */
732    static void on_server_add(GtkWidget *but, wms_server_context_t *context) {
733    
734      /* attach a new server item to the chain */
735      wms_server_t **prev = &context->appdata->settings->wms_server;
736      while(*prev) prev = &(*prev)->next;
737    
738      *prev = g_new0(wms_server_t, 1);
739      (*prev)->name   = g_strdup("<service name>");
740      (*prev)->server = g_strdup("<server url>");
741      (*prev)->path   = g_strdup("<path in server>");
742    
743      GtkTreeModel *model =
744        gtk_tree_view_get_model(GTK_TREE_VIEW(context->view));
745    
746      GtkTreeIter iter;
747      gtk_list_store_append(GTK_LIST_STORE(model), &iter);
748      gtk_list_store_set(GTK_LIST_STORE(model), &iter,
749                         WMS_SERVER_COL_NAME, (*prev)->name,
750                         WMS_SERVER_COL_DATA, *prev,
751                         -1);
752    
753      GtkTreeSelection *selection =
754        gtk_tree_view_get_selection(GTK_TREE_VIEW(context->view));
755      gtk_tree_selection_select_iter(selection, &iter);
756    
757      if(!wms_server_edit(context, TRUE, *prev)) {
758        /* user has cancelled request. remove newly added item */
759        printf("user clicked cancel\n");
760    
761        wms_server_free(*prev);
762        *prev = NULL;
763    
764        gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
765      } else
766        /* update name from edit result */
767        gtk_list_store_set(GTK_LIST_STORE(model), &iter,
768                           WMS_SERVER_COL_NAME, (*prev)->name,
769                           -1);
770    
771      wms_server_selected(context, *prev);
772    }
773    
774    /* widget to select a wms server from a list */
775    static GtkWidget *wms_server_widget(wms_server_context_t *context) {
776    
777      GtkWidget *vbox = gtk_vbox_new(FALSE,3);
778      context->view = gtk_tree_view_new();
779    
780      gtk_tree_selection_set_select_function(
781             gtk_tree_view_get_selection(GTK_TREE_VIEW(context->view)),
782             wms_server_selection_func,
783             context, NULL);
784    
785      /* --- "Name" column --- */
786      GtkCellRenderer *renderer = gtk_cell_renderer_text_new();
787      gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(context->view),
788            -1, _("Name"), renderer, "text", WMS_SERVER_COL_NAME, NULL);
789    
790    
791      /* build and fill the store */
792      context->store = gtk_list_store_new(WMS_SERVER_NUM_COLS,
793                    G_TYPE_STRING, G_TYPE_POINTER);
794    
795      gtk_tree_view_set_model(GTK_TREE_VIEW(context->view),
796                              GTK_TREE_MODEL(context->store));
797    
798      GtkTreeIter iter;
799      wms_server_t *wms_server = context->appdata->settings->wms_server;
800      while(wms_server) {
801        /* Append a row and fill in some data */
802        gtk_list_store_append(context->store, &iter);
803        gtk_list_store_set(context->store, &iter,
804                           WMS_SERVER_COL_NAME, wms_server->name,
805                           WMS_SERVER_COL_DATA, wms_server,
806                           -1);
807    
808        wms_server = wms_server->next;
809      }
810    
811      g_object_unref(context->store);
812    
813      /* put it into a scrolled window */
814      GtkWidget *scrolled_window = gtk_scrolled_window_new(NULL, NULL);
815      gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
816                                     GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
817      gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window),
818                                          GTK_SHADOW_ETCHED_IN);
819      gtk_container_add(GTK_CONTAINER(scrolled_window), context->view);
820    
821      gtk_box_pack_start_defaults(GTK_BOX(vbox), scrolled_window);
822    
823      /* ------- button box ------------ */
824    
825      GtkWidget *hbox = gtk_hbox_new(TRUE,3);
826    
827      context->but_add = gtk_button_new_with_label(_("Add..."));
828      gtk_box_pack_start_defaults(GTK_BOX(hbox), context->but_add);
829      gtk_signal_connect(GTK_OBJECT(context->but_add), "clicked",
830                         GTK_SIGNAL_FUNC(on_server_add), context);
831    
832      context->but_edit = gtk_button_new_with_label(_("Edit..."));
833      gtk_box_pack_start_defaults(GTK_BOX(hbox), context->but_edit);
834      gtk_signal_connect(GTK_OBJECT(context->but_edit), "clicked",
835                         GTK_SIGNAL_FUNC(on_server_edit), context);
836    
837      context->but_remove = gtk_button_new_with_label(_("Remove"));
838      gtk_box_pack_start_defaults(GTK_BOX(hbox), context->but_remove);
839      gtk_signal_connect(GTK_OBJECT(context->but_remove), "clicked",
840                         GTK_SIGNAL_FUNC(on_server_remove), context);
841    
842      gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
843      return vbox;
844    }
845    
846  static gboolean wms_server_dialog(appdata_t *appdata, wms_t *wms) {  static gboolean wms_server_dialog(appdata_t *appdata, wms_t *wms) {
847    gboolean ok = FALSE;    gboolean ok = FALSE;
848    
849    GtkWidget *dialog = gtk_dialog_new_with_buttons(_("WMS Setup"),    wms_server_context_t *context = g_new0(wms_server_context_t, 1);
850      context->appdata = appdata;
851      context->wms = wms;
852    
853      context->dialog = gtk_dialog_new_with_buttons(_("WMS Server Selection"),
854            GTK_WINDOW(appdata->window), GTK_DIALOG_MODAL,            GTK_WINDOW(appdata->window), GTK_DIALOG_MODAL,
855            GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,            GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
856            GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,            GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
857            NULL);            NULL);
858    
859  #ifdef USE_HILDON  #ifdef USE_HILDON
860    /* making the dialog a little wider makes it less "crowded" */    gtk_window_set_default_size(GTK_WINDOW(context->dialog), 500, 300);
   gtk_window_set_default_size(GTK_WINDOW(dialog), 640, 50);  
861  #else  #else
862    gtk_window_set_default_size(GTK_WINDOW(dialog), 400, 50);    gtk_window_set_default_size(GTK_WINDOW(context->dialog), 400, 200);
863  #endif  #endif
864    
865      /* server selection box */
866      gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(context->dialog)->vbox),
867                                  wms_server_widget(context));
868    
869      gtk_box_pack_start(GTK_BOX(GTK_DIALOG(context->dialog)->vbox),
870                         gtk_hseparator_new(), FALSE, FALSE, 0);
871    
872    GtkWidget *label;    GtkWidget *label;
873    GtkWidget *table = gtk_table_new(2, 2, FALSE);  // x, y    GtkWidget *table = gtk_table_new(2, 2, FALSE);  // x, y
874      gtk_table_set_col_spacing(GTK_TABLE(table), 0, 10);
875    
876    label = gtk_label_new(_("Server:"));    label = gtk_label_new(_("Server:"));
877    gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);    gtk_misc_set_alignment(GTK_MISC(label), 0.f, 0.5f);
878    gtk_table_attach(GTK_TABLE(table),  label, 0, 1, 0, 1, 0,0,0,0);    gtk_table_attach(GTK_TABLE(table),  label, 0, 1, 0, 1, GTK_FILL, 0,0,0);
879    GtkWidget *server_entry = gtk_entry_new();    context->server_label = gtk_label_new("");
880    HILDON_ENTRY_NO_AUTOCAP(server_entry);    gtk_label_set_ellipsize(GTK_LABEL(context->server_label),
881    gtk_entry_set_text(GTK_ENTRY(server_entry), wms->server);                            PANGO_ELLIPSIZE_MIDDLE);
882    gtk_table_attach_defaults(GTK_TABLE(table), server_entry, 1, 2, 0, 1);    gtk_misc_set_alignment(GTK_MISC(context->server_label), 0.f, 0.5f);
883      gtk_table_attach_defaults(GTK_TABLE(table), context->server_label,
884                                1, 2, 0, 1);
885    
886    label = gtk_label_new(_("Path:"));    label = gtk_label_new(_("Path:"));
887    gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);    gtk_misc_set_alignment(GTK_MISC(label), 0.f, 0.5f);
888    gtk_table_attach(GTK_TABLE(table),  label, 0, 1, 1, 2, 0,0,0,0);    gtk_table_attach(GTK_TABLE(table),  label, 0, 1, 1, 2, GTK_FILL, 0,0,0);
889    GtkWidget *path_entry = gtk_entry_new();    context->path_label = gtk_label_new("");
890    HILDON_ENTRY_NO_AUTOCAP(path_entry);    gtk_label_set_ellipsize(GTK_LABEL(context->path_label),
891    gtk_entry_set_text(GTK_ENTRY(path_entry), wms->path);                            PANGO_ELLIPSIZE_MIDDLE);
892    gtk_table_attach_defaults(GTK_TABLE(table), path_entry, 1, 2, 1, 2);    gtk_misc_set_alignment(GTK_MISC(context->path_label), 0.f, 0.5f);
893      gtk_table_attach_defaults(GTK_TABLE(table), context->path_label,
894                                1, 2, 1, 2);
895    
896    gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(dialog)->vbox), table);    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(context->dialog)->vbox),
897    gtk_widget_show_all(dialog);                       table, FALSE, FALSE, 0);
898    
899    
900      wms_server_selected(context, NULL);
901    
902      gtk_widget_show_all(context->dialog);
903    
904    if(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog))) {    if(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(context->dialog))) {
905      wms->server = g_strdup(gtk_entry_get_text(GTK_ENTRY(server_entry)));      wms_server_t *server = get_selection(context);
906      wms->path   = g_strdup(gtk_entry_get_text(GTK_ENTRY(path_entry)));      if(server) {
907      ok = TRUE;        /* fetch parameters from selected entry */
908          printf("WMS: using %s\n", server->name);
909          if(wms->server) g_free(wms->server);
910          wms->server = g_strdup(server->server);
911          if(wms->path) g_free(wms->path);
912          wms->path = g_strdup(server->path);
913          ok = TRUE;
914        } else {
915          if(wms->server && wms->path)
916            ok = TRUE;
917    
918        }
919    }    }
920    
921    gtk_widget_destroy(dialog);    gtk_widget_destroy(context->dialog);
922    
923      g_free(context);
924    return ok;    return ok;
925  }  }
926    
# Line 744  void wms_import(appdata_t *appdata) { Line 1154  void wms_import(appdata_t *appdata) {
1154    
1155    char *url = g_strdup_printf("%s%s"    char *url = g_strdup_printf("%s%s"
1156                                "%sSERVICE=wms"                                "%sSERVICE=wms"
1157                                "&WMTVER=1.1.1"                                //                              "&WMTVER=1.1.1"
1158                                  "&VERSION=1.1.1"
1159                                "&REQUEST=GetCapabilities",                                "&REQUEST=GetCapabilities",
1160                                wms->server, wms->path, append_char);                                wms->server, wms->path, append_char);
1161    
# Line 822  void wms_import(appdata_t *appdata) { Line 1233  void wms_import(appdata_t *appdata) {
1233    /* start building url */    /* start building url */
1234    url = g_strdup_printf("%s%s"    url = g_strdup_printf("%s%s"
1235                          "%sSERVICE=wms"                          "%sSERVICE=wms"
1236                          "&WMTVER=1.1.1"                          //                      "&WMTVER=1.1.1"
1237                            "&VERSION=1.1.1"
1238                          "&REQUEST=GetMap"                          "&REQUEST=GetMap"
1239                          "&LAYERS=",                          "&LAYERS=",
1240                          wms->server, wms->path, append_char);                          wms->server, wms->path, append_char);
# Line 857  void wms_import(appdata_t *appdata) { Line 1269  void wms_import(appdata_t *appdata) {
1269    char minlon[G_ASCII_DTOSTR_BUF_SIZE], minlat[G_ASCII_DTOSTR_BUF_SIZE];    char minlon[G_ASCII_DTOSTR_BUF_SIZE], minlat[G_ASCII_DTOSTR_BUF_SIZE];
1270    char maxlon[G_ASCII_DTOSTR_BUF_SIZE], maxlat[G_ASCII_DTOSTR_BUF_SIZE];    char maxlon[G_ASCII_DTOSTR_BUF_SIZE], maxlat[G_ASCII_DTOSTR_BUF_SIZE];
1271    
1272      /* build strings of min and max lat and lon to be used in url */
1273    g_ascii_dtostr(minlon, sizeof(minlon), appdata->project->min.lon);    g_ascii_dtostr(minlon, sizeof(minlon), appdata->project->min.lon);
1274    g_ascii_dtostr(minlat, sizeof(minlat), appdata->project->min.lat);    g_ascii_dtostr(minlat, sizeof(minlat), appdata->project->min.lat);
1275    g_ascii_dtostr(maxlon, sizeof(maxlon), appdata->project->max.lon);    g_ascii_dtostr(maxlon, sizeof(maxlon), appdata->project->max.lon);
1276    g_ascii_dtostr(maxlat, sizeof(maxlat), appdata->project->max.lat);    g_ascii_dtostr(maxlat, sizeof(maxlat), appdata->project->max.lat);
1277    
1278      /* find preferred supported video format */
1279    gint format = 0;    gint format = 0;
1280    while(!(wms->cap->request->getmap->format & (1<<format)))    while(!(wms->cap->request->getmap->format & (1<<format)))
1281      format++;      format++;
# Line 869  void wms_import(appdata_t *appdata) { Line 1283  void wms_import(appdata_t *appdata) {
1283    const char *formats[] = { "image/jpg", "image/jpeg",    const char *formats[] = { "image/jpg", "image/jpeg",
1284                              "image/png", "image/gif" };                              "image/png", "image/gif" };
1285    
1286      /* build complete url */
1287    old = url;    old = url;
1288    url = g_strdup_printf("%s&SRS=EPSG:4326&BBOX=%s,%s,%s,%s"    url = g_strdup_printf("%s&SRS=EPSG:4326&BBOX=%s,%s,%s,%s"
1289                          "&WIDTH=%d&HEIGHT=%d&FORMAT=%s&reaspect=false", url,                          "&WIDTH=%d&HEIGHT=%d&FORMAT=%s"
1290                            "&reaspect=false", url,
1291                          minlon, minlat, maxlon, maxlat, wms->width,                          minlon, minlat, maxlon, maxlat, wms->width,
1292                          wms->height, formats[format]);                          wms->height, formats[format]);
1293    g_free(old);    g_free(old);
# Line 962  void wms_remove(appdata_t *appdata) { Line 1378  void wms_remove(appdata_t *appdata) {
1378    }    }
1379  }  }
1380    
1381    struct server_preset_s {
1382      char *name, *server, *path;
1383    } default_servers[] = {
1384      { "NASA landsat", "http://onearth.jpl.nasa.gov", "/wms.cgi" },
1385      /* add more servers here ... */
1386      { NULL, NULL, NULL }
1387    };
1388    
1389    wms_server_t *wms_server_get_default(void) {
1390      wms_server_t *server = NULL, **cur = &server;
1391      struct server_preset_s *preset = default_servers;
1392    
1393      while(preset->name) {
1394        *cur = g_new0(wms_server_t, 1);
1395        (*cur)->name = g_strdup(preset->name);
1396        (*cur)->server = g_strdup(preset->server);
1397        (*cur)->path = g_strdup(preset->path);
1398        cur = &(*cur)->next;
1399        preset++;
1400      }
1401    
1402      return server;
1403    }
1404    
1405    void wms_server_free(wms_server_t *wms_server) {
1406      if(wms_server->name)   g_free(wms_server->name);
1407      if(wms_server->server) g_free(wms_server->server);
1408      if(wms_server->path)   g_free(wms_server->path);
1409      g_free(wms_server);
1410    }
1411    
1412    void wms_servers_free(wms_server_t *wms_server) {
1413      while(wms_server) {
1414        wms_server_t *next = wms_server->next;
1415        wms_server_free(wms_server);
1416        wms_server = next;
1417      }
1418    }

Legend:
Removed from v.13  
changed lines
  Added in v.14