git-svn-id: svn://euphorik.ch/pompage@45 02bbb61a-6d21-0410-aba0-cb053bdfd66a
[pompage.git] / doc / webdeveloper / common / file.js
diff --git a/doc/webdeveloper/common/file.js b/doc/webdeveloper/common/file.js
new file mode 100644 (file)
index 0000000..eb2df77
--- /dev/null
@@ -0,0 +1,251 @@
+// Gets the size of a file
+function webdeveloper_getFileSize(url)
+{
+    var cacheService = Components.classes["@mozilla.org/network/cache-service;1"].getService(Components.interfaces.nsICacheService);
+    var cacheSession = null;
+    var file         = null;
+    var fileSize     = null;
+    var readAccess   = Components.interfaces.nsICache.ACCESS_READ;
+
+    // Try to get the file size from the HTTP cache
+    try
+    {
+        cacheSession                      = cacheService.createSession("HTTP", 0, true);
+        cacheSession.doomEntriesIfExpired = false;
+        file                              = cacheSession.openCacheEntry(url, readAccess, false);
+
+        // If there is a file
+        if(file)
+        {
+            fileSize = file.dataSize;
+        }
+    }
+    catch(exception)
+    {
+        // Try to get the file size from the FTP cache
+        try
+        {
+            cacheSession                      = cacheService.createSession("FTP", 0, true);
+            cacheSession.doomEntriesIfExpired = false;
+            file                              = cacheSession.openCacheEntry(url, readAccess, false);
+
+            // If there is a file
+            if(file)
+            {
+                fileSize = file.dataSize;
+            }
+        }
+        catch(exception)
+        {
+            fileSize = null;
+        }
+    }
+
+    // If the file size could not be retrieved from the cache
+    if(!fileSize)
+    {
+        // Try to download the file
+        try
+        {
+            var ioService = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
+
+            fileSize = ioService.newChannelFromURI(ioService.newURI(url, null, null)).open().available();
+        }
+        catch(exception)
+        {
+            fileSize = null;
+        }
+    }
+
+    return fileSize;
+}
+
+// Gets the uncompressed size of a file
+function webdeveloper_getUncompressedFileSize(url)
+{
+    var cacheService   = Components.classes["@mozilla.org/network/cache-service;1"].getService(Components.interfaces.nsICacheService);
+    var cacheSession   = null;
+    var file           = null;
+    var fileCompressed = true;
+    var fileSize       = null;
+    var readAccess     = Components.interfaces.nsICache.ACCESS_READ;
+
+    // Try to get the file size from the HTTP cache
+    try
+    {
+        cacheSession                      = cacheService.createSession("HTTP", 0, true);
+        cacheSession.doomEntriesIfExpired = false;
+        file                              = cacheSession.openCacheEntry(url, readAccess, false);
+    }
+    catch(exception)
+    {
+        // Try to get the file size from the FTP cache
+        try
+        {
+            cacheSession                      = cacheService.createSession("FTP", 0, true);
+            cacheSession.doomEntriesIfExpired = false;
+            file                              = cacheSession.openCacheEntry(url, readAccess, false);
+        }
+        catch(exception)
+        {
+            file = null;
+        }
+    }
+
+    // If there is a file
+    if(file)
+    {
+        var encoding        = null;
+        var responseHeaders = null;
+
+        // Try to get the cache encoding
+        try
+        {
+            // Specific case-sensitive required
+            encoding = file.getMetaDataElement("request-Accept-Encoding");
+        }
+        catch(exception)
+        {
+            encoding = null;
+
+            // Try to get the response headers
+            try
+            {
+                // Specific case-sensitive required
+                responseHeaders = file.getMetaDataElement("response-head");
+            }
+            catch(exception)
+            {
+                responseHeaders = null;
+            }
+        }
+
+        // If the cache is not GZIP encoded
+        if((!encoding || encoding.indexOf("gzip") == -1) && (!responseHeaders || responseHeaders.indexOf("Content-Encoding: gzip") == -1))
+        {
+            fileCompressed = false;
+        }
+    }
+
+    // If the file is compressed
+    if(fileCompressed)
+    {
+        // Try to download the file
+        try
+        {
+            var request = new XMLHttpRequest();
+
+            request.open("get", url, false);
+            request.send(null);
+
+            fileSize = request.responseText.length;
+        }
+        catch(exception)
+        {
+            fileSize = null;
+        }
+    }
+
+    return fileSize;
+}
+
+// Retrieves the source from the given URL
+function webdeveloper_retrieveSource(url)
+{
+    var source = null;
+
+    // If the URL is not entirely generated
+    if(url.indexOf("wyciwyg://") != 0)
+    {
+        var cacheService = Components.classes["@mozilla.org/network/cache-service;1"].getService(Components.interfaces.nsICacheService);
+        var cacheSession = null;
+        var file         = null;
+        var readAccess   = Components.interfaces.nsICache.ACCESS_READ;
+
+        // Try to get the file size from the HTTP cache
+        try
+        {
+            cacheSession                      = cacheService.createSession("HTTP", 0, true);
+            cacheSession.doomEntriesIfExpired = false;
+            file                              = cacheSession.openCacheEntry(url, readAccess, false);
+        }
+        catch(exception)
+        {
+            // Try to get the file size from the FTP cache
+            try
+            {
+                cacheSession                      = cacheService.createSession("FTP", 0, true);
+                cacheSession.doomEntriesIfExpired = false;
+                file                              = cacheSession.openCacheEntry(url, readAccess, false);
+            }
+            catch(exception)
+            {
+                file = null;
+            }
+        }
+
+        // If there is a file
+        if(file)
+        {
+            var encoding        = null;
+            var responseHeaders = null;
+
+            // Try to get the cache encoding
+            try
+            {
+                // Specific case-sensitive required
+                encoding = file.getMetaDataElement("request-Accept-Encoding");
+            }
+            catch(exception)
+            {
+                encoding = null;
+
+                // Try to get the response headers
+                try
+                {
+                    // Specific case-sensitive required
+                    responseHeaders = file.getMetaDataElement("response-head");
+                }
+                catch(exception)
+                {
+                    responseHeaders = null;
+                }
+            }
+
+            // If the cache is not GZIP encoded
+            if((!encoding || encoding.indexOf("gzip") == -1) && (!responseHeaders || (responseHeaders.indexOf("Content-Encoding: deflate") == -1 && responseHeaders.indexOf("Content-Encoding: gzip") == -1)))
+            {
+                var inputStream      = file.openInputStream(0);
+                var scriptableStream = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream);
+
+                scriptableStream.init(inputStream);
+
+                source = scriptableStream.read(scriptableStream.available());
+
+                scriptableStream.close();
+                inputStream.close();
+            }
+        }
+
+        // If the source has not been loaded
+        if(!source)
+        {
+            // Try to load the URL
+            try
+            {
+                var request = new XMLHttpRequest();
+
+                request.open("get", url, false);
+                request.send(null);
+
+                source = request.responseText;
+            }
+            catch(exception)
+            {
+                source = null;
+            }
+        }
+    }
+
+    return source;
+}