diff --git a/headers/private/screen_saver/ScreenSaverPrefs.h b/headers/private/screen_saver/ScreenSaverPrefs.h index abaef7c237..05693d1413 100644 --- a/headers/private/screen_saver/ScreenSaverPrefs.h +++ b/headers/private/screen_saver/ScreenSaverPrefs.h @@ -1,9 +1,10 @@ #ifndef SCREEN_SAVER_PREFS_H #define SCREEN_SAVER_PREFS_H #include "Message.h" +#include "Path.h" #include -enum arrowDirection {NONE=-1,UPLEFT,UPRIGHT,DOWNRIGHT,DOWNLEFT}; +enum arrowDirection {NONE=-1,UPLEFT,UPRIGHT,DOWNRIGHT,DOWNLEFT,CENTER}; class ScreenSaverPrefs { @@ -11,57 +12,72 @@ public: ScreenSaverPrefs(void); bool LoadSettings(void); - BRect WindowFrame(void) {return windowFrame;} - int WindowTab(void) {return windowTab;} - int TimeFlags(void) {return timeFlags;} - int BlankTime(void) {return blankTime;} - int StandbyTime(void) {return standbyTime;} - int SuspendTime(void) {return suspendTime;} - int OffTime(void) {return offTime;} - arrowDirection GetBlankCorner(void) {return blank;} - arrowDirection GetNeverBlankCorner(void) {return neverBlank;} - bool LockEnable(void) {return lockenable;} - int PasswordTime(void) {return passwordTime;} - char *Password(void) {return password;} - bool IsNetworkPassword(void) {return isNetworkPWD;} - char *ModuleName(void) {return moduleName;} - BMessage *GetState(void) {return &stateMsg;} + BRect WindowFrame(void) {return getRect("windowframe");} + int WindowTab(void) {return getInt("windowtab");} + int TimeFlags(void) {return getInt("timeflags");} + int BlankTime(void) {return getInt("timefade");} + int StandbyTime(void) {return getInt("timestandby");} + int SuspendTime(void) {return getInt("timesuspend");} + int OffTime(void) {return getInt("timeoff");} + arrowDirection GetBlankCorner(void) {return (arrowDirection)(getInt("cornernow"));} + arrowDirection GetNeverBlankCorner(void) {return (arrowDirection)(getInt("cornerNever"));} + bool LockEnable(void) {return getBool("lockenable");} + int PasswordTime(void) {return getInt("lockdelay");} + const char *Password(void); + bool IsNetworkPassword(void) {return (0==strcmp("custom",getString("lockmethod")));} + const char *ModuleName(void) { + const char *name=getString("modulename"); + return ((name)?name:"Blackness"); + } + BMessage *GetState(const char *name); + BMessage *GetSettings(void) {return ¤tMessage;} - void SetWindowFrame(const BRect &fr) {windowFrame=fr;} - void SetWindowTab(int tab) {windowTab=tab;} - void SetTimeFlags(int tf) {timeFlags=tf;} - void SetBlankTime(int bt) {blankTime=bt;} - void SetStandbyTime(int time) {standbyTime=time;} - void SetSuspendTime(int time) {suspendTime=time;} - void SetOffTime(int intime) {offTime=intime;} - void SetBlankCorner(arrowDirection in) {blank=in;} - void SetNeverBlankCorner(arrowDirection in){neverBlank=in;} - void SetLockEnable(bool en) {lockenable=en;} - void SetPasswordTime(int pt) {passwordTime=pt;} - void SetPassword(char *pw){strncpy(password,pw,B_PATH_NAME_LENGTH-1);} - void SetNetworkPassword(bool np) {isNetworkPWD=np;} - void SetModuleName(const char *mn) {strncpy(moduleName,mn,B_PATH_NAME_LENGTH-1);} - void SetState(BMessage *in) {stateMsg=*in;} - BMessage *GetSettings(void); + void SetWindowFrame(const BRect &fr) {setRect("windowframe",fr);} + void SetWindowTab(int tab) {setInt("windowtab",tab);} + void SetTimeFlags(int tf) {setInt("timeflags",tf);} + void SetBlankTime(int bt) {setInt("timefade",bt);} + void SetStandbyTime(int time) {setInt("timestandby",time);} + void SetSuspendTime(int time) {setInt("timesuspend",time);} + void SetOffTime(int intime) {setInt("timeoff",intime);} + void SetBlankCorner(arrowDirection in) {setInt("cornernow",(int)in);} + void SetNeverBlankCorner(arrowDirection in){setInt("cornernever",(int)in);} + void SetLockEnable(bool en) {setBool("lockenable",en);} + void SetPasswordTime(int pt) {setInt("lockdelay",pt);} + void SetPassword(char *pw){setString("lockpassword",pw);} // Can not set network password from here. + void SetModuleName(const char *mn) {setString("modulename",mn);} + void SetState(const char *name,BMessage *in); void SaveSettings (void); private: bool parseSettings(BMessage *newSSMessage); - BRect windowFrame; - int windowTab; - int timeFlags; - int blankTime; // AKA timefade - int standbyTime; // AKA timestandby - int suspendTime; // AKA timesuspend - int offTime; // AKA timeoff - arrowDirection blank; // AKA cornernow - arrowDirection neverBlank; // AKA cornernever - bool lockenable; - int passwordTime; // AKA lockdelay - char password[B_PATH_NAME_LENGTH]; // aka lockpassword - bool isNetworkPWD; - char moduleName[B_PATH_NAME_LENGTH]; - BMessage stateMsg, msg; + bool getBool(const char *name) {bool b;currentMessage.FindBool(name,&b);return b;} + int32 getInt(const char *name){int32 b;currentMessage.FindInt32(name,&b);return b;} + const char *getString(const char *name){const char *b;currentMessage.FindString(name,&b);return b;} + BRect getRect(const char *name){BRect b;currentMessage.FindRect(name,&b);return b;} + + void setBool(const char *name,bool value) { + if (B_NAME_NOT_FOUND == currentMessage.ReplaceBool(name,value)) + currentMessage.AddBool(name,value); + } + + void setInt(const char *name,int value) { + if (B_NAME_NOT_FOUND == currentMessage.ReplaceInt32(name,value)) + currentMessage.AddInt32(name,value); + } + + void setString(const char *name,const char *value) { + if (B_NAME_NOT_FOUND == currentMessage.ReplaceString(name,value)) + currentMessage.AddString(name,value); + } + + void setRect(const char *name,BRect value) { + if (B_NAME_NOT_FOUND == currentMessage.ReplaceRect(name,value)) + currentMessage.AddRect(name,value); + } + + BMessage currentMessage,stateMsg; + BPath ssPath,networkPath; + char password[512]; }; diff --git a/src/kits/screensaver/ScreenSaverPrefs.cpp b/src/kits/screensaver/ScreenSaverPrefs.cpp index bf399352d1..b750bc94e2 100755 --- a/src/kits/screensaver/ScreenSaverPrefs.cpp +++ b/src/kits/screensaver/ScreenSaverPrefs.cpp @@ -9,133 +9,61 @@ ScreenSaverPrefs::ScreenSaverPrefs(void) { + find_directory(B_USER_SETTINGS_DIRECTORY,&ssPath); + find_directory(B_USER_SETTINGS_DIRECTORY,&networkPath); + ssPath.Append("ScreenSaver_settings",true); + networkPath.Append("network",true); } // Load the flattened settings BMessage from disk and parse it. bool ScreenSaverPrefs::LoadSettings(void) { - bool ok; - char pathAndFile[B_PATH_NAME_LENGTH]; - BPath path; - - status_t found=find_directory(B_USER_SETTINGS_DIRECTORY,&path); - if (ok=(found==B_OK)) { - strncpy(pathAndFile,path.Path(),B_PATH_NAME_LENGTH-1); - strncat(pathAndFile,"/ScreenSaver_settings",B_PATH_NAME_LENGTH-1); - BFile ssSettings(pathAndFile,B_READ_ONLY); - if (B_OK==ssSettings.InitCheck()) { // File exists. Unflatten the message and call the settings parser. - BMessage settings; - settings.Unflatten(&ssSettings); - ok=parseSettings (&settings); - } + BFile ssSettings(ssPath.Path(),B_READ_ONLY); + if (B_OK==ssSettings.InitCheck()) { // File exists. Unflatten the message and call the settings parser. + BMessage settings; + settings.Unflatten(&ssSettings); + return true; } - return ok; + return false; } - -void -setOnValue(BMessage *msg, char *name, int &result) -{ - int32 value; - if (B_OK == msg->FindInt32(name,&value)) // If screen saving is even enabled - result=value; +const char * +ScreenSaverPrefs::Password(void) { + if (IsNetworkPassword()) { + FILE *networkFile=NULL; + char buffer[512],*start; + // This ugly piece opens the networking file and reads the password, if it exists. + if ((networkFile=fopen(networkPath.Path(),"r"))) + while (buffer==fgets(buffer,512,networkFile)) + if ((start=strstr(buffer,"PASSWORD ="))) { + strncpy(password, start+10,strlen(start-11)); + return password; + } + } + else + return getString("lockpassword"); } - -bool -ScreenSaverPrefs::parseSettings (BMessage *msg) -{ - int temp; - const char *strPtr; - char pathAndFile[B_PATH_NAME_LENGTH]; - BPath path; - - // Set some defaults - blankTime=passwordTime=-1; - // Set the easy (integer) ones: - setOnValue(msg,"windowtab",windowTab); - setOnValue(msg,"timeflags",timeFlags); - setOnValue(msg,"timefade",blankTime); - setOnValue(msg,"timestandby",standbyTime); - setOnValue(msg,"timesuspend",suspendTime); - setOnValue(msg,"timeoff",offTime); - setOnValue(msg,"cornernow",temp); - blank=(arrowDirection)temp; - setOnValue(msg,"cornernever",temp); - neverBlank=(arrowDirection)temp; - setOnValue(msg,"lockdelay",passwordTime); - - msg->FindRect("windowframe",&windowFrame); - msg->FindBool("lockenable",&lockenable); - msg->FindString("lockmethod",&strPtr); - if (strPtr) { - isNetworkPWD=(strcmp("custom",strPtr)); - // Get the password. Either from the settings file or the networking file. - if (isNetworkPWD) { - status_t found=find_directory(B_USER_SETTINGS_DIRECTORY,&path); - if (found==B_OK) { - FILE *networkFile=NULL; - char buffer[512],*start; - strncpy(pathAndFile,path.Path(),B_PATH_NAME_LENGTH-1); - strncat(pathAndFile,"/network",B_PATH_NAME_LENGTH-1); - // This ugly piece opens the networking file and reads the password, if it exists. - if ((networkFile=fopen(pathAndFile,"r"))) - while (buffer==fgets(buffer,512,networkFile)) - if ((start=strstr(buffer,"PASSWORD ="))) - strncpy(password, start+10,strlen(start-11)); - } - } else { - msg->FindString("lockpassword",&strPtr); - if (strPtr) - strncpy(password,strPtr,B_PATH_NAME_LENGTH-1); - } - } else - password[0]='\0'; - if (B_OK != msg->FindString("modulename",&strPtr)) - blankTime=-1; // If the module doesn't exist, never blank. - if (strPtr) - strncpy(moduleName,strPtr,B_PATH_NAME_LENGTH-1); - else - strcpy(moduleName,"Blackness"); - BString stateMsgName("modulesettings_"); - stateMsgName+=moduleName; - msg->FindMessage(stateMsgName.String(),&stateMsg); // Doesn't matter if it fails - stateMsg would just continue to be empty - return true; -} - - BMessage * -ScreenSaverPrefs::GetSettings (void) -{ - msg.MakeEmpty(); - msg.AddRect("windowframe",windowFrame); - msg.AddInt32("windowtab",windowTab); - msg.AddInt32("timeflags",timeFlags); - msg.AddInt32("timefade", blankTime); - msg.AddInt32("timestandby", standbyTime); - msg.AddInt32("timesuspend", suspendTime); - msg.AddInt32("timeoff", offTime); - msg.AddInt32("cornernow", blank); - msg.AddInt32("cornernever", neverBlank); - msg.AddBool("lockenable", lockenable); - msg.AddInt32("lockdelay", passwordTime); - msg.AddString("modulename", moduleName); +ScreenSaverPrefs::GetState(const char *name) { BString stateMsgName("modulesettings_"); - stateMsgName+=moduleName; - msg.AddMessage(stateMsgName.String(),&stateMsg); - return &msg; + stateMsgName+=name; + currentMessage.FindMessage(stateMsgName.String(),&stateMsg); + return &stateMsg; } +void +ScreenSaverPrefs::SetState(const char *name,BMessage *msg) { + BString stateMsgName("modulesettings_"); + stateMsgName+=name; + if (B_NAME_NOT_FOUND == currentMessage.ReplaceMessage(stateMsgName.String(),msg)) + currentMessage.AddMessage(stateMsgName.String(),msg); +} void -ScreenSaverPrefs::SaveSettings (void) -{ - GetSettings(); - BPath path; - find_directory(B_USER_SETTINGS_DIRECTORY,&path); - path.Append("ScreenSaver_settings",true); - BFile file(path.Path(),B_READ_WRITE | B_CREATE_FILE | B_ERASE_FILE); - if ((file.InitCheck()!=B_OK) || (msg.Flatten(&file)!=B_OK)) +ScreenSaverPrefs::SaveSettings (void) { + BFile file(ssPath.Path(),B_READ_WRITE | B_CREATE_FILE | B_ERASE_FILE); + if ((file.InitCheck()!=B_OK) || (currentMessage.Flatten(&file)!=B_OK)) printf ("Problem with saving preferences file!\n"); } diff --git a/src/kits/screensaver/ScreenSaverThread.cpp b/src/kits/screensaver/ScreenSaverThread.cpp index fff8582133..df6b304647 100755 --- a/src/kits/screensaver/ScreenSaverThread.cpp +++ b/src/kits/screensaver/ScreenSaverThread.cpp @@ -99,7 +99,7 @@ ScreenSaverThread::LoadAddOn() printf ("Error = %ld\n",retVal); return NULL; } else - saver=instantiate(pref->GetState(),addon_image); + saver=instantiate(pref->GetState(pref->ModuleName()),addon_image); if (B_OK!=saver->InitCheck()) { printf ("InitCheck() Failed!\n"); unload_add_on(addon_image);