code: private void processSubProjects()
     {
        int subprojectIndex = 1;
        for (Task task : m_project.getTasks())
        {
           String subProjectFileName = task.getSubprojectName();
           if (subProjectFileName != null)
           {
              String fileName = subProjectFileName;
              int offset = 0x01000000 + (subprojectIndex * 0x00400000);
              int index = subProjectFileName.lastIndexOf('\\');
              if (index != -1)
              {
                 fileName = subProjectFileName.substring(index + 1);
              }
  
              SubProject sp = new SubProject();
              sp.setFileName(fileName);
              sp.setFullPath(subProjectFileName);
              sp.setUniqueIDOffset(Integer.valueOf(offset));
              sp.setTaskUniqueID(task.getUniqueID());
              task.setSubProject(sp);
  
              ++subprojectIndex;
           }
        }
     }
docs: The only indication that a task is a SubProject is the contents
  of the subproject file name field. We test these here then add a skeleton
  subproject structure to match the way we do things with MPP files.