Ticket #3155: patch3155_2

File patch3155_2, 14.3 KB (added by morpheuz@…, 17 years ago)

fix to support codecparams table

Line 
1Index: programs/mythbackend/httpstatus.cpp
2===================================================================
3--- programs/mythbackend/httpstatus.cpp (revision 12909)
4+++ programs/mythbackend/httpstatus.cpp (working copy)
5@@ -83,6 +83,10 @@
6     if (sURI == "getCMGRDesc"          ) return( HSM_GetCMGRDesc     );
7     if (sURI == "getMSRRDesc"          ) return( HSM_GetMSRRDesc     );
8 
9+    if (sURI == "getRecProfiles"       ) return( HSM_GetRecProfiles   );
10+    if (sURI == "delRecProfiles"       ) return( HSM_DelRecProfiles   );
11+    if (sURI == "createRecProfiles"    ) return( HSM_CreateRecProfiles);
12+
13     if (sURI == "*"                    ) return( HSM_Asterisk        );
14 
15     return( HSM_Unknown );
16@@ -124,6 +128,10 @@
17                 case HSM_GetMusic       : GetMusic       ( pThread, pRequest ); return( true );
18                 case HSM_GetVideo       : GetVideo       ( pThread, pRequest ); return( true );
19 
20+                case HSM_GetRecProfiles    : GetRecProfiles    ( pRequest ); return( true );
21+                case HSM_DelRecProfiles    : DelRecProfiles    ( pRequest ); return( true );
22+                case HSM_CreateRecProfiles : CreateRecProfiles ( pRequest ); return( true );
23+
24                 default:
25                 {
26                                    pRequest->m_eResponseType   = ResponseTypeHTML;
27@@ -1236,6 +1244,252 @@
28 //
29 /////////////////////////////////////////////////////////////////////////////
30 
31+void HttpStatus::GetRecProfiles( HTTPRequest *pRequest )
32+{
33+    QString group_name = pRequest->m_mapParams[ "groupname" ];
34+
35+    // Build Response XML
36+    QDomDocument doc( "Profiles" );
37+
38+    QDomElement root = doc.createElement("Profiles");
39+    doc.appendChild(root);
40+
41+    root.setAttribute("asOf"      , QDateTime::currentDateTime().toString( Qt::ISODate ));
42+    root.setAttribute("version"   , MYTH_BINARY_VERSION           );
43+    root.setAttribute("protoVer"  , MYTH_PROTO_VERSION            );
44+
45+    MSqlQuery query(MSqlQuery::InitCon());
46+    MSqlQuery query2(MSqlQuery::InitCon());
47+
48+    if (group_name != "")
49+    {
50+        query.prepare( "SELECT r.* FROM recordingprofiles r,profilegroups p"
51+                        " WHERE p.name=:GROUPNAME AND r.profilegroup = p.id" );
52+        query.bindValue(":GROUPNAME", group_name);
53+    } else
54+        query.prepare( "SELECT * FROM recordingprofiles" );
55+
56+    if (!query.exec() || !query.isActive())
57+        MythContext::DBError("No Profiles", query);
58+
59+    if (query.size() > 0)
60+    {
61+
62+        while (query.next())
63+        {
64+            QDomElement profile = doc.createElement("Profile");
65+            root.appendChild(profile);
66+
67+            profile.setAttribute("acodec"   , query.value(3).toString());
68+            profile.setAttribute("vcodec"   , query.value(2).toString());
69+            profile.setAttribute("name"     , query.value(1).toString());
70+            profile.setAttribute("id"       , query.value(0).toString());
71+
72+            QDomElement options = doc.createElement("Options");
73+            profile.appendChild(options);
74+
75+            query2.prepare( "SELECT name,value FROM codecparams"
76+                           " WHERE profile=:ID" );
77+            query2.bindValue(":ID", query.value(0).toString());
78+
79+            query2.exec();
80+
81+            while (query2.next())
82+            {
83+                options.setAttribute(query2.value(0).toString(), query2.value(1).toString());
84+            }
85+
86+        }
87+
88+    }
89+
90+    // Sends back the response
91+    pRequest->m_mapRespHeaders[ "Cache-Control" ] = "no-cache=\"Ext\", max-age = 5000";
92+    pRequest->m_eResponseType = ResponseTypeXML;
93+    pRequest->m_response << doc.toString();
94+
95+}
96+
97+/////////////////////////////////////////////////////////////////////////////
98+//
99+/////////////////////////////////////////////////////////////////////////////
100+void HttpStatus::CreateRecProfiles( HTTPRequest *pRequest )
101+{
102+    pRequest->m_eResponseType   = ResponseTypeXML;
103+    pRequest->m_mapRespHeaders[ "Cache-Control" ] = "no-cache=\"Ext\", max-age = 5000";
104+
105+    QString profile_name                = pRequest->m_mapParams[ "profilename" ];
106+    QString group_name                  = pRequest->m_mapParams[ "groupname" ];
107+    QString vcodec                      = pRequest->m_mapParams[ "vcodec" ];
108+    QString acodec                      = pRequest->m_mapParams[ "acodec" ];
109+    QString* transcodelossless          = &(pRequest->m_mapParams[ "transcodelossless" ]);
110+    QString* transcoderesize            = &(pRequest->m_mapParams[ "transcoderesize" ]);
111+    QString* width                      = &(pRequest->m_mapParams[ "width" ]);
112+    QString* height                     = &(pRequest->m_mapParams[ "height" ]);
113+    QString* rtjpegquality              = &(pRequest->m_mapParams[ "rtjpegquality" ]);
114+    QString* rtjpeglumafilter           = &(pRequest->m_mapParams[ "rtjpeglumafilter" ]);
115+    QString* rtjpegchromafilter         = &(pRequest->m_mapParams[ "rtjpegchromafilter" ]);
116+    QString* mpeg4bitrate               = &(pRequest->m_mapParams[ "mpeg4bitrate" ]);
117+    QString* mpeg4maxquality            = &(pRequest->m_mapParams[ "mpeg4maxquality" ]);
118+    QString* mpeg4minquality            = &(pRequest->m_mapParams[ "mpeg4minquality" ]);
119+    QString* mpeg4qualdiff              = &(pRequest->m_mapParams[ "mpeg4qualdiff" ]);
120+    QString* mpeg4scalebitrate          = &(pRequest->m_mapParams[ "mpeg4scalebitrate" ]);
121+    QString* mpeg4optionvhq             = &(pRequest->m_mapParams[ "mpeg4optionvhq" ]);
122+    QString* mpeg4option4mv             = &(pRequest->m_mapParams[ "mpeg4option4mv" ]);
123+    QString* mpeg4optionidct            = &(pRequest->m_mapParams[ "mpeg4optionidct" ]);
124+    QString* mpeg4optionime             = &(pRequest->m_mapParams[ "mpeg4optionime" ]);
125+    QString* hardwaremjpegquality       = &(pRequest->m_mapParams[ "hardwaremjpegquality" ]);
126+    QString* hardwaremjpeghdecimation   = &(pRequest->m_mapParams[ "hardwaremjpeghdecimation" ]);
127+    QString* hardwaremjpegvdecimation   = &(pRequest->m_mapParams[ "hardwaremjpegvdecimation" ]);
128+    QString* mpeg2streamtype            = &(pRequest->m_mapParams[ "mpeg2streamtype" ]);
129+    QString* mpeg2aspectratio           = &(pRequest->m_mapParams[ "mpeg2aspectratio" ]);
130+    QString* mpeg2bitrate               = &(pRequest->m_mapParams[ "mpeg2bitrate" ]);
131+    QString* mpeg2maxbitrate            = &(pRequest->m_mapParams[ "mpeg2maxbitrate" ]);
132+    QString* samplerate                 = &(pRequest->m_mapParams[ "samplerate" ]);
133+    QString* mp3quality                 = &(pRequest->m_mapParams[ "mp3quality" ]);
134+    QString* volume                     = &(pRequest->m_mapParams[ "volume" ]);
135+    QString* mpeg2audtype               = &(pRequest->m_mapParams[ "mpeg2audtype" ]);
136+    QString* mpeg2audbitratel1          = &(pRequest->m_mapParams[ "mpeg2audbitratel1" ]);
137+    QString* mpeg2audbitratel2          = &(pRequest->m_mapParams[ "mpeg2audbitratel2" ]);
138+    QString* mpeg2audvolume             = &(pRequest->m_mapParams[ "mpeg2audvolume" ]);
139+
140+    QPtrList<const char> list_opts;
141+    QPtrList<QString> list;
142+    list_opts.append("transcodelossless");
143+    list.append(transcodelossless);
144+    list_opts.append("transcoderesize"); list.append(transcoderesize);
145+    list_opts.append("width"); list.append(width);
146+    list_opts.append("height"); list.append(height);
147+    list_opts.append("rtjpegquality"); list.append(rtjpegquality);
148+    list_opts.append("rtjpeglumafilter"); list.append(rtjpeglumafilter);
149+    list_opts.append("rtjpegchromafilter"); list.append(rtjpegchromafilter);
150+    list_opts.append("mpeg4bitrate"); list.append(mpeg4bitrate);
151+    list_opts.append("mpeg4maxquality"); list.append(mpeg4maxquality);
152+    list_opts.append("mpeg4minquality"); list.append(mpeg4minquality);
153+    list_opts.append("mpeg4qualdiff"); list.append(mpeg4qualdiff);
154+    list_opts.append("mpeg4scalebitrate"); list.append(mpeg4scalebitrate);
155+    list_opts.append("mpeg4optionvhq"); list.append(mpeg4optionvhq);
156+    list_opts.append("mpeg4option4mv"); list.append(mpeg4option4mv);
157+    list_opts.append("mpeg4optionidct"); list.append(mpeg4optionidct);
158+    list_opts.append("mpeg4optionime"); list.append(mpeg4optionime);
159+    list_opts.append("hardwaremjpegquality"); list.append(hardwaremjpegquality);
160+    list_opts.append("hardwaremjpeghdecimation"); list.append(hardwaremjpeghdecimation);
161+    list_opts.append("hardwaremjpegvdecimation"); list.append(hardwaremjpegvdecimation);
162+    list_opts.append("mpeg2streamtype"); list.append(mpeg2streamtype);
163+    list_opts.append("mpeg2aspectratio"); list.append(mpeg2aspectratio);
164+    list_opts.append("mpeg2bitrate"); list.append(mpeg2bitrate);
165+    list_opts.append("mpeg2maxbitrate"); list.append(mpeg2maxbitrate);
166+    list_opts.append("samplerate"); list.append(samplerate);
167+    list_opts.append("mp3quality"); list.append(mp3quality);
168+    list_opts.append("volume"); list.append(volume);
169+    list_opts.append("mpeg2audtype"); list.append(mpeg2audtype);
170+    list_opts.append("mpeg2audbitratel1"); list.append(mpeg2audbitratel1);
171+    list_opts.append("mpeg2audbitratel2"); list.append(mpeg2audbitratel2);
172+    list_opts.append("mpeg2audvolume"); list.append(mpeg2audvolume);
173+
174+    if (profile_name != "" && vcodec != "" && acodec != "" && group_name != "")
175+    {
176+        MSqlQuery query(MSqlQuery::InitCon());
177+
178+        query.prepare("SELECT id FROM profilegroups WHERE name=:GROUPNAME");
179+        query.bindValue(":GROUPNAME", group_name);
180+
181+        if (!query.exec() || !query.isActive())
182+            MythContext::DBError("Query problem while trying to "
183+                                 "retrieve id from Group_Name", query);
184+
185+        if (query.size() > 0)
186+        {
187+            query.first();
188+            QString group = query.value(0).toString();
189+
190+            query.prepare("INSERT INTO recordingprofiles VALUES"
191+                        " (NULL,:PNAME,:VCODEC,:ACODEC,:GROUP)" );
192+            query.bindValue(":PNAME", profile_name );
193+            query.bindValue(":VCODEC", vcodec );
194+            query.bindValue(":ACODEC", acodec );
195+            query.bindValue(":GROUP", group );
196+
197+            if (!query.exec() || !query.isActive())
198+            {
199+                MythContext::DBError("Problems while inserting profile", query);
200+                pRequest->m_response <<  "<Error>Problem with the MySQL Query</Error>";
201+            }
202+            else
203+            {
204+
205+                query.prepare("SELECT id FROM recordingprofiles WHERE name=:PNAME");
206+                query.bindValue(":PNAME", profile_name);
207+                query.exec();
208+
209+                query.first();
210+                QString id = query.value(0).toString();
211+                query.prepare("INSERT INTO codecparams VALUES (:ID, :OPTION, :VALUE)");
212+                query.bindValue(":ID", id);
213+                QString* value;
214+
215+                uint i = 0;
216+                while (i < list_opts.count())
217+                {
218+                    if (list_opts.at(i) != "")
219+                    {
220+                        query.bindValue(":OPTION", list_opts.at(i));
221+                        value = list.at(i);
222+                        query.bindValue(":VALUE", *value);
223+                        query.exec();
224+                    }
225+                    i++;
226+                }
227+
228+                pRequest->m_response <<  "<Success>Profile Created</Success>";
229+            }
230+
231+        }
232+        else
233+            pRequest->m_response <<  "<Error>No Result from SQL Query</Error>";
234+    }
235+    else
236+        pRequest->m_response <<  "<Error>You must specify ALL the parameters</Error>";
237+}
238+
239+/////////////////////////////////////////////////////////////////////////////
240+//
241+/////////////////////////////////////////////////////////////////////////////
242+
243+void HttpStatus::DelRecProfiles( HTTPRequest *pRequest )
244+{
245+    pRequest->m_eResponseType   = ResponseTypeXML;
246+    pRequest->m_mapRespHeaders[ "Cache-Control" ] = "no-cache=\"Ext\", max-age = 5000";
247+
248+    QString profile_id = pRequest->m_mapParams[ "id" ];
249+
250+    if (profile_id != "")
251+    {
252+        MSqlQuery query(MSqlQuery::InitCon());
253+        MSqlQuery query2(MSqlQuery::InitCon());
254+
255+        query.prepare("DELETE FROM recordingprofiles WHERE id = :ID" );
256+        query2.prepare("DELETE FROM codecparams WHERE profile = :ID" );
257+        query.bindValue(":ID", profile_id );
258+        query2.bindValue(":ID", profile_id );
259+
260+        if (!query.exec() || !query.isActive() || !query2.exec() || !query2.isActive())
261+        {
262+            MythContext::DBError("Problems while deleting profile", query);
263+            pRequest->m_response <<  "<Error>Problem with the MySQL Query</Error>";
264+        }
265+        else
266+            pRequest->m_response <<  "<Success>Profile Deleted</Success>";
267+
268+    }
269+    else
270+        pRequest->m_response <<  "<Error>You must specify the id to delete</Error>";
271+}
272+
273+/////////////////////////////////////////////////////////////////////////////
274+//
275+/////////////////////////////////////////////////////////////////////////////
276+
277 void HttpStatus::GetStatusXML( HTTPRequest *pRequest )
278 {
279     QDomDocument doc( "Status" );                       
280Index: programs/mythbackend/httpstatus.h
281===================================================================
282--- programs/mythbackend/httpstatus.h   (revision 12909)
283+++ programs/mythbackend/httpstatus.h   (working copy)
284@@ -1,4 +1,5 @@
285-//////////////////////////////////////////////////////////////////////////////
286+//////////
287+////////////////////////////////////////////////////////////////////
288 // Program Name: httpstatus.h
289 //                                                                           
290 // Purpose - Html & XML status HttpServerExtension
291@@ -51,8 +52,12 @@
292     HSM_GetProgramDetails = 18,
293 
294     HSM_GetVideo        = 19,
295-    HSM_GetMSRRDesc     = 20
296+    HSM_GetMSRRDesc     = 20,
297 
298+    HSM_GetRecProfiles    = 21,
299+    HSM_DelRecProfiles    = 22,
300+    HSM_CreateRecProfiles = 23
301+
302 } HttpStatusMethod;
303 
304 /////////////////////////////////////////////////////////////////////////////
305@@ -180,6 +185,10 @@
306         void    GetVideo       ( HttpWorkerThread *pThread,
307                                  HTTPRequest      *pRequest );
308 
309+        void    GetRecProfiles    ( HTTPRequest *pRequest );
310+        void    DelRecProfiles    ( HTTPRequest *pRequest );
311+        void    CreateRecProfiles ( HTTPRequest *pRequest );
312+
313         void    GetDeviceDesc  ( HTTPRequest *pRequest );
314         void    GetFile        ( HTTPRequest *pRequest, QString sFileName );
315