Changeset 845

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

Add constants and extra functions to console and registry.

Location:
Whitix/trunk/user/sdk
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • Whitix/trunk/user/sdk/include/registry.h

    r841 r845  
    33 
    44#define REG_NAME_LENGTH         1024 
     5 
     6#define REG_KEY_TYPE_STR        0 
     7#define REG_KEY_TYPE_INT        1 
    58 
    69struct Registry 
     
    1518}; 
    1619 
     20struct RegKeySetIter 
     21{ 
     22        struct RegKeySet* keySet; 
     23        int bufSize; 
     24        char* buf; 
     25        int next, size, index; 
     26}; 
     27 
     28int RegRegistryOpen(char* name, struct Registry* registry); 
     29int RegKeySetOpen(struct Registry* registry, char* name, unsigned long accessRights, struct RegKeySet* keySet); 
     30int RegKeyReadString(struct RegKeySet* keySet, char* name, char** data, unsigned long* length); 
     31int RegKeyReadInt(struct RegKeySet* keySet, char* name, int* ret); 
     32int RegKeySetReadKey(struct RegKeySet* keySet, char* name, int* type, char* data, unsigned long* length); 
     33 
    1734#endif 
  • Whitix/trunk/user/sdk/python/console/main.c

    r691 r845  
    262262                return; 
    263263 
     264        PyModule_AddIntConstant(m, "ColorBlue", CONS_COLOR_BLUE); 
     265 
    264266        ReadLineInit(); 
    265267} 
  • Whitix/trunk/user/sdk/python/registry/main.c

    r843 r845  
    7979         
    8080        if (RegKeySetOpen(&self->registry, name, accessRights, &keySet)) 
    81         { 
    82                 Py_INCREF(Py_None); 
    83                 return Py_None; 
    84         } 
     81                return PyErr_Format(PyExc_KeyError, "Could not find key %s", name); 
    8582                         
    8683        regKeySet=PyObject_GC_New(WRegKeySet, &wRegKeySet_Type); 
     
    197194                                        (PyObject *)&wRegKeySetIter_Type) < 0) 
    198195                return; 
     196                 
     197        PyModule_AddIntConstant(m, "EntryKey", 0); 
     198        PyModule_AddIntConstant(m, "EntryKeySet", 1); 
    199199} 
  • 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}