<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>