tool/CommandDownload.cpp
changeset 1835 20748e9d2238
parent 1826 ec6223c3b7ec
child 1868 489ea0becd74
--- a/tool/CommandDownload.cpp	Fri Mar 05 13:20:42 2010 +0100
+++ b/tool/CommandDownload.cpp	Fri Mar 05 13:39:57 2010 +0100
@@ -86,7 +86,7 @@
 
 void CommandDownload::execute(const StringVector &args)
 {
-    stringstream strIndex, strSubIndex, strValue, err;
+    stringstream strIndex, strSubIndex, err;
     ec_ioctl_slave_sdo_download_t data;
     unsigned int number;
     const DataType *dataType = NULL;
@@ -160,80 +160,12 @@
 
     data.data = new uint8_t[data.data_size + 1];
 
-    strValue << args[2];
-    strValue >> resetiosflags(ios::basefield); // guess base from prefix
-    strValue.exceptions(ios::failbit);
-
     try {
-        switch (dataType->coeCode) {
-            case 0x0002: // int8
-                {
-                    int16_t val; // uint8_t is interpreted as char
-                    strValue >> val;
-                    if (val > 127 || val < -128)
-                        throw ios::failure("Value out of range");
-                    *data.data = val;
-                    break;
-                }
-            case 0x0003: // int16
-                {
-                    int16_t val;
-                    strValue >> val;
-                    *(int16_t *) data.data = cpu_to_le16(val);
-                    break;
-                }
-            case 0x0004: // int32
-                {
-                    int32_t val;
-                    strValue >> val;
-                    *(int32_t *) data.data = cpu_to_le32(val);
-                    break;
-                }
-            case 0x0005: // uint8
-                {
-                    uint16_t val; // uint8_t is interpreted as char
-                    strValue >> val;
-                    if (val > 0xff)
-                        throw ios::failure("Value out of range");
-                    *data.data = val;
-                    break;
-                }
-            case 0x0006: // uint16
-                {
-                    uint16_t val;
-                    strValue >> val;
-                    *(uint16_t *) data.data = cpu_to_le16(val);
-                    break;
-                }
-            case 0x0007: // uint32
-                {
-                    uint32_t val;
-                    strValue >> val;
-                    *(uint32_t *) data.data = cpu_to_le32(val);
-                    break;
-                }
-            case 0x0009: // string
-                if (strValue.str().size() >= data.data_size) {
-                    err << "String too large";
-                    throwCommandException(err);
-                }
-                data.data_size = strValue.str().size();
-                strValue >> (char *) data.data;
-                break;
-            case 0x000a: // octet_string
-                if (strValue.str().size() >= data.data_size) {
-                    err << "String too large";
-                    throwCommandException(err);
-                }
-                data.data_size = strValue.str().size();
-                strValue >> (char *) data.data;
-                break;
-
-            default:
-                delete [] data.data;
-                err << "Unknown data type 0x" << hex << dataType->coeCode;
-                throwCommandException(err);
-        }
+        data.data_size = interpretAsType(
+                dataType, args[2], data.data, data.data_size);
+    } catch (SizeException &e) {
+        delete [] data.data;
+        throwCommandException(e.what());
     } catch (ios::failure &e) {
         delete [] data.data;
         err << "Invalid value argument '" << args[2]