various little nits
[p5sagit/p5-mst-13.2.git] / os2 / OS2 / PrfDB / PrfDB.xs
1 #define INCL_WINSHELLDATA /* Or use INCL_WIN, INCL_PM, */
2
3 #ifdef __cplusplus
4 extern "C" {
5 #endif
6 #include "EXTERN.h"
7 #include "perl.h"
8 #include "XSUB.h"
9 #include <os2.h>
10 #ifdef __cplusplus
11 }
12 #endif
13
14 #define Prf_Open(pszFileName) SaveWinError(PrfOpenProfile(Perl_hab, (pszFileName)))
15 #define Prf_Close(hini) (!CheckWinError(PrfCloseProfile(hini)))
16
17 SV *
18 Prf_Get(HINI hini, PSZ app, PSZ key) {
19     ULONG len;
20     BOOL rc;
21     SV *sv;
22
23     if (CheckWinError(PrfQueryProfileSize(hini, app, key, &len))) return &PL_sv_undef;
24     sv = newSVpv("", 0);
25     SvGROW(sv, len + 1);
26     if (CheckWinError(PrfQueryProfileData(hini, app, key, SvPVX(sv), &len))
27         || (len == 0 && (app == NULL || key == NULL))) { /* Somewhy needed. */
28         SvREFCNT_dec(sv);
29         return &PL_sv_undef;
30     }
31     SvCUR_set(sv, len);
32     *SvEND(sv) = 0;
33     return sv;
34 }
35
36 I32
37 Prf_GetLength(HINI hini, PSZ app, PSZ key) {
38     U32 len;
39
40     if (CheckWinError(PrfQueryProfileSize(hini, app, key, &len))) return -1;
41     return len;
42 }
43
44 #define Prf_Set(hini, app, key, s, l)                   \
45          (!(CheckWinError(PrfWriteProfileData(hini, app, key, s, l))))
46
47 #define Prf_System(key)                                 \
48         ( (key) ? ( (key) == 1  ? HINI_USERPROFILE      \
49                                 : ( (key) == 2 ? HINI_SYSTEMPROFILE \
50                                                 : (die("Wrong profile id %i", key), 0) )) \
51           : HINI_PROFILE)
52
53 SV*
54 Prf_Profiles()
55 {
56     AV *av = newAV();
57     SV *rv;
58     char user[257];
59     char system[257];
60     PRFPROFILE info = { 257, user, 257, system};
61     
62     if (CheckWinError(PrfQueryProfile(Perl_hab, &info))) return &PL_sv_undef;
63     if (info.cchUserName > 257 || info.cchSysName > 257)
64         die("Panic: Profile names too long");
65     av_push(av, newSVpv(user, info.cchUserName - 1));
66     av_push(av, newSVpv(system, info.cchSysName - 1));
67     rv = newRV((SV*)av);
68     SvREFCNT_dec(av);
69     return rv;
70 }
71
72 BOOL
73 Prf_SetUser(SV *sv)
74 {
75     char user[257];
76     char system[257];
77     PRFPROFILE info = { 257, user, 257, system};
78     
79     if (!SvPOK(sv)) die("User profile name not defined");
80     if (SvCUR(sv) > 256) die("User profile name too long");
81     if (CheckWinError(PrfQueryProfile(Perl_hab, &info))) return 0;
82     if (info.cchSysName > 257)
83         die("Panic: System profile name too long");
84     info.cchUserName = SvCUR(sv) + 1;
85     info.pszUserName = SvPVX(sv);
86     return !CheckWinError(PrfReset(Perl_hab, &info));
87 }
88
89 MODULE = OS2::PrfDB             PACKAGE = OS2::Prf PREFIX = Prf_
90
91 HINI
92 Prf_Open(pszFileName)
93  PSZ     pszFileName;
94
95 BOOL
96 Prf_Close(hini)
97  HINI     hini;
98
99 SV *
100 Prf_Get(hini, app, key)
101  HINI hini;
102  PSZ app;
103  PSZ key;
104
105 int
106 Prf_Set(hini, app, key, s, l = (SvPOK(ST(3)) ? SvCUR(ST(3)): -1))
107  HINI hini;
108  PSZ app;
109  PSZ key;
110  PSZ s;
111  ULONG l;
112
113 I32
114 Prf_GetLength(hini, app, key)
115  HINI hini;
116  PSZ app;
117  PSZ key;
118
119 HINI
120 Prf_System(key)
121  int key;
122
123 SV*
124 Prf_Profiles()
125
126 BOOL
127 Prf_SetUser(sv)
128  SV *sv
129
130 BOOT:
131         Acquire_hab();