Statistics
| Branch: | Revision:

root / src / pithos / content / operations.js @ 46:f16f6e0e5b69

History | View | Annotate | Download (21.6 kB)

1
// The Pithos File Manager Firefox Extension is funded by GRNET S.A.
2
// (http://www.grnet.gr)
3
//
4
// Copyright (c) 2009, Christos KK Loverdos, Vassilios Karakoidas.
5
// All rights reserved.
6
//
7
// Redistribution and use in source and binary forms, with or without
8
// modification, are permitted provided that the following conditions are
9
// met:
10
//
11
//   - Redistributions of source code must retain the above copyright
12
//     notice, this list of conditions and the following disclaimer.
13
//   - Redistributions in binary form must reproduce the above
14
//     copyright notice, this list of conditions and the following
15
//     disclaimer in the documentation and/or other materials provided
16
//     with the distribution.
17
//   - Neither the name of GRNET S.A. nor the names of its contributors
18
//     may be used to endorse or promote products derived from this
19
//     software without specific prior written permission.
20
//
21
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25
// HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32

    
33
//////////////////////////////////// CREATE FOLDER //////////////////////////////////////////////////////////////
34

    
35
function create_folder_event() {
36
        var new_directory = window.prompt("Enter the directory name:", "");
37
        var source_directory = pithos_object.getSourceCurrentDirectory();
38
        if (new_directory == null) {
39
                promptAlert('Directory creation canceled');
40
                return;
41
        } else {
42
                if( create_folder(source_directory, new_directory) ) {
43
                        promptAlert(source_directory + new_directory + ' - created');
44
                        pithos_object.refreshLists();
45
                } else {
46
                        promptAlert(source_directory + new_directory + ' - Directory creation failed');
47
                }
48
        }
49
}
50

    
51
function create_folder(uri, new_directory) {
52
        if ( vfs.isRemoteResource(uri) ) {
53
                var req = connection_obj.rest_request_post(uri, '?new=' + encodeURIComponent(new_directory), '');
54
                return (connection_obj.success(req.status));
55
        } else if ( vfs.isLocalResource(uri) ) {
56
                try {
57
                        netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
58
                        var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
59
                        file.initWithPath(uri);
60
                        file.append(new_directory);
61
                        if( !file.exists() || !file.isDirectory() ) {   
62
                                // if it doesn't exist, create
63
                                   file.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, 0777);
64
                                return true;
65
                        }
66
                } catch(error) {
67
                        return false;
68
                }
69
        }
70
}
71

    
72
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
73

    
74
/////////////////////////////////////////////// COPY ////////////////////////////////////////////////////////////////////
75

    
76
function copy_event() {
77
        var sources = pithos_object.getSelectedResources();
78
        var destination = pithos_object.getDestinationCurrentDirectory();
79
    var copied = 0;
80
        
81
        if (sources.length == 0) {
82
                promptAlert('No Files/Folders are selected');
83
                return;
84
        }
85
        
86
        if ( sources.length > 1 ) {
87
                promptAlert('Copy ' + sources.length + ' items to ' + destination);
88
        } else if (sources.length == 1) {
89
        promptAlert('Copy ' + sources[0] + ' to ' + destination);
90
    }
91
        
92
        for ( i = 0; i < sources.length; i++ ) {
93
        if ( vfs.isDirectory(sources[i]) ) {
94
            promptAlert('Copy of directories is not supported! Operation Canceled.');
95
            return;
96
        }
97
        }
98
        
99
        netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
100
        window.openDialog("dialogs/operation_dialog.xul", "Copy Files", "chrome,resizable,centerscreen,window", "copy", sources, destination);
101
        
102
    pithos_object.refreshLists();
103
}
104

    
105
function copy(source, destination) {
106
        var source_metadata = vfs.getResourceMetadata(source);
107
        
108
        // server side
109
        if ( vfs.isRemoteResource(source) && vfs.isRemoteResource(destination) ) {
110
                var destinationFile = destination + source_metadata.name;
111
                var req = connection_obj.rest_request_post(source, '?copy=' + destinationFile, '');
112
        if ( req == null ) {
113
            return false;
114
        }
115
        
116
                return connection_obj.success(req.status);
117
        } else if ( vfs.isLocalResource(source) && vfs.isRemoteResource(destination) ) {
118
        var req = connection_obj.rest_request_put_upload(source, destination + source_metadata.name, data, mimes.getByExtension(source_metadata.name));
119

    
120
        return connection_obj.success(req.status);
121
        } else if ( vfs.isRemoteResource(source) && vfs.isLocalResource(destination) ) {
122
                var data = vfs.getResourceAsBinary(source);
123
        if ( data == null ) {
124
            return false;
125
        }
126
        if ( isWindows() ) {
127
            return saveBinaryFile(destination + '\\' + source_metadata.name, data);
128
        } else {
129
            return saveBinaryFile(destination + '/' + source_metadata.name, data);
130
        }
131
        } else if ( vfs.isLocalResource(source) && vfs.isLocalResource(destination) ) {
132
                try {
133
                        netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
134
                        var source_file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
135
                        source_file.initWithPath(source);
136
            
137
                        var destination_file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
138
                        destination_file.initWithPath(destination);
139
            
140
                        source_file.copyTo(destination_file, null);
141
                        
142
                        return true;
143
                } catch (e) {
144
                        return false;
145
                }                
146
        }
147
        
148
        return false;
149
}
150

    
151
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
152

    
153
////////////////////////////////////////////////////////// MOVE ////////////////////////////////////////////////////////////////
154

    
155
function move_event() {
156
        var sources = pithos_object.getSelectedResources();
157
        var destination = pithos_object.getDestinationCurrentDirectory();
158
        
159
        if (sources.length == 0) {
160
                promptAlert('No Files/Folders are selected');
161
                return;
162
        }
163
        
164
        for ( i = 0; i < sources.length; i++ ) {
165
        if ( vfs.isDirectory(sources[i]) ) {
166
            promptAlert('Moving directories is not supported!');
167
            continue;
168
        }
169

    
170
        }
171
        
172
        netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
173
        window.openDialog("dialogs/operation_dialog.xul", "Move Files", "chrome,resizable,centerscreen,window", "move", sources, destination);        
174

    
175
    pithos_object.refreshLists();
176
}
177

    
178
function move(source, destination) {
179
        if ( vfs.isRemoteResource(source) && vfs.isRemoteResource(destination)) {
180
                var destinationFile = destination + source_metadata.name;
181
                var req = connection_obj.rest_request_post(source, '?move=' + destinationFile, '');
182

    
183
                return connection_obj.success(req.status);        
184
        } else if ( vfs.isLocalResource(source) && vfs.isLocalResource(destination) ) {
185
        try {
186
            netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
187
            var source_file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
188
            source_file.initWithPath(source);
189

    
190
            var destination_file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
191
            destination_file.initWithPath(destination);
192

    
193
            source_file.moveTo(destination_file, null);
194

    
195
            return true;
196
        } catch (e) {
197
            return false;
198
        }
199
        } else if ( !copy(source, destination) ) {
200
                return false;
201
        }
202
        
203
        return delete_resource(source);
204
}
205

    
206
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
207

    
208
////////////////////////////////////////////////////// DELETE /////////////////////////////////////////////////////////////////////
209

    
210
function delete_all_async(uris) {
211
        netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
212
        window.openDialog("dialogs/operation_dialog.xul", "Delete Files", "chrome,resizable,centerscreen,window", "delete_all", uris);
213
        pithos_object.refreshLists();    
214
}
215

    
216
function delete_context_menu(uri) {
217
        netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
218
        var prompt = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
219
        var result = prompt.confirm(window, "Confirm action", "Delete " + uri + "?");
220
        if ( result ) {
221
                if ( !delete_resource(uri) ) {
222
                        promptAlert('Cannot delete ' + uri);
223
                        return;
224
                }
225
        } else {
226
                promptAlert('Action canceled');
227
                return;
228
        }
229
        pithos_object.refreshLists();
230
}
231

    
232
function delete_event() {
233
        var resources = pithos_object.getSelectedResources();
234
        
235
        if (resources.length == 0) {
236
                promptAlert('No File/Directory is selected');
237
                return;
238
        }
239
        netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
240
        var prompt = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
241
        var result = prompt.confirm(window, "Confirm action", "You are going to delete the " + resources.length + " item(s). Proceed?");
242
        
243
        if (result) {
244
                for (i = 0; i < resources.length; i++) {
245
                        var b = delete_resource(resources[i]);
246
                        if (!b) {
247
                                b = prompt.confirm(window, "Failed!", "Deletion of " + resources[i] + " failed. Continue?");
248
                                if (!b) {
249
                                        promptAlert('Action canceled');
250
                                        return;
251
                                }
252
                        }
253
                }
254
        } else {
255
                promptAlert('Action canceled');
256
                return;
257
        }
258
        promptAlert('Removed ' + resources.length + ' items.');
259
        pithos_object.refreshLists();
260
}
261

    
262
function delete_context_menu_trash(uri) {
263
    if(promptBox('Realy delete ' + uri)) {
264
        if ( delete_resource(uri) ) {
265
            promptAlert(uri + ' purged');
266
        }
267
    } else {
268
        promptAlert('Purge canceled');
269
    }
270
        pithos_object.refreshLists();
271
}
272

    
273
function delete_resource(uri) {
274
        if ( vfs.isRemoteResource(uri) ) {
275
                var req = connection_obj.rest_request_delete(uri, '?trash=', '');
276
                return connection_obj.success(req.status);
277
        } else if ( vfs.isLocalResource(uri) ) {
278
                try {
279
                        netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
280
                        var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
281
                        file.initWithPath(uri);
282
                        file.remove(true);
283
            
284
                        return true;
285
                } catch (e) {
286
                        return false;
287
                }
288
        }
289
        
290
        return false;
291
}
292

    
293
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
294

    
295
//////////////////////////////////////////////////////////////// MOVE TO TRASH /////////////////////////////////////////////////////////////////
296

    
297
function movetotrash_context_menu(uri) {
298
        netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
299
        var prompt = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
300
        var result = prompt.confirm(window, "Confirm action", "Delete " + uri + "?");
301
        if ( result ) {
302
                if ( !movetotrash_resource(uri) ) {
303
                        promptAlert('Cannot delete ' + uri);
304
                        return;
305
                }
306
        } else {
307
                promptAlert('Action canceled');
308
                return;
309
        }
310
        pithos_object.refreshLists();
311
}
312

    
313
function movetotrash_resource(uri) {
314
        if ( vfs.isRemoteResource(uri) ) {
315
                var req = connection_obj.rest_request_post(uri, '?trash=', '');
316
                return connection_obj.success(req.status);
317
        } else if ( vfs.isLocalResource(uri) ) {
318
                try {
319
                        netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
320
                        var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
321
                        file.initWithPath(uri);
322
                        file.remove(true);
323
                                                
324
                        return true;
325
                } catch (e) {
326
                        return false;
327
                }
328
        }
329
        
330
        return false;        
331
}
332

    
333
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
334

    
335
//////////////////////////////////////////////////////////// HOME EVENT ////////////////////////////////////////////////////////////////////////////
336

    
337
function home_event() {
338
        pithos_object.reInitLists();
339
}
340

    
341
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
342

    
343
/////////////////////////////////////////////////////////// SHARE ////////////////////////////////////////////////////////////////////////////////////
344

    
345
function share_event(source) {
346
        netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
347

    
348
        // Create a parameter list
349
        var params = { inp: source, out: null };
350
        
351
        window.openDialog("share/addshare.xul", "Share item", "chrome,dialog,resizable,centerscreen",params);
352
    connection_obj.get_shared_data();
353
        pithos_object.refreshLists();
354
}
355

    
356
function share_resource(source, permissions) {
357
        netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
358
        var ret = connection_obj.rest_request_post(source, '?update=', jsonToString(permissions));
359

    
360
        // if status not acceptable, return the status code (false scenario)
361
        if( !connection_obj.success(ret.status) ) {
362
            return (ret.status);
363
        } else {
364
            // remember to refresh the data
365
            return true;
366
        }
367
}
368

    
369
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
370

    
371
////////////////////////////////////////////////////// UNSHARE //////////////////////////////////////////////////////////////////////////////////////
372

    
373
function unshare_event(source) {
374
        // Example of source: http://pithos.grnet.gr/pithos/rest/aaitest@grnet-hq.admin.grnet.gr/files/Documents/
375
        netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
376

    
377
        // Get the metadata of the source
378
        var source_metadata = vfs.getResourceMetadata(source);
379
        var prompt = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
380

    
381
        // Get the file or folder name
382
        var itemname = source_metadata.name;
383
        var promptmessage = "Are you sure you want to unshare "+itemname+" from all users and groups?";
384
        var result = prompt.confirm(window, "Confirm action", promptmessage);
385
        
386
        if (result == true) {
387
                if ( unshare_resource(source) ) {
388
            connection_obj.get_shared_data();
389
            pithos_object.refreshLists();
390
        } else {
391
            promptAlert('Unshare failed');
392
        }
393
        } else {
394
                promptAlert('Unshare process canceled');
395
        }
396
}
397

    
398
function unshare_resource(source) {
399
        // trim the trailing slash ...
400
        source = source.replace(/\/$/,'');
401
        var ownFileObj = new Object();
402
        
403
        ownFileObj.readForAll = false;
404
        ownFileObj.permissions = new Array();
405
        
406
        var ownACL = new Object();
407
        
408
        ownACL.modifyACL = true;
409
        ownACL.write = true;
410
        ownACL.read = true;
411
        ownACL.user = connection_obj.username;
412

    
413
        ownFileObj.permissions.push(ownACL);
414

    
415
        var req = connection_obj.rest_request_post(source, '?update=', jsonToString(ownFileObj));
416
        return connection_obj.success(req.status);
417
}
418

    
419
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
420

    
421
////////////////////////////////////////////////////// TAGS //////////////////////////////////////////////////////////////////////////////////////
422

    
423
function modifytags_event(source){
424
        netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
425
        window.openDialog("tags/tags.xul", "Modify tags", "chrome,dialog,modal,resizable",source);
426
    //connection_obj.get_shared_data();
427
        //pithos_object.refreshLists();
428
}
429

    
430
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
431

    
432
///////////////////////////////////////////////////////////////////// RENAME ///////////////////////////////////////////////////////////////////////////////
433

    
434
function rename_context_menu(uri) {
435
        netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
436
        var prompt = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
437
        var new_name = window.prompt("Enter the new name:", "");
438
        if ( new_name != null ) {
439
                if ( !rename_resource(uri, new_name) ) {
440
                        promptAlert('Cannot rename ' + uri + ' to ' + new_name);
441
                        return;
442
                }
443
        } else {
444
                promptAlert('Action canceled');
445
        }
446
        pithos_object.refreshLists();
447
}
448

    
449
function rename_resource(uri, new_name) {
450
        if ( vfs.isRemoteResource(uri) ) {
451
                var update = new Object();
452
                if ( vfs.isFile(uri) ) {
453
                        update.name = new_name;
454
                } else {
455
                        update.directoryName = new_name;
456
                }
457
                var req = connection_obj.rest_request_post(uri, '?update=', jsonToString(update));
458
                return (connection_obj.success(req.status));
459
        } else if ( vfs.isLocalResource(uri) ) {
460
                try {
461
                        netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
462
                        var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
463
                        file.initWithPath(uri);
464
                        file.moveTo(file.parent, new_name);
465
                                                
466
                        return true;
467
                } catch (e) {
468
                        return false;
469
                }                
470
        }
471
        
472
        return false;
473
}
474

    
475
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
476

    
477
//////////////////////////////////////////////////////////// LAUNCH ///////////////////////////////////////////////////////////////////////////////////////////
478

    
479
function launch_local_resource(uri) {
480
        if ( isLocalDirectory(uri) ) {
481
                try {
482
                        netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
483
                        var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
484
                        file.initWithPath(uri);
485
                        file.launch();
486
                                                
487
                        return true;
488
                } catch (e) {
489
                        return false;
490
                }                
491
        } else {
492
                alert('Cannot execute remote file!');
493
        }
494
}
495

    
496
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
497

    
498
/////////////////////////////////////////////////////////// VERSION /////////////////////////////////////////////////////////////////////////////////////
499

    
500
function enable_version_event(uri) {
501
    if ( vfs.isLocalResource(uri) ) {
502
        promptAlert('Cannot enable versioning in local files');
503
        return;
504
    }
505
    if ( enable_version_resource(uri) ) {
506
        promptAlert('File versioning is enabled');
507
    } else {
508
        promptAlert('Could not enable file versioning for ' + uri);
509
    }
510
}
511

    
512
function enable_version_resource(uri) {
513
    if ( vfs.isRemoteResource(uri) ) {
514
        var ownFileObj = new Object();
515
        ownFileObj.versioned = true;
516

    
517
        var req = connection_obj.rest_request_post(uri, '?update=', jsonToString(ownFileObj));
518
        return connection_obj.success(req.status);
519
    }
520

    
521
    return false;
522
}
523

    
524
function download_version_event(uri, current_version) {
525
    //var version = window.prompt("Download version:", current_version);
526
    var versions = new Array();
527
    var outChoice = new Object();
528

    
529
    for ( i = 0; i < current_version; i++ ) {
530
        versions.push(i + 1);
531
    }
532

    
533
    if (promptSelect('Open Resource', 'Download version:', versions, outChoice)) {
534
        var version_number = new Number(versions[outChoice.value]);
535
        if ( (version_number >= 1) && (version_number <= current_version) ) {
536
            var local_url = connection_obj.create_request_get(uri) + '&version=' + version_number;
537
            window.open(local_url);
538
        } else {
539
            promptAlert('Invalid version number (' + version_number + '). Available versions: 1 ... ' + current_version);
540
        }            
541
    } else {
542
        promptAlert('Action canceled');
543
    }
544
}
545

    
546
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
547

    
548
////////////////////////////////////////////////// UNDELETE ///////////////////////////////////////////////////////////////////////////////
549

    
550
function restore_context_menu_trash(uri) {
551
    netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
552

    
553
    var theuri = uri;
554
    var theobj = vfs.getResourceMetadata(theuri);
555

    
556
    // Set the metadata delete property to false (i.e. not deleted)
557
    theobj.deleted = false;
558

    
559
    var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
560
    var theitem_with_path = '';
561
    
562
    if (theobj.hasOwnProperty('directoryName')) {
563
        theitem_with_path = theobj.parentFolder + '/' + theobj.directoryName;
564
        theitem_with_path = theitem_with_path.replace(connection_obj.user_homepage().fileroot, "");
565
    } else {
566
        theitem_with_path = theobj.path + theobj.name;
567
    }
568

    
569
    if (prompts.confirm(window, "Confirm action", "Are you sure you want to restore " + theitem_with_path + ' ?')) {
570
        // trim the trailing slash ...
571
        theuri = theuri.replace(/\/$/,'');
572
        if (restore_resource(theuri)) {
573
            promptAlert(theuri + ' succesfully restored');
574
            pithos_object.refreshLists();
575
        } else {
576
            promptAlert('Restoration of ' + theuri + ' failed');
577
        }
578
    }
579
}
580

    
581
function restore_resource(uri) {
582
    var retcode = connection_obj.rest_request_post(uri,'?restore=', '');
583
    return connection_obj.success(retcode.status);
584
}
585

    
586

    
587
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////