19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <parser_rel.h> 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <parser_dm.h> 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <xml_tinyParser.h> 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <wbxml_tinyparser.h> 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <drm_decoder.h> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <svc_drm.h> 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* See parser_rel.h */ 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint32_t drm_monthDays(int32_t year, int32_t month) 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (month) { 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 1: 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 3: 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 5: 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 7: 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 8: 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 10: 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 12: 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 31; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 4: 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 6: 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 9: 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 11: 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 30; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 2: 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 29; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 28; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint32_t drm_checkDate(int32_t year, int32_t month, int32_t day, 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t hour, int32_t min, int32_t sec) 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (month >= 1 && month <= 12 && 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project day >= 1 && day <= drm_monthDays(year, month) && 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hour >= 0 && hour <= 23 && 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project min >= 0 && min <= 59 && sec >= 0 && sec <= 59) 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int32_t drm_getStartEndTime(uint8_t * pValue, int32_t valueLen, 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project T_DRM_DATETIME * dateTime) 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t year, mon, day, hour, min, sec; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t pTmp[64] = {0}; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project strncpy((char *)pTmp, (char *)pValue, valueLen); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t * pHead = pTmp; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t * pEnd = NULL; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t tmpByte; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** get year */ 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pEnd = (uint8_t *)strstr((char *)pHead, "-"); 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(NULL == pEnd) 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tmpByte = *pEnd; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *pEnd = '\0'; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project year = atoi((char *)pHead); 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pHead = pEnd + 1; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *pEnd = tmpByte; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** get month */ 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pEnd = (uint8_t *)strstr((char *)pHead, "-"); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(NULL == pEnd) 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tmpByte = *pEnd; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *pEnd = '\0'; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mon = atoi((char *)pHead); 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pHead = pEnd + 1; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *pEnd = tmpByte; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** get day */ 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pEnd = (uint8_t *)strstr((char *)pHead, "T"); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(NULL == pEnd) 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tmpByte = *pEnd; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *pEnd = '\0'; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project day = atoi((char *)pHead); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pHead = pEnd + 1; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *pEnd = tmpByte; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** get hour */ 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pEnd = (uint8_t *)strstr((char *)pHead, ":"); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(NULL == pEnd) 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tmpByte = *pEnd; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *pEnd = '\0'; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hour = atoi((char *)pHead); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pHead = pEnd + 1; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *pEnd = tmpByte; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** get minute */ 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pEnd = (uint8_t *)strstr((char *)pHead, ":"); 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(NULL == pEnd) 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tmpByte = *pEnd; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *pEnd = '\0'; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project min = atoi((char *)pHead); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pHead = pEnd + 1; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *pEnd = tmpByte; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** get second */ 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sec = atoi((char *)pHead); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (0 != drm_checkDate(year, mon, day, hour, min, sec)) 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project YMD_HMS_2_INT(year, mon, day, dateTime->date, hour, min, sec, 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dateTime->time); 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return TRUE; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int32_t drm_checkWhetherHasUnknowConstraint(uint8_t* drm_constrain) 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char* begin_constrain = "<o-ex:constraint>"; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char* end_constrain = "</o-ex:constraint>"; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char* constrain_begin = strstr((char*)drm_constrain,begin_constrain); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char* constrain_end = strstr((char*)drm_constrain,end_constrain); 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t constrain_len = 0; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(NULL == constrain_begin) 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(NULL == constrain_end) 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return TRUE; 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* compute valid characters length */ 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t constrain_begin_len = strlen(begin_constrain); 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char* cur_pos = constrain_begin + constrain_begin_len; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project constrain_len = (constrain_end - constrain_begin) - constrain_begin_len; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while(cur_pos < constrain_end){ 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(isspace(*cur_pos)) 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project constrain_len--; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cur_pos++; 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* check all constraints */ 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project #define DRM_ALL_CONSTRAINT_COUNT 5 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t i = 0; 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t has_datetime = FALSE; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t has_start_or_end = FALSE; 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char* all_vaild_constraints[DRM_ALL_CONSTRAINT_COUNT][2] = { 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"<o-dd:count>","</o-dd:count>"}, 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"<o-dd:interval>","</o-dd:interval>"}, 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"<o-dd:datetime>","</o-dd:datetime>"}, 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"<o-dd:start>","</o-dd:start>"}, 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"<o-dd:end>","</o-dd:end>"} 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for(i = 0; i < DRM_ALL_CONSTRAINT_COUNT; i++){ 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char*start = strstr((char*)drm_constrain,all_vaild_constraints[i][0]); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(start && (start < constrain_end)){ 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char* end = strstr((char*)drm_constrain,all_vaild_constraints[i][1]); 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(end && (end < constrain_end)){ 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(0 == strncmp(all_vaild_constraints[i][0],"<o-dd:datetime>",strlen("<o-dd:datetime>"))){ 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project constrain_len -= strlen(all_vaild_constraints[i][0]); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project constrain_len -= strlen(all_vaild_constraints[i][1]); 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(0 == constrain_len) 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return TRUE; 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project has_datetime = TRUE; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if((0 == strncmp(all_vaild_constraints[i][0],"<o-dd:start>",strlen("<o-dd:start>"))) 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (0 == strncmp(all_vaild_constraints[i][0],"<o-dd:end>",strlen("<o-dd:end>")))){ 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(FALSE == has_datetime) 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return TRUE; 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project has_start_or_end = TRUE; 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project constrain_len -= (end - start); 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project constrain_len -= strlen(all_vaild_constraints[i][1]); 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(0 == constrain_len) 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(has_datetime != has_start_or_end) 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return TRUE; 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return TRUE; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(has_datetime != has_start_or_end) 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return TRUE; 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(constrain_len) 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return TRUE; 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int32_t drm_getRightValue(uint8_t * buffer, int32_t bufferLen, 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project T_DRM_Rights * ro, uint8_t * operation, 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t oper_char) 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t *pBuf, *pValue; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t sProperty[256]; 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t valueLen; 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t year, mon, day, hour, min, sec; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project T_DRM_Rights_Constraint *pConstraint; 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t *bIsAble; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t *ret = NULL; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t flag = 0; 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (operation == NULL) { 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (oper_char) { 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case REL_TAG_PLAY: 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pConstraint = &(ro->PlayConstraint); 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bIsAble = &(ro->bIsPlayable); 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case REL_TAG_DISPLAY: 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pConstraint = &(ro->DisplayConstraint); 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bIsAble = &(ro->bIsDisplayable); 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case REL_TAG_EXECUTE: 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pConstraint = &(ro->ExecuteConstraint); 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bIsAble = &(ro->bIsExecuteable); 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case REL_TAG_PRINT: 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pConstraint = &(ro->PrintConstraint); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bIsAble = &(ro->bIsPrintable); 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; /* The input parm is err */ 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp((char *)operation, "play") == 0) { 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pConstraint = &(ro->PlayConstraint); 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bIsAble = &(ro->bIsPlayable); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp((char *)operation, "display") == 0) { 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pConstraint = &(ro->DisplayConstraint); 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bIsAble = &(ro->bIsDisplayable); 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp((char *)operation, "execute") == 0) { 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pConstraint = &(ro->ExecuteConstraint); 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bIsAble = &(ro->bIsExecuteable); 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp((char *)operation, "print") == 0) { 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pConstraint = &(ro->PrintConstraint); 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bIsAble = &(ro->bIsPrintable); 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; /* The input parm is err */ 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (operation == NULL) { 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sprintf((char *)sProperty, "%c%c%c%c", REL_TAG_RIGHTS, 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REL_TAG_AGREEMENT, REL_TAG_PERMISSION, oper_char); 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ret = WBXML_DOM_getNode(buffer, bufferLen, sProperty); 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sprintf((char *)sProperty, 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "o-ex:rights\\o-ex:agreement\\o-ex:permission\\o-dd:%s", 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project operation); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ret = XML_DOM_getNode(buffer, sProperty); 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_VALIDITY(ret); 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == ret) 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return TRUE; 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WRITE_RO_FLAG(*bIsAble, 1, pConstraint->Indicator, DRM_NO_CONSTRAINT); /* If exit first assume have utter rights */ 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flag = 1; 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (operation == NULL) { /* If father element node is not exit then return */ 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sprintf((char *)sProperty, "%c%c%c%c%c", REL_TAG_RIGHTS, 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REL_TAG_AGREEMENT, REL_TAG_PERMISSION, oper_char, 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REL_TAG_CONSTRAINT); 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ret = WBXML_DOM_getNode(buffer, bufferLen, sProperty); 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sprintf((char *)sProperty, 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "o-ex:rights\\o-ex:agreement\\o-ex:permission\\o-dd:%s\\o-ex:constraint", 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project operation); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ret = XML_DOM_getNode(buffer, sProperty); 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_VALIDITY(ret); 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ret == NULL) 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return TRUE; 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(TRUE == drm_checkWhetherHasUnknowConstraint(ret)) 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *bIsAble = 0; 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pConstraint->Indicator = DRM_NO_PERMISSION; /* If exit constraint assume have no rights */ 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flag = 2; 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (operation == NULL) { 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sprintf((char *)sProperty, "%c%c%c%c%c%c", REL_TAG_RIGHTS, 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REL_TAG_AGREEMENT, REL_TAG_PERMISSION, oper_char, 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REL_TAG_CONSTRAINT, REL_TAG_INTERVAL); 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pBuf = 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WBXML_DOM_getNodeValue(buffer, bufferLen, sProperty, (uint8_t **)&pValue, 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &valueLen); 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sprintf((char *)sProperty, 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "o-ex:rights\\o-ex:agreement\\o-ex:permission\\o-dd:%s\\o-ex:constraint\\o-dd:interval", 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project operation); 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pBuf = XML_DOM_getNodeValue(buffer, sProperty, &pValue, &valueLen); 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_VALIDITY(pBuf); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pBuf) { /* If interval element exit then get the value */ 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t pTmp[64] = {0}; 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project strncpy((char *)pTmp, (char *)pValue, valueLen); 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t * pHead = pTmp + 1; 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t * pEnd = NULL; 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t tmpChar; 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** get year */ 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pEnd = (uint8_t *)strstr((char *)pHead, "Y"); 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(NULL == pEnd) 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tmpChar = *pEnd; 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *pEnd = '\0'; 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project year = atoi((char *)pHead); 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pHead = pEnd + 1; 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *pEnd = tmpChar; 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** get month */ 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pEnd = (uint8_t *)strstr((char *)pHead, "M"); 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(NULL == pEnd) 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tmpChar = *pEnd; 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *pEnd = '\0'; 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mon = atoi((char *)pHead); 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pHead = pEnd + 1; 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *pEnd = tmpChar; 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** get day */ 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pEnd = (uint8_t *)strstr((char *)pHead, "D"); 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(NULL == pEnd) 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tmpChar = *pEnd; 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *pEnd = '\0'; 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project day = atoi((char *)pHead); 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pHead = pEnd + 2; 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *pEnd = tmpChar; 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** get hour */ 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pEnd = (uint8_t *)strstr((char *)pHead, "H"); 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(NULL == pEnd) 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tmpChar = *pEnd; 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *pEnd = '\0'; 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hour = atoi((char *)pHead); 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pHead = pEnd + 1; 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *pEnd = tmpChar; 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** get minute */ 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pEnd = (uint8_t *)strstr((char *)pHead, "M"); 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(NULL == pEnd) 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tmpChar = *pEnd; 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *pEnd = '\0'; 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project min = atoi((char *)pHead); 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pHead = pEnd + 1; 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *pEnd = tmpChar; 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** get second */ 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pEnd = (uint8_t *)strstr((char *)pHead, "S"); 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(NULL == pEnd) 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tmpChar = *pEnd; 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *pEnd = '\0'; 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sec = atoi((char *)pHead); 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pHead = pEnd + 1; 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *pEnd = tmpChar; 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (year < 0 || mon < 0 || day < 0 || hour < 0 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || min < 0 || sec < 0) 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project YMD_HMS_2_INT(year, mon, day, pConstraint->Interval.date, hour, 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project min, sec, pConstraint->Interval.time); 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WRITE_RO_FLAG(*bIsAble, 1, pConstraint->Indicator, 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DRM_INTERVAL_CONSTRAINT); 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flag = 3; 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (operation == NULL) { 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sprintf((char *)sProperty, "%c%c%c%c%c%c", REL_TAG_RIGHTS, 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REL_TAG_AGREEMENT, REL_TAG_PERMISSION, oper_char, 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REL_TAG_CONSTRAINT, REL_TAG_COUNT); 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pBuf = 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WBXML_DOM_getNodeValue(buffer, bufferLen, sProperty, (uint8_t **)&pValue, 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &valueLen); 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sprintf((char *)sProperty, 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "o-ex:rights\\o-ex:agreement\\o-ex:permission\\o-dd:%s\\o-ex:constraint\\o-dd:count", 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project operation); 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pBuf = XML_DOM_getNodeValue(buffer, sProperty, &pValue, &valueLen); 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_VALIDITY(pBuf); 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pBuf) { /* If count element exit the get the value */ 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t pTmp[16] = {0}; 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t i; 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i = 0; i < valueLen; i++) { /* Check the count format */ 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (0 == isdigit(*(pValue + i))) 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project strncpy((char *)pTmp, (char *)pValue, valueLen); 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pConstraint->Count = atoi((char *)pTmp); 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(0 == pConstraint->Count) 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WRITE_RO_FLAG(*bIsAble, 0, pConstraint->Indicator, DRM_NO_PERMISSION); 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if( pConstraint->Count > 0) 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WRITE_RO_FLAG(*bIsAble, 1, pConstraint->Indicator, DRM_COUNT_CONSTRAINT); 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else /* < 0 */ 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flag = 3; 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (operation == NULL) { 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sprintf((char *)sProperty, "%c%c%c%c%c%c%c", REL_TAG_RIGHTS, 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REL_TAG_AGREEMENT, REL_TAG_PERMISSION, oper_char, 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REL_TAG_CONSTRAINT, REL_TAG_DATETIME, REL_TAG_START); 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pBuf = 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WBXML_DOM_getNodeValue(buffer, bufferLen, sProperty, (uint8_t **)&pValue, 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &valueLen); 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sprintf((char *)sProperty, 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "o-ex:rights\\o-ex:agreement\\o-ex:permission\\o-dd:%s\\o-ex:constraint\\o-dd:datetime\\o-dd:start", 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project operation); 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pBuf = XML_DOM_getNodeValue(buffer, sProperty, &pValue, &valueLen); 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_VALIDITY(pBuf); 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pBuf) { /* If start element exit then get the value */ 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (FALSE == 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drm_getStartEndTime(pValue, valueLen, &pConstraint->StartTime)) 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WRITE_RO_FLAG(*bIsAble, 1, pConstraint->Indicator, DRM_START_TIME_CONSTRAINT); 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flag = 3; 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (operation == NULL) { 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sprintf((char *)sProperty, "%c%c%c%c%c%c%c", REL_TAG_RIGHTS, 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REL_TAG_AGREEMENT, REL_TAG_PERMISSION, oper_char, 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REL_TAG_CONSTRAINT, REL_TAG_DATETIME, REL_TAG_END); 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pBuf = 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WBXML_DOM_getNodeValue(buffer, bufferLen, sProperty, (uint8_t **)&pValue, 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &valueLen); 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sprintf((char *)sProperty, 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "o-ex:rights\\o-ex:agreement\\o-ex:permission\\o-dd:%s\\o-ex:constraint\\o-dd:datetime\\o-dd:end", 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project operation); 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pBuf = XML_DOM_getNodeValue(buffer, sProperty, &pValue, &valueLen); 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_VALIDITY(pBuf); 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pBuf) { 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (FALSE == 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drm_getStartEndTime(pValue, valueLen, &pConstraint->EndTime)) 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WRITE_RO_FLAG(*bIsAble, 1, pConstraint->Indicator, DRM_END_TIME_CONSTRAINT); 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flag = 3; 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (2 == flag) 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WRITE_RO_FLAG(*bIsAble, 1, pConstraint->Indicator, DRM_NO_CONSTRAINT); /* If exit first assume have utter rights */ 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return TRUE; 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* See parser_rel.h */ 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint32_t drm_relParser(uint8_t* buffer, int32_t bufferLen, int32_t Format, T_DRM_Rights* pRights) 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t *pBuf, *pValue; 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t sProperty[256]; 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t valueLen; 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (TYPE_DRM_RIGHTS_WBXML != Format && TYPE_DRM_RIGHTS_XML != Format) /* It is not the support parse format */ 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (TYPE_DRM_RIGHTS_XML == Format) { 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Check whether it is a CD, and parse it using TYPE_DRM_RIGHTS_XML */ 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL != drm_strnstr(buffer, (uint8_t *)HEADERS_CONTENT_ID, bufferLen)) 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pBuf = 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_DOM_getNodeValue(buffer, 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (uint8_t *)"o-ex:rights\\o-ex:context\\o-dd:version", 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &pValue, &valueLen); 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_VALIDITY(pBuf); 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pBuf) { 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (valueLen > 8) /* Check version lenth */ 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* error version */ 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(strncmp(pValue,"1.0",valueLen)) 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project strncpy((char *)pRights->Version, (char *)pValue, valueLen); 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* this means there is more than one version label in rights */ 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(strstr((char*)pBuf, "<o-dd:version>")) 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pBuf = 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_DOM_getNodeValue(buffer, 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (uint8_t *)"o-ex:rights\\o-ex:agreement\\o-ex:asset\\ds:KeyInfo\\ds:KeyValue", 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &pValue, &valueLen); 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_VALIDITY(pBuf); 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pBuf) { /* Get keyvalue */ 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t keyLen; 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (24 != valueLen) 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project keyLen = drm_decodeBase64(NULL, 0, pValue, &valueLen); 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (keyLen < 0) 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DRM_KEY_LEN != drm_decodeBase64(pRights->KeyValue, keyLen, pValue, &valueLen)) 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pBuf = 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_DOM_getNodeValue(buffer, 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (uint8_t *)"o-ex:rights\\o-ex:agreement\\o-ex:asset\\o-ex:context\\o-dd:uid", 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &pValue, &valueLen); 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_VALIDITY(pBuf); 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pBuf) { 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (valueLen > DRM_UID_LEN) 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project strncpy((char *)pRights->uid, (char *)pValue, valueLen); 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pRights->uid[valueLen] = '\0'; 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* this means there is more than one uid label in rights */ 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(strstr((char*)pBuf, "<o-dd:uid>")) 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (FALSE == 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drm_getRightValue(buffer, bufferLen, pRights, (uint8_t *)"play", 0)) 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (FALSE == 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drm_getRightValue(buffer, bufferLen, pRights, (uint8_t *)"display", 0)) 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (FALSE == 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drm_getRightValue(buffer, bufferLen, pRights, (uint8_t *)"execute", 0)) 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (FALSE == 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drm_getRightValue(buffer, bufferLen, pRights, (uint8_t *)"print", 0)) 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (TYPE_DRM_RIGHTS_WBXML == Format) { 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!REL_CHECK_WBXML_HEADER(buffer)) 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sprintf((char *)sProperty, "%c%c%c", REL_TAG_RIGHTS, REL_TAG_CONTEXT, 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REL_TAG_VERSION); 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pBuf = 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WBXML_DOM_getNodeValue(buffer, bufferLen, sProperty, (uint8_t **)&pValue, 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &valueLen); 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_VALIDITY(pBuf); 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pBuf) { 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (valueLen > 8) /* Check version lenth */ 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project strncpy((char *)pRights->Version, (char *)pValue, valueLen); 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sprintf((char *)sProperty, "%c%c%c%c%c", 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REL_TAG_RIGHTS, REL_TAG_AGREEMENT, REL_TAG_ASSET, 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REL_TAG_KEYINFO, REL_TAG_KEYVALUE); 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pBuf = 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WBXML_DOM_getNodeValue(buffer, bufferLen, sProperty, (uint8_t **)&pValue, 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &valueLen); 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_VALIDITY(pBuf); 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pBuf) { 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DRM_KEY_LEN != valueLen) 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memcpy(pRights->KeyValue, pValue, DRM_KEY_LEN); 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memset(pValue, 0, DRM_KEY_LEN); /* Clean the KeyValue */ 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sprintf((char *)sProperty, "%c%c%c%c%c", 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REL_TAG_RIGHTS, REL_TAG_AGREEMENT, REL_TAG_ASSET, 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REL_TAG_CONTEXT, REL_TAG_UID); 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pBuf = 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WBXML_DOM_getNodeValue(buffer, bufferLen, sProperty, (uint8_t **)&pValue, 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &valueLen); 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_VALIDITY(pBuf); 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pBuf) { 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (valueLen > DRM_UID_LEN) 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project strncpy((char *)pRights->uid, (char *)pValue, valueLen); 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pRights->uid[valueLen] = '\0'; 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (FALSE == 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drm_getRightValue(buffer, bufferLen, pRights, NULL, 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REL_TAG_PLAY)) 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (FALSE == 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drm_getRightValue(buffer, bufferLen, pRights, NULL, 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REL_TAG_DISPLAY)) 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (FALSE == 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drm_getRightValue(buffer, bufferLen, pRights, NULL, 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REL_TAG_EXECUTE)) 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (FALSE == 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drm_getRightValue(buffer, bufferLen, pRights, NULL, 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REL_TAG_PRINT)) 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FALSE; 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return TRUE; 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 664