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