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)) {