*  @param start the date to start enumeration (use null to not specify one)
     *  @param end the date to end enumeration (use null to not specify one)
     *  @return a list of all live images the user has uploaded
     *  @throws IOException if a network error occurs
     */
    public Wiki.LogEntry[] getUploads(Wiki.User user, Calendar start, Calendar end) throws IOException
    {
        StringBuilder url = new StringBuilder(query);
        url.append("list=allimages&ailimit=max&aisort=timestamp&aiprop=timestamp%7Ccomment&aiuser="); // ?
        url.append(user.getUsername());
        if (start != null)
        {
            url.append("&aistart=");
            url.append(calendarToTimestamp(start));
        }
        if (end != null)
        {
            url.append("&aiend=");
            url.append(calendarToTimestamp(end));
        }
        ArrayList<Wiki.LogEntry> uploads = new ArrayList<Wiki.LogEntry>();
        String aicontinue = "";
        do
        {
            if (!aicontinue.isEmpty())
                aicontinue = "&aicontinue" + aicontinue;
            String line = fetch(url.toString() + aicontinue, "getUploads");
            if (line.contains("aicontinue=\""))
                aicontinue = parseAttribute(line, "aicontinue", 0);
            else
                aicontinue = null;
            
            for (int i = line.indexOf("<img "); i > 0; i = line.indexOf("<img ", i))
            {
                int b = line.indexOf("/>", i);
                Wiki.LogEntry le = parseLogEntry(line.substring(i, b));
                le.type = UPLOAD_LOG;
                le.action = "upload"; // unless it's an overwrite?
                le.user = user;
                uploads.add(le);
                i = b;
            }
        }
        while (aicontinue != null);
        
        int size = uploads.size();
        log(Level.INFO, "Successfully retrieved uploads of " + user.getUsername() + " (" + size + " uploads)", "getUploads");
        return uploads.toArray(new Wiki.LogEntry[size]);
    }