/* IRKitRmeoteControllerProfile.java Copyright (c) 2014 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.deviceplugin.irkit.profile; import android.content.Intent; import android.util.Log; import org.deviceconnect.android.deviceplugin.irkit.BuildConfig; import org.deviceconnect.android.deviceplugin.irkit.IRKitDevice; import org.deviceconnect.android.deviceplugin.irkit.IRKitDeviceService; import org.deviceconnect.android.deviceplugin.irkit.IRKitManager; import org.deviceconnect.android.deviceplugin.irkit.IRKitManager.GetMessageCallback; import org.deviceconnect.android.message.MessageUtils; import org.deviceconnect.android.profile.DConnectProfile; import org.deviceconnect.android.profile.api.DConnectApi; import org.deviceconnect.android.profile.api.GetApi; import org.deviceconnect.android.profile.api.PostApi; import org.deviceconnect.message.DConnectMessage; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; /** * IRKit Remote Controller Profile. * @author NTT DOCOMO, INC. */ public class IRKitRemoteControllerProfile extends DConnectProfile { /** Debug . */ private static final String TAG = "IRKit"; /** プロファイル名. */ public static final String PROFILE_NAME = "remoteController"; /** * パラメータ: {@value} . */ public static final String PARAM_MESSAGE = "message"; public IRKitRemoteControllerProfile() { addApi(mGetApi); addApi(mPostApi); } @Override public String getProfileName() { return PROFILE_NAME; } private final DConnectApi mGetApi = new GetApi() { @Override public boolean onRequest(final Intent request, final Intent response) { boolean send = true; String serviceId = getServiceID(request); final IRKitDeviceService service = (IRKitDeviceService) getContext(); IRKitDevice device = service.getDevice(serviceId); if (device == null) { MessageUtils.setNotFoundServiceError(response); } else { send = false; IRKitManager.INSTANCE.fetchMessage(device.getIp(), new GetMessageCallback() { @Override public void onGetMessage(final String message) { if (message == null) { MessageUtils.setUnknownError(response); } else { response.putExtra(PARAM_MESSAGE, message); setResult(response, DConnectMessage.RESULT_OK); } service.sendResponse(response); } }); } return send; } }; private final DConnectApi mPostApi = new PostApi() { @Override public boolean onRequest(final Intent request, final Intent response) { boolean send = true; String serviceId = getServiceID(request); String message = request.getStringExtra(PARAM_MESSAGE); final IRKitDeviceService service = (IRKitDeviceService) getContext(); IRKitDevice device = service.getDevice(serviceId); if (BuildConfig.DEBUG) { Log.d(TAG, "onPostRequest service=" + service + " device" + device); } if (device == null) { MessageUtils.setNotFoundServiceError(response); if (BuildConfig.DEBUG) { Log.d(TAG, "onPostRequest setNotFoundServiceError"); } } else if (!checkData(message)) { MessageUtils.setInvalidRequestParameterError(response); if (BuildConfig.DEBUG) { Log.d(TAG, "onPostRequest setInvalidRequestParameterError"); } } else { send = false; if (BuildConfig.DEBUG) { Log.d(TAG, "onPostRequest ip=" + device.getIp() + " message=" + message); } IRKitManager.INSTANCE.sendMessage(device.getIp(), message, new IRKitManager.PostMessageCallback() { @Override public void onPostMessage(final boolean result) { if (result) { setResult(response, DConnectMessage.RESULT_OK); } else { if (BuildConfig.DEBUG) { Log.d(TAG, "onPostRequest setUnknownError"); } MessageUtils.setUnknownError(response); } service.sendResponse(response); } }); } return send; } }; /** * 送られてきたデータがIRKitに対応しているかチェックを行う. * @param message データ * @return フォーマットが問題ない場合はtrue、それ以外はfalse */ private boolean checkData(final String message) { if (message == null || message.length() == 0) { return false; } try { JSONObject json = new JSONObject(message); String format = json.getString("format"); int freq = json.getInt("freq"); JSONArray datas = json.getJSONArray("data"); return (format != null && freq > 0 && datas != null); } catch (JSONException e) { return false; } } }