Initial version of FileOperation to encapsulate all events regarding
[pub/Android/ownCloud.git] / src / eu / alefzero / webdav / WebdavClient.java
index c4e0a9b..a1dbd09 100644 (file)
@@ -21,8 +21,7 @@ import java.io.BufferedInputStream;
 import java.io.File;\r
 import java.io.FileOutputStream;\r
 import java.io.IOException;\r
-import java.net.URLDecoder;\r
-import java.net.URLEncoder;\r
+import java.util.HashMap;\r
 \r
 import org.apache.commons.httpclient.Credentials;\r
 import org.apache.commons.httpclient.HttpClient;\r
@@ -31,30 +30,53 @@ import org.apache.commons.httpclient.auth.AuthScope;
 import org.apache.commons.httpclient.methods.GetMethod;\r
 import org.apache.commons.httpclient.methods.HeadMethod;\r
 import org.apache.commons.httpclient.methods.PutMethod;\r
-import org.apache.commons.httpclient.methods.RequestEntity;\r
 import org.apache.commons.httpclient.params.HttpMethodParams;\r
 import org.apache.commons.httpclient.protocol.Protocol;\r
 import org.apache.http.HttpStatus;\r
+import org.apache.jackrabbit.webdav.client.methods.DavMethod;\r
+import org.apache.jackrabbit.webdav.client.methods.DeleteMethod;\r
 import org.apache.jackrabbit.webdav.client.methods.MkColMethod;\r
 \r
-import eu.alefzero.owncloud.authenticator.EasySSLSocketFactory;\r
-import eu.alefzero.owncloud.files.interfaces.OnDatatransferProgressListener;\r
-\r
+import android.accounts.Account;\r
+import android.accounts.AccountManager;\r
+import android.content.Context;\r
 import android.net.Uri;\r
 import android.util.Log;\r
+import eu.alefzero.owncloud.AccountUtils;\r
+import eu.alefzero.owncloud.authenticator.AccountAuthenticator;\r
+import eu.alefzero.owncloud.authenticator.EasySSLSocketFactory;\r
+import eu.alefzero.owncloud.files.interfaces.OnDatatransferProgressListener;\r
+import eu.alefzero.owncloud.utils.OwnCloudVersion;\r
 \r
 public class WebdavClient extends HttpClient {\r
     private Uri mUri;\r
     private Credentials mCredentials;\r
     final private static String TAG = "WebdavClient";\r
     private static final String USER_AGENT = "Android-ownCloud";\r
-    private OnUploadProgressListener mUploadProgressListener;\r
     private OnDatatransferProgressListener mDataTransferListener;\r
-\r
-    public WebdavClient(Uri uri) {\r
-        mUri = uri;\r
+    private static HashMap<String, WebdavClient> clients = new HashMap<String, WebdavClient>();\r
+    \r
+    /**\r
+     * Creates a WebdavClient setup for the current account\r
+     * @param account The client accout\r
+     * @param context The application context\r
+     * @return\r
+     */\r
+    public WebdavClient (Account account, Context context){\r
+        OwnCloudVersion ownCloudVersion = new OwnCloudVersion(AccountManager.get(context).getUserData(account,\r
+                AccountAuthenticator.KEY_OC_VERSION));\r
+        String baseUrl = AccountManager.get(context).getUserData(account, AccountAuthenticator.KEY_OC_BASE_URL);\r
+        String webDavPath = AccountUtils.getWebdavPath(ownCloudVersion);        \r
+        String username = account.name.substring(0, account.name.indexOf('@'));\r
+        String password = AccountManager.get(context).getPassword(account);\r
+        \r
+        mUri = Uri.parse(baseUrl + webDavPath);\r
         getParams().setParameter(HttpMethodParams.USER_AGENT, USER_AGENT);\r
+        setCredentials(username, password);\r
+        allowSelfsignedCertificates();\r
     }\r
+    \r
+    public WebdavClient(){}\r
 \r
     public void setCredentials(String username, String password) {\r
         getParams().setAuthenticationPreemptive(true);\r
@@ -74,19 +96,22 @@ public class WebdavClient extends HttpClient {
                 new EasySSLSocketFactory(), 443));\r
     }\r
 \r
-    public boolean downloadFile(String filepath, File targetPath) {\r
+    public boolean downloadFile(String remoteFilepath, File targetPath) {\r
         // HttpGet get = new HttpGet(mUri.toString() + filepath.replace(" ",\r
         // "%20"));\r
-        String[] splitted_filepath = filepath.split("/");\r
-        filepath = "";\r
+        /* dvelasco - this is not necessary anymore; OCFile.mRemotePath (the origin of remoteFielPath) keeps valid URL strings\r
+        String[] splitted_filepath = remoteFilepath.split("/");\r
+        remoteFilepath = "";\r
         for (String s : splitted_filepath) {\r
             if (s.equals("")) continue;\r
-            filepath += "/" + URLEncoder.encode(s);\r
+            remoteFilepath += "/" + URLEncoder.encode(s);\r
         }\r
 \r
-        Log.e("ASD", mUri.toString() + filepath.replace(" ", "%20") + "");\r
+        Log.e("ASD", mUri.toString() + remoteFilepath.replace(" ", "%20") + "");\r
         GetMethod get = new GetMethod(mUri.toString()\r
-                + filepath.replace(" ", "%20"));\r
+                + remoteFilepath.replace(" ", "%20"));\r
+        */\r
+        GetMethod get = new GetMethod(mUri.toString() + remoteFilepath);\r
 \r
         // get.setHeader("Host", mUri.getHost());\r
         // get.setHeader("User-Agent", "Android-ownCloud");\r
@@ -115,11 +140,23 @@ public class WebdavClient extends HttpClient {
         }\r
         return true;\r
     }\r
-\r
-    public void setUploadListener(OnUploadProgressListener listener) {\r
-        mUploadProgressListener = listener;\r
-    }\r
     \r
+    /**\r
+     * Deletes a remote file via webdav\r
+     * @param remoteFilePath\r
+     * @return\r
+     */\r
+    public boolean deleteFile(String remoteFilePath){\r
+        DavMethod delete = new DeleteMethod(mUri.toString() + remoteFilePath);\r
+        try {\r
+            executeMethod(delete);\r
+        }  catch (Throwable e) {\r
+            Log.e(TAG, "Deleting failed with error: " + e.getMessage(), e);\r
+            return false;\r
+        }\r
+        return true;\r
+    }\r
+\r
     public void setDataTransferProgressListener(OnDatatransferProgressListener listener) {\r
         mDataTransferListener = listener;\r
     }\r
@@ -132,7 +169,7 @@ public class WebdavClient extends HttpClient {
             Log.e("ASD", contentType + "");\r
             File f = new File(localFile);\r
             FileRequestEntity entity = new FileRequestEntity(f, contentType);\r
-            entity.setOnUploadProgressListener(mUploadProgressListener);\r
+            entity.setOnDatatransferProgressListener(mDataTransferListener);\r
             Log.e("ASD", f.exists() + " " + entity.getContentLength());\r
             PutMethod put = new PutMethod(mUri.toString() + remoteTarget);\r
             put.setRequestEntity(entity);\r
@@ -149,21 +186,29 @@ public class WebdavClient extends HttpClient {
         return result;\r
     }\r
 \r
-    public int tryToLogin() {\r
-        int r = 0;\r
-        HeadMethod head = new HeadMethod(mUri.toString());\r
+    /**\r
+     * Tries to log in to the given WedDavURI, with the given credentials\r
+     * @param uri To test\r
+     * @param username Username to check\r
+     * @param password Password to verify\r
+     * @return A {@link HttpStatus}-Code of the result. SC_OK is good.\r
+     */\r
+    public static int tryToLogin(Uri uri, String username, String password) {\r
+        int returnCode = 0;\r
+        WebdavClient client = new WebdavClient();\r
+        client.setCredentials(username, password);\r
+        HeadMethod head = new HeadMethod(uri.toString());\r
         try {\r
-            r = executeMethod(head);\r
+            returnCode = client.executeMethod(head);\r
         } catch (Exception e) {\r
             Log.e(TAG, "Error: " + e.getMessage());\r
         }\r
-        return r;\r
+        return returnCode;\r
     }\r
 \r
     public boolean createDirectory(String path) {\r
         try {\r
-            MkColMethod mkcol = new MkColMethod(mUri.toString() + "/" + path\r
-                    + "/");\r
+            MkColMethod mkcol = new MkColMethod(mUri.toString() + path);\r
             int status = executeMethod(mkcol);\r
             Log.d(TAG, "Status returned " + status);\r
             Log.d(TAG, "uri: " + mkcol.getURI().toString());\r