nsresult nsSHistory::CompareFrames(nsISHEntry * aPrevEntry, nsISHEntry * aNextEntry, nsIDocShell * aParent, long aLoadType, PRBool * aIsFrameFound) { if (!aPrevEntry || !aNextEntry || !aParent) return PR_FALSE; nsresult result = NS_OK; PRUint32 prevID, nextID; aPrevEntry->GetID(&prevID); aNextEntry->GetID(&nextID); // Check the IDs to verify if the pages are different. if (prevID != nextID) { if (aIsFrameFound) *aIsFrameFound = PR_TRUE; // Set the Subframe flag of the entry to indicate that // it is subframe navigation aNextEntry->SetIsSubFrame(PR_TRUE); InitiateLoad(aNextEntry, aParent, aLoadType); return NS_OK; } /* The root entries are the same, so compare any child frames */ PRInt32 pcnt=0, ncnt=0, dsCount=0; nsCOMPtr<nsISHContainer> prevContainer(do_QueryInterface(aPrevEntry)); nsCOMPtr<nsISHContainer> nextContainer(do_QueryInterface(aNextEntry)); nsCOMPtr<nsIDocShellTreeNode> dsTreeNode(do_QueryInterface(aParent)); if (!dsTreeNode) return NS_ERROR_FAILURE; if (!prevContainer || !nextContainer) return NS_ERROR_FAILURE; prevContainer->GetChildCount(&pcnt); nextContainer->GetChildCount(&ncnt); dsTreeNode->GetChildCount(&dsCount); //XXX What to do if the children count don't match for (PRInt32 i=0; i<ncnt; i++){ nsCOMPtr<nsISHEntry> pChild, nChild; nsCOMPtr<nsIDocShellTreeItem> dsTreeItemChild; prevContainer->GetChildAt(i, getter_AddRefs(pChild)); nextContainer->GetChildAt(i, getter_AddRefs(nChild)); if (dsCount > 0) dsTreeNode->GetChildAt(i, getter_AddRefs(dsTreeItemChild)); if (!dsTreeItemChild) return NS_ERROR_FAILURE; nsCOMPtr<nsIDocShell> dsChild(do_QueryInterface(dsTreeItemChild)); CompareFrames(pChild, nChild, dsChild, aLoadType, aIsFrameFound); } return result; }
// Test Autonomous void Autonomous() { robotDrive.SetSafetyEnabled(false); // STEP 1: Set all of the states. // SAFETY AND SANITY - SET ALL TO ZERO loaded = winchSwitch.Get(); loading = false; intake.Set(0.0); rightWinch.Set(0.0); leftWinch.Set(0.0); // STEP 2: Move forward to optimum shooting position Drive(-AUTO_DRIVE_SPEED, SHOT_POSN_DIST); // STEP 3: Drop the arm for a clean shot arm.Set(DoubleSolenoid::kForward); Wait(1.0); // Ken // STEP 4: Launch the catapult LaunchCatapult(); Wait (1.0); // Ken if (ds->GetDigitalIn(1)) { // STEP 5: Start the intake motor and backup to our origin position to pick up another ball InitiateLoad(); intake.Set(-INTAKE_COLLECT); while (CheckLoad()); Drive(AUTO_DRIVE_SPEED, SHOT_POSN_DIST); Wait(1.0); // For the ball to collect // STEP 6: Shut off the intake, bring up the arm and move to shooting position intake.Set(0.0); arm.Set(DoubleSolenoid::kReverse); Wait (1.0); // "Settle down" Drive(-AUTO_DRIVE_SPEED, SHOT_POSN_DIST); // Step 7: drop the arm for a clean shot and shoot arm.Set(DoubleSolenoid::kForward); Drive(AUTO_DRIVE_SPEED, SHOT_POSN_DIST); // UNTESTED KICKED OFF FIELD Wait(1.0); // For arm to go down LaunchCatapult(); } // Get us fully into the zone for 5 points Drive(-AUTO_DRIVE_SPEED, INTO_ZONE_DIST - SHOT_POSN_DIST); // SAFETY AND SANITY - SET ALL TO ZERO intake.Set(0.0); rightWinch.Set(0.0); leftWinch.Set(0.0); }
// HandleShooter // * Manage winch motor state. // * Toggles collection and eject mode (Gamepad button 4) // ----> ASSUMES positive values = collecting void HandleShooter() { if (gamepad.GetEvent(BUTTON_LOAD) == kEventClosed) { InitiateLoad(); } if (loading) { CheckLoad(); } if (gamepad.GetEvent(BUTTON_SHOOT) == kEventClosed) { LaunchCatapult(); } }
NS_IMETHODIMP nsSHistory::LoadEntry(PRInt32 aIndex, long aLoadType, PRUint32 aHistCmd) { nsCOMPtr<nsIDocShell> docShell; nsCOMPtr<nsISHEntry> shEntry; // Keep note of requested history index in mRequestedIndex. mRequestedIndex = aIndex; nsCOMPtr<nsISHEntry> prevEntry; GetEntryAtIndex(mIndex, PR_FALSE, getter_AddRefs(prevEntry)); nsCOMPtr<nsISHEntry> nextEntry; GetEntryAtIndex(mRequestedIndex, PR_FALSE, getter_AddRefs(nextEntry)); nsCOMPtr<nsIHistoryEntry> nHEntry(do_QueryInterface(nextEntry)); if (!nextEntry || !prevEntry || !nHEntry) { mRequestedIndex = -1; return NS_ERROR_FAILURE; } // Send appropriate listener notifications PRBool canNavigate = PR_TRUE; // Get the uri for the entry we are about to visit nsCOMPtr<nsIURI> nextURI; nHEntry->GetURI(getter_AddRefs(nextURI)); if(mListener) { nsCOMPtr<nsISHistoryListener> listener(do_QueryReferent(mListener)); if (listener) { if (aHistCmd == HIST_CMD_BACK) { // We are going back one entry. Send GoBack notifications listener->OnHistoryGoBack(nextURI, &canNavigate); } else if (aHistCmd == HIST_CMD_FORWARD) { // We are going forward. Send GoForward notification listener->OnHistoryGoForward(nextURI, &canNavigate); } else if (aHistCmd == HIST_CMD_GOTOINDEX) { // We are going somewhere else. This is not reload either listener->OnHistoryGotoIndex(aIndex, nextURI, &canNavigate); } } } if (!canNavigate) { // If the listener asked us not to proceed with // the operation, simply return. return NS_OK; // XXX Maybe I can return some other error code? } nsCOMPtr<nsIURI> nexturi; PRInt32 pCount=0, nCount=0; nsCOMPtr<nsISHContainer> prevAsContainer(do_QueryInterface(prevEntry)); nsCOMPtr<nsISHContainer> nextAsContainer(do_QueryInterface(nextEntry)); if (prevAsContainer && nextAsContainer) { prevAsContainer->GetChildCount(&pCount); nextAsContainer->GetChildCount(&nCount); } nsCOMPtr<nsIDocShellLoadInfo> loadInfo; if (mRequestedIndex == mIndex) { // Possibly a reload case docShell = mRootDocShell; } else { // Going back or forward. if ((pCount > 0) && (nCount > 0)) { /* THis is a subframe navigation. Go find * the docshell in which load should happen */ PRBool frameFound = PR_FALSE; nsresult rv = CompareFrames(prevEntry, nextEntry, mRootDocShell, aLoadType, &frameFound); if (!frameFound) { // we did not successfully find the subframe in which // the new url was to be loaded. return error. mRequestedIndex = -1; return NS_ERROR_FAILURE; } return rv; } // (pCount >0) else docShell = mRootDocShell; } if (!docShell) { // we did not successfully go to the proper index. // return error. mRequestedIndex = -1; return NS_ERROR_FAILURE; } // Start the load on the appropriate docshell return InitiateLoad(nextEntry, docShell, aLoadType); }