4. DRM文件下載解析流程
finalizeDestinationFile(mInfoDelta); DownloadThread.java
private void finalizeDestinationFile(DownloadInfoDelta state) { // DownloadInfoDelta是啥?
if (state.mFileName != null) {
// make sure the file is readable
FileUtils.setPermissions(state.mFileName, 0644, -1, -1);
File file = new File(state.mFileName);
/// M: support MTK DRM @{
if (file.length() == state.mCurrentBytes) {
ContentValues values = new ContentValues();
// If written bytes is not equal to file.length(), don't install DRM file
if ((Constants.MTK_DRM_ENABLED)
&& Helpers.isMtkDRMFile(state.mMimeType)) {
OmaDrmClient drmClient = new OmaDrmClient(this.mContext);
if (Helpers.isMtkDRMFLOrCDFile(state.mMimeType)) {
int result = drmClient.installDrmMsg(state.mFileName); // 這個API的作用
String[] paths = {state.mFileName};
String[] mimeTypes = {state.mMimeType};
MediaScannerConnection.scanFile(mContext, paths, mimeTypes, null); // 這句話什麼意思?
} else if (Helpers.isMtkDRMRightFile(state.mMimeType)) {
try {
DrmRights rights = new DrmRights(state.mFileName, state.mMimeType);
int result = drmClient.saveRights(rights, null, null); //層層調用,最終調用的是DrmManagerService中的該方法
if (result == OmaDrmClient.ERROR_NONE) {
drmClient.rescanDrmMediaFiles(mContext, rights, null);
}
// Mark for delete for DRM right file 將權限文件刪除
values = new ContentValues();
values.put(Downloads.Impl.COLUMN_DELETED, 1);
mContext.getContentResolver().update(mInfo.getAllDownloadsUri(), values, null, null);
} catch (IOException e) {
Xlog.e(Constants.DL_DRM, "save rights " + state.mFileName + " exception");
}
}
/// M : when file length change after install drm msg, update state.mCurrentBytes. @{ 爲啥?
if (new File(state.mFileName).length() != state.mTotalWriteBytes) {
state.mCurrentBytes = new File(state.mFileName).length();
state.mTotalWriteBytes = state.mCurrentBytes;
}
/// @}
}
values.put(Downloads.Impl.COLUMN_TOTAL_BYTES, state.mCurrentBytes);
//cheng.hu.hz merge from PR900576
values.put(Downloads.Impl.COLUMN_CURRENT_BYTES, state.mCurrentBytes);
mContext.getContentResolver().update(mInfo.getAllDownloadsUri(), values, null, null);
Xlog.d(Constants.DL_ENHANCE, "finalizeDestinationFile: " +
" Update Total Bytes:" + state.mCurrentBytes);
}
/// @}
}
}
OmaDrmClient.java
public int installDrmMsg(String path, boolean useFd) {
Log.v(TAG, "installDrmMsg FD path : " + path);
if (null == path || path.equals("")) {
Log.e(TAG, "installDrmMsg : Given path is not valid");
return DrmManagerClient.ERROR_UNKNOWN;
}
DrmInfo info = null;
RandomAccessFile dmStream = null;
FileOutputStream dcfStream = null;
FileDescriptor dmFd = null;
FileDescriptor dcfFd = null;
try {
File dmFile = new File(path);
if (dmFile.exists()) {
dmStream = new RandomAccessFile(dmFile, "rw");
dmFd = dmStream.getFD();
}
String dcfPath = OmaDrmUtils.generateDcfFilePath(path);
Log.v(TAG, "installDrmMsg :dcfPathL: " + dcfPath);
if (dcfPath == null) {
Log.e(TAG, "installDrmMsg : dcfPath is " + dcfPath);
if (dmStream != null) {
try {
dmStream.close();
} catch (IOException e) {
Log.w(TAG, "close dm stream: I/O Exception: " + e.getMessage());
}
}
return DrmManagerClient.ERROR_UNKNOWN;
}
File dcfFile = new File(dcfPath);
if (!dcfFile.exists()) {
dcfFile.createNewFile();
}
if (dmFile.exists()) {
dcfStream = new FileOutputStream(dcfFile);
dcfFd = dcfStream.getFD();
}
// constructs the request and process it by acquireDrmInfo
DrmInfoRequest request = new DrmInfoRequest(OmaDrmStore.DrmRequestType.TYPE_SET_DRM_INFO,
OmaDrmStore.DrmObjectMime.MIME_DRM_MESSAGE);
request.put(OmaDrmStore.DrmRequestKey.KEY_ACTION, OmaDrmStore.DrmRequestAction.ACTION_INSTALL_DRM_MSG_BY_FD);
request.put(OmaDrmStore.DrmRequestKey.KEY_DM_FD, dmFd); // dm
// file
// descriptor
request.put(OmaDrmStore.DrmRequestKey.KEY_DCF_FD, dcfFd);
Log.d(TAG, "installDrmMsg FD:" + dmFd + "," + dcfFd);
info = mDrmManagerClient.acquireDrmInfo(request);
// delete file 爲什麼要這麼做,新建一個臨時文件然後又刪掉
if (dmFile.exists()) {
dmFile.delete();
}
if (dcfFile.exists()) {
dcfFile.renameTo(new File(path));
}
} catch (IOException ioe) {
// / M: Added for debug.
Log.d(TAG, "getOriginalMimeType: File I/O exception: " + ioe.getMessage());
} finally {
if (dmStream != null) {
try {
dmStream.close();
} catch (IOException e) {
Log.w(TAG, "close dm stream: I/O Exception: " + e.getMessage());
}
}
if (dcfStream != null) {
try {
dcfStream.close();
} catch (IOException e) {
Log.w(TAG, "close dcf stream: I/O Exception: " + e.getMessage());
}
}
}
// get message from returned DrmInfo
byte[] data = null;
if (info != null) {
data = info.getData();
}
String message = "";
if (null != data) {
try {
// the information shall be in format of ASCII string
message = new String(data, "US-ASCII");
} catch (UnsupportedEncodingException e) {
Log.e(TAG, "Unsupported encoding type of the returned DrmInfo data");
message = "";
}
}
Log.v(TAG, "installDrmMsg FD path: >" + message);
return OmaDrmStore.DrmRequestResult.RESULT_SUCCESS.equals(message) ?
DrmManagerClient.ERROR_NONE : DrmManagerClient.ERROR_UNKNOWN;
}
private class DownloadInfoDelta { //其成員
public String mUri;
public String mFileName;
public String mMimeType;
public int mStatus;
public int mNumFailed;
public int mRetryAfter;
public long mTotalBytes;
public long mCurrentBytes;
public String mETag;
public String mErrorMsg;
// M: Add to support OMA download
public int mOmaDownload;
public int mOmaDownloadStatus;
public String mOmaDownloadInsNotifyUrl;
public String mNotifyPkg;//add by hucheng for D345010 20150616
}
Download下載DRM
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.