iAppId = $oRow->appId; $this->iVendorId = $oRow->vendorId; $this->iCatId = $oRow->catId; $this->iSubmitterId = $oRow->submitterId; $this->sSubmitTime = $oRow->submitTime; $this->sName = $oRow->appName; $this->sKeywords = $oRow->keywords; $this->sDescription = $oRow->description; //TODO: we should move the url to the appData table // and return an id into the appData table here $this->sWebpage = Url::normalize($oRow->webPage); $this->sQueued = $oRow->queued; } /* fetch versions of this application, if there are any */ $this->aVersionsIds = array(); /* only admins can view all versions */ //FIXME: it would be nice to move this permission into the user class as well as keep it generic if($_SESSION['current']->hasPriv("admin")) { $hResult = $this->_internal_retrieve_all_versions(); } else { $hResult = $this->_internal_retrieve_unqueued_versions(); } if($hResult) { while($oRow = mysql_fetch_object($hResult)) { $this->aVersionsIds[] = $oRow->versionId; } } } function _internal_retrieve_all_versions() { $sQuery = "SELECT versionId FROM appVersion WHERE appId = '?'"; $hResult = query_parameters($sQuery, $this->iAppId); return $hResult; } function _internal_retrieve_unqueued_versions() { $sQuery = "SELECT versionId FROM appVersion WHERE queued = 'false' AND appId = '?'"; $hResult = query_parameters($sQuery, $this->iAppId); return $hResult; } /** * Creates a new application. */ function create() { if(!$_SESSION['current']->canCreateApplication()) return; $hResult = query_parameters("INSERT INTO appFamily (appName, description, keywords, ". "webPage, vendorId, catId, submitterId, queued) VALUES (". "'?', '?', '?', '?', '?', '?', '?', '?')", $this->sName, $this->sDescription, $this->sKeywords, $this->sWebpage, $this->iVendorId, $this->iCatId, $_SESSION['current']->iUserId, $this->mustBeQueued() ? "true" : "false"); if($hResult) { $this->iAppId = mysql_insert_id(); $this->application($this->iAppId); $this->SendNotificationMail(); // Only administrators will be mailed as no supermaintainers exist for this app. /* Submit super maintainer request if asked to */ if($this->iMaintainerRequest == SUPERMAINTAINER_REQUEST) { $oMaintainer = new Maintainer(); $oMaintainer->iAppId = $this->iAppId; $oMaintainer->iUserId = $_SESSION['current']->iUserId; $oMaintainer->sMaintainReason = "This user submitted the application; auto-queued."; $oMaintainer->bSuperMaintainer = 1; $oMaintainer->create(); } return true; } else { addmsg("Error while creating a new application.", "red"); return false; } } /** * Update application. * Returns true on success and false on failure. */ function update($bSilent=false) { $sWhatChanged = ""; /* if the user doesn't have permission to modify this application, don't let them */ if(!$_SESSION['current']->canModifyApplication($this)) return; /* create an instance of ourselves so we can see what has changed */ $oApp = new Application($this->iAppId); if ($this->sName && ($this->sName!=$oApp->sName)) { if (!query_parameters("UPDATE appFamily SET appName = '?' WHERE appId = '?'", $this->sName, $this->iAppId)) return false; $sWhatChanged .= "Name was changed from ".$oApp->sName." to ".$this->sName.".\n\n"; } if ($this->sDescription && ($this->sDescription!=$oApp->sDescription)) { if (!query_parameters("UPDATE appFamily SET description = '?' WHERE appId = '?'", $this->sDescription, $this->iAppId)) return false; $sWhatChanged .= "Description was changed from\n ".$oApp->sDescription."\n to \n".$this->sDescription.".\n\n"; } if ($this->sKeywords && ($this->sKeywords!=$oApp->sKeywords)) { if (!query_parameters("UPDATE appFamily SET keywords = '?' WHERE appId = '?'", $this->sKeywords, $this->iAppId)) return false; $sWhatChanged .= "Keywords were changed from\n ".$oApp->sKeywords."\n to \n".$this->sKeywords.".\n\n"; } if ($this->sWebpage && ($this->sWebpage!=$oApp->sWebpage)) { if (!query_parameters("UPDATE appFamily SET webPage = '?' WHERE appId = '?'", $this->sWebpage, $this->iAppId)) return false; $sWhatChanged .= "Web page was changed from ".$oApp->sWebpage." to ".$this->sWebpage.".\n\n"; } if ($this->iVendorId && ($this->iVendorId!=$oApp->iVendorId)) { if (!query_parameters("UPDATE appFamily SET vendorId = '?' WHERE appId = '?'", $this->iVendorId, $this->iAppId)) return false; $oVendorBefore = new Vendor($oApp->iVendorId); $oVendorAfter = new Vendor($this->iVendorId); $sWhatChanged .= "Vendor was changed from ".$oVendorBefore->sName." to ".$oVendorAfter->sName.".\n\n"; } if ($this->iCatId && ($this->iCatId!=$oApp->iCatId)) { if (!query_parameters("UPDATE appFamily SET catId = '?' WHERE appId = '?'", $this->iCatId, $this->iAppId)) return false; $oCatBefore = new Category($oApp->iCatId); $oCatAfter = new Category($this->iCatId); $sWhatChanged .= "Category was changed from ".$oCatBefore->sName." to ".$oCatAfter->sName.".\n\n"; } if($sWhatChanged and !$bSilent) $this->SendNotificationMail("edit",$sWhatChanged); return true; } /** * Deletes the application from the database. * and request the deletion of linked elements. */ function delete($bSilent=false) { /* make sure the current user has the appropriate permission to delete this application */ if(!$_SESSION['current']->canDeleteApplication($this)) return false; /* we have to retrieve the versions again here because */ /* new ones could have been added since this application */ /* object was created */ //FIXME: how to deal with concurrency issues such as // if a new version was added during this deletion? $hResult = $this->_internal_retrieve_all_versions(); while($oRow = mysql_fetch_object($hResult)) { $iVersionId = $oRow->versionId; $oVersion = new Version($iVersionId); $oVersion->delete($bSilent); } /* fetch urlsIds */ $aUrlsIds = array(); $sQuery = "SELECT id FROM appData WHERE type = 'url' AND appId = '?'"; if($hResult = query_parameters($sQuery, $this->iAppId)) { while($oRow = mysql_fetch_object($hResult)) { $aUrlsIds[] = $oRow->id; } } foreach($aUrlsIds as $iUrlId) { $oUrl = new Url($iUrlId); $oUrl->delete($bSilent); } // remove any supermaintainers for this application so we don't orphan them $hResult = Maintainer::deleteMaintainersForApplication($this); if(!$hResult) { addmsg("Error removing app maintainers for the deleted application!", "red"); } $sQuery = "DELETE FROM appFamily WHERE appId = '?' LIMIT 1"; if(!($hResult = query_parameters($sQuery, $this->iAppId))) { addmsg("Error deleting application!", "red"); } if(!$bSilent) $this->SendNotificationMail("delete"); return true; } /** * Move application out of the queue. */ function unQueue() { if(!$_SESSION['current']->canUnQueueApplication()) return; if(query_parameters("UPDATE appFamily SET queued = '?', keywords = '?' WHERE appId = '?'", "false", str_replace(" *** ","",$this->sKeywords), $this->iAppId)) { $this->sQueued = 'false'; // we send an e-mail to interested people $this->mailSubmitter(); $this->SendNotificationMail(); /* Unqueue matching super maintainer request */ $hResultMaint = query_parameters("SELECT maintainerId FROM appMaintainers WHERE userId = '?' AND appId = '?'", $this->iSubmitterId, $this->iAppId); if($hResultMaint && mysql_num_rows($hResultMaint)) { $oMaintainerRow = mysql_fetch_object($hResultMaint); $oMaintainer = new Maintainer($oMaintainerRow->maintainerId); $oMaintainer->unQueue("OK"); } } } function Reject() { if(!$_SESSION['current']->canRejectApplication($this)) return; // If we are not in the queue, we can't move the application out of the queue. if(!$this->sQueued == 'true') return false; if(query_parameters("UPDATE appFamily SET queued = '?' WHERE appId = '?'", "rejected", $this->iAppId)) { $this->sQueued = 'rejected'; // we send an e-mail to interested people $this->mailSubmitter("reject"); $this->SendNotificationMail("reject"); // the application has been rejected addmsg("The application has been rejected.", "green"); } } function ReQueue() { if(!$_SESSION['current']->canRequeueApplication($this)) return false; if(query_parameters("UPDATE appFamily SET queued = '?' WHERE appId = '?'", "true", $this->iAppId)) { $this->sQueued = 'true'; // we send an e-mail to interested people $this->SendNotificationMail(); // the application has been re-queued addmsg("The application has been re-queued.", "green"); } } function mailSubmitter($sAction="add") { global $aClean; if(!isset($aClean['sReplyText'])) $aClean['sReplyText'] = ""; if($this->iSubmitterId) { $oSubmitter = new User($this->iSubmitterId); switch($sAction) { case "add": $sSubject = "Submitted application accepted"; $sMsg = "The application you submitted (".$this->sName.") has been accepted by ".$_SESSION['current']->sRealname.".\n"; $sMsg .= "Administrator's Response:\n"; break; case "reject": $sSubject = "Submitted application rejected"; $sMsg = "The application you submitted (".$this->sName.") has been rejected by ".$_SESSION['current']->sRealname."."; $sMsg .= "Clicking on the link in this email will allow you to modify and resubmit the application. "; $sMsg .= "A link to your queue of applications and versions will also show up on the left hand side of the Appdb site once you have logged in. "; $sMsg .= APPDB_ROOT."objectManager.php?sClass=application_queue". "&bIsQueue=true&bIsRejected=true&iId=".$this->iAppId."&sTitle=". "Edit+Application\n"; $sMsg .= "Reason given:\n"; break; case "delete": $sSubject = "Submitted application deleted"; $sMsg = "The application you submitted (".$this->sName.") has been deleted by ".$_SESSION['current']->sRealname."."; $sMsg .= "Reason given:\n"; break; } $sMsg .= $aClean['sReplyText']."\n"; $sMsg .= "We appreciate your help in making the Application Database better for all users."; mail_appdb($oSubmitter->sEmail, $sSubject ,$sMsg); } } function countWithRating($sRating) { $sQuery = "SELECT DISTINCT count(appId) as total FROM appVersion WHERE maintainer_rating = '?' AND queued='false'"; if($hResult = query_parameters($sQuery, $sRating)) { $oRow = mysql_fetch_object($hResult); } return $oRow->total; } function getWithRating($sRating, $iOffset, $iItemsPerPage) { $aApps = array(); $sQuery = "SELECT DISTINCT appId FROM appVersion WHERE maintainer_rating = '?' AND queued = 'false' ORDER BY appId ASC LIMIT ?, ?"; if($hResult = query_parameters($sQuery, $sRating, $iOffset, $iItemsPerPage)) { while($aRow = mysql_fetch_row($hResult)) { array_push($aApps, $aRow[0]); } } return $aApps; } function SendNotificationMail($sAction="add",$sMsg=null) { global $aClean; if(!isset($aClean['sReplyText'])) $aClean['sReplyText'] = ""; switch($sAction) { case "add": if($this->sQueued == 'false') // Has been accepted. { $sSubject = $this->sName." has been added by ".$_SESSION['current']->sRealname; $sMsg = $this->objectMakeUrl()."\n"; if($this->iSubmitterId) { $oSubmitter = new User($this->iSubmitterId); $sMsg .= "This application has been submitted by ".$oSubmitter->sRealname."."; $sMsg .= "\n"; } if($aClean['sReplyText']) { $sMsg .= "Appdb admin reply text:\n"; $sMsg .= $aClean['sReplyText']."\n"; // append the reply text, if there is any } addmsg("The application was successfully added into the database.", "green"); } else { $sSubject = $this->sName." has been submitted by ".$_SESSION['current']->sRealname; $sMsg .= "This application has been queued."; $sMsg .= "\n"; addmsg("The application you submitted will be added to the database after being reviewed.", "green"); } break; case "edit": $sSubject = $this->sName." has been modified by ".$_SESSION['current']->sRealname; $sMsg .= $this->objectMakeUrl()."\n"; addmsg("Application modified.", "green"); break; case "delete": $sSubject = $this->sName." has been deleted by ".$_SESSION['current']->sRealname; // if sReplyText is set we should report the reason the application was deleted if($aClean['sReplyText']) { $sMsg .= "Reason given:\n"; $sMsg .= $aClean['sReplyText']."\n"; // append the reply text, if there is any } addmsg("Application deleted.", "green"); break; case "reject": $sSubject = $this->sName." has been rejected by ".$_SESSION['current']->sRealname; $sMsg .= APPDB_ROOT."objectManager.php?sClass=application_queue". "&bIsQueue=true&bIsRejected=true&iId=".$this->iAppId."&sTitle=". "Edit+Application\n"; // if sReplyText is set we should report the reason the application was rejected if($aClean['sReplyText']) { $sMsg .= "Reason given:\n"; $sMsg .= $aClean['sReplyText']."\n"; // append the reply text, if there is any } addmsg("Application rejected.", "green"); break; } $sEmail = User::get_notify_email_address_list($this->iAppId); if($sEmail) mail_appdb($sEmail, $sSubject ,$sMsg); } /* output a html table and this applications values to the fields for editing */ function outputEditor($sVendorName = "") { HtmlAreaLoaderScript(array("app_editor")); echo ''; /* Used to distinguish between the first step of entering an application name and the full editor displayed here */ echo ''."\n"; echo html_frame_start("Application Form", "90%", "", 0); echo "\n"; echo '',"\n"; echo '',"\n"; // app Category $w = new TableVE("view"); echo '',"\n"; // vendor name echo '',"\n"; echo '',"\n"; // alt vendor $x = new TableVE("view"); echo '',"\n"; // url echo '',"\n"; echo '',"\n"; echo '',"\n"; echo '',"\n"; echo '',"\n"; echo '',"\n"; // Allow user to apply as super maintainer if this is a new app if(!$this->iAppId) { $sMaintainerOptions = "". "I would not like to become a maintainer
\n". "". "I would like to be a maintainer of the new version only
\n". "". "I would like to be a maintainer of the entire application
\n"; $sMaintainerOptionsSelected = str_replace( "value=\"$this->iMaintainerRequest\"", "value=\"$this->iMaintainerRequest\" checked=\"checked\"", $sMaintainerOptions); echo html_tr(array( array("Maintainer options", "class=\"color0\""), $sMaintainerOptionsSelected), "", "valign=\"top\""); } echo "
Application name
Category',"\n"; echo $w->make_option_list("iAppCatId", $this->iCatId,"appCategory","catId","catName"); echo '
VendorIf it is not on the list please add it using the form below
 ',"\n"; echo $x->make_option_list("iAppVendorId", $this->iVendorId,"vendor","vendorId","vendorName", array("vendor.queued", "false")); echo '
URL
Keywords
Application description

\n"; echo html_frame_end(); } function CheckOutputEditorInput($aValues) { $errors = ""; if (empty($aValues['iAppCatId'])) $errors .= "
  • Please enter a category for your application.
  • \n"; if (strlen($aValues['sAppName']) > 200 ) $errors .= "
  • Your application name is too long.
  • \n"; if (empty($aValues['sAppName'])) $errors .= "
  • Please enter an application name.
  • \n"; // No vendor entered, and nothing in the list is selected if (empty($aValues['sVendorName']) && !$aValues['iAppVendorId']) $errors .= "
  • Please enter a vendor.
  • \n"; if (empty($aValues['shAppDescription'])) $errors .= "
  • Please enter a description of your application.
  • \n"; return $errors; } /* retrieves values from $aValues that were output by outputEditor() */ /* $aValues can be $_REQUEST or any array with the values from outputEditor() */ function GetOutputEditorValues($aValues) { $this->iAppId = $aValues['iAppId']; $this->sName = $aValues['sAppName']; $this->sDescription = $aValues['shAppDescription']; $this->iCatId = $aValues['iAppCatId']; $this->iVendorId = $aValues['iAppVendorId']; $this->sWebpage = $aValues['sAppWebpage']; $this->sKeywords = $aValues['sAppKeywords']; $this->iMaintainerRequest = $aValues['iMaintainerRequest']; } /* display this application */ function display() { /* is this user supposed to view this version? */ if(!$_SESSION['current']->canViewApplication($this)) util_show_error_page_and_exit("Something went wrong with the application or version id"); // header apidb_header("Viewing App - ".$this->sName); // cat display $oCategory = new Category($this->iCatId); $oCategory->display($this->iAppId); // set Vendor $oVendor = new Vendor($this->iVendorId); // set URL $appLinkURL = ($this->sWebpage) ? "sWebpage."\">".substr(stripslashes($this->sWebpage),0,30)."": " "; // start display application echo html_frame_start("","98%","",0); echo "\n"; echo " \n"; echo " \n"; echo " \n"; echo "
    \n"; echo ' ',"\n"; echo " \n"; echo " \n"; // main URL echo " \n"; // optional links if($sUrls = url::display(NULL, $this->iAppId)) echo $sUrls; // image $img = Screenshot::get_random_screenshot_img($this->iAppId, null, false); echo "\n"; echo "
    Name ".$this->sName."
    Vendor ". $oVendor->objectMakeLink()." \n"; echo "
    URL".$appLinkURL."
    $img
    \n"; /* close of name/vendor/bugs/url table */ echo "
    \n"; // Display all supermaintainers maintainers of this application echo " \n"; echo " \n"; $other_maintainers = Maintainer::getSuperMaintainersUserIdsFromAppId($this->iAppId); if($other_maintainers) { echo " \n"; } else { echo " \n"; } // Display the app maintainer button echo ' \n"; echo "
    Super maintainers:
      \n"; while(list($index, $userIdValue) = each($other_maintainers)) { $oUser = new User($userIdValue); echo "
    • ".$oUser->objectMakeLink()."
    • \n"; } echo "
    No maintainers.Volunteer today!
    '; if($_SESSION['current']->isLoggedIn()) { /* are we already a maintainer? */ if($_SESSION['current']->isSuperMaintainer($this->iAppId)) /* yep */ { echo '
    '; } else /* nope */ { echo ' '; } echo " iAppId."\">"; echo " "; /* set superMaintainer to 1 because we are at the appFamily level */ echo "
    "; if($_SESSION['current']->isSuperMaintainer($this->iAppId) || $_SESSION['current']->hasPriv("admin")) { echo '
    '; } if($_SESSION['current']->isLoggedIn()) { echo '
    '; echo ''; echo '
    '; } if($_SESSION['current']->hasPriv("admin")) { $url = BASE."admin/deleteAny.php?sWhat=appFamily&iAppId=".$this->iAppId."&sConfirmed=yes"; echo "
    "; echo '
    '; } } else { echo '
    '; } echo "
    \n"; /* close of super maintainers table */ echo "
    \n"; /* close the table that contains the whole left hand side of the upper table */ // description echo " \n"; echo "
    \n"; echo "\t
    \n"; echo "\t\tDescription\n"; echo "\t
    \n"; // close the 'title_class' div echo "\t
    \n"; echo "\t\t".$this->sDescription."\n"; echo "\t
    \n"; // close the 'info_contents' div echo "
    \n"; // close the 'info_container' div echo html_frame_end("For more details and user comments, view the versions of this application."); // display versions Version::display_approved($this->aVersionsIds); // display bundle display_bundle($this->iAppId); } function lookup_name($appId) { if(!$appId) return null; $result = query_parameters("SELECT appName FROM appFamily WHERE appId = '?'", $appId); if(!$result || mysql_num_rows($result) != 1) return null; $ob = mysql_fetch_object($result); return $ob->appName; } /* List applications submitted by a given user */ function listSubmittedBy($iUserId, $bQueued = true) { $hResult = query_parameters("SELECT appId, appName, vendorId, description, submitTime FROM appFamily WHERE submitterId = '?' AND queued = '?' ORDER BY appId", $iUserId, $bQueued ? "true" : "false"); if(!$hResult || !mysql_num_rows($hResult)) return false; $oTable = new Table(); $oTable->SetWidth("100%"); $oTable->SetAlign("center"); $oTableRow = new TableRow(); $oTableRow->AddTextCell("Application"); $oTableRow->AddTextCell("Description"); $oTableRow->AddTextCell("Vendor"); $oTableRow->AddTextCell("Submission Date"); $oTableRow->SetClass("color4"); $oTable->SetHeader($oTableRow); for($i = 1; $oRow = mysql_fetch_object($hResult); $i++) { $oVendor = new vendor($oRow->vendorId); $oApp = new application($oRow->appId); $oTableRow = new TableRow(); $oTableRow->AddTextCell($oApp->objectMakeLink()); $oTableRow->AddTextCell($oRow->description); $oTableRow->AddTextCell($oVendor->objectMakeLink()); $oTableRow->AddTextCell(print_date(mysqltimestamp_to_unixtimestamp($oRow->submitTime))); $oTableRow->SetClass(($i % 2) ? "color0" : "color1"); $oTable->AddRow($oTableRow); } return $oTable->GetString(); } function objectMakeUrl() { $sUrl = APPDB_ROOT."appview.php?iAppId=$this->iAppId"; return $sUrl; } function objectMakeLink() { $sLink = "objectMakeUrl()."\">". $this->sName.""; return $sLink; } function objectGetEntries($bQueued, $bRejected, $sOrderBy = "appId") { $sQuery = "SELECT * FROM appFamily WHERE appFamily.queued = '?'"; $sQueued = objectManager::getQueueString($bQueued, $bRejected); if($bQueued && !application::canEdit()) { /* Without global edit rights a user can only view his rejected apps */ if(!$bRejected) return FALSE; $sQuery .= " AND appFamily.submitterId = '?' ORDER BY '?'"; $hResult = query_parameters($sQuery, $sQueued, $_SESSION['current']->iUserId, $sOrderBy); } else { $sQuery .= " ORDER BY '?'"; $hResult = query_parameters($sQuery, $sQueued, $sOrderBy); } if(!$hResult) return FALSE; return $hResult; } function objectGetHeader() { $aCells = array( "Submission Date", "Submitter", "Vendor", "Application"); return $aCells; } function objectGetTableRow() { $oUser = new user($this->iSubmitterId); $oVendor = new vendor($this->iVendorId); if(!$oVendor->sName) $sVendor = get_vendor_from_keywords($this->sKeywords); else $sVendor = $oVendor->objectMakeLink(); $oTableRow = new TableRow(); $oTableRow->AddTextCell(print_date(mysqltimestamp_to_unixtimestamp($this->sSubmitTime))); $oTableRow->AddTextCell($oUser->objectMakeLink()); $oTableRow->AddTextCell($sVendor); $oTableRow->AddTextCell($this->sName); $oOMTableRow = new OMTableRow($oTableRow); return $oOMTableRow; } function canEdit() { if($_SESSION['current']->hasPriv("admin")) return TRUE; if(isset($this) && is_object($this) && $this->iAppId) { if(maintainer::isUserSuperMaintainer($_SESSION['current'], $this->iAppId)) return TRUE; if($this->sQueued != "true" && $this->iSubmitterId = $_SESSION['current']->iUserId) return TRUE; return FALSE; } else return FALSE; } function mustBeQueued() { if($_SESSION['current']->hasPriv("admin")) return FALSE; else return TRUE; } function objectDisplayQueueProcessingHelp() { echo "

    This is the list of applications waiting for your approval, ". "or to be rejected.

    \n"; echo "

    To view a submission, click on its name. ". "From that page you can edit, delete or approve it into the AppDB.

    \n"; } function objectDisplayAddItemHelp() { /* We don't display the full help on the page where you only input the app name */ if(!$this->sName) { echo "

    First, please enter the name of the application you wish to add. "; echo "This will allow you to determine whether there is already "; echo "an entry for it in the database.

    \n"; } else { echo "

    This page is for submitting new applications to be added to the\n"; echo "database. The application will be reviewed by an AppDB Administrator,\n"; echo "and you will be notified via e-mail if it is added to the database or rejected.

    \n"; echo "

    Before continuing, please ensure that you have

    \n"; echo "

    "; echo "

    Having app descriptions just sponsoring the app\n"; echo "(yes, some vendors want to use the appdb for this) or saying ‘I haven’t tried this app with Wine’ "; echo "will not help Wine development or Wine users. Application descriptions should be exactly that and only that, \n"; echo "they should not contain any information about how well the app works, just what the app is. The same applies to the \n"; echo "version information, it should be only information on what is unique or different about that version of the application, \n"; echo "not how well that version works or how great you think a new feature is.

    \n"; echo "

    When you reach the \"Test Form\" part (What works, What doesn't work, etc) please be detailed \n"; echo "about how well it worked and if any workarounds were needed but do NOT paste chunks of terminal output.

    \n"; echo "

    Please write information in proper English with correct grammar and punctuation!

    \n"; echo "Please only submit applications/versions that you have tested.\n"; echo "Submissions without test information or not using the provided template will be rejected.\n"; echo "If you are unable to see the in-browser editors below, please try Firefox, Mozilla or Opera browsers.\n"; echo "

    After your application has been added, you will be able to submit screenshots for it, post"; echo " messages in its forums or become a maintainer to help others trying to run the application.

    "; } } function objectGetEntriesCount($bQueued, $bRejected) { $sQueued = objectManager::getQueueString($bQueued, $bRejected); if($bQueued && !application::canEdit()) { /* Without edit rights users can only resubmit their rejected entries */ if(!$bRejected) return FALSE; $sQuery = "SELECT COUNT(appId) as count FROM appFamily WHERE submitterId = '?' AND queued = '?'"; $hResult = query_parameters($sQuery, $_SESSION['current']->iUserId, $sQueued); } else { $sQuery = "SELECT COUNT(appId) as count FROM appFamily WHERE queued = '?'"; $hResult = query_parameters($sQuery, $sQueued); } if(!$hResult) return FALSE; if(!$oRow = mysql_fetch_object($hResult)) return FALSE; return $oRow->count; } function objectMoveChildren($iNewId) { /* Keep track of how many children we have moved */ $iCount = 0; foreach($this->aVersionsIds as $iVersionId) { $oVersion = new version($iVersionId); $oVersion->iAppId = $iNewId; if($oVersion->update()) $iCount++; else return FALSE; } /* If no errors occured we return the number of moved children */ return $iCount; } function allowAnonymousSubmissions() { return FALSE; } function objectGetId() { return $this->iAppId; } } function get_vendor_from_keywords($sKeywords) { $aKeywords = explode(" *** ",$sKeywords); $iLastElt = (sizeOf($aKeywords)-1); return($aKeywords[$iLastElt]); } ?>