|
a/src/upexplo.cpp |
|
b/src/upexplo.cpp |
|
... |
|
... |
34 |
#define OPT_r 0x80
|
34 |
#define OPT_r 0x80
|
35 |
#define OPT_s 0x100
|
35 |
#define OPT_s 0x100
|
36 |
#define OPT_u 0x200
|
36 |
#define OPT_u 0x200
|
37 |
#define OPT_V 0x400
|
37 |
#define OPT_V 0x400
|
38 |
#define OPT_v 0x800
|
38 |
#define OPT_v 0x800
|
39 |
|
39 |
#define OPT_1 0x1000
|
|
|
40 |
#define OPT_U 0x2000
|
40 |
|
41 |
|
41 |
UPnPDeviceDirectory *superdir;
|
42 |
UPnPDeviceDirectory *superdir;
|
42 |
|
43 |
|
43 |
std::mutex reporterLock;
|
44 |
std::mutex reporterLock;
|
44 |
std::condition_variable evloopcond;
|
45 |
std::condition_variable evloopcond;
|
|
... |
|
... |
77 |
const int typewidth(48);
|
78 |
const int typewidth(48);
|
78 |
cout << setw(namewidth) << device.friendlyName << setw(0) <<
|
79 |
cout << setw(namewidth) << device.friendlyName << setw(0) <<
|
79 |
setw(typewidth) << string(" (") + device.deviceType + ")";
|
80 |
setw(typewidth) << string(" (") + device.deviceType + ")";
|
80 |
if (op_flags & OPT_u) {
|
81 |
if (op_flags & OPT_u) {
|
81 |
cout << " " << device.URLBase;
|
82 |
cout << " " << device.URLBase;
|
|
|
83 |
}
|
|
|
84 |
if (op_flags & OPT_U) {
|
|
|
85 |
cout << " " << device.UDN;
|
82 |
}
|
86 |
}
|
83 |
cout << endl;
|
87 |
cout << endl;
|
84 |
}
|
88 |
}
|
85 |
|
89 |
|
86 |
static bool traverser(const UPnPDeviceDesc& device, const UPnPServiceDesc& srv)
|
90 |
static bool traverser(const UPnPDeviceDesc& device, const UPnPServiceDesc& srv)
|
|
... |
|
... |
124 |
showDevice(deviceList[i]);
|
128 |
showDevice(deviceList[i]);
|
125 |
}
|
129 |
}
|
126 |
ndevices = deviceList.size();
|
130 |
ndevices = deviceList.size();
|
127 |
}
|
131 |
}
|
128 |
} else {
|
132 |
} else {
|
129 |
cerr << "Initial delay done\n";
|
133 |
if (cbindex >= 0) {
|
|
|
134 |
cerr << "Initial delay done. " << deviceList.size() << " devices\n";
|
|
|
135 |
UPnPDeviceDirectory::delCallback(cbindex);
|
|
|
136 |
cbindex = -2;
|
|
|
137 |
return;
|
|
|
138 |
} else {
|
130 |
break;
|
139 |
break;
|
|
|
140 |
}
|
131 |
}
|
141 |
}
|
132 |
}
|
142 |
}
|
133 |
|
143 |
|
134 |
|
144 |
|
135 |
// Called after initial delay done. Unset the callback and
|
145 |
// Called after initial delay done. Unset the callback and
|
136 |
// traverse the directory
|
146 |
// traverse the directory
|
137 |
if (cbindex >= 0) {
|
|
|
138 |
UPnPDeviceDirectory::delCallback(cbindex);
|
|
|
139 |
cbindex = -2;
|
|
|
140 |
}
|
|
|
141 |
clearDevices();
|
147 |
clearDevices();
|
142 |
auto ret = superdir->traverse(traverser);
|
148 |
auto ret = superdir->traverse(traverser);
|
143 |
cerr << "Now having " << deviceList.size() << " devices " << endl;
|
149 |
cerr << "Now having " << deviceList.size() << " devices " << endl;
|
144 |
}
|
150 |
}
|
145 |
|
151 |
|
|
... |
|
... |
189 |
cout << "Changed: " << nm << " : " << s << endl;
|
195 |
cout << "Changed: " << nm << " : " << s << endl;
|
190 |
}
|
196 |
}
|
191 |
|
197 |
|
192 |
};
|
198 |
};
|
193 |
|
199 |
|
194 |
MRDH getRenderer(const string& friendlyName)
|
200 |
MRDH getRenderer(const string& name)
|
195 |
{
|
201 |
{
|
196 |
if (superdir == 0) {
|
202 |
if (superdir == 0) {
|
197 |
superdir = UPnPDeviceDirectory::getTheDir();
|
203 |
superdir = UPnPDeviceDirectory::getTheDir();
|
198 |
}
|
204 |
}
|
199 |
|
205 |
|
200 |
UPnPDeviceDesc ddesc;
|
206 |
UPnPDeviceDesc ddesc;
|
|
|
207 |
if (superdir->getDevByUDN(name, ddesc)) {
|
|
|
208 |
return MRDH(new MediaRenderer(ddesc));
|
201 |
if (superdir->getDevByFName(friendlyName, ddesc)) {
|
209 |
} else if (superdir->getDevByFName(name, ddesc)) {
|
202 |
return MRDH(new MediaRenderer(ddesc));
|
210 |
return MRDH(new MediaRenderer(ddesc));
|
203 |
}
|
211 |
}
|
204 |
cerr << "getDevByFname failed" << endl;
|
212 |
cerr << "getDevByFname failed" << endl;
|
205 |
return MRDH();
|
213 |
return MRDH();
|
206 |
}
|
214 |
}
|
|
... |
|
... |
439 |
|
447 |
|
440 |
|
448 |
|
441 |
static char *thisprog;
|
449 |
static char *thisprog;
|
442 |
static char usage [] =
|
450 |
static char usage [] =
|
443 |
" -l : list devices\n"
|
451 |
" -l : list devices\n"
|
|
|
452 |
" -1 : loop only once (initial discovery)\n"
|
444 |
" [-u] Add url to device lines\n"
|
453 |
" [-u] Add url to device lines\n"
|
445 |
" -r <server> <objid> list object id (root is '0')\n"
|
454 |
" -r <server> <objid> list object id (root is '0')\n"
|
446 |
" -s <server> <searchstring> search for string\n"
|
455 |
" -s <server> <searchstring> search for string\n"
|
447 |
" -m <server> <objid> : list object metadata\n"
|
456 |
" -m <server> <objid> : list object metadata\n"
|
448 |
" -c <server> get search capabilities\n"
|
457 |
" -c <server> get search capabilities\n"
|
|
... |
|
... |
450 |
" -v <renderer> get volume\n"
|
459 |
" -v <renderer> get volume\n"
|
451 |
" -V <renderer> <volume> set volume\n"
|
460 |
" -V <renderer> <volume> set volume\n"
|
452 |
" -p <renderer> 1|0 play/stop\n"
|
461 |
" -p <renderer> 1|0 play/stop\n"
|
453 |
" -P <renderer> pause\n"
|
462 |
" -P <renderer> pause\n"
|
454 |
" --album-art <renderer> print album art uri for playing track\n"
|
463 |
" --album-art <renderer> print album art uri for playing track\n"
|
455 |
"\nFor now all <renderer> and <server> params should be "
|
464 |
"\n<renderer> params can be either \"friendly names\", or UDNs\n"
|
456 |
"\"friendly names\", not UUIDs\n"
|
465 |
"<server> params must be \"friendly names\"\n"
|
457 |
" \n"
|
466 |
" \n"
|
458 |
;
|
467 |
;
|
459 |
static void
|
468 |
static void
|
460 |
Usage(void)
|
469 |
Usage(void)
|
461 |
{
|
470 |
{
|
|
... |
|
... |
475 |
|
484 |
|
476 |
thisprog = argv[0];
|
485 |
thisprog = argv[0];
|
477 |
|
486 |
|
478 |
int ret;
|
487 |
int ret;
|
479 |
int option_index = 0;
|
488 |
int option_index = 0;
|
480 |
while ((ret = getopt_long(argc, argv, "MPSVclmprsuvx",
|
489 |
while ((ret = getopt_long(argc, argv, "1MPSVclmprsUuvx",
|
481 |
long_options, &option_index)) != -1) {
|
490 |
long_options, &option_index)) != -1) {
|
482 |
switch (ret) {
|
491 |
switch (ret) {
|
|
|
492 |
case '1': op_flags |= OPT_1; break;
|
483 |
case 'a': if (op_flags) Usage(); op_flags |= OPT_a; break;
|
493 |
case 'a': if (op_flags) Usage(); op_flags |= OPT_a; break;
|
484 |
case 'M': if (op_flags) Usage(); op_flags |= OPT_M; break;
|
494 |
case 'M': if (op_flags) Usage(); op_flags |= OPT_M; break;
|
485 |
case 'P': if (op_flags) Usage(); op_flags |= OPT_P; break;
|
495 |
case 'P': if (op_flags) Usage(); op_flags |= OPT_P; break;
|
486 |
case 'V': if (op_flags) Usage(); op_flags |= OPT_V; break;
|
496 |
case 'V': if (op_flags) Usage(); op_flags |= OPT_V; break;
|
487 |
case 'c': if (op_flags) Usage(); op_flags |= OPT_c; break;
|
497 |
case 'c': if (op_flags) Usage(); op_flags |= OPT_c; break;
|
|
... |
|
... |
489 |
case 'm': if (op_flags) Usage(); op_flags |= OPT_m; break;
|
499 |
case 'm': if (op_flags) Usage(); op_flags |= OPT_m; break;
|
490 |
case 'p': if (op_flags) Usage(); op_flags |= OPT_p; break;
|
500 |
case 'p': if (op_flags) Usage(); op_flags |= OPT_p; break;
|
491 |
case 'r': if (op_flags) Usage(); op_flags |= OPT_r; break;
|
501 |
case 'r': if (op_flags) Usage(); op_flags |= OPT_r; break;
|
492 |
case 's': if (op_flags) Usage(); op_flags |= OPT_s; break;
|
502 |
case 's': if (op_flags) Usage(); op_flags |= OPT_s; break;
|
493 |
case 'u': op_flags |= OPT_u; break;
|
503 |
case 'u': op_flags |= OPT_u; break;
|
|
|
504 |
case 'U': op_flags |= OPT_U; break;
|
494 |
case 'v': if (op_flags) Usage(); op_flags |= OPT_v; break;
|
505 |
case 'v': if (op_flags) Usage(); op_flags |= OPT_v; break;
|
495 |
|
506 |
|
496 |
default:
|
507 |
default:
|
497 |
Usage();
|
508 |
Usage();
|
498 |
}
|
509 |
}
|
|
... |
|
... |
538 |
// mylib->setLogFileName("/tmp/libupnp.log", LibUPnP::LogLevelDebug);
|
549 |
// mylib->setLogFileName("/tmp/libupnp.log", LibUPnP::LogLevelDebug);
|
539 |
|
550 |
|
540 |
if ((op_flags & OPT_l)) {
|
551 |
if ((op_flags & OPT_l)) {
|
541 |
while (true) {
|
552 |
while (true) {
|
542 |
listDevices();
|
553 |
listDevices();
|
|
|
554 |
if (op_flags & OPT_1) {
|
|
|
555 |
break;
|
|
|
556 |
}
|
543 |
sleep(5);
|
557 |
sleep(5);
|
544 |
}
|
558 |
}
|
545 |
} else if ((op_flags & OPT_m)) {
|
559 |
} else if ((op_flags & OPT_m)) {
|
546 |
getMetadata(fname, arg);
|
560 |
getMetadata(fname, arg);
|
547 |
} else if ((op_flags & OPT_r)) {
|
561 |
} else if ((op_flags & OPT_r)) {
|