summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAntti Ajanki <antti.ajanki@iki.fi>2011-06-12 15:18:36 +0300
committerAntti Ajanki <antti.ajanki@iki.fi>2011-06-12 15:18:36 +0300
commit541779154be54e113ddd8bfac7245aed484e9ced (patch)
tree3c4384f255b27db0c930defd14052374af9febbe /src
parentbd478ec0ef43d29f47a8892d558280cdd05a1dbb (diff)
downloadvdr-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.c3
-rw-r--r--src/vdr-plugin/history.c4
-rw-r--r--src/vdr-plugin/history.h2
-rw-r--r--src/vdr-plugin/menu.c13
-rw-r--r--src/vdr-plugin/menudata.c39
-rw-r--r--src/vdr-plugin/menudata.h10
-rw-r--r--src/webvicli/webvicli/client.py6
-rw-r--r--src/webvicli/webvicli/menu.py10
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)