Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
+// http://66.102.9.104/search?q=cache:Djc1mPF3hRoJ:cvs.sourceforge.net/viewcvs.py/audacity/audacity-src/src/AudioIO.cpp%3Frev%3D1.102+macos+x+wxthread&hl=fr
+
#include "console_thread.h" // class's header file
#include <wx/wxprec.h>
#include <wx/thread.h>
+#include <wx/file.h>
#include <bacula.h>
#include <jcr.h>
/* Imported functions */
int authenticate_director(JCR *jcr, DIRRES *director, CONRES *cons);
-// class constructor
-console_thread::console_thread(wxString configfile) {
- UA_sock = NULL;
- this->configfile = configfile;
-}
-
-// class destructor
-console_thread::~console_thread() {
- if (UA_sock) {
- bnet_sig(UA_sock, BNET_TERMINATE); /* send EOF */
- bnet_close(UA_sock);
- UA_sock = NULL;
- }
- if (WSACleanup() == 0) {
- //csprint("Windows sockets cleaned up successfully...\n");
- }
- else {
- csprint("Error while cleaning up windows sockets...\n");
- }
-}
+bool console_thread::inited = false;
+bool console_thread::configloaded = false;
-/*
- * Thread entry point
- */
-void* console_thread::Entry() {
- if (WSA_Init() == 0) {
- //csprint("Windows sockets initialized successfully...\n");
- }
- else {
+void console_thread::InitLib() {
+ if (WSA_Init() != 0) {
csprint("Error while initializing windows sockets...\n");
+ inited = false;
+ return;
}
-
- csprint("Connecting...\n");
-
+
init_stack_dump();
my_name_is(0, NULL, "wx-console");
//textdomain("bacula-console");
+ inited = true;
+}
+
+void console_thread::FreeLib() {
+ if (inited) {
+ if (WSACleanup() != 0) {
+ csprint("Error while cleaning up windows sockets...\n");
+ }
+ }
+}
+
+wxString console_thread::LoadConfig(wxString configfile) {
+ if (!inited) {
+ InitLib();
+ if (!inited)
+ return "Error while initializing library.";
+ }
+
+ free_config_resources();
+
MSGS* msgs = (MSGS *)malloc(sizeof(MSGS));
memset(msgs, 0, sizeof(MSGS));
for (int i=1; i<=M_MAX; i++) {
/* TODO (#4#): Allow the user to choose his config file. */
if (!parse_config(configfile.c_str(), 0)) {
- csprint("Unable to read configuration file.\n");
+ configloaded = false;
+ wxFile file("./wx-console.conmsg");
+ if (!file.IsOpened())
+ return "Unable to retrieve error message.";
+ wxString err = "";
+ wxChar buffer[513];
+ off_t len;
+ while ((len = file.Read(buffer, 512)) > -1) {
+ buffer[len] = (wxChar)0;
+ err += buffer;
+ if (file.Eof())
+ break;
+ }
+ file.Close();
+ term_msg();
+ wxRemoveFile("./wx-console.conmsg");
+ return err;
+ }
+
+ term_msg();
+ wxRemoveFile("./wx-console.conmsg");
+ init_msg(NULL, NULL);
+
+ configloaded = true;
+
+ return "";
+}
+
+// class constructor
+console_thread::console_thread() {
+ UA_sock = NULL;
+ choosingdirector = false;
+}
+
+// class destructor
+console_thread::~console_thread() {
+ if (UA_sock) {
+ bnet_sig(UA_sock, BNET_TERMINATE); /* send EOF */
+ bnet_close(UA_sock);
+ UA_sock = NULL;
+ }
+}
+
+/*
+ * Thread entry point
+ */
+void* console_thread::Entry() {
+ if (!inited) {
+ csprint("Error : Library not initialized\n");
csprint(NULL, CS_END);
csprint(NULL, CS_DISCONNECTED);
csprint(NULL, CS_TERMINATED);
return NULL;
}
- init_msg(NULL, NULL);
+ if (!configloaded) {
+ csprint("Error : No configuration file loaded\n");
+ csprint(NULL, CS_END);
+ csprint(NULL, CS_DISCONNECTED);
+ csprint(NULL, CS_TERMINATED);
+ #ifdef HAVE_WIN32
+ Exit();
+ #endif
+ return NULL;
+ }
+
+ csprint("Connecting...\n");
+
+ int count = 0;
+ DIRRES* res[16]; /* Maximum 16 directors */
LockRes();
- DIRRES *dir = (DIRRES *)GetNextRes(R_DIRECTOR, NULL);
+ DIRRES* dir;
+ foreach_res(dir, R_DIRECTOR) {
+ res[count] = dir;
+ count++;
+ if (count == 16) {
+ break;
+ }
+ }
UnlockRes();
+
+ if (count == 0) {
+ csprint("Error : No director defined in config file.\n");
+ csprint(NULL, CS_END);
+ csprint(NULL, CS_DISCONNECTED);
+ csprint(NULL, CS_TERMINATED);
+ #ifdef HAVE_WIN32
+ Exit();
+ #endif
+ return NULL;
+ }
+ else if (count == 1) {
+ directorchoosen = 1;
+ }
+ else {
+ while (true) {
+ csprint("Multiple directors found in your config file.\n");
+ for (int i = 0; i < count; i++) {
+ if (i < 9) {
+ csprint(wxString(" ") << (i+1) << ": " << res[i]->hdr.name << "\n");
+ }
+ else {
+ csprint(wxString(" ") << (i+1) << ": " << res[i]->hdr.name << "\n");
+ }
+ }
+ csprint(wxString("Please choose a director (1-") << count << ") : ");
+ csprint(NULL, CS_PROMPT);
+ choosingdirector = true;
+ directorchoosen = -1;
+ while(directorchoosen == -1) {
+ bmicrosleep(0, 2000);
+ Yield();
+ }
+ choosingdirector = false;
+ if (directorchoosen != 0) {
+ break;
+ }
+ }
+ }
memset(&jcr, 0, sizeof(jcr));
jcr.dequeuing = 1; /* TODO: catch messages */
- UA_sock = bnet_connect(&jcr, 3, 3, "Director daemon", dir->address, NULL, dir->DIRport, 0);
+ UA_sock = bnet_connect(&jcr, 3, 3, "Director daemon",
+ res[directorchoosen-1]->address, NULL, res[directorchoosen-1]->DIRport, 0);
+
if (UA_sock == NULL) {
csprint("Failed to connect to the director\n");
csprint(NULL, CS_END);
/* If cons==NULL, default console will be used */
CONRES *cons = (CONRES *)GetNextRes(R_CONSOLE, (RES *)NULL);
UnlockRes();
- if (!authenticate_director(&jcr, dir, cons)) {
+ if (!authenticate_director(&jcr, res[directorchoosen-1], cons)) {
csprint("ERR=");
csprint(UA_sock->msg);
csprint(NULL, CS_END);
pm_strcpy(&UA_sock->msg, str);
bnet_send(UA_sock);
}
+ else if (choosingdirector) {
+ wxString number = str;
+ number.RemoveLast(); /* Removes \n */
+ long val;
+ if (number.ToLong(&val)) {
+ directorchoosen = (int)val;
+ }
+ else {
+ directorchoosen = 0;
+ }
+ }
}
void console_thread::Delete() {
bnet_sig(UA_sock, BNET_TERMINATE); /* send EOF */
bnet_close(UA_sock);
UA_sock = NULL;
- csprint(NULL, CS_END);
+ /*csprint(NULL, CS_END);
csprint(NULL, CS_DISCONNECTED);
- csprint(NULL, CS_TERMINATED);
+ csprint(NULL, CS_TERMINATED);*/
}
}