class
AndroidManifestEditor {
public
:
struct
sAndroidManifestHead {
int
magic;
int
file_size;
};
char
* mAndroidManifestData;
sAndroidManifestHead* mAndroidManifestHead;
StringChunk* mStringChunk;
StartNamespaceChunk* mStartNamespaceChunk;
EndNameSpaceChunk* mEndNameSpaceChunk;
std::vector<Chunk*> chunk_list;
std::vector<StartTagChunk*> mStartTagChunkList;
std::vector<EndTagChunk*> mEndTagChunkList;
std::vector<StartTagChunk*> tStartTagChunkList;
AndroidManifestEditor(
const
char
* AndroidManifestPath) {
mAndroidManifestData = read_file(AndroidManifestPath);
mAndroidManifestHead = (sAndroidManifestHead*)mAndroidManifestData;
Chunk* chunk =
new
Chunk(((
char
*)mAndroidManifestHead +
sizeof
(sAndroidManifestHead)));
while
(chunk->type !=
"Unknown"
) {
if
(chunk->type ==
"StartNameSpaceChunk"
) {
mStartNamespaceChunk =
new
StartNamespaceChunk(chunk->addr, &mStringChunk);
}
else
if
(chunk->type ==
"StringChunk"
) {
mStringChunk =
new
StringChunk(chunk->addr);
}
else
if
(chunk->type ==
"StartTagChunk"
) {
StartTagChunk* mStartTagChunk =
new
StartTagChunk(chunk->addr, &mStringChunk, &mStartNamespaceChunk);
mStartTagChunkList.push_back(mStartTagChunk);
tStartTagChunkList.push_back(mStartTagChunk);
}
else
if
(chunk->type ==
"EndTagChunk"
) {
EndTagChunk* mEndTagChunk =
new
EndTagChunk(chunk->addr, &mStringChunk);
mEndTagChunkList.push_back(mEndTagChunk);
tStartTagChunkList.back()->mEndTagChunk = mEndTagChunk;
tStartTagChunkList.pop_back();
}
else
if
(chunk->type ==
"EndNameSpaceChunk"
) {
mEndNameSpaceChunk =
new
EndNameSpaceChunk(chunk->addr, &mStringChunk);
}
chunk_list.push_back(chunk);
chunk = chunk->NextChunk();
}
}
void
show() {
printf
(
"AndroidManifest 魔数\t\t\t\t0x%x\n"
, mAndroidManifestHead->magic);
printf
(
"AndroidManifest 文件大小\t\t\t0x%x\n"
, mAndroidManifestHead->file_size);
int
start_tag_id = 0;
int
end_tag_id = 0;
for
(
int
i = 0; i < chunk_list.size(); i++) {
Chunk* chunk = chunk_list[i];
printf
(
"[%s] \n"
, chunk->type.c_str());
if
(chunk->type ==
"StringChunk"
) {
printf
(
"\n"
);
}
else
if
(chunk->type ==
"ResourceChunk"
) {
printf
(
"\n"
);
}
else
if
(chunk->type ==
"StartNameSpaceChunk"
) {
std::wstring wstr = mStartNamespaceChunk->get_string();
printf
(
"%S\n\n"
, wstr.c_str());
}
else
if
(chunk->type ==
"StartTagChunk"
) {
StartTagChunk* mStartTagChunk = mStartTagChunkList[start_tag_id];
printf
(
"%S\n"
, mStartTagChunk->mEndTagChunk->get_string().c_str());
printf
(
"%S\n\n"
, mStartTagChunk->get_string().c_str());
start_tag_id++;
}
else
if
(chunk->type ==
"EndTagChunk"
) {
EndTagChunk* mEndTagChunk = mEndTagChunkList[end_tag_id];
std::wstring wstr = mEndTagChunk->get_string();
end_tag_id++;
printf
(
"%S\n\n"
, wstr.c_str());
}
else
if
(chunk->type ==
"EndNameSpaceChunk"
) {
std::wstring wstr = mEndNameSpaceChunk->get_string();
printf
(
"%S\n\n"
, wstr.c_str());
break
;
}
}
}
};