/* Copyright 2014 Google Inc. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package com.google.security.zynamics.binnavi.disassembly; import com.google.common.base.Preconditions; import com.google.security.zynamics.binnavi.Database.Interfaces.SQLProvider; import com.google.security.zynamics.binnavi.Database.MockClasses.MockSqlProvider; import com.google.security.zynamics.binnavi.Gui.GraphWindows.CommentDialogs.CComment; import com.google.security.zynamics.binnavi.Gui.GraphWindows.CommentDialogs.Interfaces.IComment; import com.google.security.zynamics.binnavi.Gui.Users.CUserManager; import com.google.security.zynamics.binnavi.Gui.Users.Interfaces.IUser; import com.google.security.zynamics.binnavi.disassembly.Modules.MockModule; import com.google.security.zynamics.zylib.disassembly.CAddress; import com.google.security.zynamics.zylib.disassembly.IAddress; import java.util.ArrayList; import java.util.List; public final class MockInstruction implements INaviInstruction { private final ArrayList<IComment> m_globalComment; public String m_mnemonic; private IAddress m_address; private final List<COperandTree> m_operands; private final INaviModule m_module; private boolean m_isSaved; private final SQLProvider m_provider = new MockSqlProvider(); public MockInstruction() { this("nop", new ArrayList<COperandTree>(), null); } public MockInstruction(final String mnemonic, final List<COperandTree> operands, final ArrayList<IComment> globalComment) { m_mnemonic = mnemonic; m_globalComment = globalComment; m_address = new CAddress(0x123); m_operands = operands; m_module = new MockModule(); } public MockInstruction(final CAddress cAddress, final String mnemonic, final ArrayList<COperandTree> operands, final ArrayList<IComment> globalComment, final INaviModule module) { m_mnemonic = mnemonic; m_globalComment = globalComment; m_address = cAddress; m_operands = operands; m_module = module; } public MockInstruction(final IAddress cAddress, final String mnemonic, final ArrayList<COperandTree> operands, final ArrayList<IComment> globalComment) { m_mnemonic = mnemonic; m_globalComment = globalComment; m_address = cAddress; m_operands = operands; m_module = new MockModule(); } public MockInstruction(final IAddress cAddress, final String mnemonic, final List<COperandTree> operands, final ArrayList<IComment> globalComment) { m_mnemonic = mnemonic; m_globalComment = globalComment; m_address = cAddress; m_operands = operands; m_module = new MockModule(); } public MockInstruction(final long address) { this("nop", new ArrayList<COperandTree>(), null); m_address = new CAddress(address); } @Override public void addListener(final IInstructionListener listener) {} @Override public List<IComment> appendGlobalComment(final String commentText) { final int id = m_globalComment.size() + 1; final IComment parent = m_globalComment.size() == 0 ? null : m_globalComment.get(m_globalComment.size() - 1); final IUser user = CUserManager.get(m_provider).getCurrentActiveUser(); final IComment comment = new CComment(id, user, parent, commentText); m_globalComment.add(comment); return m_globalComment; } @Override public INaviInstruction cloneInstruction() { final INaviInstruction instruction = new MockInstruction(m_address, m_mnemonic, m_operands, m_globalComment); return instruction; } @Override public void close() { return; } @Override public void deleteGlobalComment(final IComment comment) { m_globalComment.remove(comment); } @Override public IComment editGlobalComment(final IComment comment, final String commentText) { Preconditions.checkNotNull(comment, "Error: comment argument can not be null"); Preconditions.checkNotNull(commentText, "Error: newComment argument can not be null"); Preconditions.checkArgument( CUserManager.get(m_provider).getCurrentActiveUser().equals(comment.getUser())); final int index = m_globalComment.indexOf(comment); final IComment newComment = new CComment(comment.getId(), comment.getUser(), comment.getParent(), commentText); m_globalComment.set(index, newComment); return newComment; } @Override public IAddress getAddress() { return m_address; } @Override public String getArchitecture() { return "x86-32"; } @Override public byte[] getData() { throw new IllegalStateException("Not yet implemented"); } @Override public ArrayList<IComment> getGlobalComment() { return m_globalComment; } @Override public String getInstructionString() { return null; } @Override public long getLength() { return 4; } @Override public String getMnemonic() { return m_mnemonic; } @Override public Integer getMnemonicCode() { return m_mnemonic.hashCode(); } @Override public INaviModule getModule() { return m_module; } @Override public int getOperandPosition(final INaviOperandTree operand) { return m_operands.indexOf(operand); } @Override public List<COperandTree> getOperands() { return new ArrayList<COperandTree>(m_operands); } @Override public void initializeGlobalComment(final ArrayList<IComment> comment) { m_globalComment.clear(); m_globalComment.addAll(comment); } @Override public boolean inSameDatabase(final IDatabaseObject provider) { throw new RuntimeException("Not yet implemented"); } @Override public boolean inSameDatabase(final SQLProvider provider) { return true; } @Override public boolean isOwner(final IComment second) { // TODO Auto-generated method stub return false; } @Override public boolean isStored() { return m_isSaved; } @Override public void removeListener(final IInstructionListener listener) { throw new RuntimeException("Not yet implemented"); } @Override public void setSaved(final boolean saved) { m_isSaved = true; } @Override public String toString() { return getAddress() + ": " + getMnemonic(); } }