function transferDirectConnection($itemtype, $ID, $link_type)
{
global $DB;
// Only same Item case : no duplication of computers
// Default : delete
$keep = 0;
$clean = 0;
switch ($link_type) {
case 'Printer':
$keep = $this->options['keep_dc_printer'];
$clean = $this->options['clean_dc_printer'];
break;
case 'Monitor':
$keep = $this->options['keep_dc_monitor'];
$clean = $this->options['clean_dc_monitor'];
break;
case 'Peripheral':
$keep = $this->options['keep_dc_peripheral'];
$clean = $this->options['clean_dc_peripheral'];
break;
case 'Phone':
$keep = $this->options['keep_dc_phone'];
$clean = $this->options['clean_dc_phone'];
break;
}
if (!($link_item = getItemForItemtype($link_type))) {
return;
}
// Get connections
$query = "SELECT *\n FROM `glpi_computers_items`\n WHERE `computers_id` = '{$ID}'\n AND `itemtype` = '" . $link_type . "'";
if ($link_item->maybeRecursive()) {
$query .= " AND `items_id` NOT IN " . $this->item_recurs[$link_type];
}
if ($result = $DB->query($query)) {
if ($DB->numrows($result) != 0) {
// Foreach get item
while ($data = $DB->fetch_assoc($result)) {
$item_ID = $data['items_id'];
if ($link_item->getFromDB($item_ID)) {
// If global :
if ($link_item->fields['is_global'] == 1) {
$need_clean_process = false;
// if keep
if ($keep) {
$newID = -1;
// Is already transfer ?
if (isset($this->already_transfer[$link_type][$item_ID])) {
$newID = $this->already_transfer[$link_type][$item_ID];
// Already transfer as a copy : need clean process
if ($newID != $item_ID) {
$need_clean_process = true;
}
} else {
// Not yet tranfer
// Can be managed like a non global one ?
// = all linked computers need to be transfer (so not copy)
$query = "SELECT COUNT(*) AS cpt\n FROM `glpi_computers_items`\n WHERE `itemtype` = '" . $link_type . "'\n AND `items_id` = '{$item_ID}'\n AND `computers_id`\n NOT IN " . $this->item_search['Computer'];
$result_search = $DB->query($query);
// All linked computers need to be transfer -> use unique transfer system
if ($DB->result($result_search, 0, 'cpt') == 0) {
$need_clean_process = false;
$this->transferItem($link_type, $item_ID, $item_ID);
$newID = $item_ID;
} else {
// else Transfer by Copy
$need_clean_process = true;
// Is existing global item in the destination entity ?
$query = "SELECT *\n FROM `" . getTableForItemType($link_type) . "`\n WHERE `is_global` = '1'\n AND `entities_id` = '" . $this->to . "'\n AND `name`\n = '" . addslashes($link_item->getField('name')) . "'";
if ($result_search = $DB->query($query)) {
if ($DB->numrows($result_search) > 0) {
$newID = $DB->result($result_search, 0, 'id');
$this->addToAlreadyTransfer($link_type, $item_ID, $newID);
}
}
// Not found -> transfer copy
if ($newID < 0) {
// 1 - create new item
unset($link_item->fields['id']);
$input = $link_item->fields;
$input['entities_id'] = $this->to;
unset($link_item->fields);
$newID = $link_item->add(toolbox::addslashes_deep($input));
// 2 - transfer as copy
$this->transferItem($link_type, $item_ID, $newID);
}
// Founded -> use to link : nothing to do
}
}
// Finish updated link if needed
if ($newID > 0 && $newID != $item_ID) {
$query = "UPDATE `glpi_computers_items`\n SET `items_id` = '{$newID}'\n WHERE `id` = '" . $data['id'] . "' ";
$DB->query($query);
}
} else {
// Else delete link
// Call Disconnect for global device (no disconnect behavior, but history )
$conn = new Computer_Item();
$conn->delete(array('id' => $data['id'], '_no_auto_action' => true));
$need_clean_process = true;
}
// If clean and not linked dc -> delete
if ($need_clean_process && $clean) {
$query = "SELECT COUNT(*) AS cpt\n FROM `glpi_computers_items`\n WHERE `items_id` = '{$item_ID}'\n AND `itemtype` = '" . $link_type . "'";
if ($result_dc = $DB->query($query)) {
if ($DB->result($result_dc, 0, 'cpt') == 0) {
if ($clean == 1) {
$link_item->delete(array('id' => $item_ID));
}
if ($clean == 2) {
// purge
$link_item->delete(array('id' => $item_ID), 1);
}
}
}
}
} else {
// If unique :
//if keep -> transfer list else unlink
if ($keep) {
$this->transferItem($link_type, $item_ID, $item_ID);
} else {
// Else delete link (apply disconnect behavior)
$conn = new Computer_Item();
$conn->delete(array('id' => $data['id']));
//if clean -> delete
if ($clean == 1) {
$link_item->delete(array('id' => $item_ID));
} else {
if ($clean == 2) {
// purge
$link_item->delete(array('id' => $item_ID), 1);
}
}
}
}
} else {
// Unexisting item / Force disconnect
$conn = new Computer_Item();
$conn->delete(array('id' => $data['id'], '_no_history' => true, '_no_auto_action' => true));
}
}
}
}
}