diff options
author | Antti Ajanki <antti.ajanki@iki.fi> | 2011-06-12 15:18:36 +0300 |
---|---|---|
committer | Antti Ajanki <antti.ajanki@iki.fi> | 2011-06-12 15:18:36 +0300 |
commit | 541779154be54e113ddd8bfac7245aed484e9ced (patch) | |
tree | 3c4384f255b27db0c930defd14052374af9febbe /src | |
parent | bd478ec0ef43d29f47a8892d558280cdd05a1dbb (diff) | |
download | vdr-plugin-webvideo-541779154be54e113ddd8bfac7245aed484e9ced.tar.gz vdr-plugin-webvideo-541779154be54e113ddd8bfac7245aed484e9ced.tar.bz2 |
Fix Katsomo, add encoding attribute to <submission> node
Diffstat (limited to 'src')
-rw-r--r-- | src/vdr-plugin/common.c | 3 | ||||
-rw-r--r-- | src/vdr-plugin/history.c | 4 | ||||
-rw-r--r-- | src/vdr-plugin/history.h | 2 | ||||
-rw-r--r-- | src/vdr-plugin/menu.c | 13 | ||||
-rw-r--r-- | src/vdr-plugin/menudata.c | 39 | ||||
-rw-r--r-- | src/vdr-plugin/menudata.h | 10 | ||||
-rw-r--r-- | src/webvicli/webvicli/client.py | 6 | ||||
-rw-r--r-- | src/webvicli/webvicli/menu.py | 10 |
8 files changed, 67 insertions, 20 deletions
diff --git a/src/vdr-plugin/common.c b/src/vdr-plugin/common.c index 17a73b0..2792d24 100644 --- a/src/vdr-plugin/common.c +++ b/src/vdr-plugin/common.c @@ -142,6 +142,9 @@ char *URLencode(const char *s) { '\0' }; + if (!s) + return NULL; + char *buf = (char *)malloc((3*strlen(s)+1)*sizeof(char)); if (!buf) return NULL; diff --git a/src/vdr-plugin/history.c b/src/vdr-plugin/history.c index a463bac..fe444ca 100644 --- a/src/vdr-plugin/history.c +++ b/src/vdr-plugin/history.c @@ -43,11 +43,11 @@ int cHistoryObject::QuerySize() const { return editData.Size(); } -char *cHistoryObject::GetQueryFragment(int i) const { +char *cHistoryObject::GetQueryFragment(int i, const char *encoding) const { if (i < 0 && i >= editData.Size()) return NULL; else - return editData[i]->GetQueryFragment(); + return editData[i]->GetQueryFragment(encoding); } cTextFieldData *cHistoryObject::GetTextFieldData(const char *controlName) { diff --git a/src/vdr-plugin/history.h b/src/vdr-plugin/history.h index fd5fcf9..a999098 100644 --- a/src/vdr-plugin/history.h +++ b/src/vdr-plugin/history.h @@ -35,7 +35,7 @@ public: int GetSelected() const { return selected; } int QuerySize() const; - char *GetQueryFragment(int i) const; + char *GetQueryFragment(int i, const char *encoding) const; cTextFieldData *GetTextFieldData(const char *controlName); cItemListData *GetItemListData(const char *controlName, cStringList &items, diff --git a/src/vdr-plugin/menu.c b/src/vdr-plugin/menu.c index 111339f..d03c61d 100644 --- a/src/vdr-plugin/menu.c +++ b/src/vdr-plugin/menu.c @@ -291,6 +291,7 @@ void cNavigationMenu::NewButton(xmlDocPtr doc, xmlNodePtr node) { // label and submission tags xmlChar *itemtitle = NULL, *submission = NULL; cHistoryObject *curhistpage = history->Current(); + xmlChar *encoding = NULL; node = node->xmlChildrenNode; while (node) { @@ -302,6 +303,13 @@ void cNavigationMenu::NewButton(xmlDocPtr doc, xmlNodePtr node) { if (submission) xmlFree(submission); submission = xmlNodeListGetString(doc, node->xmlChildrenNode, 1); + + xmlChar *enc = xmlGetProp(node, BAD_CAST "encoding"); + if (enc) { + if (encoding) + xmlFree(encoding); + encoding = enc; + } } node = node->next; } @@ -309,7 +317,8 @@ void cNavigationMenu::NewButton(xmlDocPtr doc, xmlNodePtr node) { itemtitle = xmlCharStrdup("???"); cSubmissionButtonData *data = \ - new cSubmissionButtonData((char *)submission, curhistpage); + new cSubmissionButtonData((char *)submission, curhistpage, + (char *)encoding); const char *titleconv = csc.Convert((char *)itemtitle); // do not free char *newtitle = (char *)malloc((strlen(titleconv)+3)*sizeof(char)); if (newtitle) { @@ -326,6 +335,8 @@ void cNavigationMenu::NewButton(xmlDocPtr doc, xmlNodePtr node) { xmlFree(itemtitle); if (submission) xmlFree(submission); + if (encoding) + xmlFree(encoding); } void cNavigationMenu::NewTitle(xmlDocPtr doc, xmlNodePtr node) { diff --git a/src/vdr-plugin/menudata.c b/src/vdr-plugin/menudata.c index 45db133..6fc899c 100644 --- a/src/vdr-plugin/menudata.c +++ b/src/vdr-plugin/menudata.c @@ -55,13 +55,20 @@ cTextFieldData::~cTextFieldData() { free(valuebuffer); } -char *cTextFieldData::GetQueryFragment() { +char *cTextFieldData::GetQueryFragment(const char *encoding) { const char *name = GetName(); + char *val; if (name && *name && valuebuffer) { - char *encoded = URLencode(valuebuffer); - cString tmp = cString::sprintf("%s,%s", name, encoded); - free(encoded); + if (encoding) { + cCharSetConv charsetconv = cCharSetConv("UTF-8", encoding); + val = URLencode(charsetconv.Convert(valuebuffer)); + } else { + val = URLencode(valuebuffer); + } + + cString tmp = cString::sprintf("%s,%s", name, val); + free(val); return strdup(tmp); } @@ -98,11 +105,20 @@ cItemListData::~cItemListData() { free(stringvalues); } -char *cItemListData::GetQueryFragment() { +char *cItemListData::GetQueryFragment(const char *encoding) { const char *name = GetName(); + char *val; if (name && *name) { - cString tmp = cString::sprintf("%s,%s", name, stringvalues[value]); + if (encoding) { + cCharSetConv charsetconv = cCharSetConv("UTF-8", encoding); + val = URLencode(charsetconv.Convert(stringvalues[value])); + } else { + val = URLencode(stringvalues[value]); + } + + cString tmp = cString::sprintf("%s,%s", name, val); + free(val); return strdup(tmp); } @@ -128,15 +144,19 @@ int *cItemListData::GetValuePtr() { // --- cSubmissionButtonData ----------------------------------------------- cSubmissionButtonData::cSubmissionButtonData( - const char *queryUrl, const cHistoryObject *currentPage) + const char *queryUrl, const cHistoryObject *currentPage, + const char *enc) { querybase = queryUrl ? strdup(queryUrl) : NULL; page = currentPage; + encoding = enc ? strdup(enc) : NULL; } cSubmissionButtonData::~cSubmissionButtonData() { if (querybase) free(querybase); + if (encoding) + free(encoding); // do not free page } @@ -157,9 +177,10 @@ char *cSubmissionButtonData::GetURL() { int numparameters = 0; for (int i=0; i<page->QuerySize(); i++) { - char *parameter = page->GetQueryFragment(i); + char *parameter = page->GetQueryFragment(i, encoding); if (parameter) { - querystr = (char *)realloc(querystr, (strlen(querystr)+strlen(parameter)+8)*sizeof(char)); + size_t len = strlen(querystr) + strlen(parameter) + 8; + querystr = (char *)realloc(querystr, len*sizeof(char)); if (i > 0) strcat(querystr, "&"); strcat(querystr, "subst="); diff --git a/src/vdr-plugin/menudata.h b/src/vdr-plugin/menudata.h index 23a126c..98e5915 100644 --- a/src/vdr-plugin/menudata.h +++ b/src/vdr-plugin/menudata.h @@ -30,7 +30,7 @@ public: virtual ~cQueryData(); const char *GetName() { return name; } - virtual char *GetQueryFragment() = 0; + virtual char *GetQueryFragment(const char *encoding) = 0; }; // --- cSimpleLink --------------------------------------------------------- @@ -56,7 +56,7 @@ public: cTextFieldData(const char *Name, int Length); virtual ~cTextFieldData(); - virtual char *GetQueryFragment(); + virtual char *GetQueryFragment(const char *encoding); char *GetValue(); int GetLength(); }; @@ -74,7 +74,7 @@ public: cItemListData(const char *Name, char **Strings, char **StringValues, int NumStrings); virtual ~cItemListData(); - virtual char *GetQueryFragment(); + virtual char *GetQueryFragment(const char *encoding); char **GetStrings(); char **GetStringValues(); int GetNumStrings(); @@ -89,9 +89,11 @@ class cSubmissionButtonData : public cLinkBase { private: char *querybase; const cHistoryObject *page; + char *encoding; public: cSubmissionButtonData(const char *queryUrl, - const cHistoryObject *currentPage); + const cHistoryObject *currentPage, + const char *encoding); virtual ~cSubmissionButtonData(); virtual char *GetURL(); diff --git a/src/webvicli/webvicli/client.py b/src/webvicli/webvicli/client.py index 78a933d..f82c32a 100644 --- a/src/webvicli/webvicli/client.py +++ b/src/webvicli/webvicli/client.py @@ -279,14 +279,18 @@ class WVClient: def parse_button(self, node, queryitems): label = '' submission = None + encoding = 'utf-8' child = node.children while child: if child.name == 'label': label = webvi.utils.get_content_unicode(child) elif child.name == 'submission': submission = webvi.utils.get_content_unicode(child) + enc = child.hasProp('encoding') + if enc is not None: + encoding = webvi.utils.get_content_unicode(enc) child = child.next - return menu.MenuItemSubmitButton(label, submission, queryitems) + return menu.MenuItemSubmitButton(label, submission, queryitems, encoding) def guess_extension(self, mimetype, url): ext = mimetypes.guess_extension(mimetype) diff --git a/src/webvicli/webvicli/menu.py b/src/webvicli/webvicli/menu.py index f1f1f21..d8551a7 100644 --- a/src/webvicli/webvicli/menu.py +++ b/src/webvicli/webvicli/menu.py @@ -145,13 +145,14 @@ class MenuItemList: class MenuItemSubmitButton: - def __init__(self, label, baseurl, subitems): + def __init__(self, label, baseurl, subitems, encoding): self.label = label if type(baseurl) == unicode: self.baseurl = baseurl.encode('utf-8') else: self.baseurl = baseurl self.subitems = subitems + self.encoding = encoding def __str__(self): return '[' + self.label + ']' @@ -166,6 +167,11 @@ class MenuItemSubmitButton: parts = [] for sub in self.subitems: for key, val in sub.get_query().iteritems(): - parts.append('subst=' + urllib.quote_plus(key.encode('utf-8')) + ',' + urllib.quote_plus(val.encode('utf-8'))) + try: + parts.append('subst=' + \ + urllib.quote_plus(key.encode(self.encoding, 'ignore')) + ',' + \ + urllib.quote_plus(val.encode(self.encoding, 'ignore'))) + except LookupError: + pass return baseurl + '&'.join(parts) |