| 63 | extern MMKVPath_t g_realRootDir; |
| 64 | |
| 65 | MMKV_NAMESPACE_BEGIN |
| 66 | |
| 67 | void MMKV::loadFromFile() { |
| 68 | loadMetaInfoAndCheck(); |
| 69 | #ifndef MMKV_DISABLE_CRYPT |
| 70 | if (m_crypter) { |
| 71 | if (m_metaInfo->m_version >= MMKVVersionRandomIV) { |
| 72 | m_crypter->resetIV(m_metaInfo->m_vector, sizeof(m_metaInfo->m_vector)); |
| 73 | } |
| 74 | } |
| 75 | #endif |
| 76 | if (!m_file->isFileValid()) { |
| 77 | m_file->reloadFromFile(m_expectedCapacity); |
| 78 | } else if (isMultiProcess()) { |
| 79 | // the file size may change by other process between instance creation and loadFromFile |
| 80 | // because we have lazy load |
| 81 | auto actualFileSize = m_file->getActualFileSize(); |
| 82 | if (actualFileSize != m_file->getFileSize()) { |
| 83 | m_file->reloadFromFile(m_expectedCapacity); |
| 84 | } |
| 85 | } |
| 86 | if (!m_file->isFileValid()) { |
| 87 | MMKVError("file [%s] not valid", m_path.c_str()); |
| 88 | } else { |
| 89 | // error checking |
| 90 | bool loadFromFile = false, needFullWriteback = false; |
| 91 | checkDataValid(loadFromFile, needFullWriteback); |
| 92 | MMKVInfo("loading [%s] with %zu actual size, file size %zu, InterProcess %d, meta info " |
| 93 | "version:%u", |
| 94 | m_mmapID.c_str(), m_actualSize, m_file->getFileSize(), isMultiProcess(), m_metaInfo->m_version); |
| 95 | auto ptr = (uint8_t *) m_file->getMemory(); |
| 96 | // loading |
| 97 | if (loadFromFile && m_actualSize > 0) { |
| 98 | MMKVInfo("loading [%s] with crc %u sequence %u version %u", m_mmapID.c_str(), m_metaInfo->m_crcDigest, |
| 99 | m_metaInfo->m_sequence, m_metaInfo->m_version); |
| 100 | MMBuffer inputBuffer(ptr + Fixed32Size, m_actualSize, MMBufferNoCopy); |
| 101 | if (m_crypter) { |
| 102 | clearDictionary(m_dicCrypt); |
| 103 | } else { |
| 104 | clearDictionary(m_dic); |
| 105 | } |
| 106 | if (needFullWriteback) { |
| 107 | #ifndef MMKV_DISABLE_CRYPT |
| 108 | if (m_crypter) { |
| 109 | MiniPBCoder::greedyDecodeMap(*m_dicCrypt, inputBuffer, m_crypter); |
| 110 | } else |
| 111 | #endif |
| 112 | { |
| 113 | MiniPBCoder::greedyDecodeMap(*m_dic, inputBuffer); |
| 114 | } |
| 115 | } else { |
| 116 | #ifndef MMKV_DISABLE_CRYPT |
| 117 | if (m_crypter) { |
| 118 | MiniPBCoder::decodeMap(*m_dicCrypt, inputBuffer, m_crypter); |
| 119 | } else |
| 120 | #endif |
| 121 | { |
| 122 | MiniPBCoder::decodeMap(*m_dic, inputBuffer); |
no test coverage detected