/* SaveSection() Salva nel registro i valori presenti nella lista relativi alla sezione. LPCSTR lpcszRootKey nome della chiave base LPCSTR lpcszSectionKey nome della sezione */ void CConfig::SaveSection(LPCSTR lpcszRootKey,LPCSTR lpcszSectionKey) { CONFIG* c; ITERATOR iter; LONG lRet; char szKey[REGKEY_MAX_KEY_VALUE+1]; if(m_pRegistry) { m_pRegistry->Attach(HKEY_CURRENT_USER); // scorre la lista aggiornando la sezione if((iter = m_plistConfig->First())!=(ITERATOR)NULL) { do { c = (CONFIG*)iter->data; if(c) // non inserisce nel registro le chiavi eliminate if(c->GetType()!=NULL_TYPE && strcmp(c->GetSection(),lpcszSectionKey)==0) { // salva la chiave nel registro _snprintf(szKey,sizeof(szKey)-1,DEFAULT_REG_KEY"\\%s\\%s",lpcszRootKey,c->GetSection()); if((lRet = m_pRegistry->Open(HKEY_CURRENT_USER,szKey))!=ERROR_SUCCESS) lRet = m_pRegistry->Create(HKEY_CURRENT_USER,szKey); if(lRet==ERROR_SUCCESS) { if(c->GetType()==LPSTR_TYPE) m_pRegistry->SetValue(c->GetValue((LPCSTR)NULL),c->GetName()); else if(c->GetType()==DWORD_TYPE) m_pRegistry->SetValue(c->GetValue((DWORD)0L),c->GetName()); m_pRegistry->Close(); } } iter = m_plistConfig->Next(iter); } while(iter!=(ITERATOR)NULL); } m_pRegistry->Detach(); } }
/* Export() Esporta la configurazione corrente nel file specificato. */ BOOL CConfig::Export(LPCSTR /*lpcszRootKey*/,LPCSTR lpcszFileName) { BOOL bSaved = FALSE; FILE* fp; if((fp = fopen(lpcszFileName,"w"))!=(FILE*)NULL) { CONFIG* c; ITERATOR iter; fprintf(fp,"[%s]\n","Configuration File"); // salva nel file le chiavi presenti nella lista if((iter = m_plistConfig->First())!=(ITERATOR)NULL) { do { c = (CONFIG*)iter->data; if(c) // non inserisce le chiavi eliminate if(c->GetType()!=NULL_TYPE) { if(c->GetType()==LPSTR_TYPE) fprintf(fp,"%s;%s;%s;%s\n",c->GetSection(),c->GetName(),c->GetValue((LPCSTR)NULL),"SZ"); else if(c->GetType()==DWORD_TYPE) fprintf(fp,"%s;%s;%ld;%s\n",c->GetSection(),c->GetName(),c->GetValue((DWORD)0L),"DW"); } iter = m_plistConfig->Next(iter); } while(iter!=(ITERATOR)NULL); } fclose(fp); bSaved = TRUE; } return(bSaved); }
/* DeleteSection() Elimina dal registro (e dalla lista) i valori presenti nella lista relativi alla sezione. LPCSTR lpcszRootKey nome della chiave base LPCSTR lpcszSectionKey nome della sezione BOOL bDeleteFromRegistry flag per eliminazione delle chiavi dal registro */ void CConfig::DeleteSection(LPCSTR lpcszRootKey,LPCSTR lpcszSectionKey,BOOL bDeleteFromRegistry/*=FALSE*/) { CONFIG* c; ITERATOR iter; char szKey[REGKEY_MAX_KEY_VALUE+1]; if(m_pRegistry) { m_pRegistry->Attach(HKEY_CURRENT_USER); // elimina (dalla lista e dal registro) le chiavi relative alla sezione if((iter = m_plistConfig->First())!=(ITERATOR)NULL) { do { c = (CONFIG*)iter->data; if(c) // chiave da eliminare if(c->GetType()!=NULL_TYPE && strcmp(c->GetSection(),lpcszSectionKey)==0) { // elimina la chiave dal registro if(bDeleteFromRegistry) { _snprintf(szKey,sizeof(szKey)-1,DEFAULT_REG_KEY"\\%s\\%s",lpcszRootKey,c->GetSection()); if(m_pRegistry->Open(HKEY_CURRENT_USER,szKey)==ERROR_SUCCESS) { m_pRegistry->DeleteValue(c->GetName()); m_pRegistry->Close(); } } // elimina la chiave dalla lista //m_plistConfig->Remove(iter); // eliminando l'elemento della lista (iter) e non la chiave (marcandola come cancellata) i salvataggi successivi // non possono eliminare dal registro le serie di chiavi come Key[0]...Key[n] //Delete(c->GetSection(),c->GetName()); c->SetType(NULL_TYPE); SetModified(TRUE); } iter = m_plistConfig->Next(iter); } while(iter!=(ITERATOR)NULL); } m_pRegistry->Detach(); SetModified(TRUE); } }
/* String() Restituisce o aggiorna il valore (stringa) associato alla sezione/chiave a seconda del parametro associato al valore (NULL/-1 recupera, in caso contrario aggiorna). LPCSTR lpcszSectionName nome sezione LPCSTR lpcszKeyName nome chiave LPCSTR lpcszKeyValue valore chiave (stringa) */ LPCSTR CConfig::String(LPCSTR lpcszSectionName,LPCSTR lpcszKeyName,LPCSTR lpcszKeyValue/*=NULL*/) { static char* p; CONFIG* c; ITERATOR iter; p = ""; // scorre la lista cercando l'entrata relativa alla coppia sezione/chiave if((iter = m_plistConfig->First())!=(ITERATOR)NULL) { do { c = (CONFIG*)iter->data; if(c) if(strcmp(lpcszSectionName,c->GetSection())==0) { if(strcmp(lpcszKeyName,c->GetName())==0) { // salta i valori marcati per l'eliminazione (NULL_TYPE) if(c->GetType()!=NULL_TYPE) { if(lpcszKeyValue!=NULL) { // aggiorna il valore c->SetValue(lpcszKeyValue); p = (char*)c->GetValue(p); break; } else { // ricava il valore p = (char*)c->GetValue(p); if(!*p) p = ""; break; } } } } iter = m_plistConfig->Next(iter); } while(iter!=(ITERATOR)NULL); } return(p); }
/* Number() Restituisce o aggiorna il valore (numerico) associato alla sezione/nome a seconda del parametro associato al valore (NULL/-1 recupera, in caso contrario aggiorna). LPCSTR lpcszSectionName nome sezione LPCSTR lpcszKeyName nome chiave LPCSTR lpcszKeyValue valore chiave (numero) */ DWORD CConfig::Number(LPCSTR lpcszSectionName,LPCSTR lpcszKeyName,DWORD dwKeyValue/*=(DWORD)-1L*/) { DWORD l = (DWORD)-1L; CONFIG* c; ITERATOR iter; // scorre la lista cercando l'entrata relativa alla coppia sezione/chiave if((iter = m_plistConfig->First())!=(ITERATOR)NULL) { do { c = (CONFIG*)iter->data; if(c) if(strcmp(lpcszSectionName,c->GetSection())==0) { if(strcmp(lpcszKeyName,c->GetName())==0) { // salta i valori marcati per l'eliminazione (NULL_TYPE) if(c->GetType()!=NULL_TYPE) { if(dwKeyValue!=(DWORD)-1L) { // aggiorna il valore c->SetValue(dwKeyValue); l = c->GetValue(l); break; } else { // ricava il valore l = c->GetValue(l); break; } } } } iter = m_plistConfig->Next(iter); } while(iter!=(ITERATOR)NULL); } return(l); }
/* Save() Salva nel registro i valori presenti nella lista. LPCSTR lpcszRootKey nome della chiave base */ void CConfig::Save(LPCSTR lpcszRootKey) { CONFIG* c; ITERATOR iter; LONG lRet; char szKey[REGKEY_MAX_KEY_VALUE+1]; memset(szKey,'\0',sizeof(szKey)); if(m_pRegistry) { m_pRegistry->Attach(HKEY_CURRENT_USER); // elimina (dalla lista e dal registro) le chiavi marcate per la cancellazione if((iter = m_plistConfig->First())!=(ITERATOR)NULL) { do { c = (CONFIG*)iter->data; if(c) // chiave da eliminare if(c->GetType()==NULL_TYPE) { // elimina la chiave dal registro _snprintf(szKey,sizeof(szKey)-1,DEFAULT_REG_KEY"\\%s\\%s",lpcszRootKey,c->GetSection()); if(m_pRegistry->Open(HKEY_CURRENT_USER,szKey)==ERROR_SUCCESS) { m_pRegistry->DeleteValue(c->GetName()); m_pRegistry->Close(); } // elimina la chiave dalla lista m_plistConfig->Remove(iter); } iter = m_plistConfig->Next(iter); } while(iter!=(ITERATOR)NULL); } // salva nel registro le chiavi presenti nella lista if((iter = m_plistConfig->First())!=(ITERATOR)NULL) { do { c = (CONFIG*)iter->data; if(c) // non inserisce nel registro le chiavi eliminate if(c->GetType()!=NULL_TYPE) { _snprintf(szKey,sizeof(szKey)-1,DEFAULT_REG_KEY"\\%s\\%s",lpcszRootKey,c->GetSection()); if((lRet = m_pRegistry->Open(HKEY_CURRENT_USER,szKey))!=ERROR_SUCCESS) lRet = m_pRegistry->Create(HKEY_CURRENT_USER,szKey); if(lRet==ERROR_SUCCESS) { if(c->GetType()==LPSTR_TYPE) m_pRegistry->SetValue(c->GetValue((LPCSTR)NULL),c->GetName()); else if(c->GetType()==DWORD_TYPE) m_pRegistry->SetValue(c->GetValue((DWORD)0L),c->GetName()); m_pRegistry->Close(); } } iter = m_plistConfig->Next(iter); } while(iter!=(ITERATOR)NULL); } m_pRegistry->Detach(); SetModified(FALSE); } }