2002-09-27 23:43:29 +00:00
|
|
|
// 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 <stdio.h>
|
|
|
|
|
|
|
|
#include "client_state.h"
|
|
|
|
#include "error_numbers.h"
|
|
|
|
#include "file_names.h"
|
|
|
|
#include "filesys.h"
|
|
|
|
|
|
|
|
#include "account.h"
|
|
|
|
|
2003-02-21 01:38:16 +00:00
|
|
|
int write_account_file(
|
|
|
|
char* master_url, char* authenticator, char* project_prefs
|
|
|
|
) {
|
2002-09-27 23:43:29 +00:00
|
|
|
char path[256];
|
|
|
|
FILE* f;
|
2003-03-08 23:48:05 +00:00
|
|
|
int retval;
|
2002-09-27 23:43:29 +00:00
|
|
|
|
|
|
|
get_account_filename(master_url, path);
|
2003-02-21 01:38:16 +00:00
|
|
|
f = fopen(TEMP_FILE_NAME, "w");
|
2002-09-27 23:43:29 +00:00
|
|
|
if (!f) return ERR_FOPEN;
|
|
|
|
|
|
|
|
fprintf(f,
|
|
|
|
"<account>\n"
|
|
|
|
" <master_url>%s</master_url>\n"
|
2003-02-21 01:38:16 +00:00
|
|
|
" <authenticator>%s</authenticator>\n",
|
2002-09-27 23:43:29 +00:00
|
|
|
master_url,
|
|
|
|
authenticator
|
|
|
|
);
|
2003-02-21 01:38:16 +00:00
|
|
|
if (project_prefs) {
|
|
|
|
fprintf(f, "%s", project_prefs);
|
|
|
|
}
|
|
|
|
fprintf(f, "</account>\n");
|
2002-09-27 23:43:29 +00:00
|
|
|
fclose(f);
|
2003-03-08 23:48:05 +00:00
|
|
|
retval = boinc_rename(TEMP_FILE_NAME, path);
|
|
|
|
if (retval) return ERR_RENAME;
|
2002-09-27 23:43:29 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int CLIENT_STATE::parse_account_files() {
|
|
|
|
DIRREF dir;
|
|
|
|
char name[256];
|
|
|
|
PROJECT* project;
|
|
|
|
FILE* f;
|
|
|
|
|
|
|
|
dir = dir_open(".");
|
2003-03-11 00:49:07 +00:00
|
|
|
while (dir_scan(name, dir, sizeof(name)) == 0) {
|
2002-09-27 23:43:29 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2003-02-13 22:49:26 +00:00
|
|
|
int CLIENT_STATE::add_project(char* master_url, char* authenticator) {
|
2002-12-06 19:44:31 +00:00
|
|
|
char path[256];
|
|
|
|
PROJECT* project;
|
|
|
|
FILE* f;
|
2003-02-06 19:01:49 +00:00
|
|
|
int retval;
|
2002-12-06 19:44:31 +00:00
|
|
|
|
2003-02-06 19:01:49 +00:00
|
|
|
// check if this project is already running
|
2003-02-13 22:49:26 +00:00
|
|
|
//
|
|
|
|
if (lookup_project(master_url)) return -1;
|
2002-12-06 19:44:31 +00:00
|
|
|
|
2003-02-06 19:01:49 +00:00
|
|
|
// create project state
|
2003-02-13 22:49:26 +00:00
|
|
|
//
|
2003-03-08 23:48:05 +00:00
|
|
|
retval = write_account_file(master_url, authenticator);
|
|
|
|
if (retval) return retval;
|
2002-12-06 19:44:31 +00:00
|
|
|
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);
|
2003-02-06 19:01:49 +00:00
|
|
|
if(retval) {
|
|
|
|
return retval;
|
|
|
|
}
|
2002-12-06 19:44:31 +00:00
|
|
|
|
2003-02-06 19:01:49 +00:00
|
|
|
// remove any old files
|
2003-02-13 22:49:26 +00:00
|
|
|
//
|
2003-02-06 19:01:49 +00:00
|
|
|
retval = remove_project_dir(*project);
|
2002-12-06 19:44:31 +00:00
|
|
|
|
2003-02-06 19:01:49 +00:00
|
|
|
retval = make_project_dir(*project);
|
2003-02-13 22:49:26 +00:00
|
|
|
if (retval) return retval;
|
2002-12-06 19:44:31 +00:00
|
|
|
projects.push_back(project);
|
2003-02-06 19:01:49 +00:00
|
|
|
return 0;
|
2002-12-06 19:44:31 +00:00
|
|
|
}
|
|
|
|
|
2003-02-13 22:49:26 +00:00
|
|
|
int CLIENT_STATE::change_project(
|
|
|
|
int index, char* master_url, char* authenticator
|
|
|
|
) {
|
2002-12-06 19:44:31 +00:00
|
|
|
char path[256];
|
|
|
|
PROJECT* project;
|
|
|
|
FILE* f;
|
2003-02-06 19:01:49 +00:00
|
|
|
int retval;
|
2002-12-06 19:44:31 +00:00
|
|
|
|
2003-02-06 19:01:49 +00:00
|
|
|
// check if this project is already running
|
2003-02-13 22:49:26 +00:00
|
|
|
//
|
|
|
|
if (lookup_project(master_url)) return -1;
|
2002-12-06 19:44:31 +00:00
|
|
|
|
2003-02-06 19:01:49 +00:00
|
|
|
// delete old file
|
2003-02-13 22:49:26 +00:00
|
|
|
//
|
2003-02-06 19:01:49 +00:00
|
|
|
project = projects[index];
|
2002-12-06 19:44:31 +00:00
|
|
|
get_account_filename(project->master_url, path);
|
2003-02-06 19:01:49 +00:00
|
|
|
retval = file_delete(path);
|
2002-12-06 19:44:31 +00:00
|
|
|
|
2003-02-06 19:01:49 +00:00
|
|
|
// create project state
|
2003-02-13 22:49:26 +00:00
|
|
|
//
|
2003-03-08 23:48:05 +00:00
|
|
|
retval = write_account_file(master_url, authenticator);
|
|
|
|
if (retval) return retval;
|
2002-12-06 19:44:31 +00:00
|
|
|
get_account_filename(master_url, path);
|
|
|
|
f = fopen(path, "r");
|
|
|
|
if (!f) return ERR_FOPEN;
|
|
|
|
retval = project->parse_account(f);
|
|
|
|
fclose(f);
|
2003-02-13 22:49:26 +00:00
|
|
|
if (retval) return retval;
|
2003-02-06 19:01:49 +00:00
|
|
|
|
|
|
|
// remove any old files
|
|
|
|
retval = remove_project_dir(*project);
|
|
|
|
|
|
|
|
retval = make_project_dir(*project);
|
|
|
|
if(retval) {
|
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
return 0;
|
2002-12-06 19:44:31 +00:00
|
|
|
}
|
|
|
|
|
2002-12-19 22:43:38 +00:00
|
|
|
int CLIENT_STATE::quit_project(int index) {
|
2003-02-06 19:01:49 +00:00
|
|
|
PROJECT* project = NULL;
|
|
|
|
vector <PROJECT*>::iterator iter;
|
|
|
|
int curindex = 0;
|
|
|
|
|
|
|
|
// find project and remove it from the vector
|
2003-02-20 00:58:55 +00:00
|
|
|
for (iter = projects.begin(); iter != projects.end(); iter++) {
|
2003-02-06 19:01:49 +00:00
|
|
|
if (curindex == index) {
|
|
|
|
project = *iter;
|
|
|
|
projects.erase(iter);
|
|
|
|
break;
|
|
|
|
}
|
2003-02-20 00:58:55 +00:00
|
|
|
curindex++;
|
2003-02-06 19:01:49 +00:00
|
|
|
}
|
2003-02-20 00:58:55 +00:00
|
|
|
if (project == NULL) return -1;
|
2003-02-06 19:01:49 +00:00
|
|
|
|
|
|
|
// delete file
|
2002-12-06 19:44:31 +00:00
|
|
|
char path[256];
|
2003-02-06 19:01:49 +00:00
|
|
|
int retval;
|
2002-12-06 19:44:31 +00:00
|
|
|
get_account_filename(project->master_url, path);
|
2003-02-06 19:01:49 +00:00
|
|
|
retval = file_delete(path);
|
2002-12-06 19:44:31 +00:00
|
|
|
|
2003-02-06 19:01:49 +00:00
|
|
|
// delete project; //also somewhere else?
|
2002-12-06 19:44:31 +00:00
|
|
|
|
|
|
|
#ifdef _WIN32
|
2003-02-06 19:01:49 +00:00
|
|
|
AfxMessageBox("Please restart the client to complete the quit.", MB_OK, 0);
|
2002-12-06 19:44:31 +00:00
|
|
|
#endif
|
2003-02-06 19:01:49 +00:00
|
|
|
return 0;
|
2002-12-06 19:44:31 +00:00
|
|
|
}
|