prepare('SELECT * FROM ext_sipphones LIMIT :limit OFFSET :offset'); // TODO: Implemente sorting $query->bindParam(':limit' , $limit , PDO::PARAM_INT); $query->bindParam(':offset' , $offset , PDO::PARAM_INT); $query->execute(); if ($query->errorCode() != '00000') { $error = $query->errorInfo(); throw new Exception($error[2]); } $ret = $query->fetchAll(PDO::FETCH_ASSOC); return $ret; } static function retrive($pk_extension) { $pdo = database::pdo(); $extension = extensions::retrive($pk_extension); /* Get general information about this sipphone */ $query = $pdo->prepare("SELECT * FROM ext_sipphones WHERE ext_sipphones.pk_extension=:pk_extension LIMIT 1"); $query->bindParam(':pk_extension', $pk_extension, PDO::PARAM_INT); $query->execute(); if ($query->errorCode() != '00000') { $error = $query->errorInfo(); throw new Exception($error[2]); } $ret = $query->fetch(PDO::FETCH_ASSOC); /* If we have no results at the last query, return a null array */ if (empty($ret)) { return null; } $ret = array_merge((array)$extension, $ret); /* Get the list of codecs allowed for this sipphone */ $query = $pdo->prepare("SELECT fk_codec FROM ext_sipphones_codecs WHERE fk_extension = :pk_extension"); $query->bindParam(':pk_extension', $pk_extension, PDO::PARAM_INT); $query->execute(); if ($query->errorCode() != '00000') { $error = $query->errorInfo(); throw new Exception($error[2]); } while ($result = $query->fetch(PDO::FETCH_ASSOC)) { $ret['codecs'][] = $result['fk_codec']; } /* Get the list of features available for this sipphone */ $ret['features'] = array(); $query = $pdo->prepare("SELECT fk_feature FROM ext_sipphones_features WHERE fk_extension = :pk_extension"); $query->bindParam(':pk_extension', $pk_extension, PDO::PARAM_INT); $query->execute(); if ($query->errorCode() != '00000') { $error = $query->errorInfo(); throw new Exception($error[2]); } while ($result = $query->fetch(PDO::FETCH_ASSOC)) { $ret['features'][] = $result['fk_feature']; } return $ret; } static function save($data) { $pdo = database::pdo(); /* set a flag if this is a newly created extension */ if ($data['pk_extension'] == "") { $create_new = true; } /* force type to sippphone */ $data['type'] = 'sipphone'; /* triger a save on the extensions tables */ $data['pk_extension'] = extensions::save($data); /* create a record in the ext_sipphones table if this is a newly created extension */ if ($create_new) { $query = $pdo->prepare("INSERT INTO ext_sipphones(pk_extension) VALUES(:pk_extension)"); $query->bindParam(':pk_extension', $data['pk_extension'], PDO::PARAM_INT); $query->execute(); if ($query->errorCode() != '00000') { $error = $query->errorInfo(); throw new Exception($error[2]); } } /* update the main ext_sipphones table information */ $query = $pdo->prepare(" UPDATE ext_sipphones SET firstname = :firstname, firstname_editable = :firstname_editable, lastname = :lastname, lastname_editable = :lastname_editable, password_editable = :password_editable, email = :email, email_editable = :email_editable, fk_nattype = :fk_nattype, fk_dtmfmode = :fk_dtmfmode WHERE pk_extension = :pk_extension "); $query->bindParam(':firstname' , $data['firstname'] , PDO::PARAM_STR); $query->bindParam(':firstname_editable', $data['firstname_editable'], PDO::PARAM_INT); $query->bindParam(':lastname' , $data['lastname'] , PDO::PARAM_STR); $query->bindParam(':lastname_editable' , $data['lastname_editable'] , PDO::PARAM_INT); $query->bindParam(':password_editable' , $data['password_editable'] , PDO::PARAM_INT); $query->bindParam(':email' , $data['email'] , PDO::PARAM_STR); $query->bindParam(':email_editable' , $data['email_editable'] , PDO::PARAM_INT); $query->bindParam(':fk_nattype' , $data['fk_nattype'] , PDO::PARAM_INT); $query->bindParam(':fk_dtmfmode' , $data['fk_dtmfmode'] , PDO::PARAM_INT); $query->bindParam(':pk_extension' , $data['pk_extension'] , PDO::PARAM_INT); $query->execute(); if ($query->errorCode() != '00000') { $error = $query->errorInfo(); throw new Exception($error[2]); } /* update the password for this sipphone if a password param is set */ if ($data['password']) { $query = $pdo->prepare("UPDATE ext_sipphones SET password = :password WHERE pk_extension=:pk_extension"); $query->bindValue(':password' , $data['password'] , PDO::PARAM_STR); $query->bindValue(':pk_extension', $data['pk_extension'], PDO::PARAM_INT); $query->execute(); if ($query->errorCode() != '00000') { $error = $query->errorInfo(); throw new Exception($error[2]); } /* if phone password is null, set default to voicemail password */ /* note: this usually happens when creating a new sipphone extension */ $query = $pdo->prepare("UPDATE ext_sipphones SET phonepassword=password WHERE pk_extension=:pk_extension AND phonepassword=''"); $query->bindValue(':pk_extension', $data['pk_extension'], PDO::PARAM_INT); $query->execute(); if ($query->errorCode() != '00000') { $error = $query->errorInfo(); throw new Exception($error[2]); } } /* update the phone password for this sipphone if a phonepassword is set */ if ($data['password']) { $query = $pdo->prepare("UPDATE ext_sipphones SET phonepassword = :phonepassword WHERE pk_extension=:pk_extension"); $query->bindValue(':phonepassword', $data['phonepassword'], PDO::PARAM_STR); $query->bindValue(':pk_extension' , $data['pk_extension'] , PDO::PARAM_INT); $query->execute(); if ($query->errorCode() != '00000') { $error = $query->errorInfo(); throw new Exception($error[2]); } } /* update the allowed codecs for this sipphone extension */ /* note : we updat by doing a delete all then insert new */ $query = $pdo->prepare("DELETE FROM ext_sipphones_codecs WHERE fk_extension = :pk_extension"); $query->bindValue(':pk_extension', $data['pk_extension']); $query->execute(); if ($query->errorCode() != '00000') { $error = $query->errorInfo(); throw new Exception($error[2]); } if (is_array($data['codecs'])) { foreach ($data['codecs'] as $pk_codec) { $query = $pdo->prepare("INSERT INTO ext_sipphones_codecs (fk_extension, fk_codec) VALUES (:pk_extension, :pk_codec)"); $query->bindValue(':pk_extension', $data['pk_extension'], PDO::PARAM_INT); $query->bindValue(':pk_codec' , $pk_codec , PDO::PARAM_INT); $query->execute(); if ($query->errorCode() != '00000') { $error = $query->errorInfo(); throw new Exception($error[2]); } } } /* update the allowed features for this sipphone extension */ $query = $pdo->prepare("DELETE FROM ext_sipphones_features WHERE fk_extension = :pk_extension"); $query->bindValue(':pk_extension', $data['pk_extension']); $query->execute(); if ($query->errorCode() != '00000') { $error = $query->errorInfo(); throw new Exception($error[2]); } if (is_array($data['features'])) { foreach ($data['features'] as $pk_feature) { $query = $pdo->prepare("INSERT INTO ext_sipphones_features (fk_extension, fk_feature) VALUES (:pk_extension, :pk_feature)"); $query->bindValue(':pk_extension', $data['pk_extension'], PDO::PARAM_INT); $query->bindValue(':pk_feature' , $pk_feature , PDO::PARAM_INT); $query->execute(); if ($query->errorCode() != '00000') { $error = $query->errorInfo(); throw new Exception($error[2]); } } } /* Notify the pbx about the changes */ pbx::notify_changes('ext_sipphones'); return $data['pk_extension']; } static function validate($data) { $errors = array(); if ($data['pk_extension'] == '') { $create_new = true; } /* validate first against the extensions table */ $errors = extensions::validate($data); /* check sipphone's password is empty */ if ($data['password'] == "") { if ($create_new) { $errors['password']['invalid'] = true; } /* sipphone's password must have 8 to 20 digits in length */ } elseif (!preg_match('/^[0-9]{8,20}$/', $data['password'])) { $errors['password']['invalid'] = true; /* if we have a password_retype check against it */ } elseif ($data['password_retype'] && $data['password'] != $data['password_retype']) { $errors['password']['match'] = true; } /* check if firstname has proper length */ if ((strlen($data['firstname'])<1) || (strlen($data['firstname'])>32)) { $errors['firstname']['invalid'] = true; } /* if we have a phonepassword_retype check if the passwords match */ if ($data['phonepassword_retype'] && $data['phonepassword'] != $data['phonepassword_retype']) { $errors['phonepassword']['match'] = true; } return $errors; } static function generate($fk_template) { $ret = templates::retrive($fk_template); return $ret; } static function delete($pk_extension) { $pdo = database::pdo(); /* Delete from the extensions table */ extensions::delete($pk_extension); /* Delete entry from the sipphone extensions table */ $query = $pdo->prepare("DELETE FROM ext_sipphones WHERE pk_extension = :pk_extension"); $query->bindValue(':pk_extension', $pk_extension, PDO::PARAM_INT); $query->execute(); if ($query->errorCode() != '00000') { $error = $query->errorInfo(); throw new Exception($error[2]); } /* delete the extensions from the groups that it belongs to */ $query = $pdo->prepare("DELETE FROM ext_sipphones_codecs WHERE fk_extension = :pk_extension"); $query->bindValue(':pk_extension', $pk_extension, PDO::PARAM_INT); $query->execute(); if ($query->errorCode() != '00000') { $error = $query->errorInfo(); throw new Exception($error[2]); } /* delete outgoing call rules bindings for this extension */ $query = $pdo->prepare("DELETE FROM ext_sipphones_features WHERE fk_extension = :pk_extension"); $query->bindValue(':pk_extension', $pk_extension, PDO::PARAM_INT); $query->execute(); if ($query->errorCode() != '00000') { $error = $query->errorInfo(); throw new Exception($error[2]); } /* Notify the pbx about the changes */ pbx::notify_changes('ext_sipphones'); } }