Changeset 5354 for trunk/reader-videoguard-common.c
- Timestamp:
- 06/05/11 15:02:31 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/reader-videoguard-common.c
r5309 r5354 10 10 #define VG_EMMTYPE_U 1 11 11 #define VG_EMMTYPE_S 2 12 13 typedef struct mailmsg_s 14 { 15 uint16_t caid; 16 uint32_t serial; 17 uint16_t date; 18 uint16_t id; 19 uint8_t nsubs; 20 uint16_t len; 21 uint8_t mask; 22 uint8_t written; 23 char *message; 24 char *subject; 25 } MAILMSG; 26 27 LLIST *vg_msgs = 0; 12 28 13 29 void set_known_card_info(struct s_reader * reader, const unsigned char * atr, const uint32_t *atr_size) … … 847 863 if (ep->emm[offs] == 0x02 || ep->emm[offs] == 0x03 || ep->emm[offs] == 0x07) 848 864 { 865 if (ep->emm[offs] == 0x03 && (position == ua_position || vdrsc_fix)) 866 { 867 videoguard_mail_msg(reader, &ep->emm[offs+2]); 868 return OK; 869 } 849 870 offs += ep->emm[offs+1] + 2; 850 871 if (!(offs < ep->l)) … … 923 944 } 924 945 946 static MAILMSG *find_msg(uint16_t caid, uint32_t serial, uint16_t date, uint16_t msg_id) 947 { 948 MAILMSG *msg; 949 LL_ITER it = ll_iter_create(vg_msgs); 950 while ((msg = (MAILMSG *)ll_iter_next(&it))) 951 { 952 if (msg->caid == caid && msg->serial == serial && msg->date == date && msg->id == msg_id) 953 return msg; 954 } 955 return 0; 956 } 957 958 static void write_msg(MAILMSG *msg, uint32_t baseyear) 959 { 960 FILE *fp = fopen(cfg.mailfile, "a"); 961 if (fp == 0) 962 { 963 cs_log("Cannot open mailfile %s", cfg.mailfile); 964 return; 965 } 966 967 uint16_t i; 968 for (i = 0; i < msg->len - 1; ++i) 969 { 970 if (msg->message[i] == 0x00 && msg->message[i+1] == 0x32) 971 { 972 msg->subject = &msg->message[i+3]; 973 break; 974 } 975 } 976 int year = (msg->date >> 8) / 12 + baseyear; 977 int mon = (msg->date >> 8) % 12 + 1; 978 int day = msg->date & 0x1f; 979 980 fprintf(fp, "%04X:%08X:%02d/%02d/%04d:%04X:\"%s\":\"%s\"\n", msg->caid, msg->serial, day, mon, year, 981 msg->id, msg->subject, msg->message); 982 fclose(fp); 983 free(msg->message); 984 msg->message = msg->subject = 0; 985 msg->written = 1; 986 } 987 988 static void msgs_init(uint32_t baseyear) 989 { 990 vg_msgs = ll_create(); 991 FILE *fp = fopen(cfg.mailfile, "r"); 992 if (fp == 0) 993 return; 994 int year, mon, day; 995 char buffer[2048]; 996 while (fgets(buffer, sizeof(buffer), fp)) 997 { 998 MAILMSG *msg; 999 if (cs_malloc(&msg, sizeof(MAILMSG), -1) == 0) 1000 { 1001 fclose(fp); 1002 return; 1003 } 1004 sscanf(buffer, "%04hX:%08X:%02d/%02d/%04d:%04hX", &msg->caid, &msg->serial, &day, &mon, &year, &msg->id); 1005 year -= baseyear; 1006 msg->date = ((year * 12) + mon - 1) << 8 | day; 1007 msg->message = msg->subject = 0; 1008 msg->written = 1; 1009 ll_append(vg_msgs, msg); 1010 } 1011 fclose(fp); 1012 } 1013 1014 void videoguard_mail_msg(struct s_reader *rdr, uint8_t *data) 1015 { 1016 if (cfg.disablemail) 1017 return; 1018 1019 if (vg_msgs == 0) 1020 msgs_init(rdr->card_baseyear); 1021 1022 if (data[0] != 0xFF || data[1] != 0xFF) 1023 return; 1024 1025 uint16_t msg_id = (data[2] << 8) | data[3]; 1026 uint8_t index = data[4] & 0x0F; 1027 int msg_size = data[5] * 10 + 2; 1028 uint16_t date = (data[9] << 8) | data[10]; 1029 int submsg_len = data[12] - 2; 1030 uint16_t submsg_idx = (data[13] << 8) | data[14]; 1031 uint32_t serial = (rdr->hexserial[2]<<24) | (rdr->hexserial[3]<<16) | (rdr->hexserial[4]<<8) | rdr->hexserial[5]; 1032 1033 MAILMSG *msg = find_msg(rdr->caid, serial, date, msg_id); 1034 1035 if (msg == 0) 1036 { 1037 if (cs_malloc(&msg, sizeof(MAILMSG), -1) == 0) 1038 return; 1039 msg->caid = rdr->caid; 1040 msg->serial = serial; 1041 msg->date = date; 1042 msg->id = msg_id; 1043 msg->nsubs = (data[4] & 0xF0) >> 4; 1044 msg->mask = 1 << index; 1045 msg->written = 0; 1046 msg->len = submsg_len; 1047 if (cs_malloc(&msg->message, msg_size, -1) == 0) 1048 { 1049 free(msg); 1050 return; 1051 } 1052 memset(msg->message, 0, msg_size); 1053 memcpy(&msg->message[submsg_idx], &data[15], submsg_len); 1054 msg->subject = 0; 1055 ll_append(vg_msgs, msg); 1056 } 1057 else 1058 { 1059 if (msg->written == 1 || msg->mask & (1 << index)) 1060 return; 1061 msg->mask |= 1 << index; 1062 msg->len += submsg_len; 1063 memcpy(&msg->message[submsg_idx], &data[15], submsg_len); 1064 } 1065 if (msg->mask == (1 << msg->nsubs) - 1) 1066 write_msg(msg, rdr->card_baseyear); 1067 } 1068
Note:
See TracChangeset
for help on using the changeset viewer.