osxregistry.cpp

来自「这是VCF框架的代码」· C++ 代码 · 共 484 行

CPP
484
字号
//OSXRegistry.cpp/*Copyright 2000-2004 The VCF Project.Please see License.txt in the top level directorywhere you installed the VCF.*/#include "vcf/FoundationKit/FoundationKit.h"#include "vcf/FoundationKit/FoundationKitPrivate.h"#include "vcf/FoundationKit/OSXRegistry.h"using namespace VCF;CFStringRef getAppID( RegistryKeyType root ){	CFStringRef result = NULL;	switch ( root ) {		case RKT_ROOT : {			result = kCFPreferencesAnyApplication;		}		break;				case RKT_CURRENT_USER : {			result = kCFPreferencesCurrentApplication;		}		break;				case RKT_LOCAL_MACHINE : {			result = kCFPreferencesCurrentApplication;		}		break;	}	return result;}CFStringRef getUserKey( RegistryKeyType root ){	CFStringRef result = NULL;	switch ( root ) {		case RKT_ROOT : {			result = kCFPreferencesAnyUser;		}		break;				case RKT_CURRENT_USER : {			result = kCFPreferencesCurrentUser;		}		break;				case RKT_LOCAL_MACHINE : {			result = kCFPreferencesAnyUser;		}		break;	}	return result;}CFStringRef getHostKey( RegistryKeyType root ){	CFStringRef result = NULL;	switch ( root ) {		case RKT_ROOT : {			result = kCFPreferencesCurrentHost;		}		break;				case RKT_CURRENT_USER : {			result = kCFPreferencesCurrentHost;		}		break;				case RKT_LOCAL_MACHINE : {			result = kCFPreferencesCurrentHost;		}		break;	}	return result;}OSXRegistry::OSXRegistry(){	valuesContainer_.initContainer( values_ );	keysContainer_.initContainer( keys_ );}OSXRegistry::~OSXRegistry(){}void OSXRegistry::setRoot( const RegistryKeyType& rootKey ){	rootKeyType_ = rootKey;}RegistryKeyType OSXRegistry::getRoot(){	return rootKeyType_;}bool OSXRegistry::openKey( const String& keyname, const bool& createIfNonExistant ){	bool result = true;	currentRegKey_ = keyname;	return result;}bool OSXRegistry::setValue( const String& value, const String& valuename ){	bool result = false;		CFTextString key;	key = currentRegKey_ + "-" + valuename;		CFTextString val;	val = value;		CFPreferencesSetValue(key, (CFStringRef)val, 							getAppID(rootKeyType_),							getUserKey(rootKeyType_), 							getHostKey(rootKeyType_) );								result = CFPreferencesSynchronize( getAppID(rootKeyType_),							getUserKey(rootKeyType_), 							getHostKey(rootKeyType_) );					return result;}bool OSXRegistry::setValue( const uint32& value, const String& valuename ){	bool result = false;		CFTextString key;	key = currentRegKey_ + "-" + valuename;				CFRefObject<CFNumberRef> val = CFNumberCreate( NULL, kCFNumberSInt64Type, &value );		CFPreferencesSetValue(key, val, 							getAppID(rootKeyType_),							getUserKey(rootKeyType_), 							getHostKey(rootKeyType_) );								result = CFPreferencesSynchronize( getAppID(rootKeyType_),							getUserKey(rootKeyType_), 							getHostKey(rootKeyType_) );										return result;}bool OSXRegistry::setValue( const bool& value, const String& valuename ){	bool result = false;		CFTextString key;	key = currentRegKey_ + "-" + valuename;				CFBooleanRef val = value ? kCFBooleanTrue : kCFBooleanFalse;		CFPreferencesSetValue(key, val, 							getAppID(rootKeyType_),							getUserKey(rootKeyType_), 							getHostKey(rootKeyType_) );								result = CFPreferencesSynchronize( getAppID(rootKeyType_),							getUserKey(rootKeyType_), 							getHostKey(rootKeyType_) );										return result;}bool OSXRegistry::OSXRegistry::setValue( void* dataBuffer, const uint32& dataBufferSize, const String& valuename ){	bool result = false;		CFTextString key;	key = currentRegKey_ + "-" + valuename;						CFRefObject<CFDataRef> val = CFDataCreate( NULL, (const UInt8*)dataBuffer, dataBufferSize );			CFPreferencesSetValue(key, val, 							getAppID(rootKeyType_),							getUserKey(rootKeyType_), 							getHostKey(rootKeyType_) );								result = CFPreferencesSynchronize( getAppID(rootKeyType_),							getUserKey(rootKeyType_), 							getHostKey(rootKeyType_) );										return result;}bool OSXRegistry::getStringValue( const String& valuename, String& value ){	bool result = false;		result = CFPreferencesSynchronize( getAppID(rootKeyType_),							getUserKey(rootKeyType_), 							getHostKey(rootKeyType_) );		if ( result ) {		CFTextString key;		key = currentRegKey_ + "-" + valuename;				CFPropertyListRef propList = CFPreferencesCopyValue( key, getAppID(rootKeyType_),															getUserKey(rootKeyType_), 															getHostKey(rootKeyType_) );				if ( NULL != propList ) {			CFRefObject<CFStringRef> str = (CFStringRef)propList;			CFTextString tmp;			tmp = str;			value = tmp;			 		}		else {			result = false;		}	}								return result;}bool OSXRegistry::getIntValue( const String& valuename, uint32& value ){	bool result = false;		result = CFPreferencesSynchronize( getAppID(rootKeyType_),							getUserKey(rootKeyType_), 							getHostKey(rootKeyType_) );		if ( result ) {		CFTextString key;		key = currentRegKey_ + "-" + valuename;				CFPropertyListRef propList = CFPreferencesCopyValue( key, getAppID(rootKeyType_),															getUserKey(rootKeyType_), 															getHostKey(rootKeyType_) );				if ( NULL != propList ) {			CFRefObject<CFNumberRef> num = (CFNumberRef)propList;			CFNumberGetValue( num,kCFNumberSInt64Type, &value );		}		else {			result = false;		}	}	return result;}bool OSXRegistry::getBoolValue( const String& valuename, bool& value ){	bool result = false;		result = CFPreferencesSynchronize( getAppID(rootKeyType_),							getUserKey(rootKeyType_), 							getHostKey(rootKeyType_) );		if ( result ) {		CFTextString key;		key = currentRegKey_ + "-" + valuename;				CFPropertyListRef propList = CFPreferencesCopyValue( key, getAppID(rootKeyType_),															getUserKey(rootKeyType_), 															getHostKey(rootKeyType_) );				if ( NULL != propList ) {			CFBooleanRef val = (CFBooleanRef)propList;			value = CFBooleanGetValue( val );		}		else {			result = false;		}	}	return result;}bool OSXRegistry::getDataBufValue( const String& valuename, uint32& dataBufferSize, void** dataBuffer ){	bool result = false;		result = CFPreferencesSynchronize( getAppID(rootKeyType_),							getUserKey(rootKeyType_), 							getHostKey(rootKeyType_) );		if ( result ) {		CFTextString key;		key = currentRegKey_ + "-" + valuename;				CFPropertyListRef propList = CFPreferencesCopyValue( key, getAppID(rootKeyType_),															getUserKey(rootKeyType_), 															getHostKey(rootKeyType_) );				if ( NULL != propList ) {			CFRefObject<CFDataRef> data = (CFDataRef)propList;						CFIndex length = CFDataGetLength( data );			if ( length > 0 ) {				unsigned char* buf = new unsigned char[length];				CFDataGetBytes( data, CFRangeMake(0,length), buf );				dataBufferSize = length;				*dataBuffer = buf;			}			else {				result = false;			}		}		else {			result = false;		}	}	return result;}Enumerator<String>* OSXRegistry::getKeyNames(){	bool ok = CFPreferencesSynchronize( getAppID(rootKeyType_),							getUserKey(rootKeyType_), 							getHostKey(rootKeyType_) );															keys_.clear();		if ( ok ) {		CFRefObject<CFArrayRef> arr = CFPreferencesCopyKeyList( getAppID(rootKeyType_),												   getUserKey(rootKeyType_), 												   getHostKey(rootKeyType_) );				if ( arr != NULL ) {			for (int i=0;i<CFArrayGetCount(arr);i++ ) {				CFStringRef s = (CFStringRef)CFArrayGetValueAtIndex( arr, i );							keys_.push_back( CFTextString(s) );							CFRelease(s);			}		}	}					return keysContainer_.getEnumerator();}Enumerator<RegistryValueInfo*>* OSXRegistry::getValues(){	std::vector<RegistryValueInfo*>::iterator it = values_.begin();	while ( it != values_.end() ){		RegistryValueInfo* regVal = *it;		delete regVal;		regVal = NULL;		it++;	}	values_.clear();		bool ok = CFPreferencesSynchronize( getAppID(rootKeyType_),										getUserKey(rootKeyType_), 										getHostKey(rootKeyType_) );		if ( ok ) {		CFRefObject<CFDictionaryRef> dict = CFPreferencesCopyMultiple( NULL, getAppID(rootKeyType_),																getUserKey(rootKeyType_), 																getHostKey(rootKeyType_) );																		if ( dict != NULL ) {			CFIndex dictCount = CFDictionaryGetCount( dict );			CFTypeRef* keys = new CFTypeRef[dictCount];			CFTypeRef* values = new CFTypeRef[dictCount];						RegistryValueInfo* regVal = NULL;			VariantData data;						CFDictionaryGetKeysAndValues( dict, keys, values );			for ( int i = 0;i < dictCount;i++) {				regVal = NULL;				String tmp = CFTextString( (CFStringRef) keys[i] );								CFTypeID id = CFGetTypeID( values[i] );				if ( CFStringGetTypeID() == id ) {					CFTextString s( (CFStringRef)values[i] );					data = (String)s;					regVal = new RegistryValueInfo( &data, RDT_STRING, tmp );				}				else if ( CFNumberGetTypeID() == id ) {					CFNumberRef num = (CFNumberRef)values[i];										switch (CFNumberGetType(num) ) {						case kCFNumberSInt8Type : 						case kCFNumberSInt16Type :						case kCFNumberSInt32Type : {							int v = 0;							CFNumberGetValue( num, CFNumberGetType(num), &v );							data = v;							regVal = new RegistryValueInfo( &data, RDT_INTEGER, tmp );						}						break;												case kCFNumberIntType : 						case kCFNumberCharType :						case kCFNumberShortType : 						case kCFNumberLongType : {							int v = 0;							CFNumberGetValue( num, CFNumberGetType(num), &v );							data = v;							regVal = new RegistryValueInfo( &data, RDT_INTEGER, tmp );						}						break;												case kCFNumberDoubleType : {							double v = 0;							CFNumberGetValue( num, CFNumberGetType(num), &v );							data = (int)v;							regVal = new RegistryValueInfo( &data, RDT_INTEGER, tmp );						}						break;												case kCFNumberFloatType : {							float v = 0;							CFNumberGetValue( num, CFNumberGetType(num), &v );							data = (int)v;							regVal = new RegistryValueInfo( &data, RDT_INTEGER, tmp );						}						break;					}				}				else if ( CFDataGetTypeID() == id ) {					CFDataRef data = (CFDataRef)values[i];					CFIndex length = CFDataGetLength( data );					if ( length > 0 ) {						unsigned char* buf = new unsigned char[length];						CFDataGetBytes( data, CFRangeMake(0,length), buf );						regVal = new RegistryValueInfo( NULL, RDT_BINARY, tmp, (char*)buf, length );					}				}								values_.push_back( regVal );			}						delete [] keys;			delete [] values;		}	}		valuesContainer_.initContainer( values_ );		return valuesContainer_.getEnumerator();}String OSXRegistry::getCurrentKey(){	return currentRegKey_;}/***CVS Log info*$Log$*Revision 1.3  2006/04/07 02:35:34  ddiego*initial checkin of merge from 0.6.9 dev branch.**Revision 1.2.6.3  2005/12/04 20:58:32  ddiego*more osx impl work. foundationkit is mostly complete now.**Revision 1.2.6.2  2005/11/21 04:00:51  ddiego*more osx updates.**Revision 1.2.6.1  2005/11/14 22:05:42  ddiego*osx update.**Revision 1.2  2004/08/07 02:49:14  ddiego*merged in the devmain-0-6-5 branch to stable**Revision 1.1.2.6  2004/06/06 07:05:32  marcelloptr*changed macros, text reformatting, copyright sections**/

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?