00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00027
00028
00029
00030
00031
00032 #define _GNU_SOURCE
00033
00034
00035 #include <errno.h>
00036 #include <string.h>
00037 #include <sys/types.h>
00038 #include <sys/stat.h>
00039
00040
00041 #include <gtk/gtk.h>
00042
00043
00044 #include <gdk/gdkkeysyms.h>
00045 #include <liberdm/display.h>
00046 #include <liberdm/erdm.h>
00047 #include <libergtk/ergtk.h>
00048 #include <liberipc/eripctoolbar.h>
00049 #include <libermanifest/ermanifest.h>
00050
00051
00052 #include "contentListerLog.h"
00053 #include "lister.h"
00054 #include "gtkMetadataWnd.h"
00055 #include "erConnect.h"
00056 #include "system.h"
00057 #include "gtkPincodeScreen.h"
00058 #include "control.h"
00059 #include "displayUpdate.h"
00060 #include "languages.h"
00061 #include "toolbar.h"
00062 #include "erbusy.h"
00063
00064
00065
00066 static cmMetadata_t g_wnd;
00067
00068
00069
00070
00072
00074
00075 static void on_changed(GtkEditable * widget, gpointer data)
00076 {
00077 CL_LOGPRINTF("entry");
00078
00079
00080 if (GTK_WIDGET(widget) == g_wnd.nameEntry)
00081 {
00082 const char* illegal_chars = ILLEGAL_FILENAME_CHARS;
00083 const char* title = gtk_entry_get_text(GTK_ENTRY(widget));
00084
00085 char* new_title = alloca( strlen(title) + 1 );
00086 strcpy(new_title, title);
00087
00088 gboolean found = FALSE;
00089 char* cp = new_title;
00090 while (*cp)
00091 {
00092 if ( strchr(illegal_chars, *cp) )
00093 {
00094 *cp = '-';
00095 found = TRUE;
00096 }
00097 cp++;
00098 }
00099 if (found)
00100 {
00101 CL_ERRORPRINTF("illegal title [%s] new_title [%s]", title, new_title);
00102 gtk_entry_set_text(GTK_ENTRY(widget), new_title);
00103 }
00104 }
00105 }
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123 static gboolean on_expose(GtkWidget * widget, GdkEventExpose * event, gpointer data)
00124 {
00125 CL_LOGPRINTF("entry");
00126
00127 gtk_widget_grab_focus(GTK_WIDGET(g_wnd.descEntry));
00128
00129 const char* cp = gtk_entry_get_text(GTK_ENTRY(g_wnd.descEntry2));
00130 if (cp != NULL && cp[0] != '\0')
00131 {
00132 gtk_widget_grab_focus(GTK_WIDGET(g_wnd.descEntry2));
00133 }
00134
00135
00136 gtk_editable_select_region(GTK_EDITABLE(g_wnd.descEntry), -1, -1);
00137 gtk_editable_select_region(GTK_EDITABLE(g_wnd.descEntry2), -1, -1);
00138
00139 display_update_request_screen_refresh(LISTER_EXPOSE_LEVEL);
00140
00141 return FALSE;
00142 }
00143
00145
00147
00148
00149
00150
00151
00152
00153 static void createNameItem(GtkWidget* parent)
00154 {
00155 GtkWidget* widget;
00156
00157 CL_LOGPRINTF("entry");
00158
00159
00160 widget = gtk_label_new("");
00161 gtk_widget_set_name(GTK_WIDGET(widget), "content_wnd_text_bold");
00162 gtk_widget_set_size_request(widget, -1, METADATA_TAG_HEIGHT);
00163 gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 1.0);
00164 gtk_box_pack_start(GTK_BOX(parent), widget, FALSE, FALSE, 0);
00165 gtk_widget_show(widget);
00166 g_wnd.nameTag = widget;
00167
00168
00169 widget = ergtk_entry_new();
00170 gtk_widget_set_name(GTK_WIDGET(widget), "content_wnd_edit");
00171 gtk_widget_set_size_request(widget, METADATA_ENTRY_WIDTH, METADATA_NAME_HEIGHT);
00172 g_signal_connect_after(G_OBJECT(widget), "changed", G_CALLBACK(on_changed), NULL);
00173 gtk_box_pack_start(GTK_BOX(parent), widget, FALSE, FALSE, 0);
00174 gtk_widget_show(widget);
00175 g_wnd.nameEntry = widget;
00176 }
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249 static void createDescItem(GtkWidget* parent)
00250 {
00251 GtkWidget* widget;
00252
00253 CL_LOGPRINTF("entry");
00254
00255
00256 widget = gtk_label_new("");
00257 gtk_widget_set_name(GTK_WIDGET(widget), "content_wnd_text_bold");
00258 gtk_widget_set_size_request(widget, -1, METADATA_TAG_HEIGHT);
00259 gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 1.0);
00260 gtk_box_pack_start(GTK_BOX(parent), widget, FALSE, FALSE, 0);
00261 gtk_widget_show(widget);
00262 g_wnd.descTag = widget;
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289 widget = ergtk_entry_new();
00290 gtk_widget_set_name(GTK_WIDGET(widget), "content_wnd_edit");
00291 gtk_widget_set_size_request(widget, METADATA_ENTRY_WIDTH, METADATA_DESC_HEIGHT);
00292 g_signal_connect_after(G_OBJECT(widget), "changed", G_CALLBACK(on_changed), NULL);
00293 gtk_box_pack_start(GTK_BOX(parent), widget, FALSE, FALSE, 0);
00294 gtk_widget_show(widget);
00295 g_wnd.descEntry = widget;
00296
00297
00298 widget = ergtk_entry_new();
00299 gtk_widget_set_name(GTK_WIDGET(widget), "content_wnd_edit");
00300 gtk_widget_set_size_request(widget, METADATA_ENTRY_WIDTH, METADATA_DESC_HEIGHT);
00301 g_signal_connect_after(G_OBJECT(widget), "changed", G_CALLBACK(on_changed), NULL);
00302 gtk_box_pack_start(GTK_BOX(parent), widget, FALSE, FALSE, 0);
00303 gtk_widget_show(widget);
00304 g_wnd.descEntry2 = widget;
00305 }
00306
00307
00308
00309
00310
00311 static void createFinishItem(GtkWidget* parent)
00312 {
00313 GtkWidget* widget;
00314
00315 CL_LOGPRINTF("entry");
00316
00317
00318 widget = gtk_label_new("");
00319 gtk_widget_set_name(GTK_WIDGET(widget), "content_wnd_text_bold");
00320 gtk_widget_set_size_request(widget, -1, METADATA_TAG_HEIGHT);
00321 gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 1.0);
00322 gtk_box_pack_start(GTK_BOX(parent), widget, FALSE, FALSE, 0);
00323 gtk_widget_show(widget);
00324 g_wnd.finishTag = widget;
00325
00326 return;
00327 }
00328
00329
00330
00332
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344 GtkWidget* create_content_metadata_wnd(GtkWidget * parent)
00345 {
00346 CL_LOGPRINTF("entry");
00347
00348
00349 g_wnd.window = parent;
00350
00351
00352 g_signal_connect(G_OBJECT(g_wnd.window), "expose-event", G_CALLBACK(on_expose), NULL);
00353
00354
00355 GtkWidget* background = gtk_event_box_new();
00356 gtk_widget_set_name(GTK_WIDGET(background), "content_wnd_background");
00357 gtk_widget_set_size_request(GTK_WIDGET(background), METADATA_BK_IMG_WIDTH, METADATA_BK_IMG_HEIGHT);
00358 gtk_container_add(GTK_CONTAINER(parent), background);
00359 gtk_widget_show(background);
00360
00361
00362 GtkWidget* alignment = gtk_alignment_new(0.0, 0.0, 0.0, 0.0);
00363 gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), METADATA_VBORDER, METADATA_VBORDER, METADATA_HBORDER, METADATA_HBORDER);
00364 gtk_container_add(GTK_CONTAINER(background), alignment);
00365 gtk_widget_show(alignment);
00366
00367
00368 GtkWidget* vbox = gtk_vbox_new(FALSE, METADATA_WND_ITEM_SPACING);
00369 gtk_container_add(GTK_CONTAINER(alignment), vbox);
00370 gtk_widget_show(vbox);
00371
00372
00373 createNameItem(vbox);
00374
00375
00376 createDescItem(vbox);
00377
00378
00379 createFinishItem(vbox);
00380
00381
00382 content_metadata_set_text();
00383
00384
00385 g_wnd.on_change_occurred = FALSE;
00386 g_wnd.on_movecursor_occurred = FALSE;
00387 g_wnd.display_update_pending = FALSE;
00388
00389 return background;
00390 }
00391
00392
00393
00394 void content_metadata_set_text()
00395 {
00396 CL_LOGPRINTF("entry");
00397
00398
00399 gtk_label_set_text( GTK_LABEL(g_wnd.nameTag), _("Step 1: Please enter a name for the content") );
00400
00401
00402 gtk_label_set_text( GTK_LABEL(g_wnd.descTag), _("Step 2: Enter a description by which you can identify the content") );
00403
00404
00405 gtk_label_set_text( GTK_LABEL(g_wnd.finishTag), _("Step 3: Click on the 'Tagging' icon to save your changes") );
00406 }
00407
00408
00409
00410 gboolean content_metadata_read_manifest(const gchar* szManifest)
00411 {
00412 CL_LOGPRINTF("entry");
00413
00414 g_assert(szManifest != NULL);
00415
00416 int ret;
00417 gchar szTitle[MD_MAX_TITLE_SIZE];
00418 gchar szDescription[MD_MAX_DESCRIPTION_SIZE];
00419
00420
00421 erManifest manifest;
00422 if (RET_OK != ermXmlOpenFile(szManifest, &manifest))
00423 {
00424 CL_ERRORPRINTF("Could not open manifest file [%s]", szManifest);
00425 return FALSE;
00426 }
00427
00428
00429 ret = ermXmlGetString(&manifest, "/package/metadata/dc-metadata/Title", szTitle, sizeof(szTitle));
00430 if (ret != RET_OK)
00431 {
00432 strcpy(szTitle, "");
00433 }
00434 gtk_entry_set_text(GTK_ENTRY(g_wnd.nameEntry), szTitle);
00435
00436
00437 ret = ermXmlGetString(&manifest, "/package/metadata/dc-metadata/Description", szDescription, sizeof(szDescription));
00438 if (ret != RET_OK)
00439 {
00440 strcpy(szDescription, "");
00441 }
00442
00443
00444
00445
00446
00447
00448 char* cp = strchr(szDescription, '\n');
00449 if (cp)
00450 {
00451 *cp = '\0';
00452 gtk_entry_set_text(GTK_ENTRY(g_wnd.descEntry2), cp + 1);
00453 }
00454 else
00455 {
00456 gtk_entry_set_text(GTK_ENTRY(g_wnd.descEntry2), "");
00457 }
00458 gtk_entry_set_text(GTK_ENTRY(g_wnd.descEntry), szDescription);
00459
00460
00461 ermXmlClose(&manifest);
00462 return TRUE;
00463 }
00464
00465
00466 gboolean content_metadata_rename_container(const gchar* szManifest, gchar* szContainer, gint len)
00467 {
00468 CL_LOGPRINTF("entry: manifest [%s]", szManifest);
00469
00470 g_return_val_if_fail((szManifest != NULL), FALSE);
00471
00472 gboolean retval = FALSE;
00473
00474
00475
00476 char* cp = strrchr(szManifest, '/');
00477 if (cp)
00478 {
00479 *cp = '\0';
00480 snprintf(szContainer, len, "%s", szManifest);
00481 *cp = '/';
00482 }
00483 else
00484 {
00485 CL_ERRORPRINTF("Illegal manifest path [%s]", szManifest);
00486 }
00487
00488
00489 char* szContainerName = strrchr(szContainer, '/');
00490 if (szContainerName)
00491 {
00492 szContainerName++;
00493 }
00494 else
00495 {
00496 CL_ERRORPRINTF("Illegal container path [%s]", szContainer);
00497 }
00498
00499
00500 const char* szTitle = gtk_entry_get_text(GTK_ENTRY(g_wnd.nameEntry));
00501
00502
00503 if ( strlen(szTitle) > 0
00504 && strcmp(szTitle, szContainerName) != 0 )
00505 {
00506
00507
00508
00509 int n = strlen(szContainer) - strlen(szContainerName);
00510 char* newContainer = alloca(n + strlen(szTitle) + 1);
00511 g_return_val_if_fail((newContainer != NULL), FALSE);
00512 strncpy(newContainer, szContainer, n);
00513 strcpy(&newContainer[n], szTitle);
00514 CL_LOGPRINTF("New container name [%s]", newContainer);
00515
00516
00517 struct stat statbuf;
00518 if ( stat(newContainer, &statbuf) == -1
00519 && rename(szContainer, newContainer) == 0 )
00520 {
00521 CL_LOGPRINTF("Renamed container ok");
00522 snprintf(szContainer, len, "%s", newContainer);
00523 retval = TRUE;
00524 }
00525 else
00526 {
00527 CL_ERRORPRINTF("Cannot rename container [%s]", strerror(errno));
00528
00529
00530 gtk_entry_set_text(GTK_ENTRY(g_wnd.nameEntry), szContainerName);
00531 }
00532 }
00533
00534 return retval;
00535 }
00536
00537
00538 gboolean content_metadata_write_manifest(const gchar* szContainer)
00539 {
00540 CL_LOGPRINTF("entry: manifest [%s]", szContainer);
00541
00542 g_return_val_if_fail((szContainer != NULL), FALSE);
00543
00544 gboolean retval = FALSE;
00545
00546
00547
00548 const char* szTitle = gtk_entry_get_text(GTK_ENTRY(g_wnd.nameEntry));
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559 const char* szDescription = gtk_entry_get_text(GTK_ENTRY(g_wnd.descEntry));
00560 const char* szDescription2 = gtk_entry_get_text(GTK_ENTRY(g_wnd.descEntry2));
00561 if (szDescription2 != NULL && szDescription2[0] != '\0')
00562 {
00563 char* cp = alloca( strlen(szDescription) + strlen(szDescription2) + 2 );
00564 if (cp)
00565 {
00566 sprintf(cp, "%s\n%s", szDescription, szDescription2);
00567 szDescription = cp;
00568 }
00569 }
00570
00571
00572 erManifest manifest;
00573 if (RET_OK == ermXmlOpenManifest(szContainer, &manifest))
00574 {
00575
00576 if (RET_OK == ermXmlExist(&manifest, "/package/metadata/dc-metadata/Title"))
00577 {
00578 ermXmlSetString( &manifest,
00579 "/package/metadata/dc-metadata/Title",
00580 szTitle );
00581 }
00582 else
00583 {
00584 ermXmlNewString( &manifest,
00585 "/package/metadata/dc-metadata",
00586 "Title",
00587 szTitle );
00588 }
00589
00590
00591 if (RET_OK == ermXmlExist(&manifest, "/package/metadata/dc-metadata/Description"))
00592 {
00593 ermXmlSetString( &manifest,
00594 "/package/metadata/dc-metadata/Description",
00595 szDescription );
00596 }
00597 else
00598 {
00599 ermXmlNewString( &manifest,
00600 "/package/metadata/dc-metadata",
00601 "Description",
00602 szDescription );
00603 }
00604
00605
00606 ermXmlSaveAndClose(&manifest);
00607
00608 retval = TRUE;
00609 }
00610 else
00611 {
00612 CL_ERRORPRINTF("Could not open manifest file in [%s]", szContainer);
00613 }
00614
00615 return retval;
00616 }
00617