Show
Ignore:
Timestamp:
08/09/08 10:44:55 (4 years ago)
Author:
mwhitworth
Message:

Add constants and extra functions to console and registry.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • Whitix/trunk/user/sdk/registry/registry.c

    r840 r845  
    99#define REG_PACKET_OPEN_KEYSET          1 
    1010#define REG_PACKET_READ_KEY                     2 
     11#define REG_PACKET_ENUM_KEYSET          3 
     12#define REG_PACKET_GET_ENT_TYPE         4 
     13 
     14/* Used for locating an entry. */ 
     15struct RegReadKeyPacket 
     16{ 
     17        int type; 
     18        int length; 
     19        unsigned long handleId; 
     20        char name[REG_NAME_LENGTH]; 
     21}; 
    1122 
    1223int RegRegistryOpen(char* name, struct Registry* registry) 
     
    2637         
    2738        NetSocketConnect(sockFd, &addr, sizeof(struct SocketAddr)); 
    28                  
     39 
    2940        registry->sockFd=sockFd; 
    30                  
     41         
    3142        return 0; 
    3243} 
     
    6879        NetSocketReceive(registry->sockFd, &handleId, 4, 0); 
    6980         
     81        if (handleId == -1) 
     82                return -1; 
     83         
    7084        keySet->handleId=handleId; 
    7185        keySet->registry=registry; 
     
    7993} 
    8094 
     95int RegKeyReadInt(struct RegKeySet* keySet, char* name, int* ret) 
     96{ 
     97        int type, length=sizeof(int); 
     98         
     99        if (RegKeySetReadKey(keySet, name, &type, ret, &length) < 0) 
     100                return -1; 
     101                 
     102        if (type != REG_KEY_TYPE_INT) 
     103                return -1; 
     104                 
     105        return 0; 
     106} 
     107 
     108int RegKeyReadString(struct RegKeySet* keySet, char* name, char** data, unsigned long* length) 
     109{ 
     110        int type; 
     111        unsigned long rLength=2048; 
     112         
     113        /* TODO: Check return to see if buf needs to be expanded? */ 
     114         
     115        if (!*data) 
     116                *data=malloc(2048); 
     117                 
     118        if (length) 
     119                rLength=*length; 
     120         
     121        if (RegKeySetReadKey(keySet, name, &type, *data, &rLength) < 0) 
     122                return -1; 
     123                 
     124        if (type != REG_KEY_TYPE_STR) 
     125                return -1; 
     126         
     127        if (length)      
     128                *length=rLength; 
     129         
     130        return 0; 
     131} 
     132 
    81133/* TODO: Expand format to multiple keys. */ 
    82134 
     
    88140        if (!keySet || !name) 
    89141                return -1; 
    90                  
    91         struct RegReadKeyPacket 
    92         { 
    93                 int type; 
    94                 int length; 
    95                 unsigned long handleId; 
    96                 char name[REG_NAME_LENGTH]; 
    97         }; 
    98142         
    99143        struct RegReadKeyReply 
     
    120164                 
    121165        NetSocketReceive(sockFd, &reply, sizeof(struct RegReadKeyReply), 0); 
    122          
    123 //      printf("error = %d, length = %u, type = %d\n", reply.error, reply.length, reply.type); 
    124166         
    125167        if (data) 
     
    134176        *length=NetSocketReceive(sockFd, data, *length, 0); 
    135177         
    136         return 0; 
    137 } 
     178        if (type) 
     179                *type=reply.type; 
     180         
     181        return 0; 
     182} 
     183 
     184int RegKeySetIterInit(struct RegKeySet* keySet, struct RegKeySetIter* iter) 
     185{ 
     186        iter->keySet=keySet; 
     187        iter->bufSize=4096; 
     188        iter->buf=(char*)malloc(4096); 
     189        iter->next=0; 
     190        iter->index=0; 
     191        iter->size=0; 
     192                 
     193        return 0; 
     194} 
     195 
     196char* RegKeySetIterNext(struct RegKeySetIter* iter) 
     197{ 
     198        struct RegEnumSetPacket 
     199        { 
     200                int type; 
     201                int length; 
     202                unsigned long handleId; 
     203                unsigned long index; 
     204                unsigned long size; 
     205        }; 
     206         
     207        char* ret; 
     208        int bytes; 
     209        int sockFd; 
     210         
     211        sockFd=iter->keySet->registry->sockFd; 
     212         
     213        if (!iter) 
     214                return NULL; 
     215                 
     216        if (iter->size <= iter->next) 
     217                iter->size=iter->next=0; 
     218                 
     219        if (iter->size == 0) 
     220        { 
     221                /* Get the next batch of directory entries. */ 
     222                struct RegEnumSetPacket packet; 
     223                packet.type=REG_PACKET_ENUM_KEYSET; 
     224                packet.length=sizeof(struct RegEnumSetPacket); 
     225                packet.handleId=iter->keySet->handleId; 
     226                packet.index=iter->index; 
     227                packet.size=iter->bufSize; 
     228                 
     229                bytes=NetSocketSend(sockFd, &packet, packet.length, 0); 
     230                 
     231                if (bytes <= 0) 
     232                        return NULL; 
     233                 
     234                bytes=NetSocketReceive(sockFd, iter->buf, iter->bufSize, 0); 
     235                iter->size=bytes; 
     236                 
     237                if (bytes <= 0) 
     238                        return NULL; 
     239                 
     240                printf("Got %d bytes\n", bytes); 
     241        } 
     242         
     243        ret=iter->buf+iter->next; 
     244        iter->next+=strlen(ret)+1; 
     245        iter->index++; 
     246         
     247        return ret; 
     248} 
     249 
     250int RegKeySetIterClose(struct RegKeySetIter* iter) 
     251{ 
     252        if (!iter) 
     253                return -1; 
     254                 
     255        free(iter->buf); 
     256         
     257        return 0; 
     258} 
     259 
     260int RegEntryGetType(struct RegKeySet* keySet, char* name, int* ret) 
     261{ 
     262        struct RegReadKeyPacket packet; 
     263        int sockFd, err; 
     264         
     265        sockFd=keySet->registry->sockFd; 
     266         
     267        packet.type=REG_PACKET_GET_ENT_TYPE; 
     268        packet.length=sizeof(struct RegReadKeyPacket); 
     269        packet.handleId=keySet->handleId; 
     270        strncpy(packet.name, name, REG_NAME_LENGTH); 
     271         
     272        err=NetSocketSend(sockFd, &packet, sizeof(struct RegReadKeyPacket), 0); 
     273         
     274        if (err < 0) 
     275                return err; 
     276                 
     277        NetSocketReceive(sockFd, ret, 4, 0); 
     278         
     279        return 0; 
     280}