~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to www/media/browser/browser.js

  • Committer: mattgiuca
  • Date: 2008-02-28 05:19:08 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:602
util.js: Added shallow_copy_object function.
fileservice: Removed temp code causing return=contents to be the default.
    Now return=listing is the default, so you will not get file contents
    unless you explicitly say "return=contents".
browser: Moved the code to handle a dir listing somewhat from listing.js
    to browser.js, and applies to all returns. Now even non-dir files have a
    listing - all files have a file_listing and current_file global variable,
    which means the correct processing can now be done on files and dirs.
    For non-dir files, it now makes a SECOND Ajax request to get the contents,
    which it then handles in the way it always has (in the text editor or
    a binary form).
    (Suggested by Tom Conway).

Show diffs side-by-side

added added

removed removed

Lines of Context:
101
101
 
102
102
/* Global variables */
103
103
 
 
104
/** The listing object returned by the server as JSON */
 
105
file_listing = null;
 
106
current_file = null;
104
107
current_path = "";
105
108
 
106
109
/** Filenames of all files selected
162
165
    callback = function(response)
163
166
        {
164
167
            /* Read the response and set up the page accordingly */
165
 
            handle_response(path, response, editmode);
 
168
            handle_response(path, response, url.args);
166
169
        }
167
170
    /* Get any query strings */
168
171
    url = parse_url(window.location.href);
169
172
    
170
 
    /* Call the server and request the listing. This mutates the server. */
 
173
    /* Call the server and request the listing. */
171
174
    ajax_call(callback, service_app, path, url.args, "GET");
172
175
}
173
176
 
208
211
 * things) be used to update the URL in the location bar.
209
212
 * \param response XMLHttpRequest object returned by the server. Should
210
213
 * contain all the response data.
211
 
 * \param editmode Optional boolean. If true, then the user navigated here
212
 
 * with an "edit" URL so we should favour using the editor.
 
214
 * \param url_args Arguments dict, for the arguments passed to the URL
 
215
 * in the browser's address bar (will be forwarded along).
213
216
 */
214
 
function handle_response(path, response, editmode)
 
217
function handle_response(path, response, url_args)
215
218
{
216
219
    /* TODO: Set location bar to "path" */
217
220
    current_path = path;
230
233
        return;
231
234
    }
232
235
 
 
236
    /* This will always return a listing, whether it is a dir or a file.
 
237
     */
 
238
    var listing = response.responseText;
 
239
    /* The listing SHOULD be valid JSON text. Parse it into an object. */
 
240
    try
 
241
    {
 
242
        listing = JSON.parse(listing);
 
243
        file_listing = listing.listing;     /* Global */
 
244
    }
 
245
    catch (e)
 
246
    {
 
247
        handle_error("The server returned an invalid directory listing");
 
248
        return;
 
249
    }
 
250
    /* Get "." out, it's special */
 
251
    current_file = file_listing["."];     /* Global */
 
252
    delete file_listing["."];
 
253
 
233
254
    /* Check if this is a directory listing or file contents */
234
255
    var isdir = response.getResponseHeader("X-IVLE-Return") == "Dir";
235
 
    if (!editmode && isdir)
 
256
    if (isdir)
236
257
    {
237
 
        var listing = response.responseText;
238
 
        /* The listing SHOULD be valid JSON text. Parse it into an object. */
239
 
        try
240
 
        {
241
 
            listing = JSON.parse(listing);
242
 
        }
243
 
        catch (e)
244
 
        {
245
 
            handle_error("The server returned an invalid directory listing");
246
 
            return;
247
 
        }
248
258
        handle_dir_listing(path, listing);
249
259
    }
250
260
    else
251
261
    {
252
 
        /* Treat this as an ordinary file. Get the file type. */
253
 
        var content_type = response.getResponseHeader("Content-Type");
254
 
        var handler_type = get_handler_type(content_type);
255
 
        /* If we're in "edit mode", always treat this file as text */
256
 
        would_be_handler_type = handler_type;
257
 
        if (editmode) handler_type = "text";
258
 
        /* handler_type should now be set to either
259
 
         * "text", "image", "audio" or "binary". */
260
 
        switch (handler_type)
261
 
        {
262
 
        case "text":
263
 
            if (isdir)
264
 
            {
265
 
                handle_text(path_join(path, "untitled"), "",
266
 
                    would_be_handler_type);
267
 
            }
268
 
            else
269
 
            {
270
 
                handle_text(path, response.responseText,
271
 
                    would_be_handler_type);
272
 
            }
273
 
            break;
274
 
        case "image":
275
 
            /* TODO: Custom image handler */
276
 
            handle_binary(path, response.responseText);
277
 
            break;
278
 
        case "audio":
279
 
            /* TODO: Custom audio handler */
280
 
            handle_binary(path, response.responseText);
281
 
            break;
282
 
        case "binary":
283
 
            handle_binary(path);
284
 
            break;
285
 
        }
 
262
        /* Need to make a 2nd ajax call, this time get the actual file
 
263
         * contents */
 
264
        callback = function(response)
 
265
            {
 
266
                /* Read the response and set up the page accordingly */
 
267
                handle_contents_response(path, response);
 
268
            }
 
269
        /* Call the server and request the listing. */
 
270
        if (url_args)
 
271
            args = shallow_clone_object(url_args);
 
272
        else
 
273
            args = {};
 
274
        /* This time, get the contents of the file, not its metadata */
 
275
        args['return'] = "contents";
 
276
        ajax_call(callback, service_app, path, args, "GET");
286
277
    }
287
278
    update_actions(isdir);
288
279
}
289
280
 
 
281
function handle_contents_response(path, response)
 
282
{
 
283
    /* Treat this as an ordinary file. Get the file type. */
 
284
    var content_type = response.getResponseHeader("Content-Type");
 
285
    var handler_type = get_handler_type(content_type);
 
286
    /* If we're in "edit mode", always treat this file as text */
 
287
    would_be_handler_type = handler_type;
 
288
    /* handler_type should now be set to either
 
289
     * "text", "image", "audio" or "binary". */
 
290
    switch (handler_type)
 
291
    {
 
292
    case "text":
 
293
        handle_text(path, response.responseText,
 
294
            would_be_handler_type);
 
295
        break;
 
296
    case "image":
 
297
        /* TODO: Custom image handler */
 
298
        handle_binary(path, response.responseText);
 
299
        break;
 
300
    case "audio":
 
301
        /* TODO: Custom audio handler */
 
302
        handle_binary(path, response.responseText);
 
303
        break;
 
304
    case "binary":
 
305
        handle_binary(path);
 
306
        break;
 
307
    }
 
308
}
 
309
 
290
310
/** Deletes all "dynamic" content on the page.
291
311
 * This returns the page back to the state it is in when the HTML arrives to
292
312
 * the browser, ready for another handler to populate it.
434
454
        {
435
455
            /* Display information about the current directory instead */
436
456
            filename = path_basename(current_path);
437
 
            file = thisdir;
 
457
            file = current_file;
438
458
        }
439
459
        else if (numsel == 1)
440
460
        {