MythTV master
messageutils.cpp
Go to the documentation of this file.
1// C++ includes
2#include <iostream> // for cerr, cout
3using std::cerr;
4using std::cout;
5using std::endl;
6
7// Qt headers
8#include <QFile>
9#include <QHostAddress>
10#include <QString>
11#include <QUdpSocket>
12
13// libmyth* includes
14#include "libmythbase/compat.h"
16
17// Local includes
18#include "messageutils.h"
19
20const QString kMessage =
21"<mythmessage version=\"1\">\n"
22" <text>%message_text%</text>\n"
23" <timeout>%timeout%</timeout>\n"
24"</mythmessage>";
25
26const QString kNotification =
27"<mythnotification version=\"1\">\n"
28" <text>%message_text%</text>\n"
29" <origin>%origin%</origin>\n"
30" <description>%description%</description>\n"
31" <error>%error%</error>\n"
32" <timeout>%timeout%</timeout>\n"
33" <image>%image%</image>\n"
34" <extra>%extra%</extra>\n"
35" <progress_text>%progress_text%</progress_text>\n"
36" <progress>%progress%</progress>\n"
37" <fullscreen>%fullscreen%</fullscreen>\n"
38" <visibility>%visibility%</visibility>\n"
39" <type>%type%</type>\n"
40"</mythnotification>";
41
42static int PrintMTemplate(const MythUtilCommandLineParser &/*cmdline*/)
43{
44 cerr << kMessage.toLocal8Bit().constData() << endl;
45 return GENERIC_EXIT_OK;
46}
47
48static int PrintNTemplate(const MythUtilCommandLineParser &/*cmdline*/)
49{
50 cerr << kNotification.toLocal8Bit().constData() << endl;
51 return GENERIC_EXIT_OK;
52}
53
55{
56 QHostAddress address = QHostAddress::Broadcast;
57 unsigned short port = 6948;
58 bool notification = cmdline.toBool("notification");
59 QString text /* = "message" */ ;
60 QString timeout = "0";
61 QString image = "";
62 QString origin = "MythUtils";
63 QString description = "";
64 QString extra = "";
65 QString progress_text = "";
66 QString progress = "-1";
67 QString fullscreen = "false";
68 QString error = "false";
69 QString visibility = "0";
70 QString type = "normal";
71
72 QString message = notification ? kNotification : kMessage;
73
74 if (cmdline.toBool("udpport"))
75 port = (unsigned short)cmdline.toUInt("udpport");
76 if (cmdline.toBool("bcastaddr"))
77 address.setAddress(cmdline.toString("bcastaddr"));
78 if (cmdline.toBool("message_text"))
79 text = cmdline.toString("message_text");
80 message.replace("%message_text%", text);
81 if (cmdline.toBool("timeout"))
82 timeout = cmdline.toString("timeout");
83 message.replace("%timeout%", timeout);
84 if (notification)
85 {
86 if (cmdline.toBool("image"))
87 image = cmdline.toString("image");
88 message.replace("%image%", image);
89 if (cmdline.toBool("origin"))
90 origin = cmdline.toString("origin");
91 message.replace("%origin%", origin);
92 if (cmdline.toBool("description"))
93 description = cmdline.toString("description");
94 message.replace("%description%", description);
95 if (cmdline.toBool("extra"))
96 extra = cmdline.toString("extra");
97 message.replace("%extra%", extra);
98 if (cmdline.toBool("progress_text"))
99 progress_text = cmdline.toString("progress_text");
100 message.replace("%progress_text%", progress_text);
101 if (cmdline.toBool("progress"))
102 progress = cmdline.toString("progress");
103 message.replace("%progress%", progress);
104 if (cmdline.toBool("fullscreen"))
105 fullscreen = cmdline.toString("fullscreen");
106 message.replace("%fullscreen%", fullscreen);
107 if (cmdline.toBool("error"))
108 error = cmdline.toString("error");
109 message.replace("%error%", error);
110 if (cmdline.toBool("visibility"))
111 visibility = cmdline.toString("visibility");
112 message.replace("%visibility%", visibility);
113 if (cmdline.toBool("type"))
114 type = cmdline.toString("type");
115 message.replace("%type%", type);
116 }
117
118 // extra optional argument
119 // in effeect not use as the above code provides default for all possible
120 // cases
121 QMap<QString,QString>::const_iterator i;
122 QMap<QString,QString> extras = cmdline.GetExtra();
123 for (i = extras.cbegin(); i != extras.cend(); ++i)
124 {
125 QString kv_name = i.key();
126 const QString& kv_value = i.value();
127
128 kv_name.replace("--", "");
129 cerr << "name: " << kv_name.toLocal8Bit().constData()
130 << " -- value: " << kv_value.toLocal8Bit().constData() << endl;
131
132 kv_name.append("%");
133 kv_name.prepend("%");
134 message.replace(kv_name, kv_value);
135 }
136
137 cout << "output:\n" << message.toLocal8Bit().constData() << endl;
138
139 auto *sock = new QUdpSocket();
140 QByteArray utf8 = message.toUtf8();
141
142 int result = GENERIC_EXIT_OK;
143 if (sock->writeDatagram(utf8, address, port) < 0)
144 {
145 cout << "Failed to send UDP/XML packet" << endl;
146 result = GENERIC_EXIT_NOT_OK;
147 }
148 else
149 {
150 cout << "Sent UDP/XML packet to IP "
151 << address.toString().toLocal8Bit().constData()
152 << " and port: " << port << endl;
153 }
154
155 sock->deleteLater();
156
157 return result;
158}
159
161{
162 utilMap["message"] = &SendMessage;
163 utilMap["printmtemplate"] = &PrintMTemplate;
164 utilMap["notification"] = &SendMessage;
165 utilMap["printntemplate"] = &PrintNTemplate;
166}
167
168/* vim: set expandtab tabstop=4 shiftwidth=4: */
bool toBool(const QString &key) const
Returns stored QVariant as a boolean.
QMap< QString, QString > GetExtra(void) const
Return map of additional key/value pairs provided on the command line independent of any registered a...
QString toString(const QString &key) const
Returns stored QVariant as a QString, falling to default if not provided.
uint toUInt(const QString &key) const
Returns stored QVariant as an unsigned integer, falling to default if not provided.
@ GENERIC_EXIT_OK
Exited with no error.
Definition: exitcodes.h:13
@ GENERIC_EXIT_NOT_OK
Exited with error.
Definition: exitcodes.h:14
const QString kMessage
static int PrintMTemplate(const MythUtilCommandLineParser &)
static int SendMessage(const MythUtilCommandLineParser &cmdline)
void registerMessageUtils(UtilMap &utilMap)
static int PrintNTemplate(const MythUtilCommandLineParser &)
const QString kNotification
QMap< QString, UtilFunc > UtilMap
Definition: mythutil.h:15
MythCommFlagCommandLineParser cmdline
def error(message)
Definition: smolt.py:409