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
,
110 ProviderTableMeta
._ID
+ "=?",
111 new String
[] {String
.valueOf(file
.getFileId())});
114 getContentProvider().update(ProviderTableMeta
.CONTENT_URI
,
116 ProviderTableMeta
._ID
+ "=?",
117 new String
[] {String
.valueOf(file
.getFileId())});
118 } catch (RemoteException e
) {
119 Log
.e(TAG
, "Fail to insert insert file to database " + e
.getMessage());
123 Uri result_uri
= null
;
124 if (getContentResolver() != null
) {
125 result_uri
= getContentResolver().insert(ProviderTableMeta
.CONTENT_URI_FILE
, cv
);
128 result_uri
= getContentProvider().insert(ProviderTableMeta
.CONTENT_URI_FILE
, cv
);
129 } catch (RemoteException e
) {
130 Log
.e(TAG
, "Fail to insert insert file to database " + e
.getMessage());
133 if (result_uri
!= null
) {
134 long new_id
= Long
.parseLong(result_uri
.getPathSegments().get(1));
135 file
.setFileId(new_id
);
139 if (file
.isDirectory() && file
.needsUpdatingWhileSaving())
140 for (OCFile f
: getDirectoryContent(file
))
146 public void setAccount(Account account
) {
150 public Account
getAccount() {
154 public void setContentResolver(ContentResolver cr
) {
155 mContentResolver
= cr
;
158 public ContentResolver
getContentResolver() {
159 return mContentResolver
;
162 public void setContentProvider(ContentProviderClient cp
) {
163 mContentProvider
= cp
;
166 public ContentProviderClient
getContentProvider() {
167 return mContentProvider
;
170 public Vector
<OCFile
> getDirectoryContent(OCFile f
) {
171 if (f
!= null
&& f
.isDirectory() && f
.getFileId() != -1) {
172 Vector
<OCFile
> ret
= new Vector
<OCFile
>();
174 Uri req_uri
= Uri
.withAppendedPath(
175 ProviderTableMeta
.CONTENT_URI_DIR
, String
.valueOf(f
.getFileId()));
178 if (getContentProvider() != null
) {
180 c
= getContentProvider().query(req_uri
,
182 ProviderTableMeta
.FILE_ACCOUNT_OWNER
+ "=?",
183 new String
[]{mAccount
.name
},
185 } catch (RemoteException e
) {
186 Log
.e(TAG
, e
.getMessage());
190 c
= getContentResolver().query(req_uri
,
192 ProviderTableMeta
.FILE_ACCOUNT_OWNER
+ "=?",
193 new String
[]{mAccount
.name
},
197 if (c
.moveToFirst()) {
199 OCFile child
= createFileInstance(c
);
201 } while (c
.moveToNext());
211 private boolean fileExists(String cmp_key
, String value
) {
213 if (getContentResolver() != null
) {
214 c
= getContentResolver().query(ProviderTableMeta
.CONTENT_URI
,
216 cmp_key
+ "=? AND " + ProviderTableMeta
.FILE_ACCOUNT_OWNER
+ "=?",
217 new String
[] {value
, mAccount
.name
},
221 c
= getContentProvider().query(ProviderTableMeta
.CONTENT_URI
,
223 cmp_key
+ "=? AND " + ProviderTableMeta
.FILE_ACCOUNT_OWNER
+ "=?",
224 new String
[] {value
, mAccount
.name
},
226 } catch (RemoteException e
) {
227 Log
.e(TAG
, "Couldn't determine file existance, assuming non existance: " + e
.getMessage());
231 boolean retval
= c
.moveToFirst();
236 private Cursor
getCursorForValue(String key
, String value
) {
238 if (getContentResolver() != null
) {
239 c
= getContentResolver().query(ProviderTableMeta
.CONTENT_URI
,
241 key
+ "=? AND " + ProviderTableMeta
.FILE_ACCOUNT_OWNER
+ "=?",
242 new String
[] {value
, mAccount
.name
},
246 c
= getContentProvider().query(ProviderTableMeta
.CONTENT_URI
,
248 key
+ "=? AND " + ProviderTableMeta
.FILE_ACCOUNT_OWNER
+ "=?",
249 new String
[]{value
, mAccount
.name
},
251 } catch (RemoteException e
) {
252 Log
.e(TAG
, "Could not get file details: " + e
.getMessage());
259 private OCFile
createFileInstance(Cursor c
) {
262 file
= new OCFile(c
.getString(c
.getColumnIndex(ProviderTableMeta
.FILE_PATH
)));
263 file
.setFileId(c
.getLong(c
.getColumnIndex(ProviderTableMeta
._ID
)));
264 file
.setParentId(c
.getLong(c
.getColumnIndex(ProviderTableMeta
.FILE_PARENT
)));
265 file
.setStoragePath(c
.getString(c
.getColumnIndex(ProviderTableMeta
.FILE_STORAGE_PATH
)));
266 file
.setMimetype(c
.getString(c
.getColumnIndex(ProviderTableMeta
.FILE_CONTENT_TYPE
)));
267 file
.setFileLength(c
.getLong(c
.getColumnIndex(ProviderTableMeta
.FILE_CONTENT_LENGTH
)));
268 file
.setCreationTimestamp(c
.getLong(c
.getColumnIndex(ProviderTableMeta
.FILE_CREATION
)));
269 file
.setModificationTimestamp(c
.getLong(c
.getColumnIndex(ProviderTableMeta
.FILE_MODIFIED
)));