libicdlc
library for IC driving license card

libicdlc/icdl.hpp

説明を見る。
00001 
00099 #include "icdlcard.h"
00100 #include "scard.hpp"
00101 
00102 #if defined(_MSC_VER) && 1000 < _MSC_VER
00103 #pragma once
00104 #endif
00105 
00106 #ifndef ICDL_9209B7DD_A3F9_4F87_A420_F87EF1E179FD_INCLUDE_GUARD
00107 #define ICDL_9209B7DD_A3F9_4F87_A420_F87EF1E179FD_INCLUDE_GUARD
00108 
00113 class icdl
00114 {
00115         static const uint32_t ID_MF  = 0x00FF0000;
00116         static const uint32_t ID_DF1 = 0x00010000;
00117         static const uint32_t ID_DF2 = 0x00020000;
00118         static const uint32_t ID_DF3 = 0x00030000;
00119 
00120         scard           m_scard;
00121         bool            m_sending;
00122         uint8_t         m_result[2048];
00123         size_t          m_result_length;
00124 
00125 
00126         class scard_cb_type {
00127                 icdl & inst;
00128                 scard_cb_type & operator =(const scard_cb_type &);
00129         public:
00130                 scard_cb_type(icdl & inst_);
00131                 void operator()(const uint8_t* data, size_t length);
00132         };
00133 
00134 #pragma pack(push, 1)
00135         struct {
00136                 uint32_t        length;
00137                 uint8_t *       data;
00138         } m_data[0xFFFF];
00139 #pragma pack(pop)
00140 
00141         uint32_t        m_selected_file;
00142 
00143         bool            m_pin_valid;
00144         bool            m_prefetched;
00145 
00146         char*           m_code_buff;
00147         size_t          m_code_len;
00148 
00149 private:
00150 
00151         void update(uint16_t tag, const uint8_t * data, size_t length);
00152         void read_file(uint32_t file_id, uint16_t elementary_file_id, void * buff, size_t * len);
00153 
00154 
00155         bool select_master_file();
00156 
00157         bool select_dedicated_file(const uint8_t * dedicated_file_id);
00158 
00159         bool select_elementary_file(uint16_t elementary_file_id);
00160 
00161         bool attestation(uint16_t elementary_file_id, uint16_t pin);
00162 
00163         int  get_allowed_match_count(uint16_t elementary_file_id);
00164 
00165         bool read(uint16_t offset, void * buff, size_t * len);
00166 
00167 
00168         void prefetch();
00169 
00170 
00171         const char * jis208_to_sjis(uint16_t tag, bool concat = false, size_t offset = 0, size_t length = ‾0);
00172 
00173         ICDL_DATE_TYPE castDate(uint16_t tag, size_t offset = 0);
00174 
00175         ICDL_EUDC_TYPE castEudc(uint16_t tag);
00176 
00177         uint32_t       castUint(uint16_t tag);
00178 
00179         uint64_t       castUint64(uint16_t tag);
00180 
00181 public:
00182 
00184         icdl();
00185 
00187         ‾icdl();
00188 
00195         bool connect(const char * reader_name);
00196 
00202         bool disconnect();
00203 
00211         bool pin_auth(uint16_t pin1, uint16_t pin2);
00212 
00218         int get_pin1_auth_rest();
00219 
00225         int get_pin2_auth_rest();
00226 
00232         bool connected() const;
00233 
00234 
00235         const char * get_name_raw()
00236                 { prefetch(); return (const char*)m_data[TAG_NAME].data; }
00237         const char * get_name()
00238                 { prefetch(); return jis208_to_sjis(TAG_NAME); }
00239 
00240 
00241         const char * get_phonetic_name_raw()
00242                 { prefetch(); return (const char*)m_data[TAG_PHONETIC_NAME].data; }
00243         const char * get_phonetic_name()
00244                 { prefetch(); return jis208_to_sjis(TAG_PHONETIC_NAME); }
00245 
00246 
00247         const char * get_alias_name_raw()
00248                 { prefetch(); return (const char*)m_data[TAG_ALIAS_NAME].data; }
00249         const char * get_alias_name()
00250                 { prefetch(); return jis208_to_sjis(TAG_ALIAS_NAME); }
00251 
00252 
00253         const char * get_unified_name_raw()
00254                 { prefetch(); return (const char*)m_data[TAG_UNIFIED_NAME].data; }
00255         const char * get_unified_name()
00256                 { prefetch(); return jis208_to_sjis(TAG_UNIFIED_NAME); }
00257 
00258 
00259         ICDL_DATE_TYPE get_birthday()
00260                 { prefetch(); return castDate(TAG_BIRTHDAY); }
00261 
00262 
00263         const char * get_domicile_raw()
00264                 { prefetch(); return (const char*)m_data[TAG_DOMICILE].data; }
00265         const char * get_domicile()
00266                 { prefetch(); return jis208_to_sjis(TAG_DOMICILE); }
00267 
00268 
00269         ICDL_DATE_TYPE get_issue_date()
00270                 { prefetch(); return castDate(TAG_ISSUE_DATE); }
00271 
00272 
00273         uint32_t get_reference_number()
00274                 { prefetch(); return castUint(TAG_REFERENCE_NUMBER); }
00275 
00276 
00277         const char * get_license_color_raw()
00278                 { prefetch(); return (const char*)m_data[TAG_LICENSE_COLOR].data; }
00279         const char * get_license_color()
00280                 { prefetch(); return jis208_to_sjis(TAG_LICENSE_COLOR); }
00281 
00282 
00283         ICDL_DATE_TYPE get_expiration_date()
00284                 { prefetch(); return castDate(TAG_EXPIRATION_DATE); }
00285 
00286 
00287         const char * get_license_requirement()
00288                 { prefetch(); return jis208_to_sjis(TAG_LICENSE_REQUIREMENT1),
00289                                      jis208_to_sjis(TAG_LICENSE_REQUIREMENT2, true),
00290                                      jis208_to_sjis(TAG_LICENSE_REQUIREMENT3, true),
00291                                      jis208_to_sjis(TAG_LICENSE_REQUIREMENT4, true); }
00292 
00293 
00294         const char * get_license_requirement1_raw()
00295                 { prefetch(); return (const char*)m_data[TAG_LICENSE_REQUIREMENT1].data; }
00296         const char * get_license_requirement1()
00297                 { prefetch(); return jis208_to_sjis(TAG_LICENSE_REQUIREMENT1); }
00298 
00299 
00300         const char * get_license_requirement2_raw()
00301                 { prefetch(); return (const char*)m_data[TAG_LICENSE_REQUIREMENT2].data; }
00302         const char * get_license_requirement2()
00303                 { prefetch(); return jis208_to_sjis(TAG_LICENSE_REQUIREMENT2); }
00304 
00305 
00306         const char * get_license_requirement3_raw()
00307                 { prefetch(); return (const char*)m_data[TAG_LICENSE_REQUIREMENT3].data; }
00308         const char * get_license_requirement3()
00309                 { prefetch(); return jis208_to_sjis(TAG_LICENSE_REQUIREMENT3); }
00310 
00311 
00312         const char * get_license_requirement4_raw()
00313                 { prefetch(); return (const char*)m_data[TAG_LICENSE_REQUIREMENT4].data; }
00314         const char * get_license_requirement4()
00315                 { prefetch(); return jis208_to_sjis(TAG_LICENSE_REQUIREMENT4); }
00316 
00317 
00318         const char * get_police_authority_name_raw()
00319                 { prefetch(); return (const char*)m_data[TAG_POLICE_AUTHORITY_NAME].data; }
00320         const char * get_police_authority_name()
00321                 { prefetch(); return jis208_to_sjis(TAG_POLICE_AUTHORITY_NAME); }
00322 
00323 
00324         uint64_t get_license_number()
00325                 { prefetch(); return castUint64(TAG_LICENSE_NUMBER); }
00326 
00327 
00328         ICDL_DATE_TYPE get_license_date_motorcycle_or_small_or_moped()
00329                 { prefetch(); return castDate(TAG_LICENSE_DATE_MOTORCYCLE_OR_SMALL_OR_MOPED); }
00330 
00331 
00332         ICDL_DATE_TYPE get_license_date_misc()
00333                 { prefetch(); return castDate(TAG_LICENSE_DATE_MISC); }
00334 
00335 
00336         ICDL_DATE_TYPE get_license_date_class_2()
00337                 { prefetch(); return castDate(TAG_LICENSE_DATE_CLASS_2); }
00338 
00339 
00340         ICDL_DATE_TYPE get_license_date_large_sized_motor_vehicle()
00341                 { prefetch(); return castDate(TAG_LICENSE_DATE_LARGE_SIZED_MOTOR_VEHICLE); }
00342 
00343 
00344         ICDL_DATE_TYPE get_license_date_motor_vehicle()
00345                 { prefetch(); return castDate(TAG_LICENSE_DATE_MOTOR_VEHICLE); }
00346 
00347 
00348         ICDL_DATE_TYPE get_license_date_large_sized_special_motor_vehicle()
00349                 { prefetch(); return castDate(TAG_LICENSE_DATE_LARGE_SIZED_SPECIAL_MOTOR_VEHICLE); }
00350 
00351 
00352         ICDL_DATE_TYPE get_license_date_large_sized_motorcycle()
00353                 { prefetch(); return castDate(TAG_LICENSE_DATE_LARGE_SIZED_MOTORCYCLE); }
00354 
00355 
00356         ICDL_DATE_TYPE get_license_date_motorcycle()
00357                 { prefetch(); return castDate(TAG_LICENSE_DATE_MOTORCYCLE); }
00358 
00359 
00360         ICDL_DATE_TYPE get_license_date_small_sized_special_motor_vehicle()
00361                 { prefetch(); return castDate(TAG_LICENSE_DATE_SMALL_SIZED_SPECIAL_MOTOR_VEHICLE); }
00362 
00363 
00364         ICDL_DATE_TYPE get_license_date_moped()
00365                 { prefetch(); return castDate(TAG_LICENSE_DATE_MOPED); }
00366 
00367 
00368         ICDL_DATE_TYPE get_license_date_towing()
00369                 { prefetch(); return castDate(TAG_LICENSE_DATE_TOWING); }
00370 
00371 
00372         ICDL_DATE_TYPE get_license_date_class_2_large_sized_motor_vehicle()
00373                 { prefetch(); return castDate(TAG_LICENSE_DATE_CLASS_2_LARGE_SIZED_MOTOR_VEHICLE); }
00374 
00375 
00376         ICDL_DATE_TYPE get_license_date_class_2_motor_vehicle()
00377                 { prefetch(); return castDate(TAG_LICENSE_DATE_CLASS_2_MOTOR_VEHICLE); }
00378 
00379 
00380         ICDL_DATE_TYPE get_license_date_class_2_large_sized_special_motor_vehicle()
00381                 { prefetch(); return castDate(TAG_LICENSE_DATE_CLASS_2_LARGE_SIZED_SPECIAL_MOTOR_VEHICLE); }
00382 
00383 
00384         ICDL_DATE_TYPE get_license_date_class_2_towing()
00385                 { prefetch(); return castDate(TAG_LICENSE_DATE_CLASS_2_TOWING); }
00386 
00387 
00388         ICDL_DATE_TYPE get_license_date_midsize_motor_vehicle()
00389                 { prefetch(); return castDate(TAG_LICENSE_DATE_MIDSIZE_MOTOR_VEHICLE); }
00390 
00391 
00392         ICDL_DATE_TYPE get_license_date_class_2_midsize_motor_vehicle()
00393                 { prefetch(); return castDate(TAG_LICENSE_DATE_CLASS_2_MIDSIZE_MOTOR_VEHICLE); }
00394 
00395 
00396         const char * get_registered_domicile_raw()
00397                 { prefetch(); return (const char*)m_data[TAG_REGISTERED_DOMICILE].data; }
00398         const char * get_registered_domicile()
00399                 { prefetch(); return jis208_to_sjis(TAG_REGISTERED_DOMICILE); }
00400 
00401 
00402         ICDL_EUDC_TYPE get_eudc(uint16_t index = 0);
00403 
00404         const unsigned char * get_photo()
00405                 { prefetch(); return m_data[TAG_PHOTO].data; }
00406         size_t get_photo_length()
00407                 { prefetch(); return m_data[TAG_PHOTO].length; }
00408 
00409 
00410         bool is_append_presents()
00411                 { prefetch(); return m_data[TAG_APPEND_STATUS].length &&
00412                                      APPEND_STATUS_MARKER == *m_data[TAG_APPEND_STATUS].data; }
00413 
00414 
00415         const char * get_append_domicile_police_authority_name_raw(uint16_t index = 0)
00416                 { prefetch(); if( verify_append_domicile_police_authority_name(index, 1 + 7) ) { return NULL; }
00417                               return (const char*)m_data[TAG_APPEND_DOMICILE_POLICE_AUTHORITY_NAME1 + index].data + 1 + 7; }
00418         const int get_append_domicile_police_authority_name_jisx(uint16_t index = 0)
00419                 { prefetch(); if( verify_append_domicile_police_authority_name(index, 0, 1) ) { return -1; }
00420                               return (*m_data[TAG_APPEND_DOMICILE_POLICE_AUTHORITY_NAME1 + index].data >> 4) * 10 + 
00421                                      (*m_data[TAG_APPEND_DOMICILE_POLICE_AUTHORITY_NAME1 + index].data & 15); }
00422         ICDL_DATE_TYPE get_append_domicile_police_authority_name_date(uint16_t index = 0)
00423                 { prefetch(); if( verify_append_domicile_police_authority_name(index, 1, 7) ) { return ICDL_DATE_TYPE(); }
00424                               return castDate(TAG_APPEND_DOMICILE_POLICE_AUTHORITY_NAME1 + index, 1); }
00425         const char * get_append_domicile_police_authority_name(uint16_t index = 0)
00426                 { prefetch(); if( verify_append_domicile_police_authority_name(index, 1 + 7) ) { return NULL; }
00427                               return jis208_to_sjis(TAG_APPEND_DOMICILE_POLICE_AUTHORITY_NAME1 + index, false, 1 + 7); }
00428 
00429 
00430         const char * get_append_new_name_raw(uint16_t index = 0)
00431                 { prefetch(); if( verify_append_new_name(index, 1 + 7) ) { return NULL; }
00432                               return (const char*)m_data[TAG_APPEND_NAME_AND_POLICE_AUTHORITY_NAME1 + index].data + 1 + 7; }
00433         const int get_append_new_name_jisx(uint16_t index = 0)
00434                 { prefetch(); if( verify_append_new_name(index, 0, 1) ) { return -1; }
00435                               return (*m_data[TAG_APPEND_NAME_AND_POLICE_AUTHORITY_NAME1 + index].data >> 4) * 10 + 
00436                                      (*m_data[TAG_APPEND_NAME_AND_POLICE_AUTHORITY_NAME1 + index].data & 15); }
00437         ICDL_DATE_TYPE get_append_new_name_date(uint16_t index = 0)
00438                 { prefetch(); if( verify_append_new_name(index, 1, 7) ) { return ICDL_DATE_TYPE(); }
00439                               return castDate(TAG_APPEND_NAME_AND_POLICE_AUTHORITY_NAME1 + index, 1); }
00440         const char * get_append_new_name(uint16_t index = 0)
00441                 { prefetch(); if( verify_append_new_name(index, 1 + 7, m_data[TAG_APPEND_NAME_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2-1-7) ) { return NULL; }
00442                               return jis208_to_sjis(TAG_APPEND_NAME_AND_POLICE_AUTHORITY_NAME1 + index, false, 1 + 7,
00443                                                     m_data[TAG_APPEND_NAME_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2-1-7); }
00444         const char * get_append_new_name_police_authority_name(uint16_t index = 0)
00445                 { prefetch(); if( verify_append_new_name(index, m_data[TAG_APPEND_NAME_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2) ) { return NULL; }
00446                               return jis208_to_sjis(TAG_APPEND_NAME_AND_POLICE_AUTHORITY_NAME1 + index, false,
00447                                                     m_data[TAG_APPEND_NAME_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2); }
00448 
00449 
00450         const char * get_append_new_phonetic_name_raw(uint16_t index = 0)
00451                 { prefetch(); if( verify_append_new_phonetic_name(index, 1 + 7) ) { return NULL; }
00452                               return (const char*)m_data[TAG_APPEND_PHONETIC_NAME_AND_POLICE_AUTHORITY_NAME1 + index].data + 1 + 7; }
00453         const int get_append_new_phonetic_name_jisx(uint16_t index = 0)
00454                 { prefetch(); if( verify_append_new_phonetic_name(index, 0, 1) ) { return -1; }
00455                               return (*m_data[TAG_APPEND_PHONETIC_NAME_AND_POLICE_AUTHORITY_NAME1 + index].data >> 4) * 10 + 
00456                                      (*m_data[TAG_APPEND_PHONETIC_NAME_AND_POLICE_AUTHORITY_NAME1 + index].data & 15); }
00457         ICDL_DATE_TYPE get_append_new_phonetic_name_date(uint16_t index = 0)
00458                 { prefetch(); if( verify_append_new_phonetic_name(index, 1, 7) ) { return ICDL_DATE_TYPE(); }
00459                               return castDate(TAG_APPEND_PHONETIC_NAME_AND_POLICE_AUTHORITY_NAME1 + index, 1); }
00460         const char * get_append_new_phonetic_name(uint16_t index = 0)
00461                 { prefetch(); if( verify_append_new_phonetic_name(index, 1 + 7, m_data[TAG_APPEND_PHONETIC_NAME_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2-1-7) ) { return NULL; }
00462                               return jis208_to_sjis(TAG_APPEND_PHONETIC_NAME_AND_POLICE_AUTHORITY_NAME1 + index, false, 1 + 7,
00463                                                     m_data[TAG_APPEND_PHONETIC_NAME_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2-1-7); }
00464         const char * get_append_new_phonetic_name_police_authority_name(uint16_t index = 0)
00465                 { prefetch(); if( verify_append_new_phonetic_name(index, m_data[TAG_APPEND_PHONETIC_NAME_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2) ) { return NULL; }
00466                               return jis208_to_sjis(TAG_APPEND_PHONETIC_NAME_AND_POLICE_AUTHORITY_NAME1 + index, false,
00467                                                     m_data[TAG_APPEND_PHONETIC_NAME_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2); }
00468 
00469 
00470         const char * get_append_new_domicile_raw(uint16_t index = 0)
00471                 { prefetch(); if( verify_append_new_domicile(index, 1 + 7) ) { return NULL; }
00472                               return (const char*)m_data[TAG_APPEND_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].data + 1 + 7; }
00473         const int get_append_new_domicile_jisx(uint16_t index = 0)
00474                 { prefetch(); if( verify_append_new_domicile(index, 0, 1) ) { return -1; }
00475                               return (*m_data[TAG_APPEND_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].data >> 4) * 10 + 
00476                                      (*m_data[TAG_APPEND_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].data & 15); }
00477         ICDL_DATE_TYPE get_append_new_domicile_date(uint16_t index = 0)
00478                 { prefetch(); if( verify_append_new_domicile(index, 1, 7) ) { return ICDL_DATE_TYPE(); }
00479                               return castDate(TAG_APPEND_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index, 1); }
00480         const char * get_append_new_domicile(uint16_t index = 0)
00481                 { prefetch(); if( verify_append_new_domicile(index, 1 + 7, m_data[TAG_APPEND_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2-1-7) ) { return NULL; }
00482                               return jis208_to_sjis(TAG_APPEND_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index, false, 1 + 7,
00483                                                     m_data[TAG_APPEND_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2-1-7); }
00484         const char * get_append_new_domicile_police_authority_name(uint16_t index = 0)
00485                 { prefetch(); if( verify_append_new_domicile(index, m_data[TAG_APPEND_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2) ) { return NULL; }
00486                               return jis208_to_sjis(TAG_APPEND_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index, false,
00487                                                     m_data[TAG_APPEND_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2); }
00488 
00489 
00490         const char * get_append_new_license_requirement_raw(uint16_t index = 0)
00491                 { prefetch(); if( verify_append_new_license_requirement(index, 1 + 7) ) { return NULL; }
00492                               return (const char*)m_data[TAG_APPEND_LICENSE_REQUIREMENT_AND_POLICE_AUTHORITY_NAME1 + index].data + 1 + 7; }
00493         const int get_append_new_license_requirement_jisx(uint16_t index = 0)
00494                 { prefetch(); if( verify_append_new_license_requirement(index, 0, 1) ) { return -1; }
00495                               return (*m_data[TAG_APPEND_LICENSE_REQUIREMENT_AND_POLICE_AUTHORITY_NAME1 + index].data >> 4) * 10 + 
00496                                      (*m_data[TAG_APPEND_LICENSE_REQUIREMENT_AND_POLICE_AUTHORITY_NAME1 + index].data & 15); }
00497         ICDL_DATE_TYPE get_append_new_license_requirement_date(uint16_t index = 0)
00498                 { prefetch(); if( verify_append_new_license_requirement(index, 1, 7) ) { return ICDL_DATE_TYPE(); }
00499                               return castDate(TAG_APPEND_LICENSE_REQUIREMENT_AND_POLICE_AUTHORITY_NAME1 + index, 1); }
00500         const char * get_append_new_license_requirement(uint16_t index = 0)
00501                 { prefetch(); if( verify_append_new_license_requirement(index, 1 + 7, m_data[TAG_APPEND_LICENSE_REQUIREMENT_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2-1-7) ) { return NULL; }
00502                               return jis208_to_sjis(TAG_APPEND_LICENSE_REQUIREMENT_AND_POLICE_AUTHORITY_NAME1 + index, false, 1 + 7,
00503                                                     m_data[TAG_APPEND_LICENSE_REQUIREMENT_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2-1-7); }
00504         const char * get_append_new_license_requirement_police_authority_name(uint16_t index = 0)
00505                 { prefetch(); if( verify_append_new_license_requirement(index, m_data[TAG_APPEND_LICENSE_REQUIREMENT_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2) ) { return NULL; }
00506                               return jis208_to_sjis(TAG_APPEND_LICENSE_REQUIREMENT_AND_POLICE_AUTHORITY_NAME1 + index, false,
00507                                                     m_data[TAG_APPEND_LICENSE_REQUIREMENT_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2); }
00508 
00509 
00510         const char * get_append_condition_release_raw(uint16_t index = 0)
00511                 { prefetch(); if( verify_append_condition_release(index, 1 + 7) ) { return NULL; }
00512                               return (const char*)m_data[TAG_APPEND_CONDITION_RELEASE_AND_POLICE_AUTHORITY_NAME1 + index].data + 1 + 7; }
00513         const int get_append_condition_release_jisx(uint16_t index = 0)
00514                 { prefetch(); if( verify_append_condition_release(index, 0, 1) ) { return -1; }
00515                               return (*m_data[TAG_APPEND_CONDITION_RELEASE_AND_POLICE_AUTHORITY_NAME1 + index].data >> 4) * 10 + 
00516                                      (*m_data[TAG_APPEND_CONDITION_RELEASE_AND_POLICE_AUTHORITY_NAME1 + index].data & 15); }
00517         ICDL_DATE_TYPE get_append_condition_release_date(uint16_t index = 0)
00518                 { prefetch(); if( verify_append_condition_release(index, 1, 7) ) { return ICDL_DATE_TYPE(); }
00519                               return castDate(TAG_APPEND_CONDITION_RELEASE_AND_POLICE_AUTHORITY_NAME1 + index, 1); }
00520         const char * get_append_condition_release(uint16_t index = 0)
00521                 { prefetch(); if( verify_append_condition_release(index, 1 + 7, m_data[TAG_APPEND_CONDITION_RELEASE_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2-1-7) ) { return NULL; }
00522                               return jis208_to_sjis(TAG_APPEND_CONDITION_RELEASE_AND_POLICE_AUTHORITY_NAME1 + index, false, 1 + 7,
00523                                                     m_data[TAG_APPEND_CONDITION_RELEASE_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2-1-7); }
00524         const char * get_append_condition_release_police_authority_name(uint16_t index = 0)
00525                 { prefetch(); if( verify_append_condition_release(index, m_data[TAG_APPEND_CONDITION_RELEASE_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2) ) { return NULL; }
00526                               return jis208_to_sjis(TAG_APPEND_CONDITION_RELEASE_AND_POLICE_AUTHORITY_NAME1 + index, false,
00527                                                     m_data[TAG_APPEND_CONDITION_RELEASE_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2); }
00528 
00529 
00530         const char * get_append_remark_raw(uint16_t index = 0)
00531                 { prefetch(); if( verify_append_remark(index, 1 + 7) ) { return NULL; }
00532                               return (const char*)m_data[TAG_APPEND_REMARK_AND_POLICE_AUTHORITY_NAME1 + index].data + 1 + 7; }
00533         const int get_append_remark_jisx(uint16_t index = 0)
00534                 { prefetch(); if( verify_append_remark(index, 0, 1) ) { return -1; }
00535                               return (*m_data[TAG_APPEND_REMARK_AND_POLICE_AUTHORITY_NAME1 + index].data >> 4) * 10 + 
00536                                      (*m_data[TAG_APPEND_REMARK_AND_POLICE_AUTHORITY_NAME1 + index].data & 15); }
00537         ICDL_DATE_TYPE get_append_remark_date(uint16_t index = 0)
00538                 { prefetch(); if( verify_append_remark(index, 1, 7) ) { return ICDL_DATE_TYPE(); }
00539                               return castDate(TAG_APPEND_REMARK_AND_POLICE_AUTHORITY_NAME1 + index, 1); }
00540         const char * get_append_remark(uint16_t index = 0)
00541                 { prefetch(); if( verify_append_remark(index, 1 + 7, m_data[TAG_APPEND_REMARK_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2-1-7) ) { return NULL; }
00542                               return jis208_to_sjis(TAG_APPEND_REMARK_AND_POLICE_AUTHORITY_NAME1 + index, false, 1 + 7,
00543                                                     m_data[TAG_APPEND_REMARK_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2-1-7); }
00544         const char * get_append_remark_police_authority_name(uint16_t index = 0)
00545                 { prefetch(); if( verify_append_remark(index, m_data[TAG_APPEND_REMARK_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2) ) { return NULL; }
00546                               return jis208_to_sjis(TAG_APPEND_REMARK_AND_POLICE_AUTHORITY_NAME1 + index, false,
00547                                                     m_data[TAG_APPEND_REMARK_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2); }
00548 
00549 
00550         const char * get_append_spare_raw(uint16_t index = 0)
00551                 { prefetch(); if( verify_append_spare(index, 1 + 7) ) { return NULL; }
00552                               return (const char*)m_data[TAG_APPEND_SPARE_AND_POLICE_AUTHORITY_NAME1 + index].data + 1 + 7; }
00553         const int get_append_spare_jisx(uint16_t index = 0)
00554                 { prefetch(); if( verify_append_spare(index, 0, 1) ) { return -1; }
00555                               return (*m_data[TAG_APPEND_SPARE_AND_POLICE_AUTHORITY_NAME1 + index].data >> 4) * 10 + 
00556                                      (*m_data[TAG_APPEND_SPARE_AND_POLICE_AUTHORITY_NAME1 + index].data & 15); }
00557         ICDL_DATE_TYPE get_append_spare_date(uint16_t index = 0)
00558                 { prefetch(); if( verify_append_spare(index, 1, 7) ) { return ICDL_DATE_TYPE(); }
00559                               return castDate(TAG_APPEND_SPARE_AND_POLICE_AUTHORITY_NAME1 + index, 1); }
00560         const char * get_append_spare(uint16_t index = 0)
00561                 { prefetch(); if( verify_append_spare(index, 1 + 7, m_data[TAG_APPEND_SPARE_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2-1-7) ) { return NULL; }
00562                               return jis208_to_sjis(TAG_APPEND_SPARE_AND_POLICE_AUTHORITY_NAME1 + index, false, 1 + 7,
00563                                                     m_data[TAG_APPEND_SPARE_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2-1-7); }
00564         const char * get_append_spare_police_authority_name(uint16_t index = 0)
00565                 { prefetch(); if( verify_append_spare(index, m_data[TAG_APPEND_SPARE_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2) ) { return NULL; }
00566                               return jis208_to_sjis(TAG_APPEND_SPARE_AND_POLICE_AUTHORITY_NAME1 + index, false,
00567                                                     m_data[TAG_APPEND_SPARE_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2); }
00568 
00569 
00570         bool is_append_registered_domicile_presents()
00571                 { prefetch(); return m_data[TAG_REGISTERED_DOMICILE_APPEND_STATUS].length &&
00572                                      APPEND_STATUS_MARKER == *m_data[TAG_REGISTERED_DOMICILE_APPEND_STATUS].data; }
00573 
00574 
00575         const char * get_append_registered_domicile_raw(uint16_t index = 0)
00576                 { prefetch(); if( verify_append_registered_domicile(index, 1 + 7) ) { return NULL; }
00577                               return (const char*)m_data[TAG_APPEND_REGISTERED_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].data + 1 + 7; }
00578         const int get_append_registered_domicile_jisx(uint16_t index = 0)
00579                 { prefetch(); if( verify_append_registered_domicile(index, 0, 1) ) { return -1; }
00580                               return (*m_data[TAG_APPEND_REGISTERED_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].data >> 4) * 10 + 
00581                                      (*m_data[TAG_APPEND_REGISTERED_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].data & 15); }
00582         ICDL_DATE_TYPE get_append_registered_domicile_date(uint16_t index = 0)
00583                 { prefetch(); if( verify_append_registered_domicile(index, 1, 7) ) { return ICDL_DATE_TYPE(); }
00584                               return castDate(TAG_APPEND_REGISTERED_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index, 1); }
00585         const char * get_append_registered_domicile(uint16_t index = 0)
00586                 { prefetch(); if( verify_append_registered_domicile(index, 1 + 7, m_data[TAG_APPEND_REGISTERED_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2-1-7) ) { return NULL; }
00587                               return jis208_to_sjis(TAG_APPEND_REGISTERED_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index, false, 1 + 7,
00588                                                     m_data[TAG_APPEND_REGISTERED_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2-1-7); }
00589         const char * get_append_registered_domicile_police_authority_name(uint16_t index = 0)
00590                 { prefetch(); if( verify_append_registered_domicile(index, m_data[TAG_APPEND_REGISTERED_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2) ) { return NULL; }
00591                               return jis208_to_sjis(TAG_APPEND_REGISTERED_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index, false,
00592                                                     m_data[TAG_APPEND_REGISTERED_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2); }
00593 
00594 
00595         const unsigned char * get_check_code()
00596                 { prefetch(); return m_data[TAG_CHECK_CODE].data; }
00597         size_t get_check_code_length()
00598                 { prefetch(); return m_data[TAG_CHECK_CODE].length; }
00599 
00600 
00601         const char * get_serial_number()
00602                 { prefetch(); return (const char*)m_data[TAG_SERIAL_NUMBER].data; }
00603 
00604 
00605         const char * get_publisher_name()
00606                 { prefetch(); return (const char*)m_data[TAG_PUBLISHER_NAME].data; }
00607 
00608 
00609         const char * get_principal_name()
00610                 { prefetch(); return (const char*)m_data[TAG_PRINCIPAL_NAME].data; }
00611 
00612 
00613         const unsigned char * get_principal_key_id()
00614                 { prefetch(); return m_data[TAG_PRINCIPAL_KEY_ID].data; }
00615         size_t get_principal_key_id_length()
00616                 { prefetch(); return m_data[TAG_PRINCIPAL_KEY_ID].length; }
00617 
00618 private:
00619 
00620 
00621         bool verify_append_domicile_police_authority_name(uint16_t index, size_t offset, size_t length = 0)
00622                 { return index < TAG_APPEND_DOMICILE_POLICE_AUTHORITY_NAME8 - TAG_APPEND_DOMICILE_POLICE_AUTHORITY_NAME1 &&
00623                          m_data[TAG_APPEND_DOMICILE_POLICE_AUTHORITY_NAME1 + index].data &&
00624                          offset + length < m_data[TAG_APPEND_DOMICILE_POLICE_AUTHORITY_NAME1 + index].length; }
00625 
00626         bool verify_append_new_name(uint16_t index, size_t offset, size_t length = 0)
00627                 { return index < TAG_APPEND_NAME_AND_POLICE_AUTHORITY_NAME8 - TAG_APPEND_NAME_AND_POLICE_AUTHORITY_NAME1 &&
00628                          m_data[TAG_APPEND_NAME_AND_POLICE_AUTHORITY_NAME1 + index].data &&
00629                          offset + length < m_data[TAG_APPEND_NAME_AND_POLICE_AUTHORITY_NAME1 + index].length; }
00630 
00631 
00632         bool verify_append_new_phonetic_name(uint16_t index, size_t offset, size_t length = 0)
00633                 { return index < TAG_APPEND_PHONETIC_NAME_AND_POLICE_AUTHORITY_NAME8 - TAG_APPEND_PHONETIC_NAME_AND_POLICE_AUTHORITY_NAME1 &&
00634                          m_data[TAG_APPEND_PHONETIC_NAME_AND_POLICE_AUTHORITY_NAME1 + index].data &&
00635                          offset + length < m_data[TAG_APPEND_PHONETIC_NAME_AND_POLICE_AUTHORITY_NAME1 + index].length; }
00636 
00637 
00638         bool verify_append_new_domicile(uint16_t index, size_t offset, size_t length = 0)
00639                 { return index < TAG_APPEND_DOMICILE_AND_POLICE_AUTHORITY_NAME8 - TAG_APPEND_DOMICILE_AND_POLICE_AUTHORITY_NAME1 &&
00640                          m_data[TAG_APPEND_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].data &&
00641                          offset + length < m_data[TAG_APPEND_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].length; }
00642 
00643 
00644         bool verify_append_new_license_requirement(uint16_t index, size_t offset, size_t length = 0)
00645                 { return index < TAG_APPEND_LICENSE_REQUIREMENT_AND_POLICE_AUTHORITY_NAME8 - TAG_APPEND_LICENSE_REQUIREMENT_AND_POLICE_AUTHORITY_NAME1 &&
00646                          m_data[TAG_APPEND_LICENSE_REQUIREMENT_AND_POLICE_AUTHORITY_NAME1 + index].data &&
00647                          offset + length < m_data[TAG_APPEND_LICENSE_REQUIREMENT_AND_POLICE_AUTHORITY_NAME1 + index].length; }
00648 
00649 
00650         bool verify_append_condition_release(uint16_t index, size_t offset, size_t length = 0)
00651                 { return index < TAG_APPEND_CONDITION_RELEASE_AND_POLICE_AUTHORITY_NAME8 - TAG_APPEND_CONDITION_RELEASE_AND_POLICE_AUTHORITY_NAME1 &&
00652                          m_data[TAG_APPEND_CONDITION_RELEASE_AND_POLICE_AUTHORITY_NAME1 + index].data &&
00653                          offset + length < m_data[TAG_APPEND_CONDITION_RELEASE_AND_POLICE_AUTHORITY_NAME1 + index].length; }
00654 
00655 
00656         bool verify_append_remark(uint16_t index, size_t offset, size_t length = 0)
00657                 { return index < TAG_APPEND_REMARK_AND_POLICE_AUTHORITY_NAME8 - TAG_APPEND_REMARK_AND_POLICE_AUTHORITY_NAME1 &&
00658                          m_data[TAG_APPEND_REMARK_AND_POLICE_AUTHORITY_NAME1 + index].data &&
00659                          offset + length < m_data[TAG_APPEND_REMARK_AND_POLICE_AUTHORITY_NAME1 + index].length; }
00660 
00661 
00662         bool verify_append_spare(uint16_t index, size_t offset, size_t length = 0)
00663                 { return index < TAG_APPEND_SPARE_AND_POLICE_AUTHORITY_NAME8 - TAG_APPEND_SPARE_AND_POLICE_AUTHORITY_NAME1 &&
00664                          m_data[TAG_APPEND_SPARE_AND_POLICE_AUTHORITY_NAME1 + index].data &&
00665                          offset + length < m_data[TAG_APPEND_SPARE_AND_POLICE_AUTHORITY_NAME1 + index].length; }
00666 
00667 
00668         bool verify_append_registered_domicile(uint16_t index, size_t offset, size_t length = 0)
00669                 { return index < TAG_APPEND_REGISTERED_DOMICILE_AND_POLICE_AUTHORITY_NAME5 - TAG_APPEND_REGISTERED_DOMICILE_AND_POLICE_AUTHORITY_NAME1 &&
00670                          m_data[TAG_APPEND_REGISTERED_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].data &&
00671                          offset + length < m_data[TAG_APPEND_REGISTERED_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].length; }
00672 };
00673 
00674 #endif
 全て クラス ファイル 関数 変数 マクロ定義