JNIEXPORT jobject JNICALL Java_jmtp_PortableDeviceImplWin32_getDeviceContent (JNIEnv* env, jobject obj) { HRESULT hr; IPortableDevice* pDevice; IPortableDeviceContent* pContent; jclass cls; jmethodID mid; jobject reference; pDevice = GetPortableDevice(env, obj); hr = pDevice->Content(&pContent); if(FAILED(hr)) { ThrowCOMException(env, L"Couldn't retrieve the device content", hr); return NULL; } //smart reference object aanmaken cls = env->FindClass("be/derycke/pieter/com/COMReference"); mid = env->GetMethodID(cls, "<init>", "(J)V"); reference = env->NewObject(cls, mid, pContent); cls = env->FindClass("jmtp/PortableDeviceContentImplWin32"); mid = env->GetMethodID(cls, "<init>", "(Lbe/derycke/pieter/com/COMReference;)V"); return env->NewObject(cls, mid, reference); }
void Parse_MTP::mtp_do_storage(bool clear) { IPortableDevice *pd; IPortableDeviceValues *pdv; IPortableDeviceContent *pdc = NULL; HRESULT hr; hr = CoCreateInstance(CLSID_PortableDevice, NULL, CLSCTX_INPROC_SERVER, IID_IPortableDevice, (VOID**)&pd); if (FAILED(hr)) { emit add_log(LOG_ERROR, QString("mtp_do_storage: Failed to create IPortableDevice: %1") .arg(hr, 0, 16)); return; } hr = CoCreateInstance(CLSID_PortableDeviceValues, NULL, CLSCTX_INPROC_SERVER, IID_IPortableDeviceValues, (VOID**)&pdv); if (FAILED(hr)) { emit add_log(LOG_ERROR, QString("mtp_do_storage: Failed to create IPortableDeviceValues: %1") .arg(hr, 0, 16)); return; } for (int i = 0; i < mtp_devices.size(); i++) { // after this we're creating objects which need to be cleaned up. hr = pd->Open(mtp_devices[i], pdv); if (FAILED(hr)) { emit add_log(LOG_ERROR, QString("mtp_do_storage: Failed to open IPortableDevice: %1") .arg(hr, 0, 16)); goto mtp_do_storage_cleanup; } hr = pd->Content(&pdc); if (FAILED(hr)) { emit add_log(LOG_ERROR, QString("mtp_do_storage: Failed to retrieve content from IPortableDevice: %1") .arg(hr, 0, 16)); goto mtp_do_storage_cleanup; } mtp_recurse_storage(WPD_DEVICE_OBJECT_ID, pdc, clear); mtp_do_storage_cleanup: if (pdc) { pdc->Release(); pdc = NULL; } if (pdv) { pdv->Release(); pdv = NULL; } pd->Close(); } }
bool Parse_MTP::is_device_mtp(DWORD index, LPCWSTR device_id) { bool is_mtp = false; IPortableDevice *pd; IPortableDeviceValues *pdv; IPortableDeviceKeyCollection *pdkc; IPortableDeviceProperties *pdp = NULL; IPortableDeviceContent *pdc = NULL; HRESULT hr; LPWSTR dev_protocol = NULL; QString mtp; hr = CoCreateInstance(CLSID_PortableDevice, NULL, CLSCTX_INPROC_SERVER, IID_IPortableDevice, (VOID**)&pd); if (FAILED(hr)) { emit add_log(LOG_ERROR, QString("is_device_mtp: Failed to create IPortableDevice: %1") .arg(hr, 0, 16)); return false; } hr = CoCreateInstance(CLSID_PortableDeviceValues, NULL, CLSCTX_INPROC_SERVER, IID_IPortableDeviceValues, (VOID**)&pdv); if (FAILED(hr)) { emit add_log(LOG_ERROR, QString("is_device_mtp: Failed to create IPortableDeviceValues: %1") .arg(hr, 0, 16)); return false; } hr = CoCreateInstance(CLSID_PortableDeviceKeyCollection, NULL, CLSCTX_INPROC_SERVER, IID_IPortableDeviceKeyCollection, (VOID**)&pdkc); if (FAILED(hr)) { emit add_log(LOG_ERROR, QString("is_device_mtp: Failed to create IPortableDeviceKeyCollection: %1") .arg(hr, 0, 16)); return false; } // after this we're creating objects which need to be cleaned up. hr = pd->Open(device_id, pdv); if (FAILED(hr)) { emit add_log(LOG_ERROR, QString("is_device_mtp: Failed to open IPortableDevice: %1") .arg(hr, 0, 16)); goto is_mtp_cleanup; } hr = pd->Content(&pdc); if (FAILED(hr)) { emit add_log(LOG_ERROR, QString("is_device_mtp: Failed to retrieve content from IPortableDevice: %1") .arg(hr, 0, 16)); goto is_mtp_cleanup; } hr = pdc->Properties(&pdp); if (FAILED(hr)) { emit add_log(LOG_ERROR, QString("is_device_mtp: Failed to get properties from IPortableDeviceContent: %1") .arg(hr, 0, 16)); goto is_mtp_cleanup; } hr = pdkc->Add(WPD_DEVICE_PROTOCOL); if (FAILED(hr)) { emit add_log(LOG_ERROR, QString("is_device_mtp: Failed to add to IPortableDeviceKeyCollection: %1") .arg(hr, 0, 16)); goto is_mtp_cleanup; } // WPD_DEVICE_OBJECT_ID is the top level object hr = pdp->GetValues(WPD_DEVICE_OBJECT_ID, pdkc, &pdv); if (FAILED(hr)) { emit add_log(LOG_ERROR, QString("is_device_mtp: Failed to get values from IPortableDeviceProperties: %1") .arg(hr, 0, 16)); goto is_mtp_cleanup; } hr = pdv->GetStringValue(WPD_DEVICE_PROTOCOL, &dev_protocol); if (FAILED(hr)) { emit add_log(LOG_ERROR, QString("is_device_mtp: Failed to GetStringValue: %1") .arg(hr, 0, 16)); goto is_mtp_cleanup; } mtp = QString::fromStdWString(dev_protocol); emit add_log(LOG_INFO, QString("Device %1: %2").arg(index).arg(mtp)); if (mtp.startsWith("MTP")) { is_mtp = true; emit add_log(LOG_INFO, QString("Device %1: Is a MTP device").arg(index)); } is_mtp_cleanup: if (dev_protocol) CoTaskMemFree(dev_protocol); if (pdc) { pdc->Release(); pdc = NULL; } if (pdp) { pdp->Release(); pdp = NULL; } if (pdv) { pdv->Release(); pdv = NULL; } return is_mtp; }