// The contents of this file are subject to the Mozilla Public License // Version 1.0 (the "License"); you may not use this file except in // compliance with the License. You may obtain a copy of the License at // http://www.mozilla.org/MPL/ // // Software distributed under the License is distributed on an "AS IS" // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the // License for the specific language governing rights and limitations // under the License. // // The Original Code is the Berkeley Open Infrastructure for Network Computing. // // The Initial Developer of the Original Code is the SETI@home project. // Portions created by the SETI@home project are Copyright (C) 2002 // University of California at Berkeley. All Rights Reserved. // // Contributor(s): // #include #include "client_state.h" #include "error_numbers.h" #include "file_names.h" #include "filesys.h" #include "account.h" int write_account_file( char* master_url, char* authenticator, char* project_prefs ) { char path[256]; FILE* f; int retval; get_account_filename(master_url, path); f = fopen(TEMP_FILE_NAME, "w"); if (!f) return ERR_FOPEN; fprintf(f, "\n" " %s\n" " %s\n", master_url, authenticator ); if (project_prefs) { fprintf(f, "%s", project_prefs); } fprintf(f, "\n"); fclose(f); retval = boinc_rename(TEMP_FILE_NAME, path); if (retval) return ERR_RENAME; return 0; } int CLIENT_STATE::parse_account_files() { DIRREF dir; char name[256]; PROJECT* project; FILE* f; dir = dir_open("."); while (dir_scan(name, dir) == 0) { if (is_account_file(name)) { f = fopen(name, "r"); if (!f) continue; project = new PROJECT; project->parse_account(f); projects.push_back(project); fclose(f); } } dir_close(dir); return 0; } int CLIENT_STATE::add_project(char* master_url, char* authenticator) { char path[256]; PROJECT* project; FILE* f; int retval; // check if this project is already running // if (lookup_project(master_url)) return -1; // create project state // retval = write_account_file(master_url, authenticator); if (retval) return retval; get_account_filename(master_url, path); f = fopen(path, "r"); if (!f) return ERR_FOPEN; project = new PROJECT; retval = project->parse_account(f); fclose(f); if(retval) { return retval; } // remove any old files // retval = remove_project_dir(*project); retval = make_project_dir(*project); if (retval) return retval; projects.push_back(project); return 0; } int CLIENT_STATE::change_project( int index, char* master_url, char* authenticator ) { char path[256]; PROJECT* project; FILE* f; int retval; // check if this project is already running // if (lookup_project(master_url)) return -1; // delete old file // project = projects[index]; get_account_filename(project->master_url, path); retval = file_delete(path); // create project state // retval = write_account_file(master_url, authenticator); if (retval) return retval; get_account_filename(master_url, path); f = fopen(path, "r"); if (!f) return ERR_FOPEN; retval = project->parse_account(f); fclose(f); if (retval) return retval; // remove any old files retval = remove_project_dir(*project); retval = make_project_dir(*project); if(retval) { return retval; } return 0; } int CLIENT_STATE::quit_project(int index) { PROJECT* project = NULL; vector ::iterator iter; int curindex = 0; // find project and remove it from the vector for (iter = projects.begin(); iter != projects.end(); iter++) { if (curindex == index) { project = *iter; projects.erase(iter); break; } curindex++; } if (project == NULL) return -1; // delete file char path[256]; int retval; get_account_filename(project->master_url, path); retval = file_delete(path); // delete project; //also somewhere else? #ifdef _WIN32 AfxMessageBox("Please restart the client to complete the quit.", MB_OK, 0); #endif return 0; }