NS_IMPL_ISUPPORTS2(nsControllerCommandTable, nsIControllerCommandTable, nsISupportsWeakReference);
NS_IMPL_ISUPPORTS2(nsControllerCommandTable, nsIControllerCommandTable, nsISupportsWeakReference)
NS_NewControllerCommandTable(nsIControllerCommandTable** aResult);// this value is used to size the hash table. Just a sensible upper bound#define NUM_COMMANDS_BOUNDS       64nsControllerCommandTable::nsControllerCommandTable(): mCommandsTable(NUM_COMMANDS_BOUNDS, PR_FALSE), mMutable(PR_TRUE){}nsControllerCommandTable::~nsControllerCommandTable(){}NS_IMPL_ISUPPORTS2(nsControllerCommandTable, nsIControllerCommandTable, nsISupportsWeakReference);NS_IMETHODIMPnsControllerCommandTable::MakeImmutable(void){  mMutable = PR_FALSE;  return NS_OK;}NS_IMETHODIMPnsControllerCommandTable::RegisterCommand(const char * aCommandName, nsIControllerCommand *aCommand){  NS_ENSURE_TRUE(mMutable, NS_ERROR_FAILURE);    nsCStringKey commandKey(aCommandName);    if (mCommandsTable.Put(&commandKey, aCommand))  {#if DEBUG    NS_WARNING("Replacing existing command -- ");#endif  }    return NS_OK;}NS_IMETHODIMPnsControllerCommandTable::UnregisterCommand(const char * aCommandName, nsIControllerCommand *aCommand){  NS_ENSURE_TRUE(mMutable, NS_ERROR_FAILURE);  nsCStringKey commandKey(aCommandName);  PRBool wasRemoved = mCommandsTable.Remove(&commandKey);  return wasRemoved ? NS_OK : NS_ERROR_FAILURE;}NS_IMETHODIMPnsControllerCommandTable::FindCommandHandler(const char * aCommandName, nsIControllerCommand **outCommand){  NS_ENSURE_ARG_POINTER(outCommand);    *outCommand = NULL;    nsCStringKey commandKey(aCommandName);  nsISupports* foundCommand = mCommandsTable.Get(&commandKey);  if (!foundCommand) return NS_ERROR_FAILURE;    // no need to addref since the .Get does it for us  *outCommand = NS_REINTERPRET_CAST(nsIControllerCommand*, foundCommand);  return NS_OK;}/* boolean isCommandEnabled (in wstring command); */NS_IMETHODIMPnsControllerCommandTable::IsCommandEnabled(const char * aCommandName, nsISupports *aCommandRefCon, PRBool *aResult){  NS_ENSURE_ARG_POINTER(aResult);  *aResult = PR_FALSE;        // find the command    nsCOMPtr<nsIControllerCommand> commandHandler;  FindCommandHandler(aCommandName, getter_AddRefs(commandHandler));    if (!commandHandler)   {#if DEBUG    NS_WARNING("Controller command table asked about a command that it does not handle -- ");#endif    return NS_OK;    // we don't handle this command  }    return commandHandler->IsCommandEnabled(aCommandName, aCommandRefCon, aResult);}NS_IMETHODIMPnsControllerCommandTable::UpdateCommandState(const char * aCommandName, nsISupports *aCommandRefCon){  // find the command    nsCOMPtr<nsIControllerCommand> commandHandler;  FindCommandHandler(aCommandName, getter_AddRefs(commandHandler));    if (!commandHandler)  {#if DEBUG    NS_WARNING("Controller command table asked to update the state of a command that it does not handle -- ");#endif    return NS_OK;    // we don't handle this command  }    return NS_ERROR_NOT_IMPLEMENTED;}NS_IMETHODIMPnsControllerCommandTable::SupportsCommand(const char * aCommandName, nsISupports *aCommandRefCon, PRBool *aResult){  NS_ENSURE_ARG_POINTER(aResult);  // XXX: need to check the readonly and disabled states  *aResult = PR_FALSE;    // find the command    nsCOMPtr<nsIControllerCommand> commandHandler;  FindCommandHandler(aCommandName, getter_AddRefs(commandHandler));  *aResult = (commandHandler.get() != nsnull);  return NS_OK;}/* void doCommand (in wstring command); */NS_IMETHODIMPnsControllerCommandTable::DoCommand(const char * aCommandName, nsISupports *aCommandRefCon){  // find the command    nsCOMPtr<nsIControllerCommand> commandHandler;  FindCommandHandler(aCommandName, getter_AddRefs(commandHandler));  if (!commandHandler)  {#if DEBUG    NS_WARNING("Controller command table asked to do a command that it does not handle -- ");#endif    return NS_OK;    // we don't handle this command  }    return commandHandler->DoCommand(aCommandName, aCommandRefCon);}NS_IMETHODIMPnsControllerCommandTable::DoCommandParams(const char *aCommandName, nsICommandParams *aParams, nsISupports *aCommandRefCon){  // find the command    nsCOMPtr<nsIControllerCommand> commandHandler;  nsresult rv;  rv = FindCommandHandler(aCommandName, getter_AddRefs(commandHandler));  if (!commandHandler)  {#if DEBUG    NS_WARNING("Controller command table asked to do a command that it does not handle -- ");#endif    return NS_OK;    // we don't handle this command  }  return commandHandler->DoCommandParams(aCommandName, aParams, aCommandRefCon);}NS_IMETHODIMPnsControllerCommandTable::GetCommandState(const char *aCommandName, nsICommandParams *aParams, nsISupports *aCommandRefCon){  // find the command    nsCOMPtr<nsIControllerCommand> commandHandler;  nsresult rv;  rv = FindCommandHandler(aCommandName, getter_AddRefs(commandHandler));  if (!commandHandler)  {#if DEBUG    NS_WARNING("Controller command table asked to do a command that it does not handle -- ");#endif    return NS_OK;    // we don't handle this command  }  return commandHandler->GetCommandStateParams(aCommandName, aParams, aCommandRefCon);}nsresultNS_NewControllerCommandTable(nsIControllerCommandTable** aResult){  NS_PRECONDITION(aResult != nsnull, "null ptr");  if (! aResult)    return NS_ERROR_NULL_POINTER;  nsControllerCommandTable* newCommandTable = new nsControllerCommandTable();  if (! newCommandTable)    return NS_ERROR_OUT_OF_MEMORY;  NS_ADDREF(newCommandTable);  *aResult = newCommandTable;  return NS_OK;}