<div dir="ltr"><div><div>== nikita-gtk 0.0.1</div><br>Preliminary GTK+/GNOME Client for Nikita Noark Core<br><br>=== Usage<br><br>You can run this GTK+/GNOME client on Unix machines<br>who can access Nikita Noark5v5 Core via the WWW-url<br><br>    <URI:<a href="http://www.arkivarium.no/login.html" target="_blank"> http://www.arkivarium.no/login.html</a> ><br><br>or the WWW-url after the "contextPath:" configuration<br>string found in Nikita Noark5v5 Core:<br><br>    contextPath:    <a href="http://www.arkivarium.no:8092/noark5v5" target="_blank">http://www.arkivarium.no:8092/noark5v5</a><br></div><div><br></div><div>=== Binary for macOS 13.5.1 Ventura in MacBook Air M1 (2020)<br></div><div><br></div><div>% curl <a href="http://www.arkivarium.no/mac/nikita-gtk.m1.bin" target="_blank">http://www.arkivarium.no/mac/nikita-gtk.m1.bin</a> >nikita-gtk</div><div>% chmod a+x ./nikita-gtk                                           <br>% ./nikita-gtk</div><div><br></div><div>=== Build Instructions on macOS and Unix from Source<br><br>==== Autoconf:<br><br>wget <a href="http://www.arkivarium.no/gtk/nikita-gtk-0.0.1.tar.xz" target="_blank">http://www.arkivarium.no/gtk/nikita-gtk-0.0.1.tar.xz</a><br>tar zxvf nikita-gtk-0.0.1.tar.xz<br>cd nikita-gtk-0.0.1/<br>./configure --prefix=/opt<br>make && sudo make install<br>/opt/bin/nikita-gtk<br><br>==== make<br><br>wget <a href="http://www.arkivarium.no/gtk/Makefile" target="_blank">http://www.arkivarium.no/gtk/Makefile</a><br>wget <a href="http://www.arkivarium.no/gtk/nikita-gtk.c" target="_blank">http://www.arkivarium.no/gtk/nikita-gtk.c</a><br>make<br>./nikita-gtk<br><br>=== What is implemented?<br><br>* GTK App Wizard Window<br><br>* GTK App Wizard Pages<br><br>[Role]<br></div>[Server]<br><div>[Login]<br></div><div><br>=== Source<br><br>==== Makefile<br><br>nikita:      nikita-gtk.c<br>
        $(CC) `pkg-config --cflags gtk+-3.0 libsoup-2.4 libxml-2.0` -o nikita 
nikita-gtk.c `pkg-config --libs gtk+-3.0 libsoup-2.4 libxml-2.0`<br><br>==== nikita-gtk.c<br>include <libsoup/soup.h><br>#include <libsoup/soup-message.h><br>#include <glib/gstdio.h><br>#include <glib/goption.h><br>#include <gtk/gtk.h><br>#include <gtk/gtkbutton.h><br>#include <gtk/gtkwindow.h><br><br>typedef struct {<br>        GtkWidget *widget;<br>        gint index;<br>        const gchar *title;<br>        GtkAssistantPageType type;<br>        gboolean complete;<br>} PageInfo;<br><br>GtkWidget *role_entry;<br>GtkWidget *role_label;<br>GtkWidget *server_entry;<br>GtkWidget *server_label;<br>GtkWidget *login_entry;<br>GtkWidget *login_label;<br><br>GMainLoop *main_loop;<br><br>/* Commandline options */<br>static gint timeout = 3600; /* seconds */<br>static gint time_threshold;<br>GMainLoop *main_loops;<br><br>static GOptionEntry entries[] =<br>{<br>        { "timeout",<br>          't',<br>          0,<br>          G_OPTION_ARG_INT,<br>          &timeout,<br>          "Exit after T seconds. Default: 3600",<br>          "T" },<br>        { "time-threshold",<br>          'i',<br>          0,<br>          G_OPTION_ARG_INT,<br>          &time_threshold,<br>          "Only report location update after T seconds. "<br>        "Default: 0 (report new location without any delay)",<br>          "T" },<br>        { "filename",<br>          'f',<br>          0,<br>          G_OPTION_ARG_STRING,<br>          &server_entry,<br>          "Filename.  Default: file:///tmp/arkivstruktur.xml",<br>          "F" },<br>        { "noark5v5-server",<br>          's',<br>          0,<br>          G_OPTION_ARG_STRING,<br>          &server_entry,<br>          "Noark5v5 Server.  Default: <a href="http://www.arkivarium.no:8096/noark5v5" target="_blank">http://www.arkivarium.no:8096/noark5v5</a>",<br>          "S" },<br>        { NULL }<br>};<br><br>static void nikita_gtk_wizard_bootup(GtkAssistant * assistant, gpointer data)<br>{<br>  SoupMessage *msg;<br>  SoupMessageHeaders *response_headers;<br>  SoupSession *session;<br>  guint status;<br>  session = soup_session_sync_new ();<br>  msg = soup_message_new ("GET", "<a href="http://www.arkivarium.no:8092/noark5v5" target="_blank">http://www.arkivarium.no:8092/noark5v5</a>");<br>  soup_message_set_request (msg, "application/xml",<br>                      SOUP_MEMORY_COPY,<br>                           g_strdup("arkivdel"), strlen("arkivdel"));<br>  status = soup_session_send_message (session, msg);<br>  g_object_unref (msg);<br>  g_object_unref (session);<br>}<br><br>static void nikita_gtk_wizard_apply(GtkAssistant * assistant, gpointer data)<br>{<br>  SoupMessage *msg;<br>  SoupMessageHeaders *response_headers;<br>  SoupSession *session;<br>  guint status;<br>  session = soup_session_sync_new ();<br>  msg = soup_message_new ("GET", "<a href="http://www.arkivarium.no:8092/noark5v5" target="_blank">http://www.arkivarium.no:8092/noark5v5</a>");<br>  soup_message_set_request (msg, "application/xml",<br>                      SOUP_MEMORY_COPY,<br>                           g_strdup("arkivdel"), strlen("arkivdel"));<br>  status = soup_session_send_message (session, msg);<br>  g_object_unref (msg);<br>  g_object_unref (session);<br>}<br><br>static void nikita_gtk_wizard_close(GtkAssistant * assistant, gpointer data)<br>{<br>        gtk_main_quit();<br>}<br><br>static void nikita_gtk_wizard_cancel(GtkAssistant * assistant, gpointer data)<br>{<br>        if (!main_loops) {<br>                g_error("Quit more loops than there are.");<br>        } else {<br>                GMainLoop *loop = main_loops;<br>                g_main_loop_quit(loop);<br>                gtk_main_quit();<br>        }<br>}<br><br>static void on_volume_increase(GtkWidget *widget, gpointer data) {<br>}<br><br>static void on_volume_archival(GtkWidget *widget, gpointer data) {<br>}<br><br>static void on_volume_searcher(GtkWidget *widget, gpointer data) {<br>}<br><br>static gint<br>my_popup_handler (GtkWidget *widget, GdkEvent *event)<br>{<br>  GtkMenu *menu;<br>  GdkEventButton *event_button;<br><br>  g_return_val_if_fail (widget != NULL, FALSE);<br>  g_return_val_if_fail (GTK_IS_MENU (widget), FALSE);<br>  g_return_val_if_fail (event != NULL, FALSE);<br><br>  // The "widget" is the menu that was supplied when<br>  // `g_signal_connect_swapped()` was called.<br>  menu = GTK_MENU (widget);<br><br>  if (event->type == GDK_BUTTON_PRESS)<br>    {<br>      event_button = (GdkEventButton *) event;<br>      if (event_button->button == GDK_BUTTON_SECONDARY)<br>        {<br>          gtk_menu_popup (menu, NULL, NULL, NULL, NULL,<br>                          event_button->button, event_button->time);<br>          return TRUE;<br>        }<br>    }<br><br>  return FALSE;<br>}<br><br>static void nikita_gtk_wizard_entry_changed(GtkEditable * editable,<br>                                          GtkAssistant * assistant,<br>                                           gpointer *data)<br>{<br>        return;<br>}<br><br>static void nikita_gtk_wizard_button_toggled(GtkCheckButton * checkbutton,<br>                                             GtkAssistant * assistant)<br>{<br>  return;<br>}<br><br>static void nikita_gtk_wizard_button_clicked(GtkButton * button,<br>                                             GtkAssistant * assistant)<br>{<br>}<br><br>static void activate(GtkApplication *app, gpointer user_data)<br>{<br>    GtkWidget *window;<br>    GtkWidget *increaseButton;<br>    GtkWidget *archivalButton;    <br>    GtkWidget *searcherButton;<br>    GtkWidget *introduction;<br>    int i = 0;<br>    PageInfo page[4] = {<br>      {NULL, -1, "Arkivarium (nikita-gtk) 0.0.1", GTK_ASSISTANT_PAGE_INTRO, TRUE},<br>      {NULL, -1, "Role", GTK_ASSISTANT_PAGE_CONTENT, TRUE},<br>      {NULL, -1, "Server", GTK_ASSISTANT_PAGE_CONTENT, TRUE},<br>      {NULL, -1, "Login", GTK_ASSISTANT_PAGE_CONFIRM, TRUE},<br>    };<br>    <br>    window = gtk_application_window_new(app);<br>    introduction = gtk_assistant_new();<br>    gtk_container_add (GTK_WINDOW (window), introduction);<br>    gtk_widget_set_size_request(GTK_WIDGET(introduction), 800, 600);<br>    gtk_window_set_title(GTK_WINDOW(introduction), "Arkivarium (nikita-gtk)");<br>        g_signal_connect(G_OBJECT(introduction), "destroy",<br>                         G_CALLBACK(gtk_main_quit), NULL);<br>        page[0].widget = gtk_label_new("Welcome to Arkivarium!\n\n");<br>        page[1].widget = gtk_box_new(FALSE, 3);<br>        role_label = gtk_label_new("<role>:");<br>        role_entry = gtk_entry_new();<br>        gtk_entry_set_max_length (role_entry, 256);<br>        gtk_box_pack_start(GTK_BOX(page[1].widget), GTK_WIDGET(role_label),<br>                           FALSE, FALSE, 3);<br>        gtk_box_pack_start(GTK_BOX(page[1].widget), GTK_WIDGET(role_entry),<br>                           FALSE, FALSE, 3);<br>      g_signal_connect(G_OBJECT(role_label), "clicked",<br>                    G_CALLBACK(nikita_gtk_wizard_bootup),<br>                         gtk_entry_get_text(GTK_ENTRY(role_entry)));<br>        page[2].widget = gtk_box_new(FALSE, 3);<br>        server_label = gtk_label_new("<server>");<br>        server_entry = gtk_entry_new();<br> gtk_box_pack_start(GTK_BOX(page[2].widget), GTK_WIDGET(server_label),<br>                    FALSE, FALSE, 3);<br> gtk_box_pack_start(GTK_BOX(page[2].widget), GTK_WIDGET(server_entry),<br>                    FALSE, FALSE, 3);<br> g_signal_connect(G_OBJECT(server_label), "clicked",<br>                         G_CALLBACK(nikita_gtk_wizard_bootup),<br>                         gtk_entry_get_text(GTK_ENTRY(server_entry)));<br>       page[3].widget = gtk_box_new(FALSE, 3);<br>       login_label = gtk_label_new("<credential>");<br>  login_entry = gtk_entry_new();<br>        gtk_box_pack_start(GTK_BOX(page[3].widget), GTK_WIDGET(login_label),<br>                     FALSE, FALSE, 3);<br> gtk_box_pack_start(GTK_BOX(page[3].widget), GTK_WIDGET(login_entry),<br>                     FALSE, FALSE, 3);<br> g_signal_connect(G_OBJECT(login_label), "clicked",<br>                         G_CALLBACK(nikita_gtk_wizard_apply),<br>                         gtk_entry_get_text(GTK_ENTRY(login_entry)));<br>        for (i = 0; i < 4; i++) {<br>                page[i].index = gtk_assistant_append_page(GTK_ASSISTANT(introduction),<br>                                              GTK_WIDGET(page[i].widget));<br>                gtk_assistant_set_page_title(GTK_ASSISTANT(introduction),<br>                                             GTK_WIDGET(page[i].widget),<br>                                             page[i].title);<br>                gtk_assistant_set_page_type(GTK_ASSISTANT(introduction),<br>                                            GTK_WIDGET(page[i].widget),<br>                                            page[i].type);<br>                gtk_assistant_set_page_complete(GTK_ASSISTANT(introduction),<br>                                                GTK_WIDGET(page[i].widget),<br>                                                page[i].complete);<br>        }<br>   g_signal_connect(G_OBJECT(login_label), "clicked",<br>                         G_CALLBACK(nikita_gtk_wizard_bootup),<br>                         gtk_entry_get_text(GTK_ENTRY(login_entry)));<br> g_signal_connect(G_OBJECT(role_entry), "changed",<br>                    G_CALLBACK(nikita_gtk_wizard_entry_changed), role_entry);                       <br>     g_signal_connect(G_OBJECT(server_entry), "changed",<br>                         G_CALLBACK(nikita_gtk_wizard_entry_changed), server_entry);<br>      g_signal_connect(G_OBJECT(login_entry), "changed",<br>                   G_CALLBACK(nikita_gtk_wizard_entry_changed), login_entry);                      <br>        g_signal_connect(G_OBJECT(introduction), "cancel",<br>                         G_CALLBACK(nikita_gtk_wizard_cancel), main_loops);<br>        g_signal_connect(G_OBJECT(introduction), "close",<br>                         G_CALLBACK(nikita_gtk_wizard_close), NULL);<br>        g_signal_connect(G_OBJECT(introduction), "apply",<br>                         G_CALLBACK(nikita_gtk_wizard_bootup), login_entry);<br>        gtk_widget_show_all (GTK_WIDGET (introduction));<br>   gtk_window_set_application(GTK_WINDOW(window), GTK_APPLICATION(app));<br> gtk_window_set_title(GTK_WINDOW(window), "Arkivarium (nikita-gtk)");<br>        gtk_window_set_default_size(GTK_WINDOW(window), 640, 480);<br>    increaseButton = gtk_button_new_with_label("Utvid arkiv");<br>  g_signal_connect(increaseButton, "clicked", G_CALLBACK(on_volume_increase), NULL);<br>  archivalButton = gtk_button_new_with_label("Bevar arkiv");<br>  g_signal_connect(searcherButton, "clicked", G_CALLBACK(on_volume_archival), NULL);<br>  searcherButton = gtk_button_new_with_label("Søk i arkiv");<br> g_signal_connect(searcherButton, "clicked", G_CALLBACK(on_volume_searcher), NULL);<br>  GtkWidget *buttonBox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);<br>        gtk_container_set_border_width(GTK_CONTAINER(buttonBox), 10);<br> gtk_box_pack_start(GTK_BOX(buttonBox), increaseButton, FALSE, FALSE, 0);<br>      gtk_box_pack_start(GTK_BOX(buttonBox), archivalButton, FALSE, FALSE, 0);<br>      gtk_box_pack_start(GTK_BOX(buttonBox), searcherButton, FALSE, FALSE, 0);<br>      <br>      GtkWidget *mainBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);<br>       gtk_box_pack_start(GTK_BOX(mainBox), buttonBox, FALSE, FALSE, 0);<br>     <br>      /*<br>      nikita_set_uri("<a href="http://www.arkivarium.no:8092/noark5v5" target="_blank">http://www.arkivarium.no:8092/noark5v5</a>");<br>     nikita_view_archive);<br>      */<br>    <br>      gtk_container_add(GTK_CONTAINER(window), mainBox);<br>    gtk_widget_show_all(window);<br>}<br><br>int main(int argc, char **argv)<br>{<br>  GtkApplication *app;<br>  int status;<br>  int entries_n = 2;<br>  int entryNumber;<br>  GError *error = NULL;<br>  GOptionContext *context;<br>  context = g_option_context_new ("- Arkivarium (nikita-gtk) 0.0.1");<br>  g_option_context_add_main_entries (context, entries, "nikita-gtk");<br>  g_option_context_add_group (context, gtk_get_option_group (TRUE));<br>  if (!g_option_context_parse (context, &argc, &argv, &error)) {<br>    g_print ("Arkivarium (nikita-gtk) 0.0.1 Option parsing failed: %s\n", error->message);<br>    return EXIT_FAILURE;<br>  }<br>  app = gtk_application_new("<a href="http://www.arkivarium.no" target="_blank">www.arkivarium.no</a>", G_APPLICATION_DEFAULT_FLAGS);<br>  g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);<br>  status = g_application_run(G_APPLICATION(app), argc, argv);<br>  g_object_unref(app);<br>  <br>  return status;<br>}</div><div><br></div><div>....mye arbeid med eller uten veiledning av Thomas Sødring og Petter Reinholdtsen gjenstår!</div><div><br></div><div>Noe arbeid fra 2017 kan trolig gjenbrukes til å laste ned arkivstruktur.xml</div><div>til arkivstruktur.xml i noark5-import [1] av noark5-parser og deretter vise</div><div>arkivet med struktur (se <a href="https://github.com/hpjansson/conglomerate" target="_blank">https://github.com/hpjansson/conglomerate</a> av hpjansson på CC:) og så presentere Noark 5 XML-formatet som redigerbare tekster i GTK+/GNOME.<br></div><h2></h2><div><div dir="ltr" class="gmail_signature"><div dir="ltr"><font size="2"><span style="font-size:10pt"></span></font><div dir="auto"><a href="https://github.com/oleaamot/noark5-parser" target="_blank">https://github.com/oleaamot/noark5-parser</a></div><div dir="auto"><br></div><div dir="auto">export:<br>      ./noark5-export --baseurl <a href="http://arkivarium.no:8092/noark5v5/" target="_blank">http://arkivarium.no:8092/noark5v5/</a> --filename arkivstruktur.xml --username root@localhost --password password<br><br>import:<br> ./noark5-import --baseurl <a href="http://arkivarium.no:8092/noark5v5/" target="_blank">http://arkivarium.no:8092/noark5v5/</a> --filename arkivstruktur.xml --username root@localhost --password password<br><br>verify:<br> ./noark5-verify --baseurl <a href="http://arkivarium.no/noark5v4/" target="_blank">http://arkivarium.no/noark5v4/</a> --filename arkivstruktur.xml --username root@localhost --password password</div></div></div></div></div>