/* 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.Exceptions.CouldntDeleteException; import com.google.security.zynamics.binnavi.Database.Exceptions.CouldntLoadDataException; import com.google.security.zynamics.binnavi.Database.Exceptions.CouldntSaveDataException; 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.Interfaces.IComment; import com.google.security.zynamics.binnavi.Gui.Users.CUserManager; import com.google.security.zynamics.binnavi.disassembly.Modules.MockModule; import com.google.security.zynamics.binnavi.disassembly.functions.FunctionManager; import com.google.security.zynamics.binnavi.disassembly.types.BaseType; import com.google.security.zynamics.zylib.disassembly.CAddress; import com.google.security.zynamics.zylib.disassembly.FunctionType; import com.google.security.zynamics.zylib.disassembly.IAddress; import com.google.security.zynamics.zylib.disassembly.ICodeEdge; import com.google.security.zynamics.zylib.disassembly.IFunctionListener; import com.google.security.zynamics.zylib.general.ListenerProvider; import com.google.security.zynamics.zylib.types.graphs.DirectedGraph; import java.util.ArrayList; import java.util.List; public class MockFunction implements INaviFunction { private INaviModule module = new MockModule(); private final ListenerProvider<IFunctionListener<IComment>> m_listeners = new ListenerProvider<IFunctionListener<IComment>>(); private String m_description = "Mock Description"; private String m_name = "Mock Function"; private boolean m_loaded = false; private final SQLProvider provider; public final List<IBlockEdge> m_edges = new ArrayList<IBlockEdge>(); public final List<IBlockNode> m_nodes = new ArrayList<IBlockNode>(); private IAddress address = new CAddress(0x1234); private INaviFunction resolvedFunction; private BaseType stackFrame; public MockFunction() { provider = new MockSqlProvider(); FunctionManager.get(provider).putFunction(this); } public MockFunction(final long address) { this.address = new CAddress(address); provider = new MockSqlProvider(); FunctionManager.get(provider).putFunction(this); } public MockFunction(final SQLProvider provider) { this.provider = provider; FunctionManager.get(provider).putFunction(this); } public MockFunction(final SQLProvider provider, final IAddress address, final INaviModule module) { this.provider = Preconditions.checkNotNull(provider, "Error: provider argument can not be null"); this.address = Preconditions.checkNotNull(address, "Error: address argument can not be null"); this.module = Preconditions.checkNotNull(module, "Error: module argument can not be null"); FunctionManager.get(provider).putFunction(this); } public MockFunction(final SQLProvider provider, final long address) { this.address = new CAddress(address); this.provider = provider; FunctionManager.get(provider).putFunction(this); } @Override public void addListener(final IFunctionListener<IComment> listener) { m_listeners.addListener(listener); } @Override public List<IComment> appendGlobalComment(final String commentText) throws CouldntSaveDataException, CouldntLoadDataException { return CommentManager.get(provider).appendGlobalFunctionComment(this, commentText); } @Override public boolean close() { throw new IllegalStateException("Error: Not yet implemented"); } @Override public void deleteGlobalComment(final IComment comment) throws CouldntDeleteException { CommentManager.get(provider).deleteGlobalFunctionComment(this, comment); } @Override public IComment editGlobalComment(final IComment comment, final String commentText) throws CouldntSaveDataException { return CommentManager.get(provider).editGlobalFunctionComment(this, comment, commentText); } @Override public IAddress getAddress() { return address; } @Override public int getBasicBlockCount() { return m_nodes == null ? 0 : m_nodes.size(); } @Override public List<? extends ICodeEdge<?>> getBasicBlockEdges() { return new ArrayList<ICodeEdge<?>>(m_edges); } @Override public List<IBlockNode> getBasicBlocks() { return new ArrayList<IBlockNode>(m_nodes); } @Override public String getDescription() { return m_description; } @Override public int getEdgeCount() { return m_edges == null ? 0 : m_edges.size(); } @Override public List<IComment> getGlobalComment() { return CommentManager.get(provider).getGlobalFunctionComment(this); } @Override public DirectedGraph<IBlockNode, IBlockEdge> getGraph() { return new DirectedGraph<IBlockNode, IBlockEdge>(m_nodes, m_edges); } @Override public int getIndegree() { return 0; } @Override public INaviModule getModule() { return module; } @Override public String getName() { return m_name; } @Override public String getOriginalModulename() { throw new IllegalStateException("Error: Not yet implemented"); } @Override public String getOriginalName() { throw new IllegalStateException("Not yet implemented"); } @Override public int getOutdegree() { return 0; } @Override public IAddress getForwardedFunctionAddress() { return resolvedFunction != null ? resolvedFunction.getAddress() : null; } @Override public int getForwardedFunctionModuleId() { return resolvedFunction != null ? resolvedFunction.getModule().getConfiguration().getId() : 0; } @Override public BaseType getStackFrame() { return stackFrame; } @Override public FunctionType getType() { return FunctionType.NORMAL; } @Override public void initializeGlobalComment(final ArrayList<IComment> comments) { CommentManager.get(provider).initializeGlobalFunctionComment(this, comments); } @Override public boolean inSameDatabase(final IDatabaseObject provider) { throw new IllegalStateException("Error: Not yet implemented"); } @Override public boolean inSameDatabase(final SQLProvider provider) { return this.provider.equals(provider); } @Override public boolean isLoaded() { return m_loaded; } @Override public boolean isOwner(final IComment comment) { return CUserManager.get(provider).getCurrentActiveUser().equals(comment.getUser()); } @Override public boolean isForwarded() { return resolvedFunction != null; } @Override public void load() { m_loaded = true; for (final IFunctionListener<IComment> listener : m_listeners) { listener.loadedFunction(this); } } @Override public void removeListener(final IFunctionListener<IComment> listener) { throw new IllegalStateException("Error: Not yet implemented"); } @Override public void setDescription(final String comment) { m_description = comment; for (final IFunctionListener<IComment> listener : m_listeners) { listener.changedDescription(this, comment); } } @Override public void setDescriptionInternal(final String description) { setDescription(description); } @Override public void setName(final String name) { m_name = name; for (final IFunctionListener<IComment> listener : m_listeners) { listener.changedName(this, name); } } @Override public void setNameInternal(final String name) { setName(name); } @Override public void setForwardedFunction(final INaviFunction function) { resolvedFunction = function; } @Override public void setForwardedFunctionInternal(final INaviFunction function) { setForwardedFunction(function); } @Override public void setStackFrame(final BaseType stackFrame) { this.stackFrame = stackFrame; } @Override public BaseType getPrototype() { return null; } @Override public void setPrototype(BaseType prototype) {} @Override public void removeForwardedFunction() throws CouldntSaveDataException { resolvedFunction = null; } @Override public void removeForwardedFunctionInternal() { resolvedFunction = null; } }