1 /*
2 
3   G N O K I I
4 
5   A Linux/Unix toolset and driver for the mobile phones.
6 
7   This file is part of gnokii.
8 
9   Gnokii is free software; you can redistribute it and/or modify
10   it under the terms of the GNU General Public License as published by
11   the Free Software Foundation; either version 2 of the License, or
12   (at your option) any later version.
13 
14   Gnokii is distributed in the hope that it will be useful,
15   but WITHOUT ANY WARRANTY; without even the implied warranty of
16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   GNU General Public License for more details.
18 
19   You should have received a copy of the GNU General Public License
20   along with gnokii; if not, write to the Free Software
21   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22 
23   Copyright (C) 1999-2000 Hugh Blemings, Pavel Janik
24   Copyright (C) 2000-2004 BORBELY Zoltan
25   Copyright (C) 2000-2011 Pawel Kot
26   Copyright (C) 2000      Marcin Wiacek, Chris Kemp
27   Copyright (C) 2002      Ladis Michl
28   Copyright (C) 2003      Osma Suominen, Martin Goldhahn
29 
30   Internal API for libgnokii
31 
32 */
33 
34 #ifndef _gnokii_internal_h
35 #define _gnokii_internal_h
36 
37 #include "compat.h"
38 #include "misc.h"
39 
40 #if !defined(GNOKII_DEPRECATED)
41 #  define GNOKII_DEPRECATED /* do not warn about deprecated functions here */
42 #endif
43 
44 #include "gnokii.h"
45 
46 #define return_on_error(func) \
47 do { \
48 	gn_error error; \
49 	error = func; \
50 	if (error != GN_ERR_NONE) \
51 		return error; \
52 } while (0)
53 
54 /* SMS */
55 gn_error gn_sms_parse(gn_data *data);
56 gn_error gn_sms_pdu2raw(gn_sms_raw *rawsms, unsigned char *pdu, int pdu_len, int flags);
57 gn_error gn_sms_request(gn_data *data, struct gn_statemachine *state);
58 gn_error sms_prepare(gn_sms *sms, gn_sms_raw *rawsms);
59 gn_timestamp *sms_timestamp_unpack(unsigned char *number, gn_timestamp *dt);
60 unsigned char *sms_timestamp_pack(gn_timestamp *dt, unsigned char *number);
61 
62 /* Statemachine */
63 gn_error sm_initialise(struct gn_statemachine *state);
64 gn_error sm_message_send(u16 messagesize, u8 messagetype, void *message, struct gn_statemachine *state);
65 gn_error sm_wait_for(unsigned char messagetype, gn_data *data, struct gn_statemachine *state);
66 void sm_incoming_function(u8 messagetype, void *message, u16 messagesize, struct gn_statemachine *state);
67 void sm_incoming_acknowledge(struct gn_statemachine *state);
68 void sm_reset(struct gn_statemachine *state);
69 gn_error sm_error_get(unsigned char messagetype, struct gn_statemachine *state);
70 gn_error sm_block_timeout(int waitfor, int t, gn_data *data, struct gn_statemachine *state);
71 gn_error sm_block(int waitfor, gn_data *data, struct gn_statemachine *state);
72 gn_error sm_block_no_retry_timeout(int waitfor, int t, gn_data *data, struct gn_statemachine *state);
73 gn_error sm_block_no_retry(int waitfor, gn_data *data, struct gn_statemachine *state);
74 gn_error sm_block_ack(struct gn_statemachine *state);
75 void sm_message_dump(gn_log_func_t lfunc, int messagetype, unsigned char *message, int length);
76 void sm_unhandled_frame_dump(int messagetype, unsigned char *message, int length, struct gn_statemachine *state);
77 
78 extern void hex2bin(unsigned char *dest, const unsigned char *src, unsigned int len);
79 extern void bin2hex(unsigned char *dest, const unsigned char *src, unsigned int len);
80 
81 int char_7bit_unpack(unsigned int offset, unsigned int in_length, unsigned int out_length,
82 		     unsigned char *input, unsigned char *output);
83 int char_7bit_pack(unsigned int offset, unsigned char *input, unsigned char *output,
84 		   unsigned int *in_len);
85 
86 int char_mblen(const char *src);
87 
88 unsigned int char_unicode_decode(unsigned char* dest, const unsigned char* src, int len);
89 unsigned int char_unicode_encode(unsigned char* dest, const unsigned char* src, int len);
90 
91 int char_default_alphabet_decode(unsigned char* dest, const unsigned char* src, int len);
92 size_t char_ascii_encode(char *dest, size_t dest_len, const char *src, size_t len);
93 
94 void char_hex_decode(unsigned char* dest, const unsigned char* src, int len);
95 size_t char_hex_encode(char *dest, size_t dest_len, const char *src, size_t len);
96 
97 void char_ucs2_decode(unsigned char* dest, const unsigned char* src, int len);
98 size_t char_ucs2_encode(char *dest, size_t dest_len, const char *src, size_t len);
99 
100 unsigned char char_def_alphabet_encode(unsigned int value);
101 unsigned int char_def_alphabet_decode(unsigned char value);
102 
103 size_t char_uni_alphabet_encode(const char *value, size_t n, wchar_t *dest, MBSTATE *mbs);
104 int char_uni_alphabet_decode(wchar_t value, unsigned char *dest, MBSTATE *mbs);
105 
106 extern char *char_bcd_number_get(u8 *number);
107 extern int char_semi_octet_pack(char *number, unsigned char *output, gn_gsm_number_type type);
108 
109 int ucs2_encode(char *outstring, int outlen, const char *instring, int inlen);
110 
111 int char_def_alphabet_ext_count(unsigned char *input, int length);
112 bool char_def_alphabet_ext(unsigned int value);
113 
114 int char_def_alphabet_string_copy(char *dest, const char *src, int len, int offset);
115 gn_sms_dcs_alphabet_type char_def_alphabet_string_stats(char *str, int *enc_chars, int *ext_chars);
116 
117 /* Ringtones */
118 int vcal_time_get(gn_timestamp *dt, char *time);
119 int calnote_fill(gn_calnote *note, char *type, char *text, char *desc,
120 		 char *time, char *alarm);
121 int todo_fill(gn_todo *note, char *text, char *todo_priority);
122 
123 /* Ringtone Files */
124 gn_error file_rtttl_save(FILE *file, gn_ringtone *ringtone);
125 gn_error file_ott_save(FILE *file, gn_ringtone *ringtone);
126 gn_error file_midi_save(FILE *file, gn_ringtone *ringtone);
127 gn_error file_nokraw_save(FILE *file, gn_ringtone *ringtone, int dct4);
128 
129 gn_error file_rtttl_load(FILE *file, gn_ringtone *ringtone);
130 gn_error file_ott_load(FILE *file, gn_ringtone *ringtone);
131 gn_error file_midi_load(FILE *file, gn_ringtone *ringtone);
132 gn_error file_nokraw_load(FILE *file, gn_ringtone *ringtone);
133 
134 /* Bitmap Files */
135 
136 void file_nol_save(FILE *file, gn_bmp *bitmap, gn_phone *info);
137 void file_ngg_save(FILE *file, gn_bmp *bitmap, gn_phone *info);
138 void file_nsl_save(FILE *file, gn_bmp *bitmap, gn_phone *info);
139 void file_nlm_save(FILE *file, gn_bmp *bitmap);
140 void file_ota_save(FILE *file, gn_bmp *bitmap);
141 void file_bmp_save(FILE *file, gn_bmp *bitmap);
142 
143 #ifdef XPM
144 void file_xpm_save(char *filename, gn_bmp *bitmap);
145 #endif
146 
147 gn_error file_ngg_load(FILE *file, gn_bmp *bitmap, gn_phone *info);
148 gn_error file_nol_load(FILE *file, gn_bmp *bitmap, gn_phone *info);
149 gn_error file_nsl_load(FILE *file, gn_bmp *bitmap);
150 gn_error file_nlm_load(FILE *file, gn_bmp *bitmap);
151 gn_error file_ota_load(FILE *file, gn_bmp *bitmap, gn_phone *info);
152 gn_error file_bmp_load(FILE *file, gn_bmp *bitmap);
153 
154 #ifdef XPM
155 gn_error file_xpm_load(char *filename, gn_bmp *bitmap);
156 #endif
157 
158 int ringtone_sms_encode(unsigned char *message, gn_ringtone *ringtone);
159 int imelody_sms_encode(unsigned char *imelody, unsigned char *message);
160 gn_error phonebook_decode(unsigned char *blockstart, int length,
161 			  gn_data *data, int blocks, int memtype, int speeddial_pos);
162 gn_error calnote_decode(unsigned char *message, int length, gn_data *data);
163 gn_error calnote_get_alarm(int alarmdiff, gn_timestamp *time, gn_timestamp *alarm);
164 
165 int sms_nokia_smart_message_part_pack(unsigned char *msg, unsigned int size,
166 				      unsigned int type, bool first);
167 int sms_nokia_text_encode(unsigned char *text, unsigned char *message, bool first);
168 int sms_nokia_bitmap_encode(gn_bmp *bitmap, unsigned char *message, bool first);
169 
170 struct gn_cfg_header *cfg_file_read(const char *filename);
171 typedef void (*cfg_foreach_func)(const char *section, const char *key, const char *value);
172 void cfg_foreach(const char *section, cfg_foreach_func func);
173 char *cfg_set(struct gn_cfg_header *cfg, const char *section, const char *key, const char *value);
174 int cfg_file_write(struct gn_cfg_header *cfg, const char *filename);
175 /* Get some information about the given phone */
176 gn_phone_model *gn_cfg_get_phone_model(struct gn_cfg_header *cfg, const char *product_name);
177 
178 gn_error isdn_cause2gn_error(char **src, char **msg, unsigned char loc, unsigned char cause);
179 
180 int utf8_decode(char *dest, size_t destlen, const char *src, size_t inlen);
181 int utf8_encode(char *dest, int destlen, const char *src, int inlen);
182 
183 int string_base64(const char *instring);
184 int base64_decode(char *dest, int destlen, const char *src, int inlen);
185 int base64_encode(char *dest, int destlen, const char *src, int inlen);
186 
187 int utf8_base64_decode(char *dest, int destlen, const char *src, int inlen);
188 int utf8_base64_encode(char *dest, int destlen, const char *src, int inlen);
189 
190 int add_slashes(char *dest, char *src, int maxlen, int len);
191 int strip_slashes(char *dest, const char *src, int maxlen, int len);
192 
193 #endif /* _gnokii_internal_h */
194