1 /* ownCloud Android client application 
   2  *   Copyright (C) 2012  Bartek Przybylski 
   4  *   This program is free software: you can redistribute it and/or modify 
   5  *   it under the terms of the GNU General Public License as published by 
   6  *   the Free Software Foundation, either version 3 of the License, or 
   7  *   (at your option) any later version. 
   9  *   This program is distributed in the hope that it will be useful, 
  10  *   but WITHOUT ANY WARRANTY; without even the implied warranty of 
  11  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  12  *   GNU General Public License for more details. 
  14  *   You should have received a copy of the GNU General Public License 
  15  *   along with this program.  If not, see <http://www.gnu.org/licenses/>. 
  19 package eu
.alefzero
.owncloud
.datamodel
; 
  21 import java
.util
.Vector
; 
  23 import eu
.alefzero
.owncloud
.db
.ProviderMeta
.ProviderTableMeta
; 
  24 import android
.accounts
.Account
; 
  25 import android
.content
.ContentProviderClient
; 
  26 import android
.content
.ContentResolver
; 
  27 import android
.content
.ContentValues
; 
  28 import android
.database
.Cursor
; 
  29 import android
.net
.Uri
; 
  30 import android
.os
.RemoteException
; 
  31 import android
.util
.Log
; 
  33 public class FileDataStorageManager 
implements DataStorageManager 
{ 
  35     private ContentResolver mContentResolver
; 
  36     private ContentProviderClient mContentProvider
; 
  37     private Account mAccount
; 
  39     private static String TAG 
= "FileDataStorageManager"; 
  41     public FileDataStorageManager(Account account
, ContentResolver cr
) { 
  42         mContentProvider 
= null
; 
  43         mContentResolver 
= cr
; 
  47     public FileDataStorageManager(Account account
, ContentProviderClient cp
) { 
  48         mContentProvider 
= cp
; 
  49         mContentResolver 
= null
; 
  54     public OCFile 
getFileByPath(String path
) { 
  55         Cursor c 
= getCursorForValue(ProviderTableMeta
.FILE_PATH
, path
); 
  57         if (c
.moveToFirst()) { 
  58             file 
= createFileInstance(c
); 
  65     public OCFile 
getFileById(long id
) { 
  66         Cursor c 
= getCursorForValue(ProviderTableMeta
._ID
, String
.valueOf(id
)); 
  68         if (c
.moveToFirst()) { 
  69             file 
= createFileInstance(c
); 
  76     public boolean fileExists(long id
) { 
  77         return fileExists(ProviderTableMeta
._ID
, String
.valueOf(id
)); 
  81     public boolean fileExists(String path
) { 
  82         return fileExists(ProviderTableMeta
.FILE_PATH
, path
); 
  86     public boolean saveFile(OCFile file
) { 
  87         boolean overriden 
= false
; 
  88         ContentValues cv 
= new ContentValues(); 
  89         cv
.put(ProviderTableMeta
.FILE_MODIFIED
, file
.getModificationTimestamp()); 
  90         cv
.put(ProviderTableMeta
.FILE_CREATION
, file
.getCreationTimestamp()); 
  91         cv
.put(ProviderTableMeta
.FILE_CONTENT_LENGTH
, file
.getFileLength()); 
  92         cv
.put(ProviderTableMeta
.FILE_CONTENT_TYPE
, file
.getMimetype()); 
  93         cv
.put(ProviderTableMeta
.FILE_NAME
, file
.getFileName()); 
  94         if (file
.getParentId() != 0) 
  95             cv
.put(ProviderTableMeta
.FILE_PARENT
, file
.getParentId()); 
  96         cv
.put(ProviderTableMeta
.FILE_PATH
, file
.getPath()); 
  97         cv
.put(ProviderTableMeta
.FILE_STORAGE_PATH
, file
.getStoragePath()); 
  98         cv
.put(ProviderTableMeta
.FILE_ACCOUNT_OWNER
, mAccount
.name
); 
 100         if (fileExists(file
.getPath())) { 
 101             OCFile tmpfile 
= getFileByPath(file
.getPath()); 
 102             file
.setStoragePath(tmpfile
.getStoragePath()); 
 103             cv
.put(ProviderTableMeta
.FILE_STORAGE_PATH
, file
.getStoragePath()); 
 104             file
.setFileId(tmpfile
.getFileId()); 
 107             if (getContentResolver() != null
) { 
 108                 getContentResolver().update(ProviderTableMeta
.CONTENT_URI
, cv
, 
 109                         ProviderTableMeta
._ID 
+ "=?", 
 110                         new String
[] { String
.valueOf(file
.getFileId()) }); 
 113                     getContentProvider().update(ProviderTableMeta
.CONTENT_URI
, 
 114                             cv
, ProviderTableMeta
._ID 
+ "=?", 
 115                             new String
[] { String
.valueOf(file
.getFileId()) }); 
 116                 } catch (RemoteException e
) { 
 118                             "Fail to insert insert file to database " 
 123             Uri result_uri 
= null
; 
 124             if (getContentResolver() != null
) { 
 125                 result_uri 
= getContentResolver().insert( 
 126                         ProviderTableMeta
.CONTENT_URI_FILE
, cv
); 
 129                     result_uri 
= getContentProvider().insert( 
 130                             ProviderTableMeta
.CONTENT_URI_FILE
, cv
); 
 131                 } catch (RemoteException e
) { 
 133                             "Fail to insert insert file to database " 
 137             if (result_uri 
!= null
) { 
 138                 long new_id 
= Long
.parseLong(result_uri
.getPathSegments() 
 140                 file
.setFileId(new_id
); 
 144         if (file
.isDirectory() && file
.needsUpdatingWhileSaving()) 
 145             for (OCFile f 
: getDirectoryContent(file
)) 
 151     public void setAccount(Account account
) { 
 155     public Account 
getAccount() { 
 159     public void setContentResolver(ContentResolver cr
) { 
 160         mContentResolver 
= cr
; 
 163     public ContentResolver 
getContentResolver() { 
 164         return mContentResolver
; 
 167     public void setContentProvider(ContentProviderClient cp
) { 
 168         mContentProvider 
= cp
; 
 171     public ContentProviderClient 
getContentProvider() { 
 172         return mContentProvider
; 
 175     public Vector
<OCFile
> getDirectoryContent(OCFile f
) { 
 176         if (f 
!= null 
&& f
.isDirectory() && f
.getFileId() != -1) { 
 177             Vector
<OCFile
> ret 
= new Vector
<OCFile
>(); 
 179             Uri req_uri 
= Uri
.withAppendedPath( 
 180                     ProviderTableMeta
.CONTENT_URI_DIR
, 
 181                     String
.valueOf(f
.getFileId())); 
 184             if (getContentProvider() != null
) { 
 186                     c 
= getContentProvider().query(req_uri
, null
, 
 187                             ProviderTableMeta
.FILE_ACCOUNT_OWNER 
+ "=?", 
 188                             new String
[] { mAccount
.name 
}, null
); 
 189                 } catch (RemoteException e
) { 
 190                     Log
.e(TAG
, e
.getMessage()); 
 194                 c 
= getContentResolver().query(req_uri
, null
, 
 195                         ProviderTableMeta
.FILE_ACCOUNT_OWNER 
+ "=?", 
 196                         new String
[] { mAccount
.name 
}, null
); 
 199             if (c
.moveToFirst()) { 
 201                     OCFile child 
= createFileInstance(c
); 
 203                 } while (c
.moveToNext()); 
 212     private boolean fileExists(String cmp_key
, String value
) { 
 214         if (getContentResolver() != null
) { 
 215             c 
= getContentResolver() 
 216                     .query(ProviderTableMeta
.CONTENT_URI
, 
 219                                     + ProviderTableMeta
.FILE_ACCOUNT_OWNER
 
 221                             new String
[] { value
, mAccount
.name 
}, null
); 
 224                 c 
= getContentProvider().query( 
 225                         ProviderTableMeta
.CONTENT_URI
, 
 228                                 + ProviderTableMeta
.FILE_ACCOUNT_OWNER 
+ "=?", 
 229                         new String
[] { value
, mAccount
.name 
}, null
); 
 230             } catch (RemoteException e
) { 
 232                         "Couldn't determine file existance, assuming non existance: " 
 237         boolean retval 
= c
.moveToFirst(); 
 242     private Cursor 
getCursorForValue(String key
, String value
) { 
 244         if (getContentResolver() != null
) { 
 245             c 
= getContentResolver() 
 246                     .query(ProviderTableMeta
.CONTENT_URI
, 
 249                                     + ProviderTableMeta
.FILE_ACCOUNT_OWNER
 
 251                             new String
[] { value
, mAccount
.name 
}, null
); 
 254                 c 
= getContentProvider().query( 
 255                         ProviderTableMeta
.CONTENT_URI
, 
 257                         key 
+ "=? AND " + ProviderTableMeta
.FILE_ACCOUNT_OWNER
 
 258                                 + "=?", new String
[] { value
, mAccount
.name 
}, 
 260             } catch (RemoteException e
) { 
 261                 Log
.e(TAG
, "Could not get file details: " + e
.getMessage()); 
 268     private OCFile 
createFileInstance(Cursor c
) { 
 271             file 
= new OCFile(c
.getString(c
 
 272                     .getColumnIndex(ProviderTableMeta
.FILE_PATH
))); 
 273             file
.setFileId(c
.getLong(c
.getColumnIndex(ProviderTableMeta
._ID
))); 
 274             file
.setParentId(c
.getLong(c
 
 275                     .getColumnIndex(ProviderTableMeta
.FILE_PARENT
))); 
 276             file
.setStoragePath(c
.getString(c
 
 277                     .getColumnIndex(ProviderTableMeta
.FILE_STORAGE_PATH
))); 
 278             file
.setMimetype(c
.getString(c
 
 279                     .getColumnIndex(ProviderTableMeta
.FILE_CONTENT_TYPE
))); 
 280             file
.setFileLength(c
.getLong(c
 
 281                     .getColumnIndex(ProviderTableMeta
.FILE_CONTENT_LENGTH
))); 
 282             file
.setCreationTimestamp(c
.getLong(c
 
 283                     .getColumnIndex(ProviderTableMeta
.FILE_CREATION
))); 
 284             file
.setModificationTimestamp(c
.getLong(c
 
 285                     .getColumnIndex(ProviderTableMeta
.FILE_MODIFIED
)));