private RouteDataObject readRouteDataObject(RouteRegion reg, int pleftx, int ptopy)
     throws IOException {
   RouteDataObject o = new RouteDataObject(reg);
   TIntArrayList pointsX = new TIntArrayList();
   TIntArrayList pointsY = new TIntArrayList();
   TIntArrayList types = new TIntArrayList();
   List<TIntArrayList> globalpointTypes = new ArrayList<TIntArrayList>();
   while (true) {
     int ts = codedIS.readTag();
     int tags = WireFormat.getTagFieldNumber(ts);
     switch (tags) {
       case 0:
         o.pointsX = pointsX.toArray();
         o.pointsY = pointsY.toArray();
         o.types = types.toArray();
         if (globalpointTypes.size() > 0) {
           o.pointTypes = new int[globalpointTypes.size()][];
           for (int k = 0; k < o.pointTypes.length; k++) {
             TIntArrayList l = globalpointTypes.get(k);
             if (l != null) {
               o.pointTypes[k] = l.toArray();
             }
           }
         }
         return o;
       case RouteData.TYPES_FIELD_NUMBER:
         int len = codedIS.readRawVarint32();
         int oldLimit = codedIS.pushLimit(len);
         while (codedIS.getBytesUntilLimit() > 0) {
           types.add(codedIS.readRawVarint32());
         }
         codedIS.popLimit(oldLimit);
         break;
       case RouteData.STRINGNAMES_FIELD_NUMBER:
         o.names = new TIntObjectHashMap<String>();
         int sizeL = codedIS.readRawVarint32();
         int old = codedIS.pushLimit(sizeL);
         while (codedIS.getBytesUntilLimit() > 0) {
           int stag = codedIS.readRawVarint32();
           int pId = codedIS.readRawVarint32();
           o.names.put(stag, ((char) pId) + "");
         }
         codedIS.popLimit(old);
         break;
       case RouteData.POINTS_FIELD_NUMBER:
         len = codedIS.readRawVarint32();
         oldLimit = codedIS.pushLimit(len);
         int px = pleftx >> SHIFT_COORDINATES;
         int py = ptopy >> SHIFT_COORDINATES;
         while (codedIS.getBytesUntilLimit() > 0) {
           int x = (codedIS.readSInt32()) + px;
           int y = (codedIS.readSInt32()) + py;
           pointsX.add(x << SHIFT_COORDINATES);
           pointsY.add(y << SHIFT_COORDINATES);
           px = x;
           py = y;
         }
         codedIS.popLimit(oldLimit);
         break;
       case RouteData.POINTTYPES_FIELD_NUMBER:
         len = codedIS.readRawVarint32();
         oldLimit = codedIS.pushLimit(len);
         while (codedIS.getBytesUntilLimit() > 0) {
           int pointInd = codedIS.readRawVarint32();
           TIntArrayList pointTypes = new TIntArrayList();
           int lens = codedIS.readRawVarint32();
           int oldLimits = codedIS.pushLimit(lens);
           while (codedIS.getBytesUntilLimit() > 0) {
             pointTypes.add(codedIS.readRawVarint32());
           }
           codedIS.popLimit(oldLimits);
           while (pointInd >= globalpointTypes.size()) {
             globalpointTypes.add(null);
           }
           globalpointTypes.set(pointInd, pointTypes);
         }
         codedIS.popLimit(oldLimit);
         break;
       case RouteData.ROUTEID_FIELD_NUMBER:
         o.id = codedIS.readInt32();
         break;
       default:
         skipUnknownField(ts);
         break;
     }
   }
 }