Example #1
0
//
// Stores the targets that have been selected by the user with the appropriate
// worker.
//
void CPageDisk::StoreTargetSelection()
{
    HTREEITEM hdisk;
    Manager *manager;
    Worker *worker;
    int target = 0;
    int next_worker;

    // Get the selected manager and worker.
    manager = theApp.pView->m_pWorkerView->GetSelectedManager();
    worker = theApp.pView->m_pWorkerView->GetSelectedWorker();

    // Make sure we have a selected manager (or worker).
    if (!manager) {
        ErrorMessage("Unexpectedly found no selected manager in " "CPageDisk::StoreTargetSelection.");
        return;
    }

    if (worker) {
        // Assign the targets to the selected worker in the order that they
        // appear in the GUI.
        worker->RemoveTargets(GenericDiskType);
        for (hdisk = m_TTargets.GetRootItem(); hdisk; hdisk = m_TTargets.GetNextSiblingItem(hdisk)) {
            if (GetSelectionCheck(hdisk) == TargetChecked)
                worker->AddTarget(manager->GetInterface(target, GenericDiskType));
            target++;
        }
    } else {
        // Clear the assigned targets from all the manager's workers.
        manager->RemoveTargets(GenericDiskType);

        // Set the first worker to receive targets.
        worker = manager->GetWorker(0, GenericDiskType);
        next_worker = 0;

        // Assign the targets to the workers of the selected manager.
        for (hdisk = m_TTargets.GetRootItem(); hdisk; hdisk = m_TTargets.GetNextSiblingItem(hdisk)) {
            // If the disk is selected in the GUI, assign it to the expected
            // worker.
            if (GetSelectionCheck(hdisk) == TargetChecked) {
                worker->AddTarget(manager->GetInterface(target, GenericDiskType));

                // Update who the next worker to receive a target is.
                if (++next_worker >= manager->WorkerCount(GenericDiskType))
                    next_worker = 0;
                worker = manager->GetWorker(next_worker, GenericDiskType);
            }
            target++;
        }
    }
    ShowTargetSelection();
}
void CPageNetwork::StoreTargetSelection()
{
	HTREEITEM hmgr, hifc;
	Manager *manager;
	Worker *worker;
	Target_Spec new_target;
	int local_interface_no;
	int interface_no;
	int target_count = 0;
	int expected_worker = 0;

	// Make sure we have a selected manager (or worker).
	manager = theApp.pView->m_pWorkerView->GetSelectedManager();
	if (!manager) {
		ErrorMessage("Unexpectedly found no selected manager in " "CPageNetwork::StoreTargetSelection.");
		return;
	}
	// Count the number of assigned targets.
	for (hmgr = m_TTargets.GetRootItem(); hmgr; hmgr = m_TTargets.GetNextSiblingItem(hmgr)) {
		for (hifc = m_TTargets.GetChildItem(hmgr); hifc; hifc = m_TTargets.GetNextSiblingItem(hifc)) {
			if (GetSelectionCheck(hifc) == TargetChecked)
				target_count++;
		}
	}

	// Make sure we are not assigning more targets than we have workers.
	if (target_count > manager->WorkerCount(GenericServerType)) {
		ErrorMessage("You do not have enough network workers to assign all " "the selected targets.");
		// Restore the last selection.
		ShowTargetSelection();
		// Set the focus to the target list.
		::SetFocus(m_TTargets);
		return;
	}
	// The selection will succeed.  Remove current network clients.
	if (worker = theApp.pView->m_pWorkerView->GetSelectedWorker())
		worker->RemoveTargets(GenericNetType);
	else
		manager->RemoveTargets(GenericNetType);

	// Get the assigned local interface to use for the connection.
	local_interface_no = m_DInterface.GetCurSel();

	// Assign the targets.
	// Loop through all managers.
	for (hmgr = m_TTargets.GetRootItem(); hmgr; hmgr = m_TTargets.GetNextSiblingItem(hmgr)) {
		// Loop through all interfaces of a manager.
		interface_no = 0;
		for (hifc = m_TTargets.GetChildItem(hmgr); hifc; hifc = m_TTargets.GetNextSiblingItem(hifc)) {
			if (GetSelectionCheck(hifc) == TargetChecked) {
				// Are we dealing with a worker or a manager?
				if (!worker) {
					// A manager is selected.  Get the next available 
					// network server worker.
					worker = manager->GetWorker(expected_worker++, GenericServerType);

				}
				// Get the interface of the selected target from the manager
				// whose interface is selected.
				memcpy(&new_target,
				       ((Manager *) m_TTargets.GetItemData(hmgr))->GetInterface(interface_no,
												GenericNetType),
				       sizeof(Target_Spec));

				// Set the local and remote addresses of the connection.
				// The remote address used by the server is stored as the local
				// address for some manager's interface.
				if (IsType(new_target.type, TCPClientType)) {
					strcpy(new_target.tcp_info.remote_address, new_target.name);

					// Verify that the locally assigned interface matches the
					// selected target's interface.
					if (local_interface_no >= manager->InterfaceCount(GenericTCPType)) {
						// Use the first TCP interface.
						local_interface_no = 0;
						m_DInterface.SetCurSel(local_interface_no);
					}
				} else if (IsType(new_target.type, VIClientType)) {
					strcpy(new_target.vi_info.remote_nic_name, new_target.name);
					memcpy(&new_target.vi_info.remote_address,
					       &new_target.vi_info.local_address, VI_ADDRESS_SIZE);

					// Verify that the locally assigned interface matches the
					// selected target's interface.
					if (local_interface_no <= manager->InterfaceCount(GenericTCPType)) {
						// Use the first VI interface.
						local_interface_no = manager->InterfaceCount(GenericTCPType);
						m_DInterface.SetCurSel(local_interface_no);
					}
				} else {
					ErrorMessage("Invalid target type for new target in "
						     "CPageNetwork::StoreTargetSelection().");
				}
				worker->AddTarget(&new_target);

				// Record information about what local interface the server
				// should use.
				worker->SetLocalNetworkInterface(local_interface_no);

				// Create the corresponding network client.
				worker->CreateNetClient((Manager *)
							m_TTargets.GetItemData(hmgr), new_target.type);

				// Clear the worker pointer so that the next iteration
				// through the loop (for a manager with multiple selected
				// interfaces) will get the next available network server.
				worker = NULL;
			}
			interface_no++;
		}
	}
}