Changeset 3830


Ignore:
Timestamp:
03/17/08 12:51:18 (12 years ago)
Author:
curtis
Message:

Fix bugs with single booleans, and arrays of strings.

Location:
trunk/loci/jvmlink
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/jvmlink/ConnThread.java

    r3825 r3830  
    223223    String name = readString(); 
    224224    int type = readInt(); 
     225    int insideType = -1; 
    225226    Object value = null; 
    226227    if (type == ARRAY_TYPE) { 
    227       int insideType = readInt(); 
     228      insideType = readInt(); 
    228229      int arrayLength = readInt(); 
    229230      int size = getSize(insideType); 
     
    386387    else if (type == SHORT_TYPE) value = new Short(readShort()); 
    387388 
    388     debug("setVar (" + type + "): " + name + " = " + getValue(value)); 
     389    String sType = type == 0 ? type + "/" + insideType : "" + type; 
     390    debug("setVar (" + sType + "): " + name + " = " + getValue(value)); 
    389391    if (value != null) r.setVar(name, value); 
    390392  } 
     
    447449      else if (value instanceof Long) type = LONG_TYPE; 
    448450      else if (value instanceof Short) type = SHORT_TYPE; 
    449       else type = INT_TYPE; //default 
     451      else debug("Unknown type for value: " + value.getClass().getName()); 
    450452    } 
    451453    catch (ReflectException e) { 
     
    471473      } 
    472474      else if (insideType == STRING_TYPE) { 
    473         //untested. probably quite messed up. 
    474         writeInt(4); 
     475        // NB: string size is variable 
    475476        String[] sArray = (String[]) theArray; 
    476         for (int i=0; i<arrayLen; i++) out.write(sArray[i].getBytes()); 
     477        for (int i=0; i<arrayLen; i++) writeString(sArray[i]); 
    477478      } 
    478479      else if (insideType == BYTE_TYPE) { 
  • trunk/loci/jvmlink/cpp/JVMLinkClient.cpp

    r3824 r3830  
    5454        CString command; 
    5555        // NB: Toggle comments to control debugging output for the server. 
    56         //command.Format("-cp %s loci.jvmlink.JVMLinkServer %d", classpath, port); 
    57         command.Format("-cp %s loci.jvmlink.JVMLinkServer -debug %d", classpath, port); 
     56        command.Format("-cp %s loci.jvmlink.JVMLinkServer %d", classpath, port); 
     57        //command.Format("-cp %s loci.jvmlink.JVMLinkServer -debug %d", classpath, port); 
    5858        debug("java " << command); 
    59         //ShellExecute(NULL, "open", "javaw.exe" , command, "", SW_SHOW); 
    60         ShellExecute(NULL, "open", "java.exe" , command, "", SW_SHOW); 
     59        ShellExecute(NULL, "open", "javaw.exe" , command, "", SW_SHOW); 
     60        //ShellExecute(NULL, "open", "java.exe" , command, "", SW_SHOW); 
    6161} 
    6262 
     
    125125        if (obj->type == ARRAY_TYPE) { 
    126126                obj->insideType = (Type) readInt(); 
    127                 obj->length = (Type) readInt(); 
    128                 obj->size = readInt(); 
    129                 obj->data = readMessage(obj->size * obj->length); 
     127                obj->length = readInt(); 
     128                if (obj->insideType == STRING_TYPE) { 
     129                        CString* s = new CString[obj->length]; 
     130                        for (int i=0; i<obj->length; i++) s[i] = *readString(); 
     131                        obj->data = s; 
     132                } 
     133                else { 
     134                        obj->size = readInt(); 
     135                        obj->data = readMessage(obj->size * obj->length); 
     136                } 
    130137                debug("getVar: got array: length=" << obj->length << ", type=" << obj->insideType); 
    131138        } 
    132139        else if (obj->type == STRING_TYPE) {     
    133                 int len = readInt(); 
    134                 char* buff = new char[len+1]; 
    135                 int size = recv(conn,buff,len,0); 
    136                 buff[len] = '\0'; 
    137                 obj->data = buff; 
    138                 obj->size = len; 
     140                obj->data = readString(); 
     141                obj->size = 0; 
    139142                debug("getVar: got string: length=" << len << ", value=" << buff); 
    140143        } 
     
    164167                if (obj->insideType == STRING_TYPE) { 
    165168                        CString* s = (CString*) obj->data; 
    166                         for (int i=0; i<obj->length; i++) sendMessage(s[i]); 
     169                        for (int i=0; i<obj->length; i++) { 
     170                                sendMessage(s[i]); 
     171                        } 
    167172                } 
    168173                else { 
     
    201206} 
    202207 
    203 void JVMLinkClient::setVar(CString argname, CString obj) { 
     208void JVMLinkClient::setVar(CString argname, CString* obj) { 
    204209        debug("setVar: " << argname << " = " << obj << " (string)"); 
    205         JVMLinkObject* jvmObj = new JVMLinkObject(argname, STRING_TYPE, &obj); 
     210        JVMLinkObject* jvmObj = new JVMLinkObject(argname, STRING_TYPE, obj); 
    206211        setVar(jvmObj); 
    207212        delete jvmObj; 
     
    317322int JVMLinkClient::sendMessage(CString message) { 
    318323    sendInt(message.GetLength()); 
    319         return send(conn,(LPCTSTR)message,message.GetLength(),0); 
     324        return send(conn, (LPCTSTR)message, message.GetLength(), 0); 
    320325} 
    321326 
    322327int JVMLinkClient::sendInt(int value) { 
    323328        char* buff = (char*) (&value); 
    324         return send(conn,buff,4,0); 
     329        return send(conn, buff, 4, 0); 
    325330} 
    326331 
     
    334339        return *(int*) readMessage(4); 
    335340} 
     341 
     342CString* JVMLinkClient::readString() { 
     343        int len = readInt(); 
     344        char* buff = new char[len + 1]; 
     345        int size = recv(conn, buff, len, 0); 
     346        buff[len] = '\0'; 
     347        return new CString(buff); 
     348} 
  • trunk/loci/jvmlink/cpp/JVMLinkClient.h

    r3824 r3830  
    4848        int sendInt(int); 
    4949        int readInt(); 
     50        CString* readString(); 
    5051 
    5152public: 
     
    6768        void setVar(CString, int); 
    6869        void setVar(CString, int*, int); 
    69         void setVar(CString, CString); 
     70        void setVar(CString, CString*); 
    7071        void setVar(CString, CString*, int); 
    7172        void setVar(CString, char); 
  • trunk/loci/jvmlink/cpp/JVMLinkObject.cpp

    r3823 r3830  
    7272} 
    7373 
    74 CString JVMLinkObject::getDataAsString() { 
    75         CString* retval = new CString((char*) data); 
    76         return *retval; 
     74CString* JVMLinkObject::getDataAsString() { 
     75        CString* retval = (CString*) data; 
     76        return retval; 
    7777} 
    7878 
    7979CString* JVMLinkObject::getDataAsStringArray() { 
    80         // TODO 
    81         return 0; 
     80        CString* retval = (CString*) data; 
     81        return retval; 
    8282} 
    8383 
     
    114114 
    115115bool JVMLinkObject::getDataAsBool() { 
    116         bool retval = (*(int*) data) != 0; 
     116        bool retval = *(bool*) data; 
    117117        return retval; 
    118118} 
  • trunk/loci/jvmlink/cpp/JVMLinkObject.h

    r3824 r3830  
    7777        int getDataAsInt(); 
    7878        int* getDataAsIntArray(); 
    79         CString getDataAsString(); 
     79        CString* getDataAsString(); 
    8080        CString* getDataAsStringArray(); 
    8181        char getDataAsChar(); 
  • trunk/loci/jvmlink/cpp/TestC2.cpp

    r3823 r3830  
    9595} 
    9696 
     97void printStrings(CString* values, int len) { 
     98        for (int i=0; i<len; i++) { 
     99                std::cout << "\t" << values[i] << std::endl; 
     100        } 
     101} 
     102 
    97103// Tests the JVMLink API. 
    98104int _tmain(int argc, _TCHAR* argv[]) 
     
    162168        // CString variables 
    163169        CString myString = "<<The quick brown fox jumps over the lazy dog.>>"; 
    164         p->setVar("myString", myString); 
     170        p->setVar("myString", &myString); 
    165171        std::cout << "TestC2: setVar: myString = " << myString << std::endl; 
    166172        JVMLinkObject* jvmString = p->getVar("myString"); 
    167         std::cout << "TestC2: getVar: myString = " << jvmString->getDataAsString() << std::endl; 
     173        std::cout << "TestC2: getVar: myString = " << *jvmString->getDataAsString() << std::endl; 
    168174 
    169175        // arrays 
    170         const int num = 5; 
     176        const int num = 15; 
    171177        bool* myBools = new bool[num]; 
    172178        Byte* myBytes = new Byte[num]; 
     
    189195        } 
    190196 
    191         CString myStrings[6]; 
     197        CString* myStrings = new CString[6]; 
    192198        myStrings[0] = "\"There was an Old Man with a beard,"; 
    193199        myStrings[1] = "Who said, 'It is just as I feared!"; 
     
    278284 
    279285        // CString arrays 
    280         p->setVar("myStrings", myStrings, num); 
     286        p->setVar("myStrings", myStrings, 6); 
    281287        std::cout << "TestC2: setVar: myStrings = [" << std::endl; 
    282         for (int i=0; i<num; i++) { 
     288        for (int i=0; i<6; i++) { 
    283289                std::cout << "\t" << myStrings[i] << std::endl; 
    284290        } 
     
    286292        JVMLinkObject* jvmStrings = p->getVar("myStrings"); 
    287293        std::cout << "TestC2: getVar: myStrings = [" << std::endl; 
    288         for (int i=0; i<num; i++) { 
    289                 std::cout << "\t" << myStrings[i] << std::endl; 
    290         } 
     294        printStrings(jvmStrings->getDataAsStringArray(), 6); 
    291295        std::cout << "]" << std::endl; 
    292296 
Note: See TracChangeset for help on using the changeset viewer.