fix crash when deleting used account
[pub/Android/ownCloud.git] / src / eu / alefzero / webdav / WebdavClient.java
index 4d97ceb..880995d 100644 (file)
  *   along with this program.  If not, see <http://www.gnu.org/licenses/>.\r
  *\r
  */\r
-package eu.alefzero.webdav;\r
-\r
-import java.io.BufferedInputStream;\r
-import java.io.BufferedOutputStream;\r
-import java.io.File;\r
-import java.io.FileOutputStream;\r
-import java.io.IOException;\r
-import java.io.InputStreamReader;\r
-import java.io.OutputStreamWriter;\r
-\r
-import org.apache.http.HttpHost;\r
-import org.apache.http.HttpResponse;\r
+package eu.alefzero.webdav;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.URLDecoder;\r
+
+import org.apache.commons.httpclient.Credentials;\r
+import org.apache.commons.httpclient.HttpClient;\r
+import org.apache.commons.httpclient.UsernamePasswordCredentials;\r
+import org.apache.commons.httpclient.auth.AuthScope;\r
+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.params.HttpMethodParams;\r
+import org.apache.commons.httpclient.protocol.Protocol;
 import org.apache.http.HttpStatus;\r
-import org.apache.http.HttpVersion;\r
-import org.apache.http.auth.AuthScope;\r
-import org.apache.http.auth.UsernamePasswordCredentials;\r
-import org.apache.http.client.methods.HttpGet;\r
-import org.apache.http.client.methods.HttpPut;\r
-import org.apache.http.conn.ClientConnectionManager;\r
-import org.apache.http.conn.params.ConnManagerPNames;\r
-import org.apache.http.conn.params.ConnPerRouteBean;\r
-import org.apache.http.conn.scheme.PlainSocketFactory;\r
-import org.apache.http.conn.scheme.Scheme;\r
-import org.apache.http.conn.scheme.SchemeRegistry;\r
-import org.apache.http.conn.ssl.SSLSocketFactory;\r
-import org.apache.http.entity.FileEntity;\r
-import org.apache.http.entity.mime.content.FileBody;\r
-import org.apache.http.impl.auth.BasicScheme;\r
-import org.apache.http.impl.client.DefaultHttpClient;\r
-import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;\r
-import org.apache.http.params.BasicHttpParams;\r
-import org.apache.http.params.HttpParams;\r
-import org.apache.http.params.HttpProtocolParams;\r
-import org.apache.http.protocol.BasicHttpContext;\r
-\r
-import eu.alefzero.owncloud.authenticator.EasySSLSocketFactory;\r
-\r
+import org.apache.jackrabbit.webdav.client.methods.MkColMethod;\r
+
+import eu.alefzero.owncloud.authenticator.EasySSLSocketFactory;
+
 import android.net.Uri;\r
-import android.util.Log;\r
-\r
-/**\r
- * A basic WebDAV-Client\r
- * @author Bartek Przybylski\r
- *\r
- */\r
-public class WebdavClient {\r
-  private DefaultHttpClient mHttpClient;\r
-  private BasicHttpContext mHttpContext;\r
-  private HttpHost mTargetHost;\r
-  private SchemeRegistry mSchemeRegistry;\r
+import android.util.Log;
+
+public class WebdavClient extends HttpClient {
   private Uri mUri;\r
+  private Credentials mCredentials;
   final private static String TAG = "WebdavClient";\r
-  \r
-  public WebdavClient(Uri uri) {\r
+  private static final String USER_AGENT = "Android-ownCloud";
+  
+  public WebdavClient(Uri uri) {
     mUri = uri;\r
-    mSchemeRegistry = new SchemeRegistry();\r
-    setupHttpClient();\r
-  }\r
-  \r
+    getParams().setParameter(HttpMethodParams.USER_AGENT, USER_AGENT);
+  }
+  
   public void setCredentials(String username, String password) {\r
-    // determine default port for http or https\r
-    int targetPort = mTargetHost.getPort() == -1 ? \r
-                        ( mUri.getScheme().equals("https") ? 443 : 80)\r
-                        : mUri.getPort();\r
-\r
-    mHttpClient.getCredentialsProvider().setCredentials(\r
-        new AuthScope(mUri.getHost(), targetPort), \r
-        new UsernamePasswordCredentials(username, password));\r
-    BasicScheme basicAuth = new BasicScheme();\r
-    mHttpContext.setAttribute("preemptive-auth", basicAuth);\r
+    getParams().setAuthenticationPreemptive(true);
+    getState().setCredentials(AuthScope.ANY, getCredentials(username, password));
+  }
+  
+  private Credentials getCredentials(String username, String password) {\r
+    if (mCredentials == null)\r
+      mCredentials = new UsernamePasswordCredentials(username, password); \r
+    return mCredentials;\r
   }\r
-  \r
-  public void allowUnsignedCertificates() {\r
+\r
+  public void allowUnsignedCertificates() {
     // https\r
-    mSchemeRegistry.register(new Scheme("https", new EasySSLSocketFactory(), 443));\r
-  }\r
-  \r
-  public boolean downloadFile(String filepath, File targetPath) {\r
-    HttpGet get = new HttpGet(mUri.toString() + filepath.replace(" ", "%20"));\r
-    get.setHeader("Host", mUri.getHost());\r
-    get.setHeader("User-Agent", "Android-ownCloud");\r
-    \r
-    try {\r
-      HttpResponse response = mHttpClient.execute(mTargetHost, get, mHttpContext);\r
-      if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {\r
-        return false;\r
-      }\r
-      BufferedInputStream bis = new BufferedInputStream(response.getEntity().getContent());\r
-      FileOutputStream fos = new FileOutputStream(targetPath);\r
-      \r
-      byte[] bytes = new byte[512];\r
-      int readResult;\r
-      while ((readResult = bis.read(bytes)) != -1) fos.write(bytes, 0, readResult);\r
-      \r
-    } catch (IOException e) {\r
-      e.printStackTrace();\r
-      return false;\r
-    }\r
-    return true;\r
-  }\r
-  \r
-  void getFileList(String dirPath) {\r
-    \r
-  }\r
+    Protocol.registerProtocol("https", new Protocol("https", new EasySSLSocketFactory(), 443));
+  }
+  
+  public boolean downloadFile(String filepath, File targetPath) {
+    //HttpGet get = new HttpGet(mUri.toString() + filepath.replace(" ", "%20"));\r
+   \r
+    Log.e("ASD", mUri.toString() + URLDecoder.decode(filepath) + "");\r
+    GetMethod get = new GetMethod(mUri.toString() + URLDecoder.decode(filepath));\r
+    
+//    get.setHeader("Host", mUri.getHost());
+//    get.setHeader("User-Agent", "Android-ownCloud");
+    
+    try {
+      int status = executeMethod(get);
+      if (status != HttpStatus.SC_OK) {
+        return false;
+      }
+      BufferedInputStream bis = new BufferedInputStream(get.getResponseBodyAsStream());
+      FileOutputStream fos = new FileOutputStream(targetPath);
+      
+      byte[] bytes = new byte[512];
+      int readResult;
+      while ((readResult = bis.read(bytes)) != -1) fos.write(bytes, 0, readResult);
+      
+    } catch (IOException e) {
+      e.printStackTrace();
+      return false;
+    }
+    return true;
+  }
+  
+  public boolean putFile(String localFile,
+                  String remoteTarget,
+                  String contentType) {
+    boolean result = true;
+
+    try {
+      FileRequestEntity entity = new FileRequestEntity(new File(localFile), contentType);\r
+      PutMethod put = new PutMethod(mUri.toString() + remoteTarget.substring(1));\r
+      put.setRequestEntity(entity);\r
+      int status = executeMethod(put);\r
+      Log.d(TAG, "PUT method return with status "+status);
+
+      Log.i(TAG, "Uploading, done");
+    } catch (final Exception e) {
+      Log.i(TAG, ""+e.getMessage());
+      result = false;
+    }
+    
+    return result;
+  }
   \r
-  public boolean putFile(String localFile,\r
-                  String remoteTarget,\r
-                  String contentType) {\r
-    boolean result = true;\r
-    HttpPut method = new HttpPut(mUri.toString() + remoteTarget.replace(" ", "%20"));\r
-    method.setHeader("Content-type", contentType);\r
-    method.setHeader("Host", mUri.getHost());\r
-    method.setHeader("User-Agent", "Android-ownCloud");\r
-\r
+  public int tryToLogin() {\r
+    int r = 0; \r
+    HeadMethod head = new HeadMethod(mUri.toString());\r
     try {\r
-      FileBody fb = new FileBody(new File(localFile, contentType));\r
-      final FileEntity fileEntity = new FileEntity(new File(localFile), contentType);\r
-\r
-      method.setEntity(fileEntity);\r
-      Log.i(TAG, "executing:" + method.getRequestLine().toString());\r
-\r
-      mHttpClient.execute(mTargetHost, method, mHttpContext);\r
-      /*mHandler.post(new Runnable() {\r
-      public void run() {\r
-        Uploader.this.PartialupdateUpload(c.getString(c.getColumnIndex(Media.DATA)),\r
-                                                  c.getString(c.getColumnIndex(Media.DISPLAY_NAME)),\r
-                                                  mUploadPath + (mUploadPath.equals("/")?"":"/"),\r
-                                                  fileEntity.getContentType().getValue(),\r
-                                                  fileEntity.getContentLength()+"");\r
-      }\r
-    });\r
-    Log.i(TAG, "Uploading, done");\r
-*/\r
-      Log.i(TAG, "Uploading, done");\r
-    } catch (final Exception e) {\r
-      Log.i(TAG, ""+e.getMessage());\r
-      result = false;\r
+      r = executeMethod(head);\r
+    } catch (Exception e) {\r
+      Log.e(TAG, "Error: " + e.getMessage());\r
     }\r
-    \r
-    return result;\r
+    return r;\r
   }\r
-  \r
-  public boolean createDirectory(String path) {\r
-    HttpMkCol method = new HttpMkCol(mUri.toString() + path + "/");\r
-    method.setHeader("User-Agent", "Android-ownCloud");\r
-    \r
+
+  public boolean createDirectory(String path) {
     try {\r
-      mHttpClient.execute(mTargetHost, method, mHttpContext);\r
-      Log.i(TAG, "Creating dir completed");\r
-    } catch (final Exception e) {\r
-      e.printStackTrace();\r
-      return false;\r
-    }\r
-    return true;\r
-  }\r
-  \r
-  private void setupHttpClient() {\r
-    // http scheme\r
-    mSchemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));\r
-    mSchemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));\r
-    \r
-    HttpParams params = new BasicHttpParams();\r
-    params.setParameter(ConnManagerPNames.MAX_TOTAL_CONNECTIONS, 30);\r
-    params.setParameter(ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE, new ConnPerRouteBean(30));\r
-    params.setParameter(HttpProtocolParams.USE_EXPECT_CONTINUE, false);\r
-    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);\r
-\r
-    mHttpContext = new BasicHttpContext();\r
-    ClientConnectionManager cm = new ThreadSafeClientConnManager(params, mSchemeRegistry);\r
-\r
-    int port = mUri.getPort() == -1 ? \r
-                 mUri.getScheme().equals("https") ? 443 : 80\r
-               : mUri.getPort();\r
-    \r
-    mTargetHost = new HttpHost(mUri.getHost(), port, mUri.getScheme());\r
-    \r
-    mHttpClient = new DefaultHttpClient(cm, params);\r
-  }\r
-}\r
+      MkColMethod mkcol = new MkColMethod(mUri.toString() + "/" + path + "/");
+      int status = executeMethod(mkcol);\r
+      Log.d(TAG, "Status returned " + status);\r
+      Log.d(TAG, "uri: " + mkcol.getURI().toString());
+      Log.i(TAG, "Creating dir completed");
+    } catch (final Exception e) {
+      e.printStackTrace();
+      return false;
+    }
+    return true;
+  }
+}