/* WebDownloader for X-Window * Copyright (C) 1999-2002 Koshelev Maxim * This Program is free but not GPL!!! You can't modify it * without agreement with author. You can't distribute modified * program but you can distribute unmodified program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */ #include "log.h" #include #include #include #include #include #include #include #if (defined(__unix__) || defined(unix)) && !defined(USG) #include #endif #include "dlist.h" #include "face/log.h" #include "face/list.h" #include "var.h" #include "ntlocale.h" #include "signal.h" #include "msgqueue.h" tLogString::tLogString():tString(){ time=0; type=LOG_FROM_SERVER; }; tLogString::tLogString(const char *where,int len,int tp):tString(where,len) { time=::time(NULL); type=tp; }; void tLogString::print() { printf("%s ",ctime(&time)); tString::print(); }; tLogString::~tLogString() { // this data will freed at tString::~tString(); // if (body) delete[] body; // body=NULL; }; //******************************************// tLog::tLog():tStringList(){ freezed_flag=0; fd=-1; start=time(NULL); Window=NULL; last_log=1; for (int i=0;i<4;i++) geometry[i]=0; /* next string should be added quiet */ current_row=0; char *msg=N_("Log was started!"); tLogString *temp=new tLogString(_(msg),strlen(_(msg)),LOG_OK); temp->time=time(NULL); ref_count=0; insert(temp); }; void tLog::ref_inc(){ ref_count+=1; }; void tLog::ref_dec(){ ref_count-=1; if (ref_count<0) printf("WARNING: ref_count is less than zero!\n"); if (ref_count==0) delete(this); }; void tLog::store_geometry(int *a) { for (int i=0;i<4;i++) geometry[i]=a[i]; }; void tLog::get_geometry(int *a) { for (int i=0;i<4;i++) a[i]=geometry[i]; }; void tLog::send_msg(tLogString *what) { MaxNum=CFG.MAX_LOG_LENGTH; if (Window || D4X_LOG_DISPLAY.log==this) { /* FIXME: do this atomic */ tLogMsg *Msg=new tLogMsg; Msg->type=(Window?MQT_MY:0)+(D4X_LOG_DISPLAY.log==this?MQT_COM:0); Msg->what=what; Msg->which=this; ref_inc(); MsgQueue->insert(Msg); if (MsgQueue->count()>=100){ lock(); lock(); /* sleep here */ unlock(); }; }; }; void tLog::print() { if (!Window) return; tLogString *prom=(tLogString *)First; while (prom) { log_window_add_string(this,prom); prom=(tLogString *)prom->prev; }; }; int tLog::init_save(char *path){ if (fd>=0) close(fd); if (path){ fd=open(path,O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR | S_IWUSR); if (fd<0) return(-1); }else fd=-1; return(0); }; void tLog::insert(tNode *what){ DBC_RETURN_IF_FAIL(what!=NULL); /* save string to file */ if (fd>=0){ tLogString *temp=(tLogString *)what; struct tm msgtime; localtime_r(&(temp->time),&msgtime); strftime(timebuf,LOG_TIME_STR_LEN,"%T %d %b %Y ",&(msgtime)); int len=strlen(temp->body); if (write(fd,timebuf,strlen(timebuf))<0 || write(fd,temp->body,len)<0){ close(fd); fd=-1; }; if (len && temp->body[len-1]!='\n'){ write(fd,"\n",sizeof(char)); }; }; current_row+=1; ((tLogString *)what)->temp=current_row; tQueue::insert(what); }; void tLog::add(const char *str,int len,int type) { DBC_RETURN_IF_FAIL(str!=NULL); tLogString *temp=new tLogString(str,len,type); temp->time=time(NULL); lock(); insert(temp); Size+=len; unlock(); send_msg(temp); }; void tLog::add(const char *str,int type) { DBC_RETURN_IF_FAIL(str!=NULL); int len=strlen(str); tLogString *ins=new tLogString(str,len,type); lock(); insert(ins); Size+=len; unlock(); send_msg(ins); }; void tLog::add(const char *str) { DBC_RETURN_IF_FAIL(str!=NULL); int len=strlen(str); tLogString *ins=new tLogString(str,len,LOG_FROM_SERVER); lock(); insert(ins); Size+=len; unlock(); send_msg(ins); }; void tLog::dispose() { unlock(); send_msg(NULL); tStringList::dispose(); }; void tLog::unlock() { mutex.unlock(); }; void tLog::lock() { mutex.lock(); }; tLogString *tLog::last() { return (tLogString *)tStringList::last(); }; tLogString *tLog::next() { return (tLogString *)tStringList::next(); }; tLogString *tLog::first() { return (tLogString *)tStringList::first(); }; tLog::~tLog() { log_window_destroy_by_log(this); if (D4X_LOG_DISPLAY.log==this) D4X_LOG_DISPLAY.log=NULL; // MsgQueue->remove_this_log(this); done();// will be used by tStringList::~tStringList(); if (fd>=0) close(fd); };