Commit e27ac682e00be12e9c420c26c218ee2a01fbf232

Authored by Jay Berkenbilt
1 parent 005675ed

Move encryption parameters into a class

include/qpdf/QPDF.hh
@@ -1160,6 +1160,30 @@ class QPDF @@ -1160,6 +1160,30 @@ class QPDF
1160 std::set<QPDFObjGen>& visited, bool top); 1160 std::set<QPDFObjGen>& visited, bool top);
1161 void filterCompressedObjects(std::map<int, int> const& object_stream_data); 1161 void filterCompressedObjects(std::map<int, int> const& object_stream_data);
1162 1162
  1163 + class EncryptionParameters
  1164 + {
  1165 + friend class QPDF;
  1166 + public:
  1167 + EncryptionParameters();
  1168 +
  1169 + private:
  1170 + bool encrypted;
  1171 + bool encryption_initialized;
  1172 + int encryption_V;
  1173 + int encryption_R;
  1174 + bool encrypt_metadata;
  1175 + std::map<std::string, encryption_method_e> crypt_filters;
  1176 + encryption_method_e cf_stream;
  1177 + encryption_method_e cf_string;
  1178 + encryption_method_e cf_file;
  1179 + std::string provided_password;
  1180 + std::string user_password;
  1181 + std::string encryption_key;
  1182 + std::string cached_object_encryption_key;
  1183 + int cached_key_objid;
  1184 + int cached_key_generation;
  1185 + };
  1186 +
1163 class Members 1187 class Members
1164 { 1188 {
1165 friend class QPDF; 1189 friend class QPDF;
@@ -1176,26 +1200,12 @@ class QPDF @@ -1176,26 +1200,12 @@ class QPDF
1176 PointerHolder<InputSource> file; 1200 PointerHolder<InputSource> file;
1177 std::string last_object_description; 1201 std::string last_object_description;
1178 bool provided_password_is_hex_key; 1202 bool provided_password_is_hex_key;
1179 - bool encrypted;  
1180 - bool encryption_initialized;  
1181 bool ignore_xref_streams; 1203 bool ignore_xref_streams;
1182 bool suppress_warnings; 1204 bool suppress_warnings;
1183 std::ostream* out_stream; 1205 std::ostream* out_stream;
1184 std::ostream* err_stream; 1206 std::ostream* err_stream;
1185 bool attempt_recovery; 1207 bool attempt_recovery;
1186 - int encryption_V;  
1187 - int encryption_R;  
1188 - bool encrypt_metadata;  
1189 - std::map<std::string, encryption_method_e> crypt_filters;  
1190 - encryption_method_e cf_stream;  
1191 - encryption_method_e cf_string;  
1192 - encryption_method_e cf_file;  
1193 - std::string provided_password;  
1194 - std::string user_password;  
1195 - std::string encryption_key;  
1196 - std::string cached_object_encryption_key;  
1197 - int cached_key_objid;  
1198 - int cached_key_generation; 1208 + PointerHolder<EncryptionParameters> encp;
1199 std::string pdf_version; 1209 std::string pdf_version;
1200 std::map<QPDFObjGen, QPDFXRefEntry> xref_table; 1210 std::map<QPDFObjGen, QPDFXRefEntry> xref_table;
1201 std::set<int> deleted_objects; 1211 std::set<int> deleted_objects;
libqpdf/QPDF.cc
@@ -74,15 +74,9 @@ QPDF::QPDFVersion() @@ -74,15 +74,9 @@ QPDF::QPDFVersion()
74 return QPDF::qpdf_version; 74 return QPDF::qpdf_version;
75 } 75 }
76 76
77 -QPDF::Members::Members() :  
78 - provided_password_is_hex_key(false), 77 +QPDF::EncryptionParameters::EncryptionParameters() :
79 encrypted(false), 78 encrypted(false),
80 encryption_initialized(false), 79 encryption_initialized(false),
81 - ignore_xref_streams(false),  
82 - suppress_warnings(false),  
83 - out_stream(&std::cout),  
84 - err_stream(&std::cerr),  
85 - attempt_recovery(true),  
86 encryption_V(0), 80 encryption_V(0),
87 encryption_R(0), 81 encryption_R(0),
88 encrypt_metadata(true), 82 encrypt_metadata(true),
@@ -90,7 +84,18 @@ QPDF::Members::Members() : @@ -90,7 +84,18 @@ QPDF::Members::Members() :
90 cf_string(e_none), 84 cf_string(e_none),
91 cf_file(e_none), 85 cf_file(e_none),
92 cached_key_objid(0), 86 cached_key_objid(0),
93 - cached_key_generation(0), 87 + cached_key_generation(0)
  88 +{
  89 +}
  90 +
  91 +QPDF::Members::Members() :
  92 + provided_password_is_hex_key(false),
  93 + ignore_xref_streams(false),
  94 + suppress_warnings(false),
  95 + out_stream(&std::cout),
  96 + err_stream(&std::cerr),
  97 + attempt_recovery(true),
  98 + encp(new EncryptionParameters),
94 pushed_inherited_attributes_to_pages(false), 99 pushed_inherited_attributes_to_pages(false),
95 copied_stream_data_provider(0), 100 copied_stream_data_provider(0),
96 reconstructed_xref(false), 101 reconstructed_xref(false),
@@ -293,7 +298,7 @@ QPDF::parse(char const* password) @@ -293,7 +298,7 @@ QPDF::parse(char const* password)
293 { 298 {
294 if (password) 299 if (password)
295 { 300 {
296 - this->m->provided_password = password; 301 + this->m->encp->provided_password = password;
297 } 302 }
298 303
299 // Find the header anywhere in the first 1024 bytes of the file. 304 // Find the header anywhere in the first 1024 bytes of the file.
@@ -1383,7 +1388,7 @@ QPDF::readObject(PointerHolder&lt;InputSource&gt; input, @@ -1383,7 +1388,7 @@ QPDF::readObject(PointerHolder&lt;InputSource&gt; input,
1383 bool empty = false; 1388 bool empty = false;
1384 PointerHolder<StringDecrypter> decrypter_ph; 1389 PointerHolder<StringDecrypter> decrypter_ph;
1385 StringDecrypter* decrypter = 0; 1390 StringDecrypter* decrypter = 0;
1386 - if (this->m->encrypted && (! in_object_stream)) 1391 + if (this->m->encp->encrypted && (! in_object_stream))
1387 { 1392 {
1388 decrypter_ph = new StringDecrypter(this, objid, generation); 1393 decrypter_ph = new StringDecrypter(this, objid, generation);
1389 decrypter = decrypter_ph.getPointer(); 1394 decrypter = decrypter_ph.getPointer();
@@ -2509,7 +2514,7 @@ QPDF::pipeStreamData(int objid, int generation, @@ -2509,7 +2514,7 @@ QPDF::pipeStreamData(int objid, int generation,
2509 { 2514 {
2510 bool success = false; 2515 bool success = false;
2511 std::vector<PointerHolder<Pipeline> > to_delete; 2516 std::vector<PointerHolder<Pipeline> > to_delete;
2512 - if (this->m->encrypted) 2517 + if (this->m->encp->encrypted)
2513 { 2518 {
2514 decryptStream(pipeline, objid, generation, stream_dict, to_delete); 2519 decryptStream(pipeline, objid, generation, stream_dict, to_delete);
2515 } 2520 }
libqpdf/QPDF_encryption.cc
@@ -769,9 +769,9 @@ QPDF::interpretCF(QPDFObjectHandle cf) @@ -769,9 +769,9 @@ QPDF::interpretCF(QPDFObjectHandle cf)
769 if (cf.isName()) 769 if (cf.isName())
770 { 770 {
771 std::string filter = cf.getName(); 771 std::string filter = cf.getName();
772 - if (this->m->crypt_filters.count(filter) != 0) 772 + if (this->m->encp->crypt_filters.count(filter) != 0)
773 { 773 {
774 - return this->m->crypt_filters[filter]; 774 + return this->m->encp->crypt_filters[filter];
775 } 775 }
776 else if (filter == "/Identity") 776 else if (filter == "/Identity")
777 { 777 {
@@ -792,11 +792,11 @@ QPDF::interpretCF(QPDFObjectHandle cf) @@ -792,11 +792,11 @@ QPDF::interpretCF(QPDFObjectHandle cf)
792 void 792 void
793 QPDF::initializeEncryption() 793 QPDF::initializeEncryption()
794 { 794 {
795 - if (this->m->encryption_initialized) 795 + if (this->m->encp->encryption_initialized)
796 { 796 {
797 return; 797 return;
798 } 798 }
799 - this->m->encryption_initialized = true; 799 + this->m->encp->encryption_initialized = true;
800 800
801 // After we initialize encryption parameters, we must used stored 801 // After we initialize encryption parameters, we must used stored
802 // key information and never look at /Encrypt again. Otherwise, 802 // key information and never look at /Encrypt again. Otherwise,
@@ -811,7 +811,7 @@ QPDF::initializeEncryption() @@ -811,7 +811,7 @@ QPDF::initializeEncryption()
811 // Go ahead and set this->m->encrypted here. That way, isEncrypted 811 // Go ahead and set this->m->encrypted here. That way, isEncrypted
812 // will return true even if there were errors reading the 812 // will return true even if there were errors reading the
813 // encryption dictionary. 813 // encryption dictionary.
814 - this->m->encrypted = true; 814 + this->m->encp->encrypted = true;
815 815
816 std::string id1; 816 std::string id1;
817 QPDFObjectHandle id_obj = this->m->trailer.getKey("/ID"); 817 QPDFObjectHandle id_obj = this->m->trailer.getKey("/ID");
@@ -885,8 +885,8 @@ QPDF::initializeEncryption() @@ -885,8 +885,8 @@ QPDF::initializeEncryption()
885 QUtil::int_to_string(V) + " (max 5)"); 885 QUtil::int_to_string(V) + " (max 5)");
886 } 886 }
887 887
888 - this->m->encryption_V = V;  
889 - this->m->encryption_R = R; 888 + this->m->encp->encryption_V = V;
  889 + this->m->encp->encryption_R = R;
890 890
891 // OE, UE, and Perms are only present if V >= 5. 891 // OE, UE, and Perms are only present if V >= 5.
892 std::string OE; 892 std::string OE;
@@ -949,10 +949,10 @@ QPDF::initializeEncryption() @@ -949,10 +949,10 @@ QPDF::initializeEncryption()
949 } 949 }
950 } 950 }
951 951
952 - this->m->encrypt_metadata = true; 952 + this->m->encp->encrypt_metadata = true;
953 if ((V >= 4) && (encryption_dict.getKey("/EncryptMetadata").isBool())) 953 if ((V >= 4) && (encryption_dict.getKey("/EncryptMetadata").isBool()))
954 { 954 {
955 - this->m->encrypt_metadata = 955 + this->m->encp->encrypt_metadata =
956 encryption_dict.getKey("/EncryptMetadata").getBoolValue(); 956 encryption_dict.getKey("/EncryptMetadata").getBoolValue();
957 } 957 }
958 958
@@ -993,40 +993,41 @@ QPDF::initializeEncryption() @@ -993,40 +993,41 @@ QPDF::initializeEncryption()
993 method = e_unknown; 993 method = e_unknown;
994 } 994 }
995 } 995 }
996 - this->m->crypt_filters[filter] = method; 996 + this->m->encp->crypt_filters[filter] = method;
997 } 997 }
998 } 998 }
999 999
1000 QPDFObjectHandle StmF = encryption_dict.getKey("/StmF"); 1000 QPDFObjectHandle StmF = encryption_dict.getKey("/StmF");
1001 QPDFObjectHandle StrF = encryption_dict.getKey("/StrF"); 1001 QPDFObjectHandle StrF = encryption_dict.getKey("/StrF");
1002 QPDFObjectHandle EFF = encryption_dict.getKey("/EFF"); 1002 QPDFObjectHandle EFF = encryption_dict.getKey("/EFF");
1003 - this->m->cf_stream = interpretCF(StmF);  
1004 - this->m->cf_string = interpretCF(StrF); 1003 + this->m->encp->cf_stream = interpretCF(StmF);
  1004 + this->m->encp->cf_string = interpretCF(StrF);
1005 if (EFF.isName()) 1005 if (EFF.isName())
1006 { 1006 {
1007 - this->m->cf_file = interpretCF(EFF); 1007 + this->m->encp->cf_file = interpretCF(EFF);
1008 } 1008 }
1009 else 1009 else
1010 { 1010 {
1011 - this->m->cf_file = this->m->cf_stream; 1011 + this->m->encp->cf_file = this->m->encp->cf_stream;
1012 } 1012 }
1013 } 1013 }
1014 1014
1015 EncryptionData data(V, R, Length / 8, P, O, U, OE, UE, Perms, 1015 EncryptionData data(V, R, Length / 8, P, O, U, OE, UE, Perms,
1016 - id1, this->m->encrypt_metadata); 1016 + id1, this->m->encp->encrypt_metadata);
1017 if (this->m->provided_password_is_hex_key) 1017 if (this->m->provided_password_is_hex_key)
1018 { 1018 {
1019 // ignore passwords in file 1019 // ignore passwords in file
1020 } 1020 }
1021 else if (check_owner_password( 1021 else if (check_owner_password(
1022 - this->m->user_password, this->m->provided_password, data)) 1022 + this->m->encp->user_password,
  1023 + this->m->encp->provided_password, data))
1023 { 1024 {
1024 // password supplied was owner password; user_password has 1025 // password supplied was owner password; user_password has
1025 // been initialized for V < 5 1026 // been initialized for V < 5
1026 } 1027 }
1027 - else if (check_user_password(this->m->provided_password, data)) 1028 + else if (check_user_password(this->m->encp->provided_password, data))
1028 { 1029 {
1029 - this->m->user_password = this->m->provided_password; 1030 + this->m->encp->user_password = this->m->encp->provided_password;
1030 } 1031 }
1031 else 1032 else
1032 { 1033 {
@@ -1036,15 +1037,16 @@ QPDF::initializeEncryption() @@ -1036,15 +1037,16 @@ QPDF::initializeEncryption()
1036 1037
1037 if (this->m->provided_password_is_hex_key) 1038 if (this->m->provided_password_is_hex_key)
1038 { 1039 {
1039 - this->m->encryption_key = QUtil::hex_decode(this->m->provided_password); 1040 + this->m->encp->encryption_key =
  1041 + QUtil::hex_decode(this->m->encp->provided_password);
1040 } 1042 }
1041 else if (V < 5) 1043 else if (V < 5)
1042 { 1044 {
1043 // For V < 5, the user password is encrypted with the owner 1045 // For V < 5, the user password is encrypted with the owner
1044 // password, and the user password is always used for 1046 // password, and the user password is always used for
1045 // computing the encryption key. 1047 // computing the encryption key.
1046 - this->m->encryption_key = compute_encryption_key(  
1047 - this->m->user_password, data); 1048 + this->m->encp->encryption_key = compute_encryption_key(
  1049 + this->m->encp->user_password, data);
1048 } 1050 }
1049 else 1051 else
1050 { 1052 {
@@ -1052,8 +1054,8 @@ QPDF::initializeEncryption() @@ -1052,8 +1054,8 @@ QPDF::initializeEncryption()
1052 // compute the encryption key, and neither password can be 1054 // compute the encryption key, and neither password can be
1053 // used to recover the other. 1055 // used to recover the other.
1054 bool perms_valid; 1056 bool perms_valid;
1055 - this->m->encryption_key = recover_encryption_key_with_password(  
1056 - this->m->provided_password, data, perms_valid); 1057 + this->m->encp->encryption_key = recover_encryption_key_with_password(
  1058 + this->m->encp->provided_password, data, perms_valid);
1057 if (! perms_valid) 1059 if (! perms_valid)
1058 { 1060 {
1059 warn(QPDFExc(qpdf_e_damaged_pdf, this->m->file->getName(), 1061 warn(QPDFExc(qpdf_e_damaged_pdf, this->m->file->getName(),
@@ -1068,24 +1070,24 @@ QPDF::initializeEncryption() @@ -1068,24 +1070,24 @@ QPDF::initializeEncryption()
1068 std::string 1070 std::string
1069 QPDF::getKeyForObject(int objid, int generation, bool use_aes) 1071 QPDF::getKeyForObject(int objid, int generation, bool use_aes)
1070 { 1072 {
1071 - if (! this->m->encrypted) 1073 + if (! this->m->encp->encrypted)
1072 { 1074 {
1073 throw std::logic_error( 1075 throw std::logic_error(
1074 "request for encryption key in non-encrypted PDF"); 1076 "request for encryption key in non-encrypted PDF");
1075 } 1077 }
1076 1078
1077 - if (! ((objid == this->m->cached_key_objid) &&  
1078 - (generation == this->m->cached_key_generation))) 1079 + if (! ((objid == this->m->encp->cached_key_objid) &&
  1080 + (generation == this->m->encp->cached_key_generation)))
1079 { 1081 {
1080 - this->m->cached_object_encryption_key =  
1081 - compute_data_key(this->m->encryption_key, objid, generation,  
1082 - use_aes, this->m->encryption_V,  
1083 - this->m->encryption_R);  
1084 - this->m->cached_key_objid = objid;  
1085 - this->m->cached_key_generation = generation; 1082 + this->m->encp->cached_object_encryption_key =
  1083 + compute_data_key(this->m->encp->encryption_key, objid, generation,
  1084 + use_aes, this->m->encp->encryption_V,
  1085 + this->m->encp->encryption_R);
  1086 + this->m->encp->cached_key_objid = objid;
  1087 + this->m->encp->cached_key_generation = generation;
1086 } 1088 }
1087 1089
1088 - return this->m->cached_object_encryption_key; 1090 + return this->m->encp->cached_object_encryption_key;
1089 } 1091 }
1090 1092
1091 void 1093 void
@@ -1096,9 +1098,9 @@ QPDF::decryptString(std::string&amp; str, int objid, int generation) @@ -1096,9 +1098,9 @@ QPDF::decryptString(std::string&amp; str, int objid, int generation)
1096 return; 1098 return;
1097 } 1099 }
1098 bool use_aes = false; 1100 bool use_aes = false;
1099 - if (this->m->encryption_V >= 4) 1101 + if (this->m->encp->encryption_V >= 4)
1100 { 1102 {
1101 - switch (this->m->cf_string) 1103 + switch (this->m->encp->cf_string)
1102 { 1104 {
1103 case e_none: 1105 case e_none:
1104 return; 1106 return;
@@ -1123,7 +1125,7 @@ QPDF::decryptString(std::string&amp; str, int objid, int generation) @@ -1123,7 +1125,7 @@ QPDF::decryptString(std::string&amp; str, int objid, int generation)
1123 " strings may be decrypted improperly")); 1125 " strings may be decrypted improperly"));
1124 // To avoid repeated warnings, reset cf_string. Assume 1126 // To avoid repeated warnings, reset cf_string. Assume
1125 // we'd want to use AES if V == 4. 1127 // we'd want to use AES if V == 4.
1126 - this->m->cf_string = e_aes; 1128 + this->m->encp->cf_string = e_aes;
1127 use_aes = true; 1129 use_aes = true;
1128 break; 1130 break;
1129 } 1131 }
@@ -1188,7 +1190,7 @@ QPDF::decryptStream(Pipeline*&amp; pipeline, int objid, int generation, @@ -1188,7 +1190,7 @@ QPDF::decryptStream(Pipeline*&amp; pipeline, int objid, int generation,
1188 return; 1190 return;
1189 } 1191 }
1190 bool use_aes = false; 1192 bool use_aes = false;
1191 - if (this->m->encryption_V >= 4) 1193 + if (this->m->encp->encryption_V >= 4)
1192 { 1194 {
1193 encryption_method_e method = e_unknown; 1195 encryption_method_e method = e_unknown;
1194 std::string method_source = "/StmF from /Encrypt dictionary"; 1196 std::string method_source = "/StmF from /Encrypt dictionary";
@@ -1239,7 +1241,7 @@ QPDF::decryptStream(Pipeline*&amp; pipeline, int objid, int generation, @@ -1239,7 +1241,7 @@ QPDF::decryptStream(Pipeline*&amp; pipeline, int objid, int generation,
1239 1241
1240 if (method == e_unknown) 1242 if (method == e_unknown)
1241 { 1243 {
1242 - if ((! this->m->encrypt_metadata) && (type == "/Metadata")) 1244 + if ((! this->m->encp->encrypt_metadata) && (type == "/Metadata"))
1243 { 1245 {
1244 QTC::TC("qpdf", "QPDF_encryption cleartext metadata"); 1246 QTC::TC("qpdf", "QPDF_encryption cleartext metadata");
1245 method = e_none; 1247 method = e_none;
@@ -1249,11 +1251,11 @@ QPDF::decryptStream(Pipeline*&amp; pipeline, int objid, int generation, @@ -1249,11 +1251,11 @@ QPDF::decryptStream(Pipeline*&amp; pipeline, int objid, int generation,
1249 if (this->m->attachment_streams.count( 1251 if (this->m->attachment_streams.count(
1250 QPDFObjGen(objid, generation)) > 0) 1252 QPDFObjGen(objid, generation)) > 0)
1251 { 1253 {
1252 - method = this->m->cf_file; 1254 + method = this->m->encp->cf_file;
1253 } 1255 }
1254 else 1256 else
1255 { 1257 {
1256 - method = this->m->cf_stream; 1258 + method = this->m->encp->cf_stream;
1257 } 1259 }
1258 } 1260 }
1259 } 1261 }
@@ -1285,7 +1287,7 @@ QPDF::decryptStream(Pipeline*&amp; pipeline, int objid, int generation, @@ -1285,7 +1287,7 @@ QPDF::decryptStream(Pipeline*&amp; pipeline, int objid, int generation,
1285 " streams may be decrypted improperly")); 1287 " streams may be decrypted improperly"));
1286 // To avoid repeated warnings, reset cf_stream. Assume 1288 // To avoid repeated warnings, reset cf_stream. Assume
1287 // we'd want to use AES if V == 4. 1289 // we'd want to use AES if V == 4.
1288 - this->m->cf_stream = e_aes; 1290 + this->m->encp->cf_stream = e_aes;
1289 break; 1291 break;
1290 } 1292 }
1291 } 1293 }
@@ -1349,13 +1351,13 @@ QPDF::compute_encryption_parameters_V5( @@ -1349,13 +1351,13 @@ QPDF::compute_encryption_parameters_V5(
1349 std::string const& 1351 std::string const&
1350 QPDF::getPaddedUserPassword() const 1352 QPDF::getPaddedUserPassword() const
1351 { 1353 {
1352 - return this->m->user_password; 1354 + return this->m->encp->user_password;
1353 } 1355 }
1354 1356
1355 std::string 1357 std::string
1356 QPDF::getTrimmedUserPassword() const 1358 QPDF::getTrimmedUserPassword() const
1357 { 1359 {
1358 - std::string result = this->m->user_password; 1360 + std::string result = this->m->encp->user_password;
1359 trim_user_password(result); 1361 trim_user_password(result);
1360 return result; 1362 return result;
1361 } 1363 }
@@ -1363,13 +1365,13 @@ QPDF::getTrimmedUserPassword() const @@ -1363,13 +1365,13 @@ QPDF::getTrimmedUserPassword() const
1363 std::string 1365 std::string
1364 QPDF::getEncryptionKey() const 1366 QPDF::getEncryptionKey() const
1365 { 1367 {
1366 - return this->m->encryption_key; 1368 + return this->m->encp->encryption_key;
1367 } 1369 }
1368 1370
1369 bool 1371 bool
1370 QPDF::isEncrypted() const 1372 QPDF::isEncrypted() const
1371 { 1373 {
1372 - return this->m->encrypted; 1374 + return this->m->encp->encrypted;
1373 } 1375 }
1374 1376
1375 bool 1377 bool
@@ -1386,7 +1388,7 @@ QPDF::isEncrypted(int&amp; R, int&amp; P, int&amp; V, @@ -1386,7 +1388,7 @@ QPDF::isEncrypted(int&amp; R, int&amp; P, int&amp; V,
1386 encryption_method_e& string_method, 1388 encryption_method_e& string_method,
1387 encryption_method_e& file_method) 1389 encryption_method_e& file_method)
1388 { 1390 {
1389 - if (this->m->encrypted) 1391 + if (this->m->encp->encrypted)
1390 { 1392 {
1391 QPDFObjectHandle trailer = getTrailer(); 1393 QPDFObjectHandle trailer = getTrailer();
1392 QPDFObjectHandle encrypt = trailer.getKey("/Encrypt"); 1394 QPDFObjectHandle encrypt = trailer.getKey("/Encrypt");
@@ -1396,9 +1398,9 @@ QPDF::isEncrypted(int&amp; R, int&amp; P, int&amp; V, @@ -1396,9 +1398,9 @@ QPDF::isEncrypted(int&amp; R, int&amp; P, int&amp; V,
1396 P = Pkey.getIntValue(); 1398 P = Pkey.getIntValue();
1397 R = Rkey.getIntValue(); 1399 R = Rkey.getIntValue();
1398 V = Vkey.getIntValue(); 1400 V = Vkey.getIntValue();
1399 - stream_method = this->m->cf_stream;  
1400 - string_method = this->m->cf_string;  
1401 - file_method = this->m->cf_file; 1401 + stream_method = this->m->encp->cf_stream;
  1402 + string_method = this->m->encp->cf_string;
  1403 + file_method = this->m->encp->cf_file;
1402 return true; 1404 return true;
1403 } 1405 }
1404 else 1406 else