Commit | Line | Data |
760ac839 |
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 * |
41cd3736 |
18 | Prf_Get(pTHX_ HINI hini, PSZ app, PSZ key) { |
760ac839 |
19 | ULONG len; |
20 | BOOL rc; |
21 | SV *sv; |
22 | |
6b88bc9c |
23 | if (CheckWinError(PrfQueryProfileSize(hini, app, key, &len))) return &PL_sv_undef; |
760ac839 |
24 | sv = newSVpv("", 0); |
dd96f567 |
25 | SvGROW(sv, len + 1); |
760ac839 |
26 | if (CheckWinError(PrfQueryProfileData(hini, app, key, SvPVX(sv), &len)) |
27 | || (len == 0 && (app == NULL || key == NULL))) { /* Somewhy needed. */ |
28 | SvREFCNT_dec(sv); |
6b88bc9c |
29 | return &PL_sv_undef; |
760ac839 |
30 | } |
31 | SvCUR_set(sv, len); |
32 | *SvEND(sv) = 0; |
33 | return sv; |
34 | } |
35 | |
4e3d4845 |
36 | I32 |
760ac839 |
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* |
41cd3736 |
54 | Prf_Profiles(pTHX) |
760ac839 |
55 | { |
56 | AV *av = newAV(); |
57 | SV *rv; |
58 | char user[257]; |
59 | char system[257]; |
60 | PRFPROFILE info = { 257, user, 257, system}; |
61 | |
6b88bc9c |
62 | if (CheckWinError(PrfQueryProfile(Perl_hab, &info))) return &PL_sv_undef; |
760ac839 |
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 |
41cd3736 |
73 | Prf_SetUser(pTHX_ SV *sv) |
760ac839 |
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; |
41cd3736 |
104 | CODE: |
105 | RETVAL = Prf_Get(aTHX_ hini, app, key); |
106 | OUTPUT: |
107 | RETVAL |
760ac839 |
108 | |
109 | int |
110 | Prf_Set(hini, app, key, s, l = (SvPOK(ST(3)) ? SvCUR(ST(3)): -1)) |
111 | HINI hini; |
112 | PSZ app; |
113 | PSZ key; |
114 | PSZ s; |
115 | ULONG l; |
116 | |
4e3d4845 |
117 | I32 |
760ac839 |
118 | Prf_GetLength(hini, app, key) |
119 | HINI hini; |
120 | PSZ app; |
121 | PSZ key; |
122 | |
123 | HINI |
124 | Prf_System(key) |
125 | int key; |
126 | |
127 | SV* |
128 | Prf_Profiles() |
41cd3736 |
129 | CODE: |
130 | RETVAL = Prf_Profiles(aTHX); |
131 | OUTPUT: |
132 | RETVAL |
760ac839 |
133 | |
134 | BOOL |
135 | Prf_SetUser(sv) |
136 | SV *sv |
41cd3736 |
137 | CODE: |
138 | RETVAL = Prf_SetUser(aTHX_ sv); |
139 | OUTPUT: |
140 | RETVAL |
760ac839 |
141 | |
142 | BOOT: |
143 | Acquire_hab(); |