📄 metadata_manip.cpp
字号:
return die_("setting APPLICATION data"); if(!replace_in_our_metadata_(app, our_current_position, /*copy=*/true)) return die_("copying object"); if(!iterator.set_block(app)) return die_c_("iterator.set_block(app)", chain.status()); if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfile_)) return die_c_("during chain.write(true, false)", chain.status()); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; if(!test_file_(flacfile_, /*ignore_metadata=*/false)) return false; printf("SV[A]P\tgrow APPLICATION, use padding, last block is padding of exceeding size\n"); if(0 == (app = dynamic_cast<FLAC::Metadata::Application *>(FLAC::Metadata::clone(our_metadata_.blocks[our_current_position])))) return die_("copying object"); if(!app->set_data(data, 56, true)) return die_("setting APPLICATION data"); if(!replace_in_our_metadata_(app, our_current_position, /*copy=*/true)) return die_("copying object"); add_to_padding_length_(our_current_position+1, -(56 - 50)); if(!iterator.set_block(app)) return die_c_("iterator.set_block(app)", chain.status()); if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfile_)) return die_c_("during chain.write(true, false)", chain.status()); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; if(!test_file_(flacfile_, /*ignore_metadata=*/false)) return false; printf("SV[A]P\tgrow APPLICATION, use padding, last block is padding of exact size\n"); if(0 == (app = dynamic_cast<FLAC::Metadata::Application *>(FLAC::Metadata::clone(our_metadata_.blocks[our_current_position])))) return die_("copying object"); if(!app->set_data(data, 67, true)) return die_("setting APPLICATION data"); if(!replace_in_our_metadata_(app, our_current_position, /*copy=*/true)) return die_("copying object"); delete_from_our_metadata_(our_current_position+1); if(!iterator.set_block(app)) return die_c_("iterator.set_block(app)", chain.status()); if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfile_)) return die_c_("during chain.write(true, false)", chain.status()); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; if(!test_file_(flacfile_, /*ignore_metadata=*/false)) return false; printf("SV[A]\tprev\n"); if(!iterator.prev()) return die_("iterator ended early\n"); our_current_position--; printf("S[V]A\tprev\n"); if(!iterator.prev()) return die_("iterator ended early\n"); our_current_position--; printf("[S]VA\tinsert PADDING before STREAMINFO (should fail)\n"); if(0 == (padding = new FLAC::Metadata::Padding())) return die_("creating PADDING block"); padding->set_length(30); if(!iterator.insert_block_before(padding)) printf("\titerator.insert_block_before() returned false like it should\n"); else return die_("iterator.insert_block_before() should have returned false"); printf("[S]VA\tnext\n"); if(!iterator.next()) return die_("iterator ended early\n"); our_current_position++; printf("S[V]A\tinsert PADDING after\n"); if(!insert_to_our_metadata_(padding, ++our_current_position, /*copy=*/true)) return die_("copying metadata"); if(!iterator.insert_block_after(padding)) return die_("iterator.insert_block_after(padding)"); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; printf("SV[P]A\tinsert PADDING before\n"); if(0 == (padding = dynamic_cast<FLAC::Metadata::Padding *>(FLAC::Metadata::clone(our_metadata_.blocks[our_current_position])))) return die_("creating PADDING block"); padding->set_length(17); if(!insert_to_our_metadata_(padding, our_current_position, /*copy=*/true)) return die_("copying metadata"); if(!iterator.insert_block_before(padding)) return die_("iterator.insert_block_before(padding)"); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; printf("SV[P]PA\tinsert PADDING before\n"); if(0 == (padding = dynamic_cast<FLAC::Metadata::Padding *>(FLAC::Metadata::clone(our_metadata_.blocks[our_current_position])))) return die_("creating PADDING block"); padding->set_length(0); if(!insert_to_our_metadata_(padding, our_current_position, /*copy=*/true)) return die_("copying metadata"); if(!iterator.insert_block_before(padding)) return die_("iterator.insert_block_before(padding)"); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; printf("SV[P]PPA\tnext\n"); if(!iterator.next()) return die_("iterator ended early\n"); our_current_position++; printf("SVP[P]PA\tnext\n"); if(!iterator.next()) return die_("iterator ended early\n"); our_current_position++; printf("SVPP[P]A\tnext\n"); if(!iterator.next()) return die_("iterator ended early\n"); our_current_position++; printf("SVPPP[A]\tinsert PADDING after\n"); if(0 == (padding = dynamic_cast<FLAC::Metadata::Padding *>(FLAC::Metadata::clone(our_metadata_.blocks[2])))) return die_("creating PADDING block"); padding->set_length(57); if(!insert_to_our_metadata_(padding, ++our_current_position, /*copy=*/true)) return die_("copying metadata"); if(!iterator.insert_block_after(padding)) return die_("iterator.insert_block_after(padding)"); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; printf("SVPPPA[P]\tinsert PADDING before\n"); if(0 == (padding = dynamic_cast<FLAC::Metadata::Padding *>(FLAC::Metadata::clone(our_metadata_.blocks[2])))) return die_("creating PADDING block"); padding->set_length(99); if(!insert_to_our_metadata_(padding, our_current_position, /*copy=*/true)) return die_("copying metadata"); if(!iterator.insert_block_before(padding)) return die_("iterator.insert_block_before(padding)"); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; } our_current_position = 0; printf("SVPPPAPP\tmerge padding\n"); chain.merge_padding(); add_to_padding_length_(2, FLAC__STREAM_METADATA_HEADER_LENGTH + our_metadata_.blocks[3]->get_length()); add_to_padding_length_(2, FLAC__STREAM_METADATA_HEADER_LENGTH + our_metadata_.blocks[4]->get_length()); add_to_padding_length_(6, FLAC__STREAM_METADATA_HEADER_LENGTH + our_metadata_.blocks[7]->get_length()); delete_from_our_metadata_(7); delete_from_our_metadata_(4); delete_from_our_metadata_(3); if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfile_)) return die_c_("during chain.write(true, false)", chain.status()); if(!compare_chain_(chain, 0, 0)) return false; if(!test_file_(flacfile_, /*ignore_metadata=*/false)) return false; printf("SVPAP\tsort padding\n"); chain.sort_padding(); add_to_padding_length_(4, FLAC__STREAM_METADATA_HEADER_LENGTH + our_metadata_.blocks[2]->get_length()); delete_from_our_metadata_(2); if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfile_)) return die_c_("during chain.write(true, false)", chain.status()); if(!compare_chain_(chain, 0, 0)) return false; if(!test_file_(flacfile_, /*ignore_metadata=*/false)) return false; printf("create iterator\n"); { FLAC::Metadata::Iterator iterator; if(!iterator.is_valid()) return die_("allocating memory for iterator"); our_current_position = 0; iterator.init(chain); printf("[S]VAP\tnext\n"); if(!iterator.next()) return die_("iterator ended early\n"); our_current_position++; printf("S[V]AP\tnext\n"); if(!iterator.next()) return die_("iterator ended early\n"); our_current_position++; printf("SV[A]P\tdelete middle block, replace with padding\n"); if(0 == (padding = new FLAC::Metadata::Padding())) return die_("creating PADDING block"); padding->set_length(71); if(!replace_in_our_metadata_(padding, our_current_position--, /*copy=*/false)) return die_("copying object"); if(!iterator.delete_block(/*replace_with_padding=*/true)) return die_c_("iterator.delete_block(true)", chain.status()); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; printf("S[V]PP\tnext\n"); if(!iterator.next()) return die_("iterator ended early\n"); our_current_position++; printf("SV[P]P\tdelete middle block, don't replace with padding\n"); delete_from_our_metadata_(our_current_position--); if(!iterator.delete_block(/*replace_with_padding=*/false)) return die_c_("iterator.delete_block(false)", chain.status()); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; printf("S[V]P\tnext\n"); if(!iterator.next()) return die_("iterator ended early\n"); our_current_position++; printf("SV[P]\tdelete last block, replace with padding\n"); if(0 == (padding = new FLAC::Metadata::Padding())) return die_("creating PADDING block"); padding->set_length(219); if(!replace_in_our_metadata_(padding, our_current_position--, /*copy=*/false)) return die_("copying object"); if(!iterator.delete_block(/*replace_with_padding=*/true)) return die_c_("iterator.delete_block(true)", chain.status()); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; printf("S[V]P\tnext\n"); if(!iterator.next()) return die_("iterator ended early\n"); our_current_position++; printf("SV[P]\tdelete last block, don't replace with padding\n"); delete_from_our_metadata_(our_current_position--); if(!iterator.delete_block(/*replace_with_padding=*/false)) return die_c_("iterator.delete_block(false)", chain.status()); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; printf("S[V]\tprev\n"); if(!iterator.prev()) return die_("iterator ended early\n"); our_current_position--; printf("[S]V\tdelete STREAMINFO block, should fail\n"); if(iterator.delete_block(/*replace_with_padding=*/false)) return die_("iterator.delete_block() on STREAMINFO should have failed but didn't"); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; } // delete iterator our_current_position = 0; printf("SV\tmerge padding\n"); chain.merge_padding(); if(!write_chain_(chain, /*use_padding=*/false, /*preserve_file_stats=*/false, filename_based, flacfile_)) return die_c_("during chain.write(false, false)", chain.status()); if(!compare_chain_(chain, 0, 0)) return false; if(!test_file_(flacfile_, /*ignore_metadata=*/false)) return false; printf("SV\tsort padding\n"); chain.sort_padding(); if(!write_chain_(chain, /*use_padding=*/false, /*preserve_file_stats=*/false, filename_based, flacfile_)) return die_c_("during chain.write(false, false)", chain.status()); if(!compare_chain_(chain, 0, 0)) return false; if(!test_file_(flacfile_, /*ignore_metadata=*/false)) return false; if(!remove_file_(flacfile_)) return false; return true;}static bool test_level_2_misc_(){ ::FLAC__IOCallbacks callbacks; memset(&callbacks, 0, sizeof(callbacks)); callbacks.read = (::FLAC__IOCallback_Read)fread;#ifdef FLAC__VALGRIND_TESTING callbacks.write = chain_write_cb_;#else callbacks.write = (::FLAC__IOCallback_Write)fwrite;#endif callbacks.seek = chain_seek_cb_; callbacks.tell = chain_tell_cb_; callbacks.eof = chain_eof_cb_; printf("\n\n++++++ testing level 2 interface (mismatched read/write protections)\n"); printf("generate file\n"); if(!generate_file_()) return false; printf("create chain\n"); FLAC::Metadata::Chain chain; if(!chain.is_valid()) return die_("allocating chain"); printf("read chain (filename-based)\n"); if(!chain.read(flacfile_)) return die_c_("reading chain", chain.status()); printf("write chain with wrong method Chain::write(with callbacks)\n"); { if(chain.write(/*use_padding=*/false, 0, callbacks)) return die_c_("mismatched write should have failed", chain.status()); if(chain.status() != ::FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH) return die_c_("expected FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH", chain.status()); printf(" OK: Chain::write(with callbacks) returned false,FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH like it should\n"); } printf("read chain (filename-based)\n"); if(!chain.read(flacfile_)) return die_c_("reading chain", chain.status()); printf("write chain with wrong method Chain::write(with callbacks and tempfile)\n"); { if(chain.write(/*use_padding=*/false, 0, callbacks, 0, callbacks)) return die_c_("mismatched write should have failed", chain.status()); if(chain.status() != ::FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH) return die_c_("expected FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH", chain.status()); printf(" OK: Chain::write(with callbacks and tempfile) returned false,FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH like it should\n"); } printf("read chain (callback-based)\n"); { FILE *file = fopen(flacfile_, "rb"); if(0 == file) return die_("opening file"); if(!chain.read((::FLAC__IOHandle)file, callbacks)) { fclose(file); return die_c_("reading chain", chain.status()); } fclose(file); } printf("write chain with wrong method write()\n"); { if(chain.write(/*use_padding=*/false, /*preserve_file_stats=*/false)) return die_c_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -