From 77046f3553130f3f10f1d18ea5f4bec6a1daea74 Mon Sep 17 00:00:00 2001 From: Paul Cercueil Date: Sun, 11 Nov 2012 19:47:45 -0300 Subject: [PATCH] Add support for reading manuals located inside OPK archives --- src/gmenu2x.cpp | 2 +- src/linkapp.cpp | 45 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/gmenu2x.cpp b/src/gmenu2x.cpp index 9228263..cadc09c 100644 --- a/src/gmenu2x.cpp +++ b/src/gmenu2x.cpp @@ -1011,7 +1011,7 @@ void GMenu2X::contextMenu() { { LinkApp* app = menu->selLinkApp(); - if (app && fileExists(app->getManual())) { + if (app && !app->getManual().empty()) { MenuOption opt = {tr.translate("Show manual of $1",menu->selLink()->getTitle().c_str(),NULL), MakeDelegate(this, &GMenu2X::showManual), }; diff --git a/src/linkapp.cpp b/src/linkapp.cpp index b060aca..4636225 100644 --- a/src/linkapp.cpp +++ b/src/linkapp.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -381,7 +382,49 @@ void LinkApp::start() { } void LinkApp::showManual() { - if (manual=="" || !fileExists(manual)) return; + if (manual.empty()) + return; + +#ifdef HAVE_LIBOPK + if (isOPK) { + vector readme; + char *token, *buf, *ptr; + struct ParserData *pdata; + + pdata = opk_open(opkFile.c_str()); + if (!pdata) { + WARNING("Unable to open OPK to read manual\n"); + return; + } + + buf = ptr = opk_extract_file(pdata, manual.c_str()); + opk_close(pdata); + + if (!buf) { + WARNING("Unable to read manual from OPK\n"); + return; + } + + while((token = strchr(ptr, '\n'))) { + *token = '\0'; + + string str(ptr); + readme.push_back(str); + ptr = token + 1; + } + + /* Add the last line */ + string str(ptr); + readme.push_back(str); + free(buf); + + TextDialog td(gmenu2x, getTitle(), "ReadMe", getIconPath(), &readme); + td.exec(); + return; + } +#endif + if (!fileExists(manual)) + return; // Png manuals string ext8 = manual.substr(manual.size()-8,8);