diff --git a/libfreerdp-core/CMakeLists.txt b/libfreerdp-core/CMakeLists.txt index a91916d19..a3b7b9910 100644 --- a/libfreerdp-core/CMakeLists.txt +++ b/libfreerdp-core/CMakeLists.txt @@ -38,6 +38,8 @@ set(LIBFREERDP_CORE_SRCS ntlmssp.h license.c license.h + registry.c + registry.h security.c security.h settings.c diff --git a/libfreerdp-core/rdp.c b/libfreerdp-core/rdp.c index 9fa651809..2086e083f 100644 --- a/libfreerdp-core/rdp.c +++ b/libfreerdp-core/rdp.c @@ -157,6 +157,7 @@ rdpRdp* rdp_new() if (rdp != NULL) { rdp->settings = settings_new(); + rdp->registry = registry_new(rdp->settings); rdp->transport = transport_new(rdp->settings); rdp->license = license_new(rdp); rdp->nego = nego_new(rdp->transport); diff --git a/libfreerdp-core/rdp.h b/libfreerdp-core/rdp.h index bfe112f4e..3b7867f89 100644 --- a/libfreerdp-core/rdp.h +++ b/libfreerdp-core/rdp.h @@ -28,10 +28,12 @@ typedef struct rdp_rdp rdpRdp; #include "nego.h" #include "license.h" #include "security.h" +#include "registry.h" #include "transport.h" #include "connection.h" #include +#include #include /* Security Header Flags */ @@ -60,6 +62,7 @@ struct rdp_rdp struct rdp_nego* nego; struct rdp_license* license; struct rdp_settings* settings; + struct rdp_registry* registry; struct rdp_transport* transport; }; diff --git a/libfreerdp-core/registry.c b/libfreerdp-core/registry.c new file mode 100644 index 000000000..76de691c3 --- /dev/null +++ b/libfreerdp-core/registry.c @@ -0,0 +1,156 @@ +/** + * FreeRDP: A Remote Desktop Protocol Client + * Configuration Registry + * + * Copyright 2011 Marc-Andre Moreau + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "registry.h" + +static uint8 registry_dir[] = "freerdp"; +static uint8 registry_file[] = "config.txt"; + +REG_ENTRY resolution = +{ + REG_TYPE_STRING, "resolution", 8, "1024x768" +}; + +REG_ENTRY fast_path = +{ + REG_TYPE_BOOLEAN, "fast_path", 1, "1" +}; + +REG_ENTRY performance_flags = +{ + REG_TYPE_INTEGER, "performance_flags", 4, "0xFFFF" +}; + +REG_SECTION root = +{ + REG_TYPE_SECTION, "root", 0, NULL +}; + +void registry_print_entry(REG_ENTRY* entry) +{ + uint8* value; + value = (uint8*) entry->value; + printf("%s = %s\n", entry->name, value); +} + +void registry_print_section(REG_SECTION* section) +{ + printf("[%s]\n", section->name); + registry_print_entry(&resolution); + registry_print_entry(&fast_path); + registry_print_entry(&performance_flags); +} + +void registry_print(rdpRegistry* registry) +{ + registry_print_section(registry->root); +} + +void registry_create(rdpRegistry* registry) +{ + registry->fp = fopen(registry->file, "w+"); +} + +void registry_load(rdpRegistry* registry) +{ + registry->fp = fopen(registry->file, "r+"); +} + +void registry_open(rdpRegistry* registry) +{ + struct stat stat_info; + + if (stat(registry->file, &stat_info) != 0) + registry_create(registry); + else + registry_load(registry); +} + +void registry_close(rdpRegistry* registry) +{ + if (registry->fp != NULL) + fclose(registry->fp); +} + +void registry_init(rdpRegistry* registry) +{ + int length; + char* home_path; + struct stat stat_info; + + home_path = getenv("HOME"); + registry->available = True; + + if (home_path == NULL) + { + printf("could not get home path\n"); + registry->available = False; + return; + } + + length = strlen(home_path); + registry->home = (uint8*) xmalloc(length); + memcpy(registry->home, home_path, length); + printf("home path: %s\n", registry->home); + + registry->path = (uint8*) xmalloc(length + sizeof(registry_dir) + 2); + sprintf(registry->path, "%s/.%s", registry->home, registry_dir); + printf("registry path: %s\n", registry->path); + + if (stat(registry->path, &stat_info) != 0) + { + mkdir(registry->path, S_IRUSR | S_IWUSR | S_IXUSR); + printf("creating directory %s\n", registry->path); + } + + length = strlen(registry->path); + registry->file = (uint8*) xmalloc(length + sizeof(registry_file) + 1); + sprintf(registry->file, "%s/%s", registry->path, registry_file); + printf("registry file: %s\n", registry->file); + + registry_open(registry); + + registry_print(registry); +} + +rdpRegistry* registry_new(rdpSettings* settings) +{ + rdpRegistry* registry = (rdpRegistry*) xzalloc(sizeof(rdpRegistry)); + + if (registry != NULL) + { + registry->root = &root; + registry->settings = settings; + registry_init(registry); + } + + return registry; +} + +void registry_free(rdpRegistry* registry) +{ + if (registry != NULL) + { + registry_close(registry); + xfree(registry->path); + xfree(registry->file); + xfree(registry->home); + xfree(registry); + } +} diff --git a/libfreerdp-core/registry.h b/libfreerdp-core/registry.h new file mode 100644 index 000000000..2396f56b4 --- /dev/null +++ b/libfreerdp-core/registry.h @@ -0,0 +1,68 @@ +/** + * FreeRDP: A Remote Desktop Protocol Client + * Configuration Registry + * + * Copyright 2011 Marc-Andre Moreau + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __REGISTRY_H +#define __REGISTRY_H + +typedef struct rdp_registry rdpRegistry; + +#include +#include +#include +#include +#include +#include + +enum REG_TYPE +{ + REG_TYPE_STRING, + REG_TYPE_INTEGER, + REG_TYPE_BOOLEAN, + REG_TYPE_SECTION +}; + +typedef struct +{ + uint8 type; + uint8* name; + uint32 length; + void* value; +} REG_ENTRY; + +typedef REG_ENTRY REG_SECTION; + +struct rdp_registry +{ + FILE* fp; + uint8* path; + uint8* file; + uint8* home; + boolean available; + REG_SECTION* root; + struct rdp_settings* settings; +}; + +void registry_open(rdpRegistry* registry); +void registry_close(rdpRegistry* registry); + +void registry_init(rdpRegistry* registry); +rdpRegistry* registry_new(rdpSettings* settings); +void registry_free(rdpRegistry* registry); + +#endif /* __REGISTRY_H */