summaryrefslogtreecommitdiff
path: root/src/vdr-plugin
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/vdr-plugin
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/vdr-plugin')
-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
6 files changed, 54 insertions, 17 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();