Ticket #428 (new defect)

Opened 5 years ago

Error sending raw commands from tdtool with bytes > 0x7F

Reported by: stefan persson <stefan.persson@…> Owned by:
Priority: minor Milestone: 2.1.3
Component: telldus-core Version: 2.1.2
Keywords: Cc:
Blocked By: Blocking:
Platform: All Sensitive: no
Verified by Telldus: no

Description

See if the following change is working across all platforms, if so add it (many thanks to Richard O for this fix):

Hej, nu har jag fixat det och just där det skedde en omvandling till UTF-8 så har jag gjort en egen alternativ funktion: (Hoppas det är läsbart!)
Jag har lagt till funktionen i DeviceManager.cpp precis före int DeviceManager::sendRawCommand(const std::wstring &command, int reserved)

Här kommer funktionen:

char * r2ConvertWideToCharString(std::wstring incomingString, char *outgoingString)
{
char theChar;
char inLen;
int x;

inLen = incomingString.length();

for(x=0;x < inLen;x++)
{
theChar = incomingString[x];
printf("[%02X]",theChar);
outgoingString[x] = theChar;
}

outgoingString[x] = 0;

printf("\n");

return outgoingString;
}

Sedan har jag i DeviceManager::sendRawCommand på de två första raderna lagt in:
char charCommand[command.length() + 1];
r2ConvertWideToCharString(command,charCommand);

Och slutligen på de två rader som skickar vidare kommandot så har jag bytt ut strängen som skickas:
retval = controller->send(TelldusCore::wideToString(command));
retval = controller->send(charCommand);


Jag har i filen DeviceManager.cpp ändrat i funktionen "int DeviceManager::sendRawCommand(const std::wstring &command, int reserved) {" och lagt till en extra funktion före som gör omvandlingen från wide till vanlig char-sträng utan UTF-8-konverteringen som användes tidigare. (Den kallade i originalet på "TelldusCore::wideToString(command)" i common/Strings.cpp och där blev den felaktigt översatt.)
Detta påverkar inga andra teckenkonverteringar.

Här kommer min extra funktion följt av originalfunktionen med fyra annorlunda rader: (Man kan förenkla och förkorta ytterligare om man vill...)

char * r2ConvertWideToCharString(std::wstring incomingString, char *outgoingString)
{
char theChar;
char inLen;
int x;

inLen = incomingString.length();

for(x=0;x < inLen;x++)
{
theChar = incomingString[x];
printf("[%02X]",theChar);
outgoingString[x] = theChar;
}

outgoingString[x] = 0;

printf("\n");

return outgoingString;
}

int DeviceManager::sendRawCommand(const std::wstring &command, int reserved) {

char charCommand[command.length() + 1];
r2ConvertWideToCharString(command,charCommand);

Controller *controller = d->controllerManager->getBestControllerById(-1);

if(!controller) {
no controller found, scan for one, and retry once
d->controllerManager->loadControllers();
controller = d->controllerManager->getBestControllerById(-1);
}

int retval = TELLSTICK_ERROR_UNKNOWN;
if(controller) {

retval = controller->send(TelldusCore::wideToString(command));
retval = controller->send(charCommand);

if(retval == TELLSTICK_ERROR_BROKEN_PIPE) {
d->controllerManager->resetController(controller);
}

if(retval == TELLSTICK_ERROR_BROKEN_PIPE
retval == TELLSTICK_ERROR_NOT_FOUND) {

d->controllerManager->loadControllers();
controller = d->controllerManager->getBestControllerById(-1);
if(!controller) {
return TELLSTICK_ERROR_NOT_FOUND;
}
retval = controller->send(TelldusCore::wideToString(command)); retry one more time
retval = controller->send(charCommand); retry one more time
}
return retval;
} else {
return TELLSTICK_ERROR_NOT_FOUND;
}
}

Note: See TracTickets for help on using tickets.