package org.deviceconnect.android.deviceplugin.kadecot.profile; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import org.deviceconnect.android.deviceplugin.kadecot.KadecotDeviceService; import org.deviceconnect.android.message.MessageUtils; import org.deviceconnect.android.profile.DConnectProfile; import org.deviceconnect.android.profile.api.GetApi; import org.deviceconnect.android.profile.api.PutApi; import org.deviceconnect.message.DConnectMessage; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; import static org.deviceconnect.android.deviceplugin.kadecot.profile.original.AirConditionerProfile.getEpc; import static org.deviceconnect.android.deviceplugin.kadecot.profile.original.AirConditionerProfile.getEpcValue; import static org.deviceconnect.android.deviceplugin.kadecot.profile.original.AirConditionerProfile.setEpc; import static org.deviceconnect.android.deviceplugin.kadecot.profile.original.AirConditionerProfile.setValue; import static org.deviceconnect.android.deviceplugin.kadecot.profile.original.AirConditionerProfileConstants.PARAM_EPC; import static org.deviceconnect.android.deviceplugin.kadecot.profile.original.AirConditionerProfileConstants.PARAM_PROPERTIES; import static org.deviceconnect.android.deviceplugin.kadecot.profile.original.AirConditionerProfileConstants.PARAM_VALUE; import static org.deviceconnect.android.deviceplugin.kadecot.service.KadecotService.IDX_DEVICEID; import static org.deviceconnect.android.deviceplugin.kadecot.service.KadecotService.IDX_PREFIX; import static org.deviceconnect.android.deviceplugin.kadecot.service.KadecotService.NO_RESULT; import static org.deviceconnect.android.deviceplugin.kadecot.service.KadecotService.PREFIX_KADECOT; import static org.deviceconnect.android.deviceplugin.kadecot.service.KadecotService.createInvalidKadecotResponseError; public class KadecotEchonetliteProfile extends DConnectProfile { public KadecotEchonetliteProfile() { // GET /gotapi/echonetLite/property addApi(new GetApi() { @Override public String getAttribute() { return "property"; } @Override public boolean onRequest(final Intent request, final Intent response) { getECHONETLiteProperty(request, response); return false; } }); // PUT /gotapi/echonetLite/property addApi(new PutApi() { @Override public String getAttribute() { return "property"; } @Override public boolean onRequest(final Intent request, final Intent response) { putECHONETLiteProperty(request, response); return false; } }); } @Override public String getProfileName() { return "echonetLite"; } /** * Get ECHONET Lite property. * * @param request Request. * @param response Response. */ private void getECHONETLiteProperty(final Intent request, final Intent response) { String[] element = KadecotDeviceService.getElementFromServiceId(getServiceID(request)); if (element[IDX_PREFIX].equals(PREFIX_KADECOT) && element[IDX_DEVICEID] != null) { String strEpcs = getEpc(request); if (strEpcs == null) { MessageUtils.setInvalidRequestParameterError(response); sendResponse(response); return; } Pattern p = Pattern.compile(","); String[] epcs = p.split(strEpcs); List<Bundle> dataList = new ArrayList<>(); Bundle resultData = new Bundle(); for (int i = 0; i < epcs.length; i++) { String strValue = epcs[i].trim(); try { int checkInt = Integer.decode(strValue); if (checkInt < 0x0 || checkInt >= 0x100) { MessageUtils.setInvalidRequestParameterError(response); sendResponse(response); return; } epcs[i] = "0x" + Integer.toHexString(checkInt); } catch (NumberFormatException e) { MessageUtils.setInvalidRequestParameterError(response); sendResponse(response); return; } } for (String epc : epcs) { String urlstr = "content://com.sonycsl.kadecot.json.provider/jsonp/v1/devices/" + element[IDX_DEVICEID] + "?procedure=get¶ms={\"propertyName\":\"" + epc + "\"}"; Cursor cursor = getContext().getContentResolver().query(Uri.parse(urlstr), null, null, null, null); if (cursor != null) { cursor.moveToFirst(); String result = cursor.getString(0); String propertyName = KadecotDeviceService.getPropertyName(result); String propertyValue = KadecotDeviceService.getPropertyValue(result); if (propertyName != null && propertyValue != null) { if (result.equals(NO_RESULT)) { cursor.close(); MessageUtils.setNotSupportAttributeError(response, "This device not support 'get' procedure."); sendResponse(response); return; } else { resultData.putString(PARAM_EPC, propertyName); resultData.putString(PARAM_VALUE, propertyValue); dataList.add((Bundle) resultData.clone()); } } else { cursor.close(); createInvalidKadecotResponseError(response); sendResponse(response); return; } cursor.close(); } else { createInvalidKadecotResponseError(response); sendResponse(response); return; } } setResult(response, DConnectMessage.RESULT_OK); response.putExtra(PARAM_PROPERTIES, dataList.toArray(new Bundle[dataList.size()])); } else { createInvalidKadecotResponseError(response); } sendResponse(response); } /** * Put ECHONET Lite property. * * @param request Request. * @param response Response. */ private void putECHONETLiteProperty(final Intent request, final Intent response) { String[] element = KadecotDeviceService.getElementFromServiceId(getServiceID(request)); if (element[IDX_PREFIX].equals(PREFIX_KADECOT) && element[IDX_DEVICEID] != null) { String epc = getEpc(request); String value = getEpcValue(request); if (epc == null || value == null) { MessageUtils.setInvalidRequestParameterError(response); sendResponse(response); return; } try { int checkInt = Integer.decode(epc); if (checkInt < 0x0 || checkInt >= 0x100) { MessageUtils.setInvalidRequestParameterError(response); sendResponse(response); return; } epc = "0x" + Integer.toHexString(checkInt); } catch (NumberFormatException e) { MessageUtils.setInvalidRequestParameterError(response); sendResponse(response); return; } Pattern p = Pattern.compile(","); String[] values = p.split(value); for (int i = 0; i < values.length; i++) { String strValue = values[i].trim(); try { int checkInt = Integer.decode(strValue); if (checkInt < 0x0 || checkInt >= 0x100) { MessageUtils.setInvalidRequestParameterError(response); sendResponse(response); return; } values[i] = "0x" + Integer.toHexString(checkInt); } catch (NumberFormatException e) { MessageUtils.setInvalidRequestParameterError(response); sendResponse(response); return; } } StringBuilder buf = new StringBuilder(); for (int i = 0; i < values.length; i++) { if (i != 0) { buf.append(","); } buf.append(values[i]); } String urlstr = "content://com.sonycsl.kadecot.json.provider/jsonp/v1/devices/" + element[IDX_DEVICEID] + "?procedure=set¶ms={\"propertyName\":\"" + epc + "\",\"propertyValue\":[" + buf.toString() + "]}"; Cursor cursor = getContext().getContentResolver().query(Uri.parse(urlstr), null, null, null, null); if (cursor != null) { cursor.moveToFirst(); String result = cursor.getString(0); String propertyName = KadecotDeviceService.getPropertyName(result); String propertyValue = KadecotDeviceService.getPropertyValue(result); if (propertyName != null && propertyValue != null) { if (result.equals(NO_RESULT)) { MessageUtils.setNotSupportAttributeError(response, "This device not support 'get' procedure."); } else { setResult(response, DConnectMessage.RESULT_OK); setEpc(response, propertyName); setValue(response, propertyValue); } } else { createInvalidKadecotResponseError(response); } cursor.close(); } else { createInvalidKadecotResponseError(response); } } else { createInvalidKadecotResponseError(response); } sendResponse(response); } }