/******************************************************************************* * Software Name : RCS IMS Stack * * Copyright (C) 2010 France Telecom S.A. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package com.orangelabs.rcs.provider.fthttp; import java.util.Arrays; import android.content.ContentProvider; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.net.Uri; import android.provider.BaseColumns; import com.orangelabs.rcs.provider.RichProviderHelper; import com.orangelabs.rcs.utils.logger.Logger; /** * @author YPLO6403 * * Provider for the resumable FT HTTP table */ public class FtHttpProvider extends ContentProvider { private static final String TYPE_CURSOR_ITEM = "vnd.android.cursor.item/"; private static final String TYPE_CURSOR_DIR = "vnd.android.cursor.dir/"; public static final String AUTHORITY = "com.orangelabs.rcs.fthttp"; public static final String CONTENT_URI_BASE = "content://" + AUTHORITY; public static final String QUERY_NOTIFY = "QUERY_NOTIFY"; public static final String QUERY_GROUP_BY = "QUERY_GROUP_BY"; private static final int URI_TYPE_FTHTTP = 0; private static final int URI_TYPE_FTHTTP_ID = 1; /** * The logger */ final private static Logger logger = Logger.getLogger(FtHttpProvider.class.getSimpleName()); private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH); static { URI_MATCHER.addURI(AUTHORITY, FtHttpColumns.TABLE, URI_TYPE_FTHTTP); URI_MATCHER.addURI(AUTHORITY, FtHttpColumns.TABLE + "/#", URI_TYPE_FTHTTP_ID); } private RichProviderHelper mRichProviderHelper; @Override public boolean onCreate() { if (RichProviderHelper.getInstance() == null) { RichProviderHelper.createInstance(this.getContext()); } mRichProviderHelper = RichProviderHelper.getInstance(); return true; } @Override public String getType(Uri uri) { final int match = URI_MATCHER.match(uri); switch (match) { case URI_TYPE_FTHTTP: return TYPE_CURSOR_DIR + FtHttpColumns.TABLE; case URI_TYPE_FTHTTP_ID: return TYPE_CURSOR_ITEM + FtHttpColumns.TABLE; } return null; } @Override public Uri insert(Uri uri, ContentValues values) { if (logger.isActivated()) { logger.debug("insert uri=" + uri + " values=" + values ); } final String table = uri.getLastPathSegment(); final long rowId = mRichProviderHelper.getWritableDatabase().insert(table, null, values); String notify; if (rowId != -1 && ((notify = uri.getQueryParameter(QUERY_NOTIFY)) == null || "true".equals(notify))) { getContext().getContentResolver().notifyChange(uri, null); } return uri.buildUpon().appendEncodedPath(String.valueOf(rowId)).build(); } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { if (logger.isActivated()) { logger.debug("update uri=" + uri + " values=" + values + " selection=" + selection + " selectionArgs=" + Arrays.toString(selectionArgs)); } final QueryParams queryParams = getQueryParams(uri, selection); final int res = mRichProviderHelper.getWritableDatabase().update(queryParams.table, values, queryParams.selection, selectionArgs); String notify; if (res != 0 && ((notify = uri.getQueryParameter(QUERY_NOTIFY)) == null || "true".equals(notify))) { getContext().getContentResolver().notifyChange(uri, null); } return res; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { if (logger.isActivated()) { logger.debug("delete uri=" + uri + " selection=" + selection + " selectionArgs=" + Arrays.toString(selectionArgs)); } final QueryParams queryParams = getQueryParams(uri, selection); final int res = mRichProviderHelper.getWritableDatabase().delete(queryParams.table, queryParams.selection, selectionArgs); String notify; if (res != 0 && ((notify = uri.getQueryParameter(QUERY_NOTIFY)) == null || "true".equals(notify))) { getContext().getContentResolver().notifyChange(uri, null); } return res; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { final String groupBy = uri.getQueryParameter(QUERY_GROUP_BY); final QueryParams queryParams = getQueryParams(uri, selection); final Cursor res = mRichProviderHelper.getReadableDatabase().query(queryParams.table, projection, queryParams.selection, selectionArgs, groupBy, null, sortOrder == null ? queryParams.orderBy : sortOrder); if (logger.isActivated()) { logger.debug("query uri=" + uri + " selection=" + selection + " selectionArgs=" + Arrays.toString(selectionArgs) + " sortOrder=" + (sortOrder == null ? queryParams.orderBy : sortOrder) + " groupBy=" + groupBy); } res.setNotificationUri(getContext().getContentResolver(), uri); return res; } private static class QueryParams { public String table; public String selection; public String orderBy; } private QueryParams getQueryParams(Uri uri, String selection) { QueryParams res = new QueryParams(); String id = null; int matchedId = URI_MATCHER.match(uri); switch (matchedId) { case URI_TYPE_FTHTTP: case URI_TYPE_FTHTTP_ID: res.table = FtHttpColumns.TABLE; res.orderBy = FtHttpColumns.DEFAULT_ORDER; break; default: throw new IllegalArgumentException("The uri '" + uri + "' is not supported by this ContentProvider"); } switch (matchedId) { case URI_TYPE_FTHTTP_ID: id = uri.getLastPathSegment(); } if (id != null) { if (selection != null) { res.selection = BaseColumns._ID + "=" + id + " and (" + selection + ")"; } else { res.selection = BaseColumns._ID + "=" + id; } } else { res.selection = selection; } return res; } public static Uri notify(Uri uri, boolean notify) { return uri.buildUpon().appendQueryParameter(QUERY_NOTIFY, String.valueOf(notify)).build(); } public static Uri groupBy(Uri uri, String groupBy) { return uri.buildUpon().appendQueryParameter(QUERY_GROUP_BY, groupBy).build(); } }